-/*\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 jp.sourceforge.mikutoga.corelib.ListUtil;\r
-import java.util.Iterator;\r
-import java.util.LinkedList;\r
-import java.util.List;\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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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){
+ 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){
+ 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){
+ 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;
+ }
+
+}