2 * model exporter for pmd-file(Ext3)
4 * License : The MIT License
5 * Copyright(c) 2010 MikuToga Partners
8 package jp.sfjp.mikutoga.pmd.model.binio;
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;
29 * PMDファイルのエクスポーター(拡張3:物理演算対応)。
31 * 物理演算対応のPMDファイルフォーマットを
32 * 使いたい場合はこのエクスポーターを用いて出力せよ。
34 public class PmdExporterExt3 extends PmdExporterExt2{
36 private static final short MASK_FULLCOLLISION = (short) 0xffff;
40 * @param stream 出力ストリーム
41 * @throws NullPointerException 引数がnull
43 public PmdExporterExt3(OutputStream stream)
44 throws NullPointerException{
51 * @param model {@inheritDoc}
52 * @throws IOException {@inheritDoc}
53 * @throws IllegalPmdDataException {@inheritDoc}
56 public void dumpPmdModel(PmdModel model)
57 throws IOException, IllegalPmdDataException{
58 super.dumpPmdModel(model);
63 }catch(IllegalTextExportException e){
64 throw new IllegalPmdDataException(e);
73 * @throws IOException 出力エラー
74 * @throws IllegalTextExportException 長すぎる剛体名
76 private void dumpRigidList(PmdModel model)
77 throws IOException, IllegalTextExportException{
78 List<RigidInfo> rigidList = model.getRigidList();
79 int rigidNum = rigidList.size();
82 for(RigidInfo rigid : rigidList){
94 * @throws IOException 出力エラー
95 * @throws IllegalTextExportException 長すぎる剛体名
97 private void dumpRigid(RigidInfo rigid)
98 throws IOException, IllegalTextExportException{
99 String rigidName = rigid.getRigidName().getPrimaryText();
100 dumpText(rigidName, PmdConst.MAXBYTES_RIGIDNAME);
102 BoneInfo linkedBone = rigid.getLinkedBone();
103 if(linkedBone == null){
106 dumpLeShort(linkedBone.getSerialNumber());
109 RigidGroup group = rigid.getRigidGroup();
110 dumpByte(group.getSerialNumber());
112 short mask = MASK_FULLCOLLISION;
113 for(RigidGroup throughGroup : rigid.getThroughGroupColl()){
114 int serialId = throughGroup.getSerialNumber();
115 mask &= ~(0x0001 << serialId);
119 dumpRigidShape(rigid.getRigidShape());
121 dumpPos3D(rigid.getPosition());
122 dumpRad3d(rigid.getRotation());
124 dumpDynamics(rigid.getDynamicsInfo());
126 dumpByte(rigid.getBehaviorType().encode());
134 * @throws IOException 出力エラー
136 private void dumpRigidShape(RigidShape shape)
138 RigidShapeType type = shape.getShapeType();
139 dumpByte(type.encode());
141 float width = shape.getWidth();
142 float height = shape.getHeight();
143 float depth = shape.getDepth();
154 * @param dynamics 力学設定
155 * @throws IOException 出力エラー
157 private void dumpDynamics(DynamicsInfo dynamics)
159 float mass = dynamics.getMass();
160 float dampPos = dynamics.getDampingPosition();
161 float dampRot = dynamics.getDampingRotation();
162 float restitution = dynamics.getRestitution();
163 float friction = dynamics.getFriction();
166 dumpLeFloat(dampPos);
167 dumpLeFloat(dampRot);
168 dumpLeFloat(restitution);
169 dumpLeFloat(friction);
176 * @param model モデルデータ
177 * @throws IOException 出力エラー
178 * @throws IllegalTextExportException 長すぎるジョイント名
180 private void dumpJointList(PmdModel model)
181 throws IOException, IllegalTextExportException{
182 List<JointInfo> jointList = model.getJointList();
183 int jointNum = jointList.size();
186 for(JointInfo joint : jointList){
198 * @throws IOException 出力エラー
199 * @throws IllegalTextExportException 長すぎるジョイント名
201 private void dumpJoint(JointInfo joint)
202 throws IOException, IllegalTextExportException{
203 String jointName = joint.getJointName().getPrimaryText();
204 dumpText(jointName, PmdConst.MAXBYTES_JOINTNAME);
206 RigidInfo rigidA = joint.getRigidA();
207 RigidInfo rigidB = joint.getRigidB();
209 dumpLeInt(rigidA.getSerialNumber());
210 dumpLeInt(rigidB.getSerialNumber());
212 dumpPos3D(joint.getPosition());
213 dumpRad3d(joint.getRotation());
215 dumpTripletRange(joint.getPositionRange());
216 dumpTripletRange(joint.getRotationRange());
218 dumpPos3D(joint.getElasticPosition());
219 dumpDeg3d(joint.getElasticRotation());
226 * @param range 3次元範囲制約
227 * @throws IOException 出力エラー
229 protected void dumpTripletRange(TripletRange range) throws IOException{
230 float xFrom = range.getXFrom();
231 float yFrom = range.getYFrom();
232 float zFrom = range.getZFrom();
238 float xTo = range.getXTo();
239 float yTo = range.getYTo();
240 float zTo = range.getZTo();
250 * ラジアンによる3次元姿勢情報を出力する。
252 * @throws IOException 出力エラー
254 protected void dumpRad3d(Rad3d rad) throws IOException{
255 float xVal = rad.getXRad();
256 float yVal = rad.getYRad();
257 float zVal = rad.getZRad();
267 * 度数法による3次元姿勢情報を出力する。
269 * @throws IOException 出力エラー
271 protected void dumpDeg3d(Deg3d deg) throws IOException{
272 float xVal = deg.getXDeg();
273 float yVal = deg.getYDeg();
274 float zVal = deg.getZDeg();