OSDN Git Service

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