-/*\r
- * model exporter for pmd-file(Ext3)\r
- *\r
- * License : The MIT License\r
- * Copyright(c) 2010 MikuToga Partners\r
- */\r
-\r
-package jp.sourceforge.mikutoga.pmd.pmdexporter;\r
-\r
-import java.io.IOException;\r
-import java.io.OutputStream;\r
-import java.util.List;\r
-import jp.sourceforge.mikutoga.parser.pmd.PmdLimits;\r
-import jp.sourceforge.mikutoga.pmd.BoneInfo;\r
-import jp.sourceforge.mikutoga.pmd.Deg3d;\r
-import jp.sourceforge.mikutoga.pmd.DynamicsInfo;\r
-import jp.sourceforge.mikutoga.pmd.JointInfo;\r
-import jp.sourceforge.mikutoga.pmd.PmdModel;\r
-import jp.sourceforge.mikutoga.pmd.Rad3d;\r
-import jp.sourceforge.mikutoga.pmd.RigidGroup;\r
-import jp.sourceforge.mikutoga.pmd.RigidInfo;\r
-import jp.sourceforge.mikutoga.pmd.RigidShape;\r
-import jp.sourceforge.mikutoga.pmd.RigidShapeType;\r
-import jp.sourceforge.mikutoga.pmd.TripletRange;\r
-\r
-/**\r
- * PMDファイルのエクスポーター(拡張3:物理演算対応)。\r
- * <p>\r
- * 物理演算対応のPMDファイルフォーマットを\r
- * 使いたい場合はこのエクスポーターを用いて出力せよ。\r
- */\r
-public class PmdExporterExt3 extends PmdExporterExt2{\r
-\r
- private static final short MASK_FULLCOLLISION = (short) 0xffff;\r
-\r
- /**\r
- * コンストラクタ。\r
- * @param stream 出力ストリーム\r
- * @throws NullPointerException 引数がnull\r
- */\r
- public PmdExporterExt3(OutputStream stream)\r
- throws NullPointerException{\r
- super(stream);\r
- return;\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * @param model {@inheritDoc}\r
- * @throws IOException {@inheritDoc}\r
- * @throws IllegalPmdException {@inheritDoc}\r
- */\r
- @Override\r
- public void dumpPmdModel(PmdModel model)\r
- throws IOException, IllegalPmdException{\r
- super.dumpPmdModel(model);\r
-\r
- dumpRigidList(model);\r
- dumpJointList(model);\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * 剛体リストを出力する。\r
- * @param model モデルデータ\r
- * @throws IOException 出力エラー\r
- * @throws IllegalPmdTextException 長すぎる剛体名\r
- */\r
- private void dumpRigidList(PmdModel model)\r
- throws IOException, IllegalPmdTextException{\r
- List<RigidInfo> rigidList = model.getRigidList();\r
- int rigidNum = rigidList.size();\r
- dumpInt(rigidNum);\r
-\r
- for(RigidInfo rigid : rigidList){\r
- dumpRigid(rigid);\r
- }\r
-\r
- flush();\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * 個別の剛体情報を出力する。\r
- * @param rigid 剛体\r
- * @throws IOException 出力エラー\r
- * @throws IllegalPmdTextException 長すぎる剛体名\r
- */\r
- private void dumpRigid(RigidInfo rigid)\r
- throws IOException, IllegalPmdTextException{\r
- String rigidName = rigid.getRigidName().getPrimaryText();\r
- dumpText(rigidName, PmdLimits.MAXBYTES_RIGIDNAME);\r
-\r
- BoneInfo linkedBone = rigid.getLinkedBone();\r
- dumpShort(linkedBone.getSerialNumber());\r
-\r
- RigidGroup group = rigid.getRigidGroup();\r
- dumpByte(group.getSerialNumber());\r
-\r
- short mask = MASK_FULLCOLLISION;\r
- for(RigidGroup throughGroup : rigid.getThroughGroupColl()){\r
- int serialId = throughGroup.getSerialNumber();\r
- mask &= ~(0x0001 << serialId);\r
- }\r
- dumpShort(mask);\r
-\r
- dumpRigidShape(rigid.getRigidShape());\r
-\r
- dumpPos3d(rigid.getPosition());\r
- dumpRad3d(rigid.getRotation());\r
-\r
- dumpDynamics(rigid.getDynamicsInfo());\r
-\r
- dumpByte(rigid.getBehaviorType().encode());\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * 剛体形状を出力する。\r
- * @param shape 剛体形状\r
- * @throws IOException 出力エラー\r
- */\r
- private void dumpRigidShape(RigidShape shape)\r
- throws IOException{\r
- RigidShapeType type = shape.getShapeType();\r
- dumpByte(type.encode());\r
-\r
- float width = shape.getWidth();\r
- float height = shape.getHeight();\r
- float depth = shape.getDepth();\r
-\r
- dumpFloat(width);\r
- dumpFloat(height);\r
- dumpFloat(depth);\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * 力学設定を出力する。\r
- * @param dynamics 力学設定\r
- * @throws IOException 出力エラー\r
- */\r
- private void dumpDynamics(DynamicsInfo dynamics)\r
- throws IOException{\r
- float mass = dynamics.getMass();\r
- float dampPos = dynamics.getDampingPosition();\r
- float dampRot = dynamics.getDampingRotation();\r
- float restitution = dynamics.getRestitution();\r
- float friction = dynamics.getFriction();\r
-\r
- dumpFloat(mass);\r
- dumpFloat(dampPos);\r
- dumpFloat(dampRot);\r
- dumpFloat(restitution);\r
- dumpFloat(friction);\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * ジョイントリストを出力する。\r
- * @param model モデルデータ\r
- * @throws IOException 出力エラー\r
- * @throws IllegalPmdTextException 長すぎるジョイント名\r
- */\r
- private void dumpJointList(PmdModel model)\r
- throws IOException, IllegalPmdTextException{\r
- List<JointInfo> jointList = model.getJointList();\r
- int jointNum = jointList.size();\r
- dumpInt(jointNum);\r
-\r
- for(JointInfo joint : jointList){\r
- dumpJoint(joint);\r
- }\r
-\r
- flush();\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * 個別のジョイント情報を出力する。\r
- * @param joint ジョイント\r
- * @throws IOException 出力エラー\r
- * @throws IllegalPmdTextException 長すぎるジョイント名\r
- */\r
- private void dumpJoint(JointInfo joint)\r
- throws IOException, IllegalPmdTextException{\r
- String jointName = joint.getJointName().getPrimaryText();\r
- dumpText(jointName, PmdLimits.MAXBYTES_JOINTNAME);\r
-\r
- RigidInfo rigidA = joint.getRigidA();\r
- RigidInfo rigidB = joint.getRigidB();\r
-\r
- dumpInt(rigidA.getSerialNumber());\r
- dumpInt(rigidB.getSerialNumber());\r
-\r
- dumpPos3d(joint.getPosition());\r
- dumpRad3d(joint.getRotation());\r
-\r
- dumpTripletRange(joint.getPositionRange());\r
- dumpTripletRange(joint.getRotationRange());\r
-\r
- dumpPos3d(joint.getElasticPosition());\r
- dumpDeg3d(joint.getElasticRotation());\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * 3次元範囲制約を出力する。\r
- * @param range 3次元範囲制約\r
- * @throws IOException 出力エラー\r
- */\r
- protected void dumpTripletRange(TripletRange range) throws IOException{\r
- float xFrom = range.getXFrom();\r
- float yFrom = range.getYFrom();\r
- float zFrom = range.getZFrom();\r
-\r
- dumpFloat(xFrom);\r
- dumpFloat(yFrom);\r
- dumpFloat(zFrom);\r
-\r
- float xTo = range.getXTo();\r
- float yTo = range.getYTo();\r
- float zTo = range.getZTo();\r
-\r
- dumpFloat(xTo);\r
- dumpFloat(yTo);\r
- dumpFloat(zTo);\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * ラジアンによる3次元姿勢情報を出力する。\r
- * @param rad 3次元姿勢情報\r
- * @throws IOException 出力エラー\r
- */\r
- protected void dumpRad3d(Rad3d rad) throws IOException{\r
- float xVal = rad.getXRad();\r
- float yVal = rad.getYRad();\r
- float zVal = rad.getZRad();\r
-\r
- dumpFloat(xVal);\r
- dumpFloat(yVal);\r
- dumpFloat(zVal);\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * 度数法による3次元姿勢情報を出力する。\r
- * @param deg 3次元姿勢情報\r
- * @throws IOException 出力エラー\r
- */\r
- protected void dumpDeg3d(Deg3d deg) throws IOException{\r
- float xVal = deg.getXDeg();\r
- float yVal = deg.getYDeg();\r
- float zVal = deg.getZDeg();\r
-\r
- dumpFloat(xVal);\r
- dumpFloat(yVal);\r
- dumpFloat(zVal);\r
-\r
- return;\r
- }\r
-\r
-}\r
+/*
+ * model exporter for pmd-file(Ext3)
+ *
+ * License : The MIT License
+ * Copyright(c) 2010 MikuToga Partners
+ */
+
+package jp.sourceforge.mikutoga.pmd.pmdexporter;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+import jp.sourceforge.mikutoga.pmd.Deg3d;
+import jp.sourceforge.mikutoga.pmd.Rad3d;
+import jp.sourceforge.mikutoga.pmd.RigidShapeType;
+import jp.sourceforge.mikutoga.pmd.TripletRange;
+import jp.sourceforge.mikutoga.pmd.model.BoneInfo;
+import jp.sourceforge.mikutoga.pmd.model.DynamicsInfo;
+import jp.sourceforge.mikutoga.pmd.model.JointInfo;
+import jp.sourceforge.mikutoga.pmd.model.PmdModel;
+import jp.sourceforge.mikutoga.pmd.model.RigidGroup;
+import jp.sourceforge.mikutoga.pmd.model.RigidInfo;
+import jp.sourceforge.mikutoga.pmd.model.RigidShape;
+import jp.sourceforge.mikutoga.pmd.parser.PmdLimits;
+
+/**
+ * PMDファイルのエクスポーター(拡張3:物理演算対応)。
+ * <p>
+ * 物理演算対応のPMDファイルフォーマットを
+ * 使いたい場合はこのエクスポーターを用いて出力せよ。
+ */
+public class PmdExporterExt3 extends PmdExporterExt2{
+
+ private static final short MASK_FULLCOLLISION = (short) 0xffff;
+
+ /**
+ * コンストラクタ。
+ * @param stream 出力ストリーム
+ * @throws NullPointerException 引数がnull
+ */
+ public PmdExporterExt3(OutputStream stream)
+ throws NullPointerException{
+ super(stream);
+ return;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @param model {@inheritDoc}
+ * @throws IOException {@inheritDoc}
+ * @throws IllegalPmdException {@inheritDoc}
+ */
+ @Override
+ public void dumpPmdModel(PmdModel model)
+ throws IOException, IllegalPmdException{
+ super.dumpPmdModel(model);
+
+ dumpRigidList(model);
+ dumpJointList(model);
+
+ return;
+ }
+
+ /**
+ * 剛体リストを出力する。
+ * @param model モデルデータ
+ * @throws IOException 出力エラー
+ * @throws IllegalPmdTextException 長すぎる剛体名
+ */
+ private void dumpRigidList(PmdModel model)
+ throws IOException, IllegalPmdTextException{
+ List<RigidInfo> rigidList = model.getRigidList();
+ int rigidNum = rigidList.size();
+ dumpInt(rigidNum);
+
+ for(RigidInfo rigid : rigidList){
+ dumpRigid(rigid);
+ }
+
+ flush();
+
+ return;
+ }
+
+ /**
+ * 個別の剛体情報を出力する。
+ * @param rigid 剛体
+ * @throws IOException 出力エラー
+ * @throws IllegalPmdTextException 長すぎる剛体名
+ */
+ private void dumpRigid(RigidInfo rigid)
+ throws IOException, IllegalPmdTextException{
+ String rigidName = rigid.getRigidName().getPrimaryText();
+ dumpText(rigidName, PmdLimits.MAXBYTES_RIGIDNAME);
+
+ BoneInfo linkedBone = rigid.getLinkedBone();
+ if(linkedBone == null){
+ dumpShort(-1);
+ }else{
+ dumpShort(linkedBone.getSerialNumber());
+ }
+
+ RigidGroup group = rigid.getRigidGroup();
+ dumpByte(group.getSerialNumber());
+
+ short mask = MASK_FULLCOLLISION;
+ for(RigidGroup throughGroup : rigid.getThroughGroupColl()){
+ int serialId = throughGroup.getSerialNumber();
+ mask &= ~(0x0001 << serialId);
+ }
+ dumpShort(mask);
+
+ dumpRigidShape(rigid.getRigidShape());
+
+ dumpPos3d(rigid.getPosition());
+ dumpRad3d(rigid.getRotation());
+
+ dumpDynamics(rigid.getDynamicsInfo());
+
+ dumpByte(rigid.getBehaviorType().encode());
+
+ return;
+ }
+
+ /**
+ * 剛体形状を出力する。
+ * @param shape 剛体形状
+ * @throws IOException 出力エラー
+ */
+ private void dumpRigidShape(RigidShape shape)
+ throws IOException{
+ RigidShapeType type = shape.getShapeType();
+ dumpByte(type.encode());
+
+ float width = shape.getWidth();
+ float height = shape.getHeight();
+ float depth = shape.getDepth();
+
+ dumpFloat(width);
+ dumpFloat(height);
+ dumpFloat(depth);
+
+ return;
+ }
+
+ /**
+ * 力学設定を出力する。
+ * @param dynamics 力学設定
+ * @throws IOException 出力エラー
+ */
+ private void dumpDynamics(DynamicsInfo dynamics)
+ throws IOException{
+ float mass = dynamics.getMass();
+ float dampPos = dynamics.getDampingPosition();
+ float dampRot = dynamics.getDampingRotation();
+ float restitution = dynamics.getRestitution();
+ float friction = dynamics.getFriction();
+
+ dumpFloat(mass);
+ dumpFloat(dampPos);
+ dumpFloat(dampRot);
+ dumpFloat(restitution);
+ dumpFloat(friction);
+
+ return;
+ }
+
+ /**
+ * ジョイントリストを出力する。
+ * @param model モデルデータ
+ * @throws IOException 出力エラー
+ * @throws IllegalPmdTextException 長すぎるジョイント名
+ */
+ private void dumpJointList(PmdModel model)
+ throws IOException, IllegalPmdTextException{
+ List<JointInfo> jointList = model.getJointList();
+ int jointNum = jointList.size();
+ dumpInt(jointNum);
+
+ for(JointInfo joint : jointList){
+ dumpJoint(joint);
+ }
+
+ flush();
+
+ return;
+ }
+
+ /**
+ * 個別のジョイント情報を出力する。
+ * @param joint ジョイント
+ * @throws IOException 出力エラー
+ * @throws IllegalPmdTextException 長すぎるジョイント名
+ */
+ private void dumpJoint(JointInfo joint)
+ throws IOException, IllegalPmdTextException{
+ String jointName = joint.getJointName().getPrimaryText();
+ dumpText(jointName, PmdLimits.MAXBYTES_JOINTNAME);
+
+ RigidInfo rigidA = joint.getRigidA();
+ RigidInfo rigidB = joint.getRigidB();
+
+ dumpInt(rigidA.getSerialNumber());
+ dumpInt(rigidB.getSerialNumber());
+
+ dumpPos3d(joint.getPosition());
+ dumpRad3d(joint.getRotation());
+
+ dumpTripletRange(joint.getPositionRange());
+ dumpTripletRange(joint.getRotationRange());
+
+ dumpPos3d(joint.getElasticPosition());
+ dumpDeg3d(joint.getElasticRotation());
+
+ return;
+ }
+
+ /**
+ * 3次元範囲制約を出力する。
+ * @param range 3次元範囲制約
+ * @throws IOException 出力エラー
+ */
+ protected void dumpTripletRange(TripletRange range) throws IOException{
+ float xFrom = range.getXFrom();
+ float yFrom = range.getYFrom();
+ float zFrom = range.getZFrom();
+
+ dumpFloat(xFrom);
+ dumpFloat(yFrom);
+ dumpFloat(zFrom);
+
+ float xTo = range.getXTo();
+ float yTo = range.getYTo();
+ float zTo = range.getZTo();
+
+ dumpFloat(xTo);
+ dumpFloat(yTo);
+ dumpFloat(zTo);
+
+ return;
+ }
+
+ /**
+ * ラジアンによる3次元姿勢情報を出力する。
+ * @param rad 3次元姿勢情報
+ * @throws IOException 出力エラー
+ */
+ protected void dumpRad3d(Rad3d rad) throws IOException{
+ float xVal = rad.getXRad();
+ float yVal = rad.getYRad();
+ float zVal = rad.getZRad();
+
+ dumpFloat(xVal);
+ dumpFloat(yVal);
+ dumpFloat(zVal);
+
+ return;
+ }
+
+ /**
+ * 度数法による3次元姿勢情報を出力する。
+ * @param deg 3次元姿勢情報
+ * @throws IOException 出力エラー
+ */
+ protected void dumpDeg3d(Deg3d deg) throws IOException{
+ float xVal = deg.getXDeg();
+ float yVal = deg.getYDeg();
+ float zVal = deg.getZDeg();
+
+ dumpFloat(xVal);
+ dumpFloat(yVal);
+ dumpFloat(zVal);
+
+ return;
+ }
+
+}