OSDN Git Service

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