OSDN Git Service

[no commit message]
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / pmd / pmdexporter / PmdExporterExt3.java
index 142c5ac..daf75d2 100644 (file)
-/*\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;
+    }
+
+}