2 * model exporter for pmd-file(Ext3)
\r
4 * License : The MIT License
\r
5 * Copyright(c) 2010 MikuToga Partners
\r
8 package jp.sourceforge.mikutoga.pmd.pmdexporter;
\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
27 * PMDファイルのエクスポーター(拡張3:物理演算対応)。
\r
29 * 物理演算対応のPMDファイルフォーマットを
\r
30 * 使いたい場合はこのエクスポーターを用いて出力せよ。
\r
32 public class PmdExporterExt3 extends PmdExporterExt2{
\r
34 private static final short MASK_FULLCOLLISION = (short) 0xffff;
\r
38 * @param stream 出力ストリーム
\r
39 * @throws NullPointerException 引数がnull
\r
41 public PmdExporterExt3(OutputStream stream)
\r
42 throws NullPointerException{
\r
49 * @param model {@inheritDoc}
\r
50 * @throws IOException {@inheritDoc}
\r
51 * @throws IllegalPmdException {@inheritDoc}
\r
54 public void dumpPmdModel(PmdModel model)
\r
55 throws IOException, IllegalPmdException{
\r
56 super.dumpPmdModel(model);
\r
58 dumpRigidList(model);
\r
59 dumpJointList(model);
\r
66 * @param model モデルデータ
\r
67 * @throws IOException 出力エラー
\r
68 * @throws IllegalPmdTextException 長すぎる剛体名
\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
76 for(RigidInfo rigid : rigidList){
\r
88 * @throws IOException 出力エラー
\r
89 * @throws IllegalPmdTextException 長すぎる剛体名
\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
96 BoneInfo linkedBone = rigid.getLinkedBone();
\r
97 dumpShort(linkedBone.getSerialNumber());
\r
99 RigidGroup group = rigid.getRigidGroup();
\r
100 dumpByte(group.getSerialNumber());
\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
109 dumpRigidShape(rigid.getRigidShape());
\r
111 dumpPos3d(rigid.getPosition());
\r
112 dumpRad3d(rigid.getRotation());
\r
114 dumpDynamics(rigid.getDynamicsInfo());
\r
116 dumpByte(rigid.getBehaviorType().encode());
\r
123 * @param shape 剛体形状
\r
124 * @throws IOException 出力エラー
\r
126 private void dumpRigidShape(RigidShape shape)
\r
127 throws IOException{
\r
128 RigidShapeType type = shape.getShapeType();
\r
129 dumpByte(type.encode());
\r
131 float width = shape.getWidth();
\r
132 float height = shape.getHeight();
\r
133 float depth = shape.getDepth();
\r
144 * @param dynamics 力学設定
\r
145 * @throws IOException 出力エラー
\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
156 dumpFloat(dampPos);
\r
157 dumpFloat(dampRot);
\r
158 dumpFloat(restitution);
\r
159 dumpFloat(friction);
\r
166 * @param model モデルデータ
\r
167 * @throws IOException 出力エラー
\r
168 * @throws IllegalPmdTextException 長すぎるジョイント名
\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
176 for(JointInfo joint : jointList){
\r
187 * @param joint ジョイント
\r
188 * @throws IOException 出力エラー
\r
189 * @throws IllegalPmdTextException 長すぎるジョイント名
\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
196 RigidInfo rigidA = joint.getRigidA();
\r
197 RigidInfo rigidB = joint.getRigidB();
\r
199 dumpInt(rigidA.getSerialNumber());
\r
200 dumpInt(rigidB.getSerialNumber());
\r
202 dumpPos3d(joint.getPosition());
\r
203 dumpRad3d(joint.getRotation());
\r
205 dumpTripletRange(joint.getPositionRange());
\r
206 dumpTripletRange(joint.getRotationRange());
\r
208 dumpPos3d(joint.getElasticPosition());
\r
209 dumpDeg3d(joint.getElasticRotation());
\r
216 * @param range 3次元範囲制約
\r
217 * @throws IOException 出力エラー
\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
228 float xTo = range.getXTo();
\r
229 float yTo = range.getYTo();
\r
230 float zTo = range.getZTo();
\r
240 * ラジアンによる3次元姿勢情報を出力する。
\r
241 * @param rad 3次元姿勢情報
\r
242 * @throws IOException 出力エラー
\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
257 * 度数法による3次元姿勢情報を出力する。
\r
258 * @param deg 3次元姿勢情報
\r
259 * @throws IOException 出力エラー
\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