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 if(linkedBone == null){
\r
100 dumpShort(linkedBone.getSerialNumber());
\r
103 RigidGroup group = rigid.getRigidGroup();
\r
104 dumpByte(group.getSerialNumber());
\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
113 dumpRigidShape(rigid.getRigidShape());
\r
115 dumpPos3d(rigid.getPosition());
\r
116 dumpRad3d(rigid.getRotation());
\r
118 dumpDynamics(rigid.getDynamicsInfo());
\r
120 dumpByte(rigid.getBehaviorType().encode());
\r
127 * @param shape 剛体形状
\r
128 * @throws IOException 出力エラー
\r
130 private void dumpRigidShape(RigidShape shape)
\r
131 throws IOException{
\r
132 RigidShapeType type = shape.getShapeType();
\r
133 dumpByte(type.encode());
\r
135 float width = shape.getWidth();
\r
136 float height = shape.getHeight();
\r
137 float depth = shape.getDepth();
\r
148 * @param dynamics 力学設定
\r
149 * @throws IOException 出力エラー
\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
160 dumpFloat(dampPos);
\r
161 dumpFloat(dampRot);
\r
162 dumpFloat(restitution);
\r
163 dumpFloat(friction);
\r
170 * @param model モデルデータ
\r
171 * @throws IOException 出力エラー
\r
172 * @throws IllegalPmdTextException 長すぎるジョイント名
\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
180 for(JointInfo joint : jointList){
\r
191 * @param joint ジョイント
\r
192 * @throws IOException 出力エラー
\r
193 * @throws IllegalPmdTextException 長すぎるジョイント名
\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
200 RigidInfo rigidA = joint.getRigidA();
\r
201 RigidInfo rigidB = joint.getRigidB();
\r
203 dumpInt(rigidA.getSerialNumber());
\r
204 dumpInt(rigidB.getSerialNumber());
\r
206 dumpPos3d(joint.getPosition());
\r
207 dumpRad3d(joint.getRotation());
\r
209 dumpTripletRange(joint.getPositionRange());
\r
210 dumpTripletRange(joint.getRotationRange());
\r
212 dumpPos3d(joint.getElasticPosition());
\r
213 dumpDeg3d(joint.getElasticRotation());
\r
220 * @param range 3次元範囲制約
\r
221 * @throws IOException 出力エラー
\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
232 float xTo = range.getXTo();
\r
233 float yTo = range.getYTo();
\r
234 float zTo = range.getZTo();
\r
244 * ラジアンによる3次元姿勢情報を出力する。
\r
245 * @param rad 3次元姿勢情報
\r
246 * @throws IOException 出力エラー
\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
261 * 度数法による3次元姿勢情報を出力する。
\r
262 * @param deg 3次元姿勢情報
\r
263 * @throws IOException 出力エラー
\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