-/*\r
- * pmd parser extension 3\r
- *\r
- * License : The MIT License\r
- * Copyright(c) 2010 MikuToga Partners\r
- */\r
-\r
-package jp.sourceforge.mikutoga.parser.pmd;\r
-\r
-import java.io.IOException;\r
-import jp.sourceforge.mikutoga.parser.MmdFormatException;\r
-import jp.sourceforge.mikutoga.parser.MmdSource;\r
-\r
-/**\r
- * PMDモデルファイルのパーサ拡張その3。\r
- * ※剛体情報対応\r
- */\r
-public class PmdParserExt3 extends PmdParserExt2 {\r
-\r
- private static final int RIGID_DATA_SZ = 83;\r
- private static final int JOINT_DATA_SZ = 124;\r
-\r
- private PmdRigidHandler rigidHandler = null;\r
- private PmdJointHandler jointHandler = null;\r
-\r
- /**\r
- * コンストラクタ。\r
- * @param source 入力ソース\r
- */\r
- public PmdParserExt3(MmdSource source){\r
- super(source);\r
- return;\r
- }\r
-\r
- /**\r
- * 剛体ハンドラを登録する。\r
- * @param handler 剛体ハンドラ\r
- */\r
- public void setRigidHandler(PmdRigidHandler handler){\r
- this.rigidHandler = handler;\r
- return;\r
- }\r
-\r
- /**\r
- * ジョイントハンドラを登録する。\r
- * @param handler ジョイントハンドラ\r
- */\r
- public void setJointHandler(PmdJointHandler handler){\r
- this.jointHandler = handler;\r
- return;\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * @throws IOException {@inheritDoc}\r
- * @throws MmdFormatException {@inheritDoc}\r
- */\r
- @Override\r
- protected void parseBody()\r
- throws IOException, MmdFormatException {\r
- super.parseBody();\r
-\r
- if(hasMore()){\r
- parseRigidList();\r
- parseJointList();\r
- }\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * 剛体情報のパースと通知。\r
- * @throws IOException IOエラー\r
- * @throws MmdFormatException フォーマットエラー\r
- */\r
- private void parseRigidList() throws IOException, MmdFormatException{\r
- int rigidNum = parseInteger();\r
-\r
- if(this.rigidHandler == null){\r
- skip(RIGID_DATA_SZ * rigidNum);\r
- return;\r
- }\r
-\r
- this.rigidHandler.loopStart(PmdRigidHandler.RIGID_LIST, rigidNum);\r
-\r
- for(int ct = 0; ct < rigidNum; ct++){\r
- String rigidName =\r
- parseZeroTermString(PmdLimits.MAXBYTES_RIGIDNAME);\r
- this.rigidHandler.pmdRigidName(rigidName);\r
-\r
- int linkedBoneId = parseUShortAsInteger();\r
- int rigidGroupId = parseUByteAsInteger();\r
- short collisionMap = parseShort();\r
- this.rigidHandler.pmdRigidInfo(rigidGroupId, linkedBoneId);\r
-\r
- byte shapeType = parseByte();\r
- float width = parseFloat();\r
- float height = parseFloat();\r
- float depth = parseFloat();\r
- this.rigidHandler.pmdRigidShape(shapeType, width, height, depth);\r
-\r
- float posX = parseFloat();\r
- float posY = parseFloat();\r
- float posZ = parseFloat();\r
- this.rigidHandler.pmdRigidPosition(posX, posY, posZ);\r
-\r
- float rotX = parseFloat();\r
- float rotY = parseFloat();\r
- float rotZ = parseFloat();\r
- this.rigidHandler.pmdRigidRotation(rotX, rotY, rotZ);\r
-\r
- float mass = parseFloat();\r
- float dampingPos = parseFloat();\r
- float dampingRot = parseFloat();\r
- float restitution = parseFloat();\r
- float friction = parseFloat();\r
- this.rigidHandler.pmdRigidPhysics(mass,\r
- dampingPos, dampingRot,\r
- restitution, friction );\r
-\r
- byte behaveType = parseByte();\r
- this.rigidHandler.pmdRigidBehavior(behaveType, collisionMap);\r
-\r
- this.rigidHandler.loopNext(PmdRigidHandler.RIGID_LIST);\r
- }\r
-\r
- this.rigidHandler.loopEnd(PmdRigidHandler.RIGID_LIST);\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * ジョイント情報のパースと通知。\r
- * @throws IOException IOエラー\r
- * @throws MmdFormatException フォーマットエラー\r
- */\r
- private void parseJointList() throws IOException, MmdFormatException{\r
- int jointNum = parseInteger();\r
-\r
- if(this.jointHandler == null){\r
- skip(JOINT_DATA_SZ * jointNum);\r
- return;\r
- }\r
-\r
- this.jointHandler.loopStart(PmdJointHandler.JOINT_LIST, jointNum);\r
-\r
- for(int ct = 0; ct < jointNum; ct++){\r
- String jointName =\r
- parseZeroTermString(PmdLimits.MAXBYTES_JOINTNAME);\r
- this.jointHandler.pmdJointName(jointName);\r
-\r
- int rigidIdA = parseInteger();\r
- int rigidIdB = parseInteger();\r
- this.jointHandler.pmdJointLink(rigidIdA, rigidIdB);\r
-\r
- float posX = parseFloat();\r
- float posY = parseFloat();\r
- float posZ = parseFloat();\r
- this.jointHandler.pmdJointPosition(posX, posY, posZ);\r
-\r
- float rotX = parseFloat();\r
- float rotY = parseFloat();\r
- float rotZ = parseFloat();\r
- this.jointHandler.pmdJointRotation(rotX, rotY, rotZ);\r
-\r
- float posXlim1 = parseFloat();\r
- float posYlim1 = parseFloat();\r
- float posZlim1 = parseFloat();\r
- float posXlim2 = parseFloat();\r
- float posYlim2 = parseFloat();\r
- float posZlim2 = parseFloat();\r
- this.jointHandler.pmdPositionLimit(posXlim1, posXlim2,\r
- posYlim1, posYlim2,\r
- posZlim1, posZlim2 );\r
-\r
- float rotXlim1 = parseFloat();\r
- float rotYlim1 = parseFloat();\r
- float rotZlim1 = parseFloat();\r
- float rotXlim2 = parseFloat();\r
- float rotYlim2 = parseFloat();\r
- float rotZlim2 = parseFloat();\r
- this.jointHandler.pmdRotationLimit(rotXlim1, rotXlim2,\r
- rotYlim1, rotYlim2,\r
- rotZlim1, rotZlim2 );\r
-\r
- float elasticPosX = parseFloat();\r
- float elasticPosY = parseFloat();\r
- float elasticPosZ = parseFloat();\r
- this.jointHandler.pmdElasticPosition(elasticPosX,\r
- elasticPosY,\r
- elasticPosZ );\r
-\r
- float elasticRotX = parseFloat();\r
- float elasticRotY = parseFloat();\r
- float elasticRotZ = parseFloat();\r
- this.jointHandler.pmdElasticRotation(elasticRotX,\r
- elasticRotY,\r
- elasticRotZ );\r
-\r
- this.jointHandler.loopNext(PmdJointHandler.JOINT_LIST);\r
- }\r
-\r
- this.jointHandler.loopEnd(PmdJointHandler.JOINT_LIST);\r
-\r
- return;\r
- }\r
-\r
-}\r
+/*
+ * pmd parser extension 3
+ *
+ * License : The MIT License
+ * Copyright(c) 2010 MikuToga Partners
+ */
+
+package jp.sourceforge.mikutoga.parser.pmd;
+
+import java.io.IOException;
+import jp.sourceforge.mikutoga.parser.MmdFormatException;
+import jp.sourceforge.mikutoga.parser.MmdSource;
+
+/**
+ * PMDモデルファイルのパーサ拡張その3。
+ * ※剛体情報対応
+ */
+public class PmdParserExt3 extends PmdParserExt2 {
+
+ private static final int RIGID_DATA_SZ = 83;
+ private static final int JOINT_DATA_SZ = 124;
+
+ private PmdRigidHandler rigidHandler = null;
+ private PmdJointHandler jointHandler = null;
+
+ /**
+ * コンストラクタ。
+ * @param source 入力ソース
+ */
+ public PmdParserExt3(MmdSource source){
+ super(source);
+ return;
+ }
+
+ /**
+ * 剛体ハンドラを登録する。
+ * @param handler 剛体ハンドラ
+ */
+ public void setRigidHandler(PmdRigidHandler handler){
+ this.rigidHandler = handler;
+ return;
+ }
+
+ /**
+ * ジョイントハンドラを登録する。
+ * @param handler ジョイントハンドラ
+ */
+ public void setJointHandler(PmdJointHandler handler){
+ this.jointHandler = handler;
+ return;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @throws IOException {@inheritDoc}
+ * @throws MmdFormatException {@inheritDoc}
+ */
+ @Override
+ protected void parseBody()
+ throws IOException, MmdFormatException {
+ super.parseBody();
+
+ if(hasMore()){
+ parseRigidList();
+ parseJointList();
+ }
+
+ return;
+ }
+
+ /**
+ * 剛体情報のパースと通知。
+ * @throws IOException IOエラー
+ * @throws MmdFormatException フォーマットエラー
+ */
+ private void parseRigidList() throws IOException, MmdFormatException{
+ int rigidNum = parseInteger();
+
+ if(this.rigidHandler == null){
+ skip(RIGID_DATA_SZ * rigidNum);
+ return;
+ }
+
+ this.rigidHandler.loopStart(PmdRigidHandler.RIGID_LIST, rigidNum);
+
+ for(int ct = 0; ct < rigidNum; ct++){
+ String rigidName =
+ parseZeroTermString(PmdLimits.MAXBYTES_RIGIDNAME);
+ this.rigidHandler.pmdRigidName(rigidName);
+
+ int linkedBoneId = parseUShortAsInteger();
+ int rigidGroupId = parseUByteAsInteger();
+ short collisionMap = parseShort();
+ this.rigidHandler.pmdRigidInfo(rigidGroupId, linkedBoneId);
+
+ byte shapeType = parseByte();
+ float width = parseFloat();
+ float height = parseFloat();
+ float depth = parseFloat();
+ this.rigidHandler.pmdRigidShape(shapeType, width, height, depth);
+
+ float posX = parseFloat();
+ float posY = parseFloat();
+ float posZ = parseFloat();
+ this.rigidHandler.pmdRigidPosition(posX, posY, posZ);
+
+ float rotX = parseFloat();
+ float rotY = parseFloat();
+ float rotZ = parseFloat();
+ this.rigidHandler.pmdRigidRotation(rotX, rotY, rotZ);
+
+ float mass = parseFloat();
+ float dampingPos = parseFloat();
+ float dampingRot = parseFloat();
+ float restitution = parseFloat();
+ float friction = parseFloat();
+ this.rigidHandler.pmdRigidPhysics(mass,
+ dampingPos, dampingRot,
+ restitution, friction );
+
+ byte behaveType = parseByte();
+ this.rigidHandler.pmdRigidBehavior(behaveType, collisionMap);
+
+ this.rigidHandler.loopNext(PmdRigidHandler.RIGID_LIST);
+ }
+
+ this.rigidHandler.loopEnd(PmdRigidHandler.RIGID_LIST);
+
+ return;
+ }
+
+ /**
+ * ジョイント情報のパースと通知。
+ * @throws IOException IOエラー
+ * @throws MmdFormatException フォーマットエラー
+ */
+ private void parseJointList() throws IOException, MmdFormatException{
+ int jointNum = parseInteger();
+
+ if(this.jointHandler == null){
+ skip(JOINT_DATA_SZ * jointNum);
+ return;
+ }
+
+ this.jointHandler.loopStart(PmdJointHandler.JOINT_LIST, jointNum);
+
+ for(int ct = 0; ct < jointNum; ct++){
+ String jointName =
+ parseZeroTermString(PmdLimits.MAXBYTES_JOINTNAME);
+ this.jointHandler.pmdJointName(jointName);
+
+ int rigidIdA = parseInteger();
+ int rigidIdB = parseInteger();
+ this.jointHandler.pmdJointLink(rigidIdA, rigidIdB);
+
+ float posX = parseFloat();
+ float posY = parseFloat();
+ float posZ = parseFloat();
+ this.jointHandler.pmdJointPosition(posX, posY, posZ);
+
+ float rotX = parseFloat();
+ float rotY = parseFloat();
+ float rotZ = parseFloat();
+ this.jointHandler.pmdJointRotation(rotX, rotY, rotZ);
+
+ float posXlim1 = parseFloat();
+ float posYlim1 = parseFloat();
+ float posZlim1 = parseFloat();
+ float posXlim2 = parseFloat();
+ float posYlim2 = parseFloat();
+ float posZlim2 = parseFloat();
+ this.jointHandler.pmdPositionLimit(posXlim1, posXlim2,
+ posYlim1, posYlim2,
+ posZlim1, posZlim2 );
+
+ float rotXlim1 = parseFloat();
+ float rotYlim1 = parseFloat();
+ float rotZlim1 = parseFloat();
+ float rotXlim2 = parseFloat();
+ float rotYlim2 = parseFloat();
+ float rotZlim2 = parseFloat();
+ this.jointHandler.pmdRotationLimit(rotXlim1, rotXlim2,
+ rotYlim1, rotYlim2,
+ rotZlim1, rotZlim2 );
+
+ float elasticPosX = parseFloat();
+ float elasticPosY = parseFloat();
+ float elasticPosZ = parseFloat();
+ this.jointHandler.pmdElasticPosition(elasticPosX,
+ elasticPosY,
+ elasticPosZ );
+
+ float elasticRotX = parseFloat();
+ float elasticRotY = parseFloat();
+ float elasticRotZ = parseFloat();
+ this.jointHandler.pmdElasticRotation(elasticRotX,
+ elasticRotY,
+ elasticRotZ );
+
+ this.jointHandler.loopNext(PmdJointHandler.JOINT_LIST);
+ }
+
+ this.jointHandler.loopEnd(PmdJointHandler.JOINT_LIST);
+
+ return;
+ }
+
+}