OSDN Git Service

接続ボーンを持たない剛体に対処。
[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         if(linkedBone == null){\r
98             dumpShort(-1);\r
99         }else{\r
100             dumpShort(linkedBone.getSerialNumber());\r
101         }\r
102 \r
103         RigidGroup group = rigid.getRigidGroup();\r
104         dumpByte(group.getSerialNumber());\r
105 \r
106         short mask = MASK_FULLCOLLISION;\r
107         for(RigidGroup throughGroup : rigid.getThroughGroupColl()){\r
108             int serialId = throughGroup.getSerialNumber();\r
109             mask &= ~(0x0001 << serialId);\r
110         }\r
111         dumpShort(mask);\r
112 \r
113         dumpRigidShape(rigid.getRigidShape());\r
114 \r
115         dumpPos3d(rigid.getPosition());\r
116         dumpRad3d(rigid.getRotation());\r
117 \r
118         dumpDynamics(rigid.getDynamicsInfo());\r
119 \r
120         dumpByte(rigid.getBehaviorType().encode());\r
121 \r
122         return;\r
123     }\r
124 \r
125     /**\r
126      * 剛体形状を出力する。\r
127      * @param shape 剛体形状\r
128      * @throws IOException 出力エラー\r
129      */\r
130     private void dumpRigidShape(RigidShape shape)\r
131             throws IOException{\r
132         RigidShapeType type = shape.getShapeType();\r
133         dumpByte(type.encode());\r
134 \r
135         float width = shape.getWidth();\r
136         float height = shape.getHeight();\r
137         float depth = shape.getDepth();\r
138 \r
139         dumpFloat(width);\r
140         dumpFloat(height);\r
141         dumpFloat(depth);\r
142 \r
143         return;\r
144     }\r
145 \r
146     /**\r
147      * 力学設定を出力する。\r
148      * @param dynamics 力学設定\r
149      * @throws IOException 出力エラー\r
150      */\r
151     private void dumpDynamics(DynamicsInfo dynamics)\r
152             throws IOException{\r
153         float mass        = dynamics.getMass();\r
154         float dampPos     = dynamics.getDampingPosition();\r
155         float dampRot     = dynamics.getDampingRotation();\r
156         float restitution = dynamics.getRestitution();\r
157         float friction    = dynamics.getFriction();\r
158 \r
159         dumpFloat(mass);\r
160         dumpFloat(dampPos);\r
161         dumpFloat(dampRot);\r
162         dumpFloat(restitution);\r
163         dumpFloat(friction);\r
164 \r
165         return;\r
166     }\r
167 \r
168     /**\r
169      * ジョイントリストを出力する。\r
170      * @param model モデルデータ\r
171      * @throws IOException 出力エラー\r
172      * @throws IllegalPmdTextException 長すぎるジョイント名\r
173      */\r
174     private void dumpJointList(PmdModel model)\r
175             throws IOException, IllegalPmdTextException{\r
176         List<JointInfo> jointList = model.getJointList();\r
177         int jointNum = jointList.size();\r
178         dumpInt(jointNum);\r
179 \r
180         for(JointInfo joint : jointList){\r
181             dumpJoint(joint);\r
182         }\r
183 \r
184         flush();\r
185 \r
186         return;\r
187     }\r
188 \r
189     /**\r
190      * 個別のジョイント情報を出力する。\r
191      * @param joint ジョイント\r
192      * @throws IOException 出力エラー\r
193      * @throws IllegalPmdTextException 長すぎるジョイント名\r
194      */\r
195     private void dumpJoint(JointInfo joint)\r
196             throws IOException, IllegalPmdTextException{\r
197         String jointName = joint.getJointName().getPrimaryText();\r
198         dumpText(jointName, PmdLimits.MAXBYTES_JOINTNAME);\r
199 \r
200         RigidInfo rigidA = joint.getRigidA();\r
201         RigidInfo rigidB = joint.getRigidB();\r
202 \r
203         dumpInt(rigidA.getSerialNumber());\r
204         dumpInt(rigidB.getSerialNumber());\r
205 \r
206         dumpPos3d(joint.getPosition());\r
207         dumpRad3d(joint.getRotation());\r
208 \r
209         dumpTripletRange(joint.getPositionRange());\r
210         dumpTripletRange(joint.getRotationRange());\r
211 \r
212         dumpPos3d(joint.getElasticPosition());\r
213         dumpDeg3d(joint.getElasticRotation());\r
214 \r
215         return;\r
216     }\r
217 \r
218     /**\r
219      * 3次元範囲制約を出力する。\r
220      * @param range 3次元範囲制約\r
221      * @throws IOException 出力エラー\r
222      */\r
223     protected void dumpTripletRange(TripletRange range) throws IOException{\r
224         float xFrom = range.getXFrom();\r
225         float yFrom = range.getYFrom();\r
226         float zFrom = range.getZFrom();\r
227 \r
228         dumpFloat(xFrom);\r
229         dumpFloat(yFrom);\r
230         dumpFloat(zFrom);\r
231 \r
232         float xTo = range.getXTo();\r
233         float yTo = range.getYTo();\r
234         float zTo = range.getZTo();\r
235 \r
236         dumpFloat(xTo);\r
237         dumpFloat(yTo);\r
238         dumpFloat(zTo);\r
239 \r
240         return;\r
241     }\r
242 \r
243     /**\r
244      * ラジアンによる3次元姿勢情報を出力する。\r
245      * @param rad 3次元姿勢情報\r
246      * @throws IOException 出力エラー\r
247      */\r
248     protected void dumpRad3d(Rad3d rad) throws IOException{\r
249         float xVal = rad.getXRad();\r
250         float yVal = rad.getYRad();\r
251         float zVal = rad.getZRad();\r
252 \r
253         dumpFloat(xVal);\r
254         dumpFloat(yVal);\r
255         dumpFloat(zVal);\r
256 \r
257         return;\r
258     }\r
259 \r
260     /**\r
261      * 度数法による3次元姿勢情報を出力する。\r
262      * @param deg 3次元姿勢情報\r
263      * @throws IOException 出力エラー\r
264      */\r
265     protected void dumpDeg3d(Deg3d deg) throws IOException{\r
266         float xVal = deg.getXDeg();\r
267         float yVal = deg.getYDeg();\r
268         float zVal = deg.getZDeg();\r
269 \r
270         dumpFloat(xVal);\r
271         dumpFloat(yVal);\r
272         dumpFloat(zVal);\r
273 \r
274         return;\r
275     }\r
276 \r
277 }\r