2 * building bone information
\r
4 * License : The MIT License
\r
5 * Copyright(c) 2010 MikuToga Partners
\r
8 package jp.sourceforge.mikutoga.pmd.pmdloader;
\r
10 import jp.sourceforge.mikutoga.corelib.ListUtil;
\r
11 import java.util.Iterator;
\r
12 import java.util.LinkedList;
\r
13 import java.util.List;
\r
14 import jp.sourceforge.mikutoga.parser.ParseStage;
\r
15 import jp.sourceforge.mikutoga.parser.pmd.PmdBoneHandler;
\r
16 import jp.sourceforge.mikutoga.parser.pmd.PmdLimits;
\r
17 import jp.sourceforge.mikutoga.pmd.BoneGroup;
\r
18 import jp.sourceforge.mikutoga.pmd.BoneInfo;
\r
19 import jp.sourceforge.mikutoga.pmd.BoneType;
\r
20 import jp.sourceforge.mikutoga.pmd.IKChain;
\r
21 import jp.sourceforge.mikutoga.pmd.PmdModel;
\r
22 import jp.sourceforge.mikutoga.pmd.Pos3d;
\r
25 * ボーン関係の通知をパーサから受け取る。
\r
27 class BoneBuilder implements PmdBoneHandler {
\r
29 private final List<BoneInfo> boneList;
\r
30 private Iterator<BoneInfo> boneIt;
\r
31 private BoneInfo currentBone = null;
\r
33 private final List<IKChain> ikChainList;
\r
34 private Iterator<IKChain> ikChainIt;
\r
35 private IKChain currentIkChain = null;
\r
37 private final List<BoneGroup> boneGroupList;
\r
38 private Iterator<BoneGroup> boneGroupIt;
\r
39 private BoneGroup currentBoneGroup = null;
\r
45 BoneBuilder(PmdModel model){
\r
48 this.boneList = model.getBoneList();
\r
49 this.ikChainList = model.getIKChainList();
\r
50 this.boneGroupList = model.getBoneGroupList();
\r
57 * @param stage {@inheritDoc}
\r
58 * @param loops {@inheritDoc}
\r
60 public void loopStart(ParseStage stage, int loops){
\r
61 assert stage instanceof PmdBoneStage;
\r
63 if(stage == PmdBoneHandler.BONE_LIST){
\r
64 ListUtil.prepareDefConsList(this.boneList, BoneInfo.class, loops);
\r
65 ListUtil.assignIndexedSerial(this.boneList);
\r
67 this.boneIt = this.boneList.iterator();
\r
68 if(this.boneIt.hasNext()){
\r
69 this.currentBone = this.boneIt.next();
\r
71 }else if(stage == PmdBoneHandler.IK_LIST){
\r
72 ListUtil.prepareDefConsList(this.ikChainList,
\r
76 this.ikChainIt = this.ikChainList.iterator();
\r
77 if(this.ikChainIt.hasNext()){
\r
78 this.currentIkChain = this.ikChainIt.next();
\r
80 }else if(stage == PmdBoneHandler.IKCHAIN_LIST){
\r
82 }else if(stage == PmdBoneHandler.BONEGROUP_LIST){
\r
83 ListUtil.prepareDefConsList(this.boneGroupList,
\r
86 ListUtil.assignIndexedSerial(this.boneGroupList);
\r
88 this.boneGroupIt = this.boneGroupList.iterator();
\r
90 assert this.boneGroupIt.hasNext();
\r
91 this.boneGroupIt.next(); // デフォルトボーングループを読み飛ばす
\r
93 if(this.boneGroupIt.hasNext()){
\r
94 this.currentBoneGroup = this.boneGroupIt.next();
\r
96 }else if(stage == PmdBoneHandler.GROUPEDBONE_LIST){
\r
100 throw new AssertionError();
\r
108 * @param stage {@inheritDoc}
\r
110 public void loopNext(ParseStage stage){
\r
111 assert stage instanceof PmdBoneStage;
\r
113 if(stage == PmdBoneHandler.BONE_LIST){
\r
114 if(this.boneIt.hasNext()){
\r
115 this.currentBone = this.boneIt.next();
\r
117 }else if(stage == PmdBoneHandler.IK_LIST){
\r
118 if(this.ikChainIt.hasNext()){
\r
119 this.currentIkChain = this.ikChainIt.next();
\r
121 }else if(stage == PmdBoneHandler.IKCHAIN_LIST){
\r
123 }else if(stage == PmdBoneHandler.BONEGROUP_LIST){
\r
124 if(this.boneGroupIt.hasNext()){
\r
125 this.currentBoneGroup = this.boneGroupIt.next();
\r
127 }else if(stage == PmdBoneHandler.GROUPEDBONE_LIST){
\r
131 throw new AssertionError();
\r
138 * @param stage {@inheritDoc}
\r
140 public void loopEnd(ParseStage stage){
\r
141 assert stage instanceof PmdBoneStage;
\r
143 if(stage == PmdBoneHandler.BONE_LIST){
\r
145 }else if(stage == PmdBoneHandler.IK_LIST){
\r
147 }else if(stage == PmdBoneHandler.IKCHAIN_LIST){
\r
149 }else if(stage == PmdBoneHandler.BONEGROUP_LIST){
\r
151 }else if(stage == PmdBoneHandler.GROUPEDBONE_LIST){
\r
155 throw new AssertionError();
\r
161 * 所属グループの無いボーンをデフォルトボーングループへ登録する。
\r
163 private void pickOrphanBone(){
\r
164 List<BoneInfo> orpahnList = new LinkedList<BoneInfo>();
\r
165 orpahnList.addAll(this.boneList);
\r
166 for(BoneGroup group : this.boneGroupList){
\r
167 orpahnList.removeAll(group.getBoneList());
\r
170 BoneGroup defaultGroup = this.boneGroupList.get(0);
\r
171 defaultGroup.getBoneList().addAll(orpahnList);
\r
178 * @param boneName {@inheritDoc}
\r
179 * @param boneKind {@inheritDoc}
\r
181 public void pmdBoneInfo(String boneName, byte boneKind){
\r
182 this.currentBone.getBoneName().setPrimaryText(boneName);
\r
183 BoneType type = BoneType.decode(boneKind);
\r
184 this.currentBone.setBoneType(type);
\r
190 * @param parentId {@inheritDoc}
\r
191 * @param tailId {@inheritDoc}
\r
192 * @param ikId {@inheritDoc}
\r
194 public void pmdBoneLink(int parentId, int tailId, int ikId){
\r
195 BoneInfo prevBone = null;
\r
196 if(0 <= parentId && parentId < PmdLimits.MAX_BONE){
\r
197 prevBone = this.boneList.get(parentId);
\r
200 BoneInfo nextBone = null;
\r
202 nextBone = this.boneList.get(tailId);
\r
205 BoneInfo ikBone = null;
\r
206 if(this.currentBone.getBoneType() == BoneType.LINKEDROT){
\r
209 this.currentBone.setRotationRatio(ratio);
\r
210 }else if(0 < ikId && ikId < PmdLimits.MAX_BONE){
\r
211 ikBone = this.boneList.get(ikId);
\r
214 this.currentBone.setPrevBone(prevBone);
\r
215 this.currentBone.setNextBone(nextBone);
\r
216 this.currentBone.setIKBone(ikBone);
\r
223 * @param xPos {@inheritDoc}
\r
224 * @param yPos {@inheritDoc}
\r
225 * @param zPos {@inheritDoc}
\r
227 public void pmdBonePosition(float xPos, float yPos, float zPos){
\r
228 Pos3d position = this.currentBone.getPosition();
\r
229 position.setXPos(xPos);
\r
230 position.setYPos(yPos);
\r
231 position.setZPos(zPos);
\r
237 * @param boneId {@inheritDoc}
\r
238 * @param targetId {@inheritDoc}
\r
239 * @param depth {@inheritDoc}
\r
240 * @param weight {@inheritDoc}
\r
242 public void pmdIKInfo(int boneId, int targetId, int depth, float weight){
\r
243 BoneInfo bone = this.boneList.get(boneId);
\r
244 this.currentIkChain.setIkBone(bone);
\r
246 BoneInfo target = this.boneList.get(targetId);
\r
247 this.currentIkChain.getChainedBoneList().add(0, target);
\r
249 this.currentIkChain.setIKDepth(depth);
\r
250 this.currentIkChain.setIKWeight(weight);
\r
257 * @param childId {@inheritDoc}
\r
259 public void pmdIKChainInfo(int childId){
\r
260 BoneInfo chain = this.boneList.get(childId);
\r
261 this.currentIkChain.getChainedBoneList().add(chain);
\r
267 * @param groupName {@inheritDoc}
\r
269 public void pmdBoneGroupInfo(String groupName){
\r
270 this.currentBoneGroup.getGroupName().setPrimaryText(groupName);
\r
276 * @param boneId {@inheritDoc}
\r
277 * @param groupId {@inheritDoc}
\r
279 public void pmdGroupedBoneInfo(int boneId, int groupId){
\r
280 BoneInfo bone = this.boneList.get(boneId);
\r
281 BoneGroup group = this.boneGroupList.get(groupId);
\r
282 group.getBoneList().add(bone);
\r