From: Olyutorskii Date: Wed, 17 Apr 2013 21:08:18 +0000 (+0900) Subject: シェーディング情報分離 X-Git-Tag: fromMercurial~18 X-Git-Url: http://git.osdn.net/view?p=mikutoga%2FTogaGem.git;a=commitdiff_plain;h=5b7a34da51cb3c328b40a573a906e6d6fbe6cfbe シェーディング情報分離 --- diff --git a/src/main/java/jp/sfjp/mikutoga/pmd/ShadingUtil.java b/src/main/java/jp/sfjp/mikutoga/pmd/ShadingUtil.java new file mode 100644 index 0000000..9fe2e35 --- /dev/null +++ b/src/main/java/jp/sfjp/mikutoga/pmd/ShadingUtil.java @@ -0,0 +1,83 @@ +/* + * shading file utility + * + * License : The MIT License + * Copyright(c) 2013 MikuToga Partners + */ + +package jp.sfjp.mikutoga.pmd; + +import java.util.regex.Pattern; + +/** + * シェーディング情報の各種ユーティリティ。 + *

※ スフィアマップファイルの中身はBMP(DIB)形式。 + *

+ * BMP file format + */ +public final class ShadingUtil { + + /** スフィアマップファイル名(乗算)拡張子。 */ + public static final String EXT_SPH = ".sph"; + /** スフィアマップファイル名(加算)拡張子。 */ + public static final String EXT_SPA = ".spa"; + + private static final String SEPARATOR = Pattern.quote("*"); + private static final Pattern SPLITTER = Pattern.compile(SEPARATOR); + + + /** + * 隠しコンストラクタ。 + */ + private ShadingUtil(){ + assert false; + throw new AssertionError(); + } + + + /** + * スフィアマップファイル名か否か判定する。 + *

拡張子が「.sph」(乗算)もしくは「.spa」(加算)なら + * スフィアマップファイル名と判定する。 + * @param fname ファイル名 + * @return スフィアマップファイルならtrue + */ + public static boolean isSpheremapFile(String fname) { + if(fname.endsWith(EXT_SPH)) return true; + if(fname.endsWith(EXT_SPA)) return true; + return false; + } + + /** + * シェーディング用ファイル情報文字列から + * テクスチャファイル名とスフィアマップファイル名を分離する。 + *

2つのファイル名は単一の「*」で区切られ、 + * 前部がテクスチャファイル名、後部がスフィアマップファイル名となる。 + * 「*」がなく末尾が「.sph」か「.spa」なら + * スフィアマップファイル名のみ、 + * 末尾がどちらでもなければテクスチャファイル名のみとなる。 + * @param shadingFile シェーディング用ファイル情報 + * @return [0]:テクスチャファイル名 [1]:スフィアマップファイル名。 + * 該当ファイル名が無い場合は空文字列。 + */ + public static String[] splitShadingFileInfo(String shadingFile) { + String[] result; + + result = SPLITTER.split(shadingFile, 2); + assert result.length == 1 || result.length == 2; + + if(result.length == 1){ + String onlyFile = result[0]; + if (isSpheremapFile(onlyFile)){ + result = new String[]{ "", onlyFile }; + }else{ + result = new String[]{ onlyFile, "" }; + } + } + + assert result.length == 2; + + return result; + } + +} diff --git a/src/main/java/jp/sfjp/mikutoga/pmd/parser/PmdParserBase.java b/src/main/java/jp/sfjp/mikutoga/pmd/parser/PmdParserBase.java index 720114c..b005258 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd/parser/PmdParserBase.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd/parser/PmdParserBase.java @@ -15,6 +15,7 @@ import jp.sfjp.mikutoga.bin.parser.CommonParser; import jp.sfjp.mikutoga.bin.parser.MmdEofException; import jp.sfjp.mikutoga.bin.parser.MmdFormatException; import jp.sfjp.mikutoga.bin.parser.TextDecoder; +import jp.sfjp.mikutoga.pmd.ShadingUtil; /** * PMDモデルファイルのパーサ基本部。 @@ -93,36 +94,6 @@ public class PmdParserBase extends CommonParser { } /** - * シェーディング用ファイル情報から - * テクスチャファイル名とスフィアマップファイル名を分離する。 - * @param shadingFile シェーディング用ファイル情報 - * @return [0]:テクスチャファイル名 [1]:スフィアマップファイル名。 - * 該当ファイル名が無い場合は空文字列。 - */ - public static String[] splitShadingFileInfo(String shadingFile){ - String[] result; - - result = shadingFile.split('\\'+"*", 2); - assert result.length == 1 || result.length == 2; - - if(result.length == 1){ - String onlyFile = result[0]; - result = new String[2]; - result[0] = ""; - result[1] = ""; - if(onlyFile.endsWith(".sph") || onlyFile.endsWith(".spa")){ - result[1] = onlyFile; - }else{ - result[0] = onlyFile; - } - } - - assert result.length == 2; - - return result; - } - - /** * 基本情報通知ハンドラを登録する。 * @param handler ハンドラ */ @@ -384,7 +355,7 @@ public class PmdParserBase extends CommonParser { String shadingFile = parsePmdText(PmdLimits.MAXBYTES_TEXTUREFILENAME); - String[] splitted = splitShadingFileInfo(shadingFile); + String[] splitted = ShadingUtil.splitShadingFileInfo(shadingFile); String textureFile = splitted[0]; String sphereFile = splitted[1]; diff --git a/src/test/java/jp/sfjp/mikutoga/pmd/ShadingUtilTest.java b/src/test/java/jp/sfjp/mikutoga/pmd/ShadingUtilTest.java new file mode 100644 index 0000000..a7b07a2 --- /dev/null +++ b/src/test/java/jp/sfjp/mikutoga/pmd/ShadingUtilTest.java @@ -0,0 +1,131 @@ +/* + */ + +package jp.sfjp.mikutoga.pmd; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * + */ +public class ShadingUtilTest { + + public ShadingUtilTest() { + } + + @BeforeClass + public static void setUpClass() { + } + + @AfterClass + public static void tearDownClass() { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + /** + * Test of isSpheremapFile method, of class ShadingUtil. + */ + @Test + public void testIsSpheremapFile() { + System.out.println("isSpheremapFile"); + + assertFalse(ShadingUtil.isSpheremapFile("")); + assertFalse(ShadingUtil.isSpheremapFile("a")); + assertFalse(ShadingUtil.isSpheremapFile("a.png")); + assertTrue(ShadingUtil.isSpheremapFile("a.sph")); + assertTrue(ShadingUtil.isSpheremapFile("a.spa")); + assertTrue(ShadingUtil.isSpheremapFile(".sph")); + assertTrue(ShadingUtil.isSpheremapFile(".spa")); + assertFalse(ShadingUtil.isSpheremapFile("sph")); + assertFalse(ShadingUtil.isSpheremapFile("spa")); + assertFalse(ShadingUtil.isSpheremapFile("a.SPH")); + assertFalse(ShadingUtil.isSpheremapFile("a.SPA")); + + return; + } + + /** + * Test of splitShadingFileInfo method, of class PmdParserBase. + */ + @Test + public void testSplitShadingFileInfo() { + System.out.println("splitShadingFileInfo"); + + String[] result; + + result = ShadingUtil.splitShadingFileInfo(""); + assertEquals(2, result.length); + assertEquals("", result[0]); + assertEquals("", result[1]); + + result = ShadingUtil.splitShadingFileInfo("a"); + assertEquals(2, result.length); + assertEquals("a", result[0]); + assertEquals("", result[1]); + + result = ShadingUtil.splitShadingFileInfo("a.sph"); + assertEquals(2, result.length); + assertEquals("", result[0]); + assertEquals("a.sph", result[1]); + + result = ShadingUtil.splitShadingFileInfo("a.spa"); + assertEquals(2, result.length); + assertEquals("", result[0]); + assertEquals("a.spa", result[1]); + + result = ShadingUtil.splitShadingFileInfo("a.spz"); + assertEquals(2, result.length); + assertEquals("a.spz", result[0]); + assertEquals("", result[1]); + + result = ShadingUtil.splitShadingFileInfo("a*b"); + assertEquals(2, result.length); + assertEquals("a", result[0]); + assertEquals("b", result[1]); + + result = ShadingUtil.splitShadingFileInfo("a*b*c"); + assertEquals(2, result.length); + assertEquals("a", result[0]); + assertEquals("b*c", result[1]); + + result = ShadingUtil.splitShadingFileInfo("*"); + assertEquals(2, result.length); + assertEquals("", result[0]); + assertEquals("", result[1]); + + result = ShadingUtil.splitShadingFileInfo("a*"); + assertEquals(2, result.length); + assertEquals("a", result[0]); + assertEquals("", result[1]); + + result = ShadingUtil.splitShadingFileInfo("*b"); + assertEquals(2, result.length); + assertEquals("", result[0]); + assertEquals("b", result[1]); + + result = ShadingUtil.splitShadingFileInfo("a.sph*"); + assertEquals(2, result.length); + assertEquals("a.sph", result[0]); + assertEquals("", result[1]); + + result = ShadingUtil.splitShadingFileInfo("a.spa*"); + assertEquals(2, result.length); + assertEquals("a.spa", result[0]); + assertEquals("", result[1]); + + return; + } + +} diff --git a/src/test/java/jp/sfjp/mikutoga/pmd/parser/PmdParserBaseTest.java b/src/test/java/jp/sfjp/mikutoga/pmd/parser/PmdParserBaseTest.java new file mode 100644 index 0000000..bac02c9 --- /dev/null +++ b/src/test/java/jp/sfjp/mikutoga/pmd/parser/PmdParserBaseTest.java @@ -0,0 +1,58 @@ +/* + */ + +package jp.sfjp.mikutoga.pmd.parser; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * + */ +public class PmdParserBaseTest { + + public PmdParserBaseTest() { + } + + @BeforeClass + public static void setUpClass() { + } + + @AfterClass + public static void tearDownClass() { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + /** + * Test of chopLastLF method, of class PmdParserBase. + */ + @Test + public void testChopLastLF() { + System.out.println("chopLastLF"); + + assertEquals("", PmdParserBase.chopLastLF("")); + assertEquals("abc", PmdParserBase.chopLastLF("abc")); + assertEquals("abc\r", PmdParserBase.chopLastLF("abc\r")); + assertEquals("abc", PmdParserBase.chopLastLF("abc\n")); + assertEquals("abc\r", PmdParserBase.chopLastLF("abc\r\n")); + assertEquals("abc\nxyz", PmdParserBase.chopLastLF("abc\nxyz")); + assertEquals("abc\r\nxyz", PmdParserBase.chopLastLF("abc\r\nxyz")); + assertEquals("\r", PmdParserBase.chopLastLF("\r")); + assertEquals("", PmdParserBase.chopLastLF("\n")); + assertEquals("\r", PmdParserBase.chopLastLF("\r\n")); + + return; + } + +}