OSDN Git Service

1.105.3-SNAPSHOT版開発開始
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / parser / pmd / PmdParserExt3.java
1 /*\r
2  * pmd parser extension 3\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2010 MikuToga Partners\r
6  */\r
7 \r
8 package jp.sourceforge.mikutoga.parser.pmd;\r
9 \r
10 import java.io.IOException;\r
11 import jp.sourceforge.mikutoga.parser.MmdFormatException;\r
12 import jp.sourceforge.mikutoga.parser.MmdSource;\r
13 \r
14 /**\r
15  * PMDモデルファイルのパーサ拡張その3。\r
16  * ※剛体情報対応\r
17  */\r
18 public class PmdParserExt3 extends PmdParserExt2 {\r
19 \r
20     private static final int RIGID_DATA_SZ = 83;\r
21     private static final int JOINT_DATA_SZ = 124;\r
22 \r
23     private PmdRigidHandler rigidHandler = null;\r
24     private PmdJointHandler jointHandler = null;\r
25 \r
26     /**\r
27      * コンストラクタ。\r
28      * @param source 入力ソース\r
29      */\r
30     public PmdParserExt3(MmdSource source){\r
31         super(source);\r
32         return;\r
33     }\r
34 \r
35     /**\r
36      * 剛体ハンドラを登録する。\r
37      * @param handler 剛体ハンドラ\r
38      */\r
39     public void setRigidHandler(PmdRigidHandler handler){\r
40         this.rigidHandler = handler;\r
41         return;\r
42     }\r
43 \r
44     /**\r
45      * ジョイントハンドラを登録する。\r
46      * @param handler ジョイントハンドラ\r
47      */\r
48     public void setJointHandler(PmdJointHandler handler){\r
49         this.jointHandler = handler;\r
50         return;\r
51     }\r
52 \r
53     /**\r
54      * {@inheritDoc}\r
55      * @throws IOException {@inheritDoc}\r
56      * @throws MmdFormatException {@inheritDoc}\r
57      */\r
58     @Override\r
59     protected void parseBody()\r
60             throws IOException, MmdFormatException {\r
61         super.parseBody();\r
62 \r
63         if(hasMore()){\r
64             parseRigidList();\r
65             parseJointList();\r
66         }\r
67 \r
68         return;\r
69     }\r
70 \r
71     /**\r
72      * 剛体情報のパースと通知。\r
73      * @throws IOException IOエラー\r
74      * @throws MmdFormatException フォーマットエラー\r
75      */\r
76     private void parseRigidList() throws IOException, MmdFormatException{\r
77         int rigidNum = parseInteger();\r
78 \r
79         if(this.rigidHandler == null){\r
80             skip(RIGID_DATA_SZ * rigidNum);\r
81             return;\r
82         }\r
83 \r
84         this.rigidHandler.loopStart(PmdRigidHandler.RIGID_LIST, rigidNum);\r
85 \r
86         for(int ct = 0; ct < rigidNum; ct++){\r
87             String rigidName =\r
88                     parseZeroTermString(PmdLimits.MAXBYTES_RIGIDNAME);\r
89             this.rigidHandler.pmdRigidName(rigidName);\r
90 \r
91             int linkedBoneId = parseUShortAsInteger();\r
92             int rigidGroupId = parseUByteAsInteger();\r
93             short collisionMap = parseShort();\r
94             this.rigidHandler.pmdRigidInfo(rigidGroupId, linkedBoneId);\r
95 \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
101 \r
102             float posX = parseFloat();\r
103             float posY = parseFloat();\r
104             float posZ = parseFloat();\r
105             this.rigidHandler.pmdRigidPosition(posX, posY, posZ);\r
106 \r
107             float rotX = parseFloat();\r
108             float rotY = parseFloat();\r
109             float rotZ = parseFloat();\r
110             this.rigidHandler.pmdRigidRotation(rotX, rotY, rotZ);\r
111 \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
120 \r
121             byte behaveType = parseByte();\r
122             this.rigidHandler.pmdRigidBehavior(behaveType, collisionMap);\r
123 \r
124             this.rigidHandler.loopNext(PmdRigidHandler.RIGID_LIST);\r
125         }\r
126 \r
127         this.rigidHandler.loopEnd(PmdRigidHandler.RIGID_LIST);\r
128 \r
129         return;\r
130     }\r
131 \r
132     /**\r
133      * ジョイント情報のパースと通知。\r
134      * @throws IOException IOエラー\r
135      * @throws MmdFormatException フォーマットエラー\r
136      */\r
137     private void parseJointList() throws IOException, MmdFormatException{\r
138         int jointNum = parseInteger();\r
139 \r
140         if(this.jointHandler == null){\r
141             skip(JOINT_DATA_SZ * jointNum);\r
142             return;\r
143         }\r
144 \r
145         this.jointHandler.loopStart(PmdJointHandler.JOINT_LIST, jointNum);\r
146 \r
147         for(int ct = 0; ct < jointNum; ct++){\r
148             String jointName =\r
149                     parseZeroTermString(PmdLimits.MAXBYTES_JOINTNAME);\r
150             this.jointHandler.pmdJointName(jointName);\r
151 \r
152             int rigidIdA = parseInteger();\r
153             int rigidIdB = parseInteger();\r
154             this.jointHandler.pmdJointLink(rigidIdA, rigidIdB);\r
155 \r
156             float posX = parseFloat();\r
157             float posY = parseFloat();\r
158             float posZ = parseFloat();\r
159             this.jointHandler.pmdJointPosition(posX, posY, posZ);\r
160 \r
161             float rotX = parseFloat();\r
162             float rotY = parseFloat();\r
163             float rotZ = parseFloat();\r
164             this.jointHandler.pmdJointRotation(rotX, rotY, rotZ);\r
165 \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
175 \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
185 \r
186             float elasticPosX = parseFloat();\r
187             float elasticPosY = parseFloat();\r
188             float elasticPosZ = parseFloat();\r
189             this.jointHandler.pmdElasticPosition(elasticPosX,\r
190                                                  elasticPosY,\r
191                                                  elasticPosZ );\r
192 \r
193             float elasticRotX = parseFloat();\r
194             float elasticRotY = parseFloat();\r
195             float elasticRotZ = parseFloat();\r
196             this.jointHandler.pmdElasticRotation(elasticRotX,\r
197                                                  elasticRotY,\r
198                                                  elasticRotZ );\r
199 \r
200             this.jointHandler.loopNext(PmdJointHandler.JOINT_LIST);\r
201         }\r
202 \r
203         this.jointHandler.loopEnd(PmdJointHandler.JOINT_LIST);\r
204 \r
205         return;\r
206     }\r
207 \r
208 }\r