2 * pmd parser extension 3
\r
4 * License : The MIT License
\r
5 * Copyright(c) 2010 MikuToga Partners
\r
8 package jp.sourceforge.mikutoga.parser.pmd;
\r
10 import java.io.IOException;
\r
11 import jp.sourceforge.mikutoga.parser.MmdFormatException;
\r
12 import jp.sourceforge.mikutoga.parser.MmdSource;
\r
15 * PMDモデルファイルのパーサ拡張その3。
\r
18 public class PmdParserExt3 extends PmdParserExt2 {
\r
20 private static final int RIGID_DATA_SZ = 83;
\r
21 private static final int JOINT_DATA_SZ = 124;
\r
23 private PmdRigidHandler rigidHandler = null;
\r
24 private PmdJointHandler jointHandler = null;
\r
28 * @param source 入力ソース
\r
30 public PmdParserExt3(MmdSource source){
\r
37 * @param handler 剛体ハンドラ
\r
39 public void setRigidHandler(PmdRigidHandler handler){
\r
40 this.rigidHandler = handler;
\r
46 * @param handler ジョイントハンドラ
\r
48 public void setJointHandler(PmdJointHandler handler){
\r
49 this.jointHandler = handler;
\r
55 * @throws IOException {@inheritDoc}
\r
56 * @throws MmdFormatException {@inheritDoc}
\r
59 protected void parseBody()
\r
60 throws IOException, MmdFormatException {
\r
73 * @throws IOException IOエラー
\r
74 * @throws MmdFormatException フォーマットエラー
\r
76 private void parseRigidList() throws IOException, MmdFormatException{
\r
77 int rigidNum = parseInteger();
\r
79 if(this.rigidHandler == null){
\r
80 skip(RIGID_DATA_SZ * rigidNum);
\r
84 this.rigidHandler.loopStart(PmdRigidHandler.RIGID_LIST, rigidNum);
\r
86 for(int ct = 0; ct < rigidNum; ct++){
\r
88 parseZeroTermString(PmdLimits.MAXBYTES_RIGIDNAME);
\r
89 this.rigidHandler.pmdRigidName(rigidName);
\r
91 int linkedBoneId = parseUShortAsInteger();
\r
92 int rigidGroupId = parseUByteAsInteger();
\r
93 short collisionMap = parseShort();
\r
94 this.rigidHandler.pmdRigidInfo(rigidGroupId, linkedBoneId);
\r
96 byte shapeType = parseByte();
\r
97 float width = parseFloat();
\r
98 float height = parseFloat();
\r
99 float depth = parseFloat();
\r
100 this.rigidHandler.pmdRigidShape(shapeType, width, height, depth);
\r
102 float posX = parseFloat();
\r
103 float posY = parseFloat();
\r
104 float posZ = parseFloat();
\r
105 this.rigidHandler.pmdRigidPosition(posX, posY, posZ);
\r
107 float rotX = parseFloat();
\r
108 float rotY = parseFloat();
\r
109 float rotZ = parseFloat();
\r
110 this.rigidHandler.pmdRigidRotation(rotX, rotY, rotZ);
\r
112 float mass = parseFloat();
\r
113 float dampingPos = parseFloat();
\r
114 float dampingRot = parseFloat();
\r
115 float restitution = parseFloat();
\r
116 float friction = parseFloat();
\r
117 this.rigidHandler.pmdRigidPhysics(mass,
\r
118 dampingPos, dampingRot,
\r
119 restitution, friction );
\r
121 byte behaveType = parseByte();
\r
122 this.rigidHandler.pmdRigidBehavior(behaveType, collisionMap);
\r
124 this.rigidHandler.loopNext(PmdRigidHandler.RIGID_LIST);
\r
127 this.rigidHandler.loopEnd(PmdRigidHandler.RIGID_LIST);
\r
134 * @throws IOException IOエラー
\r
135 * @throws MmdFormatException フォーマットエラー
\r
137 private void parseJointList() throws IOException, MmdFormatException{
\r
138 int jointNum = parseInteger();
\r
140 if(this.jointHandler == null){
\r
141 skip(JOINT_DATA_SZ * jointNum);
\r
145 this.jointHandler.loopStart(PmdJointHandler.JOINT_LIST, jointNum);
\r
147 for(int ct = 0; ct < jointNum; ct++){
\r
149 parseZeroTermString(PmdLimits.MAXBYTES_JOINTNAME);
\r
150 this.jointHandler.pmdJointName(jointName);
\r
152 int rigidIdA = parseInteger();
\r
153 int rigidIdB = parseInteger();
\r
154 this.jointHandler.pmdJointLink(rigidIdA, rigidIdB);
\r
156 float posX = parseFloat();
\r
157 float posY = parseFloat();
\r
158 float posZ = parseFloat();
\r
159 this.jointHandler.pmdJointPosition(posX, posY, posZ);
\r
161 float rotX = parseFloat();
\r
162 float rotY = parseFloat();
\r
163 float rotZ = parseFloat();
\r
164 this.jointHandler.pmdJointRotation(rotX, rotY, rotZ);
\r
166 float posXlim1 = parseFloat();
\r
167 float posYlim1 = parseFloat();
\r
168 float posZlim1 = parseFloat();
\r
169 float posXlim2 = parseFloat();
\r
170 float posYlim2 = parseFloat();
\r
171 float posZlim2 = parseFloat();
\r
172 this.jointHandler.pmdPositionLimit(posXlim1, posXlim2,
\r
173 posYlim1, posYlim2,
\r
174 posZlim1, posZlim2 );
\r
176 float rotXlim1 = parseFloat();
\r
177 float rotYlim1 = parseFloat();
\r
178 float rotZlim1 = parseFloat();
\r
179 float rotXlim2 = parseFloat();
\r
180 float rotYlim2 = parseFloat();
\r
181 float rotZlim2 = parseFloat();
\r
182 this.jointHandler.pmdRotationLimit(rotXlim1, rotXlim2,
\r
183 rotYlim1, rotYlim2,
\r
184 rotZlim1, rotZlim2 );
\r
186 float elasticPosX = parseFloat();
\r
187 float elasticPosY = parseFloat();
\r
188 float elasticPosZ = parseFloat();
\r
189 this.jointHandler.pmdElasticPosition(elasticPosX,
\r
193 float elasticRotX = parseFloat();
\r
194 float elasticRotY = parseFloat();
\r
195 float elasticRotZ = parseFloat();
\r
196 this.jointHandler.pmdElasticRotation(elasticRotX,
\r
200 this.jointHandler.loopNext(PmdJointHandler.JOINT_LIST);
\r
203 this.jointHandler.loopEnd(PmdJointHandler.JOINT_LIST);
\r