OSDN Git Service

1.105.3-SNAPSHOT版開発開始
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / pmd / pmdloader / BoneBuilder.java
index 0dca521..28a00ea 100644 (file)
-/*\r
- * building bone information\r
- *\r
- * License : The MIT License\r
- * Copyright(c) 2010 MikuToga Partners\r
- */\r
-\r
-package jp.sourceforge.mikutoga.pmd.pmdloader;\r
-\r
-import java.util.Iterator;\r
-import java.util.LinkedList;\r
-import java.util.List;\r
-import jp.sourceforge.mikutoga.corelib.ListUtil;\r
-import jp.sourceforge.mikutoga.parser.ParseStage;\r
-import jp.sourceforge.mikutoga.parser.pmd.PmdBoneHandler;\r
-import jp.sourceforge.mikutoga.parser.pmd.PmdLimits;\r
-import jp.sourceforge.mikutoga.pmd.BoneGroup;\r
-import jp.sourceforge.mikutoga.pmd.BoneInfo;\r
-import jp.sourceforge.mikutoga.pmd.BoneType;\r
-import jp.sourceforge.mikutoga.pmd.IKChain;\r
-import jp.sourceforge.mikutoga.pmd.PmdModel;\r
-import jp.sourceforge.mikutoga.pmd.Pos3d;\r
-\r
-/**\r
- * ボーン関係の通知をパーサから受け取る。\r
- */\r
-class BoneBuilder implements PmdBoneHandler {\r
-\r
-    private final List<BoneInfo> boneList;\r
-    private Iterator<BoneInfo> boneIt;\r
-    private BoneInfo currentBone = null;\r
-\r
-    private final List<IKChain> ikChainList;\r
-    private Iterator<IKChain> ikChainIt;\r
-    private IKChain currentIkChain = null;\r
-\r
-    private final List<BoneGroup> boneGroupList;\r
-    private Iterator<BoneGroup> boneGroupIt;\r
-    private BoneGroup currentBoneGroup = null;\r
-\r
-    /**\r
-     * コンストラクタ。\r
-     * @param model モデル\r
-     */\r
-    BoneBuilder(PmdModel model){\r
-        super();\r
-\r
-        this.boneList      = model.getBoneList();\r
-        this.ikChainList   = model.getIKChainList();\r
-        this.boneGroupList = model.getBoneGroupList();\r
-\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * {@inheritDoc}\r
-     * @param stage {@inheritDoc}\r
-     * @param loops {@inheritDoc}\r
-     */\r
-    @Override\r
-    public void loopStart(ParseStage stage, int loops){\r
-        assert stage instanceof PmdBoneStage;\r
-\r
-        if(stage == PmdBoneHandler.BONE_LIST){\r
-            ListUtil.prepareDefConsList(this.boneList, BoneInfo.class, loops);\r
-            ListUtil.assignIndexedSerial(this.boneList);\r
-\r
-            this.boneIt = this.boneList.iterator();\r
-            if(this.boneIt.hasNext()){\r
-                this.currentBone = this.boneIt.next();\r
-            }\r
-        }else if(stage == PmdBoneHandler.IK_LIST){\r
-            ListUtil.prepareDefConsList(this.ikChainList,\r
-                                        IKChain.class,\r
-                                        loops );\r
-\r
-            this.ikChainIt = this.ikChainList.iterator();\r
-            if(this.ikChainIt.hasNext()){\r
-                this.currentIkChain = this.ikChainIt.next();\r
-            }\r
-        }else if(stage == PmdBoneHandler.IKCHAIN_LIST){\r
-            //NOTHING\r
-        }else if(stage == PmdBoneHandler.BONEGROUP_LIST){\r
-            ListUtil.prepareDefConsList(this.boneGroupList,\r
-                                        BoneGroup.class,\r
-                                        loops + 1 );\r
-            ListUtil.assignIndexedSerial(this.boneGroupList);\r
-\r
-            this.boneGroupIt = this.boneGroupList.iterator();\r
-\r
-            assert this.boneGroupIt.hasNext();\r
-            this.boneGroupIt.next();     // デフォルトボーングループを読み飛ばす\r
-\r
-            if(this.boneGroupIt.hasNext()){\r
-                this.currentBoneGroup = this.boneGroupIt.next();\r
-            }\r
-        }else if(stage == PmdBoneHandler.GROUPEDBONE_LIST){\r
-            //NOTHING\r
-        }else{\r
-            assert false;\r
-            throw new AssertionError();\r
-        }\r
-\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * {@inheritDoc}\r
-     * @param stage {@inheritDoc}\r
-     */\r
-    @Override\r
-    public void loopNext(ParseStage stage){\r
-        assert stage instanceof PmdBoneStage;\r
-\r
-        if(stage == PmdBoneHandler.BONE_LIST){\r
-            if(this.boneIt.hasNext()){\r
-                this.currentBone = this.boneIt.next();\r
-            }\r
-        }else if(stage == PmdBoneHandler.IK_LIST){\r
-            if(this.ikChainIt.hasNext()){\r
-                this.currentIkChain = this.ikChainIt.next();\r
-            }\r
-        }else if(stage == PmdBoneHandler.IKCHAIN_LIST){\r
-            //NOTHING\r
-        }else if(stage == PmdBoneHandler.BONEGROUP_LIST){\r
-            if(this.boneGroupIt.hasNext()){\r
-                this.currentBoneGroup = this.boneGroupIt.next();\r
-            }\r
-        }else if(stage == PmdBoneHandler.GROUPEDBONE_LIST){\r
-            //NOTHING\r
-        }else{\r
-            assert false;\r
-            throw new AssertionError();\r
-        }\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * {@inheritDoc}\r
-     * @param stage {@inheritDoc}\r
-     */\r
-    @Override\r
-    public void loopEnd(ParseStage stage){\r
-        assert stage instanceof PmdBoneStage;\r
-\r
-        if(stage == PmdBoneHandler.BONE_LIST){\r
-            //NOTHING\r
-        }else if(stage == PmdBoneHandler.IK_LIST){\r
-            //NOTHING\r
-        }else if(stage == PmdBoneHandler.IKCHAIN_LIST){\r
-            //NOTHING\r
-        }else if(stage == PmdBoneHandler.BONEGROUP_LIST){\r
-            //NOTHING\r
-        }else if(stage == PmdBoneHandler.GROUPEDBONE_LIST){\r
-            pickOrphanBone();\r
-        }else{\r
-            assert false;\r
-            throw new AssertionError();\r
-        }\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * 所属グループの無いボーンをデフォルトボーングループへ登録する。\r
-     */\r
-    private void pickOrphanBone(){\r
-        List<BoneInfo> orpahnList = new LinkedList<BoneInfo>();\r
-        orpahnList.addAll(this.boneList);\r
-        for(BoneGroup group : this.boneGroupList){\r
-            orpahnList.removeAll(group.getBoneList());\r
-        }\r
-\r
-        BoneGroup defaultGroup = this.boneGroupList.get(0);\r
-        defaultGroup.getBoneList().addAll(orpahnList);\r
-\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * {@inheritDoc}\r
-     * @param boneName {@inheritDoc}\r
-     * @param boneKind {@inheritDoc}\r
-     */\r
-    @Override\r
-    public void pmdBoneInfo(String boneName, byte boneKind){\r
-        this.currentBone.getBoneName().setPrimaryText(boneName);\r
-        BoneType type = BoneType.decode(boneKind);\r
-        this.currentBone.setBoneType(type);\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * {@inheritDoc}\r
-     * @param parentId {@inheritDoc}\r
-     * @param tailId {@inheritDoc}\r
-     * @param ikId {@inheritDoc}\r
-     */\r
-    @Override\r
-    public void pmdBoneLink(int parentId, int tailId, int ikId){\r
-        BoneInfo prevBone = null;\r
-        if(0 <= parentId && parentId < PmdLimits.MAX_BONE){\r
-            prevBone = this.boneList.get(parentId);\r
-        }\r
-\r
-        BoneInfo nextBone = null;\r
-        if(tailId != 0){\r
-            nextBone = this.boneList.get(tailId);\r
-        }\r
-\r
-        BoneInfo ikBone = null;\r
-        if(this.currentBone.getBoneType() == BoneType.LINKEDROT){\r
-            ikBone = null;\r
-            int ratio = ikId;\r
-            this.currentBone.setRotationRatio(ratio);\r
-        }else if(0 < ikId && ikId < PmdLimits.MAX_BONE){\r
-            ikBone = this.boneList.get(ikId);\r
-        }\r
-\r
-        this.currentBone.setPrevBone(prevBone);\r
-        this.currentBone.setNextBone(nextBone);\r
-        this.currentBone.setIKBone(ikBone);\r
-\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * {@inheritDoc}\r
-     * @param xPos {@inheritDoc}\r
-     * @param yPos {@inheritDoc}\r
-     * @param zPos {@inheritDoc}\r
-     */\r
-    @Override\r
-    public void pmdBonePosition(float xPos, float yPos, float zPos){\r
-        Pos3d position = this.currentBone.getPosition();\r
-        position.setXPos(xPos);\r
-        position.setYPos(yPos);\r
-        position.setZPos(zPos);\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * {@inheritDoc}\r
-     * @param boneId {@inheritDoc}\r
-     * @param targetId {@inheritDoc}\r
-     * @param depth {@inheritDoc}\r
-     * @param weight {@inheritDoc}\r
-     */\r
-    @Override\r
-    public void pmdIKInfo(int boneId, int targetId, int depth, float weight){\r
-        BoneInfo bone = this.boneList.get(boneId);\r
-        this.currentIkChain.setIkBone(bone);\r
-\r
-        BoneInfo target = this.boneList.get(targetId);\r
-        this.currentIkChain.getChainedBoneList().add(0, target);\r
-\r
-        this.currentIkChain.setIKDepth(depth);\r
-        this.currentIkChain.setIKWeight(weight);\r
-\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * {@inheritDoc}\r
-     * @param childId {@inheritDoc}\r
-     */\r
-    @Override\r
-    public void pmdIKChainInfo(int childId){\r
-        BoneInfo chain = this.boneList.get(childId);\r
-        this.currentIkChain.getChainedBoneList().add(chain);\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * {@inheritDoc}\r
-     * @param groupName {@inheritDoc}\r
-     */\r
-    @Override\r
-    public void pmdBoneGroupInfo(String groupName){\r
-        this.currentBoneGroup.getGroupName().setPrimaryText(groupName);\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * {@inheritDoc}\r
-     * @param boneId {@inheritDoc}\r
-     * @param groupId {@inheritDoc}\r
-     */\r
-    @Override\r
-    public void pmdGroupedBoneInfo(int boneId, int groupId){\r
-        BoneInfo bone = this.boneList.get(boneId);\r
-        BoneGroup group = this.boneGroupList.get(groupId);\r
-        group.getBoneList().add(bone);\r
-        return;\r
-    }\r
-\r
-}\r
+/*
+ * building bone information
+ *
+ * License : The MIT License
+ * Copyright(c) 2010 MikuToga Partners
+ */
+
+package jp.sourceforge.mikutoga.pmd.pmdloader;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import jp.sourceforge.mikutoga.corelib.ListUtil;
+import jp.sourceforge.mikutoga.parser.ParseStage;
+import jp.sourceforge.mikutoga.parser.pmd.PmdBoneHandler;
+import jp.sourceforge.mikutoga.parser.pmd.PmdLimits;
+import jp.sourceforge.mikutoga.pmd.BoneGroup;
+import jp.sourceforge.mikutoga.pmd.BoneInfo;
+import jp.sourceforge.mikutoga.pmd.BoneType;
+import jp.sourceforge.mikutoga.pmd.IKChain;
+import jp.sourceforge.mikutoga.pmd.PmdModel;
+import jp.sourceforge.mikutoga.pmd.Pos3d;
+
+/**
+ * ボーン関係の通知をパーサから受け取る。
+ */
+class BoneBuilder implements PmdBoneHandler {
+
+    private final List<BoneInfo> boneList;
+    private Iterator<BoneInfo> boneIt;
+    private BoneInfo currentBone = null;
+
+    private final List<IKChain> ikChainList;
+    private Iterator<IKChain> ikChainIt;
+    private IKChain currentIkChain = null;
+
+    private final List<BoneGroup> boneGroupList;
+    private Iterator<BoneGroup> boneGroupIt;
+    private BoneGroup currentBoneGroup = null;
+
+    /**
+     * コンストラクタ。
+     * @param model モデル
+     */
+    BoneBuilder(PmdModel model){
+        super();
+
+        this.boneList      = model.getBoneList();
+        this.ikChainList   = model.getIKChainList();
+        this.boneGroupList = model.getBoneGroupList();
+
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param stage {@inheritDoc}
+     * @param loops {@inheritDoc}
+     */
+    @Override
+    public void loopStart(ParseStage stage, int loops){
+        assert stage instanceof PmdBoneStage;
+
+        if(stage == PmdBoneHandler.BONE_LIST){
+            ListUtil.prepareDefConsList(this.boneList, BoneInfo.class, loops);
+            ListUtil.assignIndexedSerial(this.boneList);
+
+            this.boneIt = this.boneList.iterator();
+            if(this.boneIt.hasNext()){
+                this.currentBone = this.boneIt.next();
+            }
+        }else if(stage == PmdBoneHandler.IK_LIST){
+            ListUtil.prepareDefConsList(this.ikChainList,
+                                        IKChain.class,
+                                        loops );
+
+            this.ikChainIt = this.ikChainList.iterator();
+            if(this.ikChainIt.hasNext()){
+                this.currentIkChain = this.ikChainIt.next();
+            }
+        }else if(stage == PmdBoneHandler.IKCHAIN_LIST){
+            //NOTHING
+        }else if(stage == PmdBoneHandler.BONEGROUP_LIST){
+            ListUtil.prepareDefConsList(this.boneGroupList,
+                                        BoneGroup.class,
+                                        loops + 1 );
+            ListUtil.assignIndexedSerial(this.boneGroupList);
+
+            this.boneGroupIt = this.boneGroupList.iterator();
+
+            assert this.boneGroupIt.hasNext();
+            this.boneGroupIt.next();     // デフォルトボーングループを読み飛ばす
+
+            if(this.boneGroupIt.hasNext()){
+                this.currentBoneGroup = this.boneGroupIt.next();
+            }
+        }else if(stage == PmdBoneHandler.GROUPEDBONE_LIST){
+            //NOTHING
+        }else{
+            assert false;
+            throw new AssertionError();
+        }
+
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param stage {@inheritDoc}
+     */
+    @Override
+    public void loopNext(ParseStage stage){
+        assert stage instanceof PmdBoneStage;
+
+        if(stage == PmdBoneHandler.BONE_LIST){
+            if(this.boneIt.hasNext()){
+                this.currentBone = this.boneIt.next();
+            }
+        }else if(stage == PmdBoneHandler.IK_LIST){
+            if(this.ikChainIt.hasNext()){
+                this.currentIkChain = this.ikChainIt.next();
+            }
+        }else if(stage == PmdBoneHandler.IKCHAIN_LIST){
+            //NOTHING
+        }else if(stage == PmdBoneHandler.BONEGROUP_LIST){
+            if(this.boneGroupIt.hasNext()){
+                this.currentBoneGroup = this.boneGroupIt.next();
+            }
+        }else if(stage == PmdBoneHandler.GROUPEDBONE_LIST){
+            //NOTHING
+        }else{
+            assert false;
+            throw new AssertionError();
+        }
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param stage {@inheritDoc}
+     */
+    @Override
+    public void loopEnd(ParseStage stage){
+        assert stage instanceof PmdBoneStage;
+
+        if(stage == PmdBoneHandler.BONE_LIST){
+            //NOTHING
+        }else if(stage == PmdBoneHandler.IK_LIST){
+            //NOTHING
+        }else if(stage == PmdBoneHandler.IKCHAIN_LIST){
+            //NOTHING
+        }else if(stage == PmdBoneHandler.BONEGROUP_LIST){
+            //NOTHING
+        }else if(stage == PmdBoneHandler.GROUPEDBONE_LIST){
+            pickOrphanBone();
+        }else{
+            assert false;
+            throw new AssertionError();
+        }
+        return;
+    }
+
+    /**
+     * 所属グループの無いボーンをデフォルトボーングループへ登録する。
+     */
+    private void pickOrphanBone(){
+        List<BoneInfo> orpahnList = new LinkedList<BoneInfo>();
+        orpahnList.addAll(this.boneList);
+        for(BoneGroup group : this.boneGroupList){
+            orpahnList.removeAll(group.getBoneList());
+        }
+
+        BoneGroup defaultGroup = this.boneGroupList.get(0);
+        defaultGroup.getBoneList().addAll(orpahnList);
+
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param boneName {@inheritDoc}
+     * @param boneKind {@inheritDoc}
+     */
+    @Override
+    public void pmdBoneInfo(String boneName, byte boneKind){
+        this.currentBone.getBoneName().setPrimaryText(boneName);
+        BoneType type = BoneType.decode(boneKind);
+        this.currentBone.setBoneType(type);
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param parentId {@inheritDoc}
+     * @param tailId {@inheritDoc}
+     * @param ikId {@inheritDoc}
+     */
+    @Override
+    public void pmdBoneLink(int parentId, int tailId, int ikId){
+        BoneInfo prevBone = null;
+        if(0 <= parentId && parentId < PmdLimits.MAX_BONE){
+            prevBone = this.boneList.get(parentId);
+        }
+
+        BoneInfo nextBone = null;
+        if(tailId != 0){
+            nextBone = this.boneList.get(tailId);
+        }
+
+        BoneInfo ikBone = null;
+        if(this.currentBone.getBoneType() == BoneType.LINKEDROT){
+            ikBone = null;
+            int ratio = ikId;
+            this.currentBone.setRotationRatio(ratio);
+        }else if(0 < ikId && ikId < PmdLimits.MAX_BONE){
+            ikBone = this.boneList.get(ikId);
+        }
+
+        this.currentBone.setPrevBone(prevBone);
+        this.currentBone.setNextBone(nextBone);
+        this.currentBone.setIKBone(ikBone);
+
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param xPos {@inheritDoc}
+     * @param yPos {@inheritDoc}
+     * @param zPos {@inheritDoc}
+     */
+    @Override
+    public void pmdBonePosition(float xPos, float yPos, float zPos){
+        Pos3d position = this.currentBone.getPosition();
+        position.setXPos(xPos);
+        position.setYPos(yPos);
+        position.setZPos(zPos);
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param boneId {@inheritDoc}
+     * @param targetId {@inheritDoc}
+     * @param depth {@inheritDoc}
+     * @param weight {@inheritDoc}
+     */
+    @Override
+    public void pmdIKInfo(int boneId, int targetId, int depth, float weight){
+        BoneInfo bone = this.boneList.get(boneId);
+        this.currentIkChain.setIkBone(bone);
+
+        BoneInfo target = this.boneList.get(targetId);
+        this.currentIkChain.getChainedBoneList().add(0, target);
+
+        this.currentIkChain.setIKDepth(depth);
+        this.currentIkChain.setIKWeight(weight);
+
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param childId {@inheritDoc}
+     */
+    @Override
+    public void pmdIKChainInfo(int childId){
+        BoneInfo chain = this.boneList.get(childId);
+        this.currentIkChain.getChainedBoneList().add(chain);
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param groupName {@inheritDoc}
+     */
+    @Override
+    public void pmdBoneGroupInfo(String groupName){
+        this.currentBoneGroup.getGroupName().setPrimaryText(groupName);
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param boneId {@inheritDoc}
+     * @param groupId {@inheritDoc}
+     */
+    @Override
+    public void pmdGroupedBoneInfo(int boneId, int groupId){
+        BoneInfo bone = this.boneList.get(boneId);
+        BoneGroup group = this.boneGroupList.get(groupId);
+        group.getBoneList().add(bone);
+        return;
+    }
+
+}