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.PmdConst;
+import jp.sfjp.mikutoga.pmd.ShadingUtil;
/**
* PMDモデルファイルのパーサ基本部。
private final TextDecoder decoderWin31j = new TextDecoder(CS_WIN31J);
- private PmdBasicHandler basicHandler = NullHandler.HANDLER;
- private PmdShapeHandler shapeHandler = NullHandler.HANDLER;
- private PmdMaterialHandler materialHandler = NullHandler.HANDLER;
- private PmdBoneHandler boneHandler = NullHandler.HANDLER;
- private PmdMorphHandler morphHandler = NullHandler.HANDLER;
+ private PmdBasicHandler basicHandler = PmdUnifiedHandler.EMPTY;
+ private PmdShapeHandler shapeHandler = PmdUnifiedHandler.EMPTY;
+ private PmdMaterialHandler materialHandler = PmdUnifiedHandler.EMPTY;
+ private PmdBoneHandler boneHandler = PmdUnifiedHandler.EMPTY;
+ private PmdMorphHandler morphHandler = PmdUnifiedHandler.EMPTY;
private int boneCount = -1;
private int morphCount = -1;
/**
* 文字列の最後がLF(0x0a)の場合削除する。
+ *
* <p>ボーングループ名対策。
+ *
* @param name 文字列
* @return 末尾LFが削除された文字列
*/
}
/**
- * シェーディング用ファイル情報から
- * テクスチャファイル名とスフィアマップファイル名を分離する。
- * @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 ハンドラ
*/
public void setBasicHandler(PmdBasicHandler handler){
if(handler == null){
- this.basicHandler = NullHandler.HANDLER;
+ this.basicHandler = PmdUnifiedHandler.EMPTY;
}else{
this.basicHandler = handler;
}
*/
public void setShapeHandler(PmdShapeHandler handler){
if(handler == null){
- this.shapeHandler = NullHandler.HANDLER;
+ this.shapeHandler = PmdUnifiedHandler.EMPTY;
}else{
this.shapeHandler = handler;
}
*/
public void setMaterialHandler(PmdMaterialHandler handler){
if(handler == null){
- this.materialHandler = NullHandler.HANDLER;
+ this.materialHandler = PmdUnifiedHandler.EMPTY;
}else{
this.materialHandler = handler;
}
*/
public void setBoneHandler(PmdBoneHandler handler){
if(handler == null){
- this.boneHandler = NullHandler.HANDLER;
+ this.boneHandler = PmdUnifiedHandler.EMPTY;
}else{
this.boneHandler = handler;
}
*/
public void setMorphHandler(PmdMorphHandler handler){
if(handler == null){
- this.morphHandler = NullHandler.HANDLER;
+ this.morphHandler = PmdUnifiedHandler.EMPTY;
}else{
this.morphHandler = handler;
}
/**
* 指定されたバイト長に収まるゼロ終端(0x00)文字列を読み込む。
+ *
* <p>入力バイト列はwindows-31jエンコーディングとして解釈される。
+ *
* <p>ゼロ終端以降のデータは無視されるが、
* IO入力は指定バイト数だけ読み進められる。
* ゼロ終端が見つからないまま指定バイト数が読み込み終わった場合、
* そこまでのデータから文字列を構成する。
+ *
* @param byteLen 読み込みバイト数
* @return デコードされた文字列
* @throws IOException IOエラー
}
String modelName =
- parsePmdText(PmdLimits.MAXBYTES_MODELNAME);
+ parsePmdText(PmdConst.MAXBYTES_MODELNAME);
String description =
- parsePmdText(PmdLimits.MAXBYTES_MODELDESC);
+ parsePmdText(PmdConst.MAXBYTES_MODELDESC);
description = description.replace(CRLF, LF);
this.basicHandler.pmdHeaderInfo(header);
int surfaceCount = parseLeInt();
String shadingFile =
- parsePmdText(PmdLimits.MAXBYTES_TEXTUREFILENAME);
- String[] splitted = splitShadingFileInfo(shadingFile);
+ parsePmdText(PmdConst.MAXBYTES_TEXTUREFILENAME);
+ String[] splitted = ShadingUtil.splitShadingFileInfo(shadingFile);
String textureFile = splitted[0];
String sphereFile = splitted[1];
for(int ct = 0; ct < this.boneCount; ct++){
String boneName =
- parsePmdText(PmdLimits.MAXBYTES_BONENAME);
+ parsePmdText(PmdConst.MAXBYTES_BONENAME);
int parentId = parseLeUShortAsInt();
int tailId = parseLeUShortAsInt();
byte boneKind = parseByte();
for(int ct = 0; ct < this.morphCount; ct++){
String morphName =
- parsePmdText(PmdLimits.MAXBYTES_MORPHNAME);
+ parsePmdText(PmdConst.MAXBYTES_MORPHNAME);
int vertexCount = parseLeInt();
byte morphType = parseByte();
for(int ct = 0; ct < this.boneGroupCount; ct++){
String groupName =
- parsePmdText(PmdLimits.MAXBYTES_BONEGROUPNAME);
+ parsePmdText(PmdConst.MAXBYTES_BONEGROUPNAME);
groupName = chopLastLF(groupName);
this.boneHandler.pmdBoneGroupInfo(groupName);