2 * model exporter for pmd-file(Ext3)
4 * License : The MIT License
5 * Copyright(c) 2010 MikuToga Partners
8 package jp.sourceforge.mikutoga.pmd.model.binio;
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;
28 * PMDファイルのエクスポーター(拡張3:物理演算対応)。
30 * 物理演算対応のPMDファイルフォーマットを
31 * 使いたい場合はこのエクスポーターを用いて出力せよ。
33 public class PmdExporterExt3 extends PmdExporterExt2{
35 private static final short MASK_FULLCOLLISION = (short) 0xffff;
39 * @param stream 出力ストリーム
40 * @throws NullPointerException 引数がnull
42 public PmdExporterExt3(OutputStream stream)
43 throws NullPointerException{
50 * @param model {@inheritDoc}
51 * @throws IOException {@inheritDoc}
52 * @throws IllegalPmdException {@inheritDoc}
55 public void dumpPmdModel(PmdModel model)
56 throws IOException, IllegalPmdException{
57 super.dumpPmdModel(model);
62 }catch(IllegalTextExportException e){
63 throw new IllegalPmdException(e);
72 * @throws IOException 出力エラー
73 * @throws IllegalPmdTextException 長すぎる剛体名
75 private void dumpRigidList(PmdModel model)
76 throws IOException, IllegalTextExportException{
77 List<RigidInfo> rigidList = model.getRigidList();
78 int rigidNum = rigidList.size();
81 for(RigidInfo rigid : rigidList){
93 * @throws IOException 出力エラー
94 * @throws IllegalPmdTextException 長すぎる剛体名
96 private void dumpRigid(RigidInfo rigid)
97 throws IOException, IllegalTextExportException{
98 String rigidName = rigid.getRigidName().getPrimaryText();
99 dumpText(rigidName, PmdLimits.MAXBYTES_RIGIDNAME);
101 BoneInfo linkedBone = rigid.getLinkedBone();
102 if(linkedBone == null){
105 dumpShort(linkedBone.getSerialNumber());
108 RigidGroup group = rigid.getRigidGroup();
109 dumpByte(group.getSerialNumber());
111 short mask = MASK_FULLCOLLISION;
112 for(RigidGroup throughGroup : rigid.getThroughGroupColl()){
113 int serialId = throughGroup.getSerialNumber();
114 mask &= ~(0x0001 << serialId);
118 dumpRigidShape(rigid.getRigidShape());
120 dumpPos3D(rigid.getPosition());
121 dumpRad3d(rigid.getRotation());
123 dumpDynamics(rigid.getDynamicsInfo());
125 dumpByte(rigid.getBehaviorType().encode());
133 * @throws IOException 出力エラー
135 private void dumpRigidShape(RigidShape shape)
137 RigidShapeType type = shape.getShapeType();
138 dumpByte(type.encode());
140 float width = shape.getWidth();
141 float height = shape.getHeight();
142 float depth = shape.getDepth();
153 * @param dynamics 力学設定
154 * @throws IOException 出力エラー
156 private void dumpDynamics(DynamicsInfo dynamics)
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();
167 dumpFloat(restitution);
175 * @param model モデルデータ
176 * @throws IOException 出力エラー
177 * @throws IllegalPmdTextException 長すぎるジョイント名
179 private void dumpJointList(PmdModel model)
180 throws IOException, IllegalTextExportException{
181 List<JointInfo> jointList = model.getJointList();
182 int jointNum = jointList.size();
185 for(JointInfo joint : jointList){
197 * @throws IOException 出力エラー
198 * @throws IllegalPmdTextException 長すぎるジョイント名
200 private void dumpJoint(JointInfo joint)
201 throws IOException, IllegalTextExportException{
202 String jointName = joint.getJointName().getPrimaryText();
203 dumpText(jointName, PmdLimits.MAXBYTES_JOINTNAME);
205 RigidInfo rigidA = joint.getRigidA();
206 RigidInfo rigidB = joint.getRigidB();
208 dumpInt(rigidA.getSerialNumber());
209 dumpInt(rigidB.getSerialNumber());
211 dumpPos3D(joint.getPosition());
212 dumpRad3d(joint.getRotation());
214 dumpTripletRange(joint.getPositionRange());
215 dumpTripletRange(joint.getRotationRange());
217 dumpPos3D(joint.getElasticPosition());
218 dumpDeg3d(joint.getElasticRotation());
225 * @param range 3次元範囲制約
226 * @throws IOException 出力エラー
228 protected void dumpTripletRange(TripletRange range) throws IOException{
229 float xFrom = range.getXFrom();
230 float yFrom = range.getYFrom();
231 float zFrom = range.getZFrom();
237 float xTo = range.getXTo();
238 float yTo = range.getYTo();
239 float zTo = range.getZTo();
249 * ラジアンによる3次元姿勢情報を出力する。
251 * @throws IOException 出力エラー
253 protected void dumpRad3d(Rad3d rad) throws IOException{
254 float xVal = rad.getXRad();
255 float yVal = rad.getYRad();
256 float zVal = rad.getZRad();
266 * 度数法による3次元姿勢情報を出力する。
268 * @throws IOException 出力エラー
270 protected void dumpDeg3d(Deg3d deg) throws IOException{
271 float xVal = deg.getXDeg();
272 float yVal = deg.getYDeg();
273 float zVal = deg.getZDeg();