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 * <p>物理演算対応のPMDファイルフォーマットを
32 * 使いたい場合はこのエクスポーターを用いて出力せよ。
34 public class PmdExporterExt3 extends PmdExporterExt2{
36 private static final short MASK_FULLCOLLISION = (short) 0xffff;
41 * @param stream 出力ストリーム
42 * @throws NullPointerException 引数がnull
44 public PmdExporterExt3(OutputStream stream)
45 throws NullPointerException{
53 * @param model {@inheritDoc}
54 * @throws IOException {@inheritDoc}
55 * @throws IllegalPmdDataException {@inheritDoc}
58 public void dumpPmdModel(PmdModel model)
59 throws IOException, IllegalPmdDataException{
60 super.dumpPmdModel(model);
65 }catch(IllegalTextExportException e){
66 throw new IllegalPmdDataException(e);
76 * @throws IOException 出力エラー
77 * @throws IllegalTextExportException 長すぎる剛体名
79 private void dumpRigidList(PmdModel model)
80 throws IOException, IllegalTextExportException{
81 List<RigidInfo> rigidList = model.getRigidList();
82 int rigidNum = rigidList.size();
85 for(RigidInfo rigid : rigidList){
98 * @throws IOException 出力エラー
99 * @throws IllegalTextExportException 長すぎる剛体名
101 private void dumpRigid(RigidInfo rigid)
102 throws IOException, IllegalTextExportException{
103 String rigidName = rigid.getRigidName().getPrimaryText();
104 dumpText(rigidName, PmdConst.MAXBYTES_RIGIDNAME);
106 BoneInfo linkedBone = rigid.getLinkedBone();
107 if(linkedBone == null){
110 dumpLeShort(linkedBone.getSerialNumber());
113 RigidGroup group = rigid.getRigidGroup();
114 dumpByte(group.getSerialNumber());
116 short mask = MASK_FULLCOLLISION;
117 for(RigidGroup throughGroup : rigid.getThroughGroupColl()){
118 int serialId = throughGroup.getSerialNumber();
119 mask &= ~(0x0001 << serialId);
123 dumpRigidShape(rigid.getRigidShape());
125 dumpPos3D(rigid.getPosition());
126 dumpRad3d(rigid.getRotation());
128 dumpDynamics(rigid.getDynamicsInfo());
130 dumpByte(rigid.getBehaviorType().encode());
139 * @throws IOException 出力エラー
141 private void dumpRigidShape(RigidShape shape)
143 RigidShapeType type = shape.getShapeType();
144 dumpByte(type.encode());
146 float width = shape.getWidth();
147 float height = shape.getHeight();
148 float depth = shape.getDepth();
160 * @param dynamics 力学設定
161 * @throws IOException 出力エラー
163 private void dumpDynamics(DynamicsInfo dynamics)
165 float mass = dynamics.getMass();
166 float dampPos = dynamics.getDampingPosition();
167 float dampRot = dynamics.getDampingRotation();
168 float restitution = dynamics.getRestitution();
169 float friction = dynamics.getFriction();
172 dumpLeFloat(dampPos);
173 dumpLeFloat(dampRot);
174 dumpLeFloat(restitution);
175 dumpLeFloat(friction);
183 * @param model モデルデータ
184 * @throws IOException 出力エラー
185 * @throws IllegalTextExportException 長すぎるジョイント名
187 private void dumpJointList(PmdModel model)
188 throws IOException, IllegalTextExportException{
189 List<JointInfo> jointList = model.getJointList();
190 int jointNum = jointList.size();
193 for(JointInfo joint : jointList){
206 * @throws IOException 出力エラー
207 * @throws IllegalTextExportException 長すぎるジョイント名
209 private void dumpJoint(JointInfo joint)
210 throws IOException, IllegalTextExportException{
211 String jointName = joint.getJointName().getPrimaryText();
212 dumpText(jointName, PmdConst.MAXBYTES_JOINTNAME);
214 RigidInfo rigidA = joint.getRigidA();
215 RigidInfo rigidB = joint.getRigidB();
217 dumpLeInt(rigidA.getSerialNumber());
218 dumpLeInt(rigidB.getSerialNumber());
220 dumpPos3D(joint.getPosition());
221 dumpRad3d(joint.getRotation());
223 dumpTripletRange(joint.getPositionRange());
224 dumpTripletRange(joint.getRotationRange());
226 dumpPos3D(joint.getElasticPosition());
227 dumpDeg3d(joint.getElasticRotation());
235 * @param range 3次元範囲制約
236 * @throws IOException 出力エラー
238 protected void dumpTripletRange(TripletRange range) throws IOException{
239 float xFrom = range.getXFrom();
240 float yFrom = range.getYFrom();
241 float zFrom = range.getZFrom();
247 float xTo = range.getXTo();
248 float yTo = range.getYTo();
249 float zTo = range.getZTo();
259 * ラジアンによる3次元姿勢情報を出力する。
262 * @throws IOException 出力エラー
264 protected void dumpRad3d(Rad3d rad) throws IOException{
265 float xVal = rad.getXRad();
266 float yVal = rad.getYRad();
267 float zVal = rad.getZRad();
277 * 度数法による3次元姿勢情報を出力する。
280 * @throws IOException 出力エラー
282 protected void dumpDeg3d(Deg3d deg) throws IOException{
283 float xVal = deg.getXDeg();
284 float yVal = deg.getYDeg();
285 float zVal = deg.getZDeg();