OSDN Git Service

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