*/
public class PmdParserBase extends CommonParser {
+ public static final int HEADER_LENGTH = 7;
+
/** 改行文字列 CR。 */
protected static final String CR = "\r"; // 0x0d
/** 改行文字列 LF。 */
/** 改行文字列 CRLF。 */
protected static final String CRLF = CR + LF; // 0x0d, 0x0a
- private static final String MAGIC = "Pmd";
- private static final int MAGIC_SZ = MAGIC.getBytes(CS_WIN31J).length;
+ private static final byte[] MAGIC_BYTES = {
+ (byte)0x50, (byte)0x6d, (byte)0x64, // "Pmd"
+ (byte)0x00, (byte)0x00, (byte)0x80, (byte)0x3f, // 1.0f
+ };
private static final int VERTEX_DATA_SZ = 38;
private static final int SURFACE_DATA_SZ = 6;
private static final int GROUPEDBONE_DATA_SZ = 3;
+ static{
+ assert MAGIC_BYTES.length == HEADER_LENGTH;
+ }
+
+
private PmdBasicHandler basicHandler = null;
private PmdShapeHandler shapeHandler = null;
private PmdMaterialHandler materialHandler = null;
* @throws MmdFormatException フォーマットエラー
*/
private void parsePmdHeader() throws IOException, MmdFormatException{
- String magic = parseZeroTermWin31J(MAGIC_SZ);
- if( ! magic.equals(MAGIC) ){
- throw new MmdFormatException("unrecognized magic data");
+ byte[] header = new byte[HEADER_LENGTH];
+ parseByteArray(header);
+
+ for(int idx = 0; idx < MAGIC_BYTES.length; idx++){
+ if(header[idx] != MAGIC_BYTES[idx]){
+ throw new MmdFormatException("unknown PMD-header type");
+ }
}
- float ver = parseFloat();
String modelName =
parseZeroTermWin31J(PmdLimits.MAXBYTES_MODELNAME);
String description =
description = description.replace(CRLF, LF);
if(this.basicHandler != null){
- this.basicHandler.pmdHeaderInfo(ver);
+ this.basicHandler.pmdHeaderInfo(header);
this.basicHandler.pmdModelInfo(modelName, description);
}
*/
public class PmdModel {
- /** デフォルトのヘッダバージョン。 */
- public static final float DEF_HEADERVER = 1.0f;
-
- private float headerVersion = DEF_HEADERVER;
-
private final I18nText modelName = new I18nText();
private final I18nText description = new I18nText();
}
/**
- * PMDファイルのヘッダバージョンを返す。
- * @return PMDファイルのヘッダバージョン
- */
- public float getHeaderVersion(){
- return this.headerVersion;
- }
-
- /**
- * PMDファイルのヘッダバージョンを設定する。
- * @param ver PMDファイルのヘッダバージョン
- */
- public void setHeaderVersion(float ver){
- this.headerVersion = ver;
- return;
- }
-
- /**
* モデル名を返す。
* @return モデル名
*/
/** 影響元IKボーンが無い場合の便宜的なボーンID。 */
public static final int NOIKBONE_ID = 0x0000;
- private static final String MAGIC = "Pmd";
+ private static final byte[] MAGIC_BYTES = {
+ (byte)0x50, (byte)0x6d, (byte)0x64, // "Pmd"
+ (byte)0x00, (byte)0x00, (byte)0x80, (byte)0x3f, // 1.0f
+ };
private static final byte[] NULLFILLER =
{ (byte)0x00 };
*/
private void dumpBasic(PmdModel model)
throws IOException, IllegalPmdTextException{
- dumpCharSequence(MAGIC);
- float ver = model.getHeaderVersion();
- dumpFloat(ver);
+ for(int idx=0; idx < MAGIC_BYTES.length; idx++){
+ dumpByte(MAGIC_BYTES[idx]);
+ }
String modelName = model.getModelName() .getPrimaryText();
String description = model.getDescription().getPrimaryText();