OSDN Git Service

PMD出力機能及びXML入出力機能のソースをマージ
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / pmd / pmdexporter / PmdExporterExt3.java
1 /*\r
2  * model exporter for pmd-file(Ext3)\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.pmd.pmdexporter;\r
9 \r
10 import java.io.IOException;\r
11 import java.io.OutputStream;\r
12 import java.util.List;\r
13 import jp.sourceforge.mikutoga.parser.pmd.PmdLimits;\r
14 import jp.sourceforge.mikutoga.pmd.BoneInfo;\r
15 import jp.sourceforge.mikutoga.pmd.Deg3d;\r
16 import jp.sourceforge.mikutoga.pmd.DynamicsInfo;\r
17 import jp.sourceforge.mikutoga.pmd.JointInfo;\r
18 import jp.sourceforge.mikutoga.pmd.PmdModel;\r
19 import jp.sourceforge.mikutoga.pmd.Rad3d;\r
20 import jp.sourceforge.mikutoga.pmd.RigidGroup;\r
21 import jp.sourceforge.mikutoga.pmd.RigidInfo;\r
22 import jp.sourceforge.mikutoga.pmd.RigidShape;\r
23 import jp.sourceforge.mikutoga.pmd.RigidShapeType;\r
24 import jp.sourceforge.mikutoga.pmd.TripletRange;\r
25 \r
26 /**\r
27  * PMDファイルのエクスポーター(拡張3:物理演算対応)。\r
28  * <p>\r
29  * 物理演算対応のPMDファイルフォーマットを\r
30  * 使いたい場合はこのエクスポーターを用いて出力せよ。\r
31  */\r
32 public class PmdExporterExt3 extends PmdExporterExt2{\r
33 \r
34     private static final short MASK_FULLCOLLISION = (short) 0xffff;\r
35 \r
36     /**\r
37      * コンストラクタ。\r
38      * @param stream 出力ストリーム\r
39      * @throws NullPointerException 引数がnull\r
40      */\r
41     public PmdExporterExt3(OutputStream stream)\r
42             throws NullPointerException{\r
43         super(stream);\r
44         return;\r
45     }\r
46 \r
47     /**\r
48      * {@inheritDoc}\r
49      * @param model {@inheritDoc}\r
50      * @throws IOException {@inheritDoc}\r
51      * @throws IllegalPmdException {@inheritDoc}\r
52      */\r
53     @Override\r
54     public void dumpPmdModel(PmdModel model)\r
55             throws IOException, IllegalPmdException{\r
56         super.dumpPmdModel(model);\r
57 \r
58         dumpRigidList(model);\r
59         dumpJointList(model);\r
60 \r
61         return;\r
62     }\r
63 \r
64     /**\r
65      * 剛体リストを出力する。\r
66      * @param model モデルデータ\r
67      * @throws IOException 出力エラー\r
68      * @throws IllegalPmdTextException 長すぎる剛体名\r
69      */\r
70     private void dumpRigidList(PmdModel model)\r
71             throws IOException, IllegalPmdTextException{\r
72         List<RigidInfo> rigidList = model.getRigidList();\r
73         int rigidNum = rigidList.size();\r
74         dumpInt(rigidNum);\r
75 \r
76         for(RigidInfo rigid : rigidList){\r
77             dumpRigid(rigid);\r
78         }\r
79 \r
80         flush();\r
81 \r
82         return;\r
83     }\r
84 \r
85     /**\r
86      * 個別の剛体情報を出力する。\r
87      * @param rigid 剛体\r
88      * @throws IOException 出力エラー\r
89      * @throws IllegalPmdTextException 長すぎる剛体名\r
90      */\r
91     private void dumpRigid(RigidInfo rigid)\r
92             throws IOException, IllegalPmdTextException{\r
93         String rigidName = rigid.getRigidName().getPrimaryText();\r
94         dumpText(rigidName, PmdLimits.MAXBYTES_RIGIDNAME);\r
95 \r
96         BoneInfo linkedBone = rigid.getLinkedBone();\r
97         dumpShort(linkedBone.getSerialNumber());\r
98 \r
99         RigidGroup group = rigid.getRigidGroup();\r
100         dumpByte(group.getSerialNumber());\r
101 \r
102         short mask = MASK_FULLCOLLISION;\r
103         for(RigidGroup throughGroup : rigid.getThroughGroupColl()){\r
104             int serialId = throughGroup.getSerialNumber();\r
105             mask &= ~(0x0001 << serialId);\r
106         }\r
107         dumpShort(mask);\r
108 \r
109         dumpRigidShape(rigid.getRigidShape());\r
110 \r
111         dumpPos3d(rigid.getPosition());\r
112         dumpRad3d(rigid.getRotation());\r
113 \r
114         dumpDynamics(rigid.getDynamicsInfo());\r
115 \r
116         dumpByte(rigid.getBehaviorType().encode());\r
117 \r
118         return;\r
119     }\r
120 \r
121     /**\r
122      * 剛体形状を出力する。\r
123      * @param shape 剛体形状\r
124      * @throws IOException 出力エラー\r
125      */\r
126     private void dumpRigidShape(RigidShape shape)\r
127             throws IOException{\r
128         RigidShapeType type = shape.getShapeType();\r
129         dumpByte(type.encode());\r
130 \r
131         float width = shape.getWidth();\r
132         float height = shape.getHeight();\r
133         float depth = shape.getDepth();\r
134 \r
135         dumpFloat(width);\r
136         dumpFloat(height);\r
137         dumpFloat(depth);\r
138 \r
139         return;\r
140     }\r
141 \r
142     /**\r
143      * 力学設定を出力する。\r
144      * @param dynamics 力学設定\r
145      * @throws IOException 出力エラー\r
146      */\r
147     private void dumpDynamics(DynamicsInfo dynamics)\r
148             throws IOException{\r
149         float mass        = dynamics.getMass();\r
150         float dampPos     = dynamics.getDampingPosition();\r
151         float dampRot     = dynamics.getDampingRotation();\r
152         float restitution = dynamics.getRestitution();\r
153         float friction    = dynamics.getFriction();\r
154 \r
155         dumpFloat(mass);\r
156         dumpFloat(dampPos);\r
157         dumpFloat(dampRot);\r
158         dumpFloat(restitution);\r
159         dumpFloat(friction);\r
160 \r
161         return;\r
162     }\r
163 \r
164     /**\r
165      * ジョイントリストを出力する。\r
166      * @param model モデルデータ\r
167      * @throws IOException 出力エラー\r
168      * @throws IllegalPmdTextException 長すぎるジョイント名\r
169      */\r
170     private void dumpJointList(PmdModel model)\r
171             throws IOException, IllegalPmdTextException{\r
172         List<JointInfo> jointList = model.getJointList();\r
173         int jointNum = jointList.size();\r
174         dumpInt(jointNum);\r
175 \r
176         for(JointInfo joint : jointList){\r
177             dumpJoint(joint);\r
178         }\r
179 \r
180         flush();\r
181 \r
182         return;\r
183     }\r
184 \r
185     /**\r
186      * 個別のジョイント情報を出力する。\r
187      * @param joint ジョイント\r
188      * @throws IOException 出力エラー\r
189      * @throws IllegalPmdTextException 長すぎるジョイント名\r
190      */\r
191     private void dumpJoint(JointInfo joint)\r
192             throws IOException, IllegalPmdTextException{\r
193         String jointName = joint.getJointName().getPrimaryText();\r
194         dumpText(jointName, PmdLimits.MAXBYTES_JOINTNAME);\r
195 \r
196         RigidInfo rigidA = joint.getRigidA();\r
197         RigidInfo rigidB = joint.getRigidB();\r
198 \r
199         dumpInt(rigidA.getSerialNumber());\r
200         dumpInt(rigidB.getSerialNumber());\r
201 \r
202         dumpPos3d(joint.getPosition());\r
203         dumpRad3d(joint.getRotation());\r
204 \r
205         dumpTripletRange(joint.getPositionRange());\r
206         dumpTripletRange(joint.getRotationRange());\r
207 \r
208         dumpPos3d(joint.getElasticPosition());\r
209         dumpDeg3d(joint.getElasticRotation());\r
210 \r
211         return;\r
212     }\r
213 \r
214     /**\r
215      * 3次元範囲制約を出力する。\r
216      * @param range 3次元範囲制約\r
217      * @throws IOException 出力エラー\r
218      */\r
219     protected void dumpTripletRange(TripletRange range) throws IOException{\r
220         float xFrom = range.getXFrom();\r
221         float yFrom = range.getYFrom();\r
222         float zFrom = range.getZFrom();\r
223 \r
224         dumpFloat(xFrom);\r
225         dumpFloat(yFrom);\r
226         dumpFloat(zFrom);\r
227 \r
228         float xTo = range.getXTo();\r
229         float yTo = range.getYTo();\r
230         float zTo = range.getZTo();\r
231 \r
232         dumpFloat(xTo);\r
233         dumpFloat(yTo);\r
234         dumpFloat(zTo);\r
235 \r
236         return;\r
237     }\r
238 \r
239     /**\r
240      * ラジアンによる3次元姿勢情報を出力する。\r
241      * @param rad 3次元姿勢情報\r
242      * @throws IOException 出力エラー\r
243      */\r
244     protected void dumpRad3d(Rad3d rad) throws IOException{\r
245         float xVal = rad.getXRad();\r
246         float yVal = rad.getYRad();\r
247         float zVal = rad.getZRad();\r
248 \r
249         dumpFloat(xVal);\r
250         dumpFloat(yVal);\r
251         dumpFloat(zVal);\r
252 \r
253         return;\r
254     }\r
255 \r
256     /**\r
257      * 度数法による3次元姿勢情報を出力する。\r
258      * @param deg 3次元姿勢情報\r
259      * @throws IOException 出力エラー\r
260      */\r
261     protected void dumpDeg3d(Deg3d deg) throws IOException{\r
262         float xVal = deg.getXDeg();\r
263         float yVal = deg.getYDeg();\r
264         float zVal = deg.getZDeg();\r
265 \r
266         dumpFloat(xVal);\r
267         dumpFloat(yVal);\r
268         dumpFloat(zVal);\r
269 \r
270         return;\r
271     }\r
272 \r
273 }\r