OSDN Git Service

1.6化に伴う@Overrideアノテーション対応
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / pmd / pmdloader / BoneBuilder.java
1 /*\r
2  * building bone information\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2010 MikuToga Partners\r
6  */\r
7 \r
8 package jp.sourceforge.mikutoga.pmd.pmdloader;\r
9 \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
23 \r
24 /**\r
25  * ボーン関係の通知をパーサから受け取る。\r
26  */\r
27 class BoneBuilder implements PmdBoneHandler {\r
28 \r
29     private final List<BoneInfo> boneList;\r
30     private Iterator<BoneInfo> boneIt;\r
31     private BoneInfo currentBone = null;\r
32 \r
33     private final List<IKChain> ikChainList;\r
34     private Iterator<IKChain> ikChainIt;\r
35     private IKChain currentIkChain = null;\r
36 \r
37     private final List<BoneGroup> boneGroupList;\r
38     private Iterator<BoneGroup> boneGroupIt;\r
39     private BoneGroup currentBoneGroup = null;\r
40 \r
41     /**\r
42      * コンストラクタ。\r
43      * @param model モデル\r
44      */\r
45     BoneBuilder(PmdModel model){\r
46         super();\r
47 \r
48         this.boneList      = model.getBoneList();\r
49         this.ikChainList   = model.getIKChainList();\r
50         this.boneGroupList = model.getBoneGroupList();\r
51 \r
52         return;\r
53     }\r
54 \r
55     /**\r
56      * {@inheritDoc}\r
57      * @param stage {@inheritDoc}\r
58      * @param loops {@inheritDoc}\r
59      */\r
60     @Override\r
61     public void loopStart(ParseStage stage, int loops){\r
62         assert stage instanceof PmdBoneStage;\r
63 \r
64         if(stage == PmdBoneHandler.BONE_LIST){\r
65             ListUtil.prepareDefConsList(this.boneList, BoneInfo.class, loops);\r
66             ListUtil.assignIndexedSerial(this.boneList);\r
67 \r
68             this.boneIt = this.boneList.iterator();\r
69             if(this.boneIt.hasNext()){\r
70                 this.currentBone = this.boneIt.next();\r
71             }\r
72         }else if(stage == PmdBoneHandler.IK_LIST){\r
73             ListUtil.prepareDefConsList(this.ikChainList,\r
74                                         IKChain.class,\r
75                                         loops );\r
76 \r
77             this.ikChainIt = this.ikChainList.iterator();\r
78             if(this.ikChainIt.hasNext()){\r
79                 this.currentIkChain = this.ikChainIt.next();\r
80             }\r
81         }else if(stage == PmdBoneHandler.IKCHAIN_LIST){\r
82             //NOTHING\r
83         }else if(stage == PmdBoneHandler.BONEGROUP_LIST){\r
84             ListUtil.prepareDefConsList(this.boneGroupList,\r
85                                         BoneGroup.class,\r
86                                         loops + 1 );\r
87             ListUtil.assignIndexedSerial(this.boneGroupList);\r
88 \r
89             this.boneGroupIt = this.boneGroupList.iterator();\r
90 \r
91             assert this.boneGroupIt.hasNext();\r
92             this.boneGroupIt.next();     // デフォルトボーングループを読み飛ばす\r
93 \r
94             if(this.boneGroupIt.hasNext()){\r
95                 this.currentBoneGroup = this.boneGroupIt.next();\r
96             }\r
97         }else if(stage == PmdBoneHandler.GROUPEDBONE_LIST){\r
98             //NOTHING\r
99         }else{\r
100             assert false;\r
101             throw new AssertionError();\r
102         }\r
103 \r
104         return;\r
105     }\r
106 \r
107     /**\r
108      * {@inheritDoc}\r
109      * @param stage {@inheritDoc}\r
110      */\r
111     @Override\r
112     public void loopNext(ParseStage stage){\r
113         assert stage instanceof PmdBoneStage;\r
114 \r
115         if(stage == PmdBoneHandler.BONE_LIST){\r
116             if(this.boneIt.hasNext()){\r
117                 this.currentBone = this.boneIt.next();\r
118             }\r
119         }else if(stage == PmdBoneHandler.IK_LIST){\r
120             if(this.ikChainIt.hasNext()){\r
121                 this.currentIkChain = this.ikChainIt.next();\r
122             }\r
123         }else if(stage == PmdBoneHandler.IKCHAIN_LIST){\r
124             //NOTHING\r
125         }else if(stage == PmdBoneHandler.BONEGROUP_LIST){\r
126             if(this.boneGroupIt.hasNext()){\r
127                 this.currentBoneGroup = this.boneGroupIt.next();\r
128             }\r
129         }else if(stage == PmdBoneHandler.GROUPEDBONE_LIST){\r
130             //NOTHING\r
131         }else{\r
132             assert false;\r
133             throw new AssertionError();\r
134         }\r
135         return;\r
136     }\r
137 \r
138     /**\r
139      * {@inheritDoc}\r
140      * @param stage {@inheritDoc}\r
141      */\r
142     @Override\r
143     public void loopEnd(ParseStage stage){\r
144         assert stage instanceof PmdBoneStage;\r
145 \r
146         if(stage == PmdBoneHandler.BONE_LIST){\r
147             //NOTHING\r
148         }else if(stage == PmdBoneHandler.IK_LIST){\r
149             //NOTHING\r
150         }else if(stage == PmdBoneHandler.IKCHAIN_LIST){\r
151             //NOTHING\r
152         }else if(stage == PmdBoneHandler.BONEGROUP_LIST){\r
153             //NOTHING\r
154         }else if(stage == PmdBoneHandler.GROUPEDBONE_LIST){\r
155             pickOrphanBone();\r
156         }else{\r
157             assert false;\r
158             throw new AssertionError();\r
159         }\r
160         return;\r
161     }\r
162 \r
163     /**\r
164      * 所属グループの無いボーンをデフォルトボーングループへ登録する。\r
165      */\r
166     private void pickOrphanBone(){\r
167         List<BoneInfo> orpahnList = new LinkedList<BoneInfo>();\r
168         orpahnList.addAll(this.boneList);\r
169         for(BoneGroup group : this.boneGroupList){\r
170             orpahnList.removeAll(group.getBoneList());\r
171         }\r
172 \r
173         BoneGroup defaultGroup = this.boneGroupList.get(0);\r
174         defaultGroup.getBoneList().addAll(orpahnList);\r
175 \r
176         return;\r
177     }\r
178 \r
179     /**\r
180      * {@inheritDoc}\r
181      * @param boneName {@inheritDoc}\r
182      * @param boneKind {@inheritDoc}\r
183      */\r
184     @Override\r
185     public void pmdBoneInfo(String boneName, byte boneKind){\r
186         this.currentBone.getBoneName().setPrimaryText(boneName);\r
187         BoneType type = BoneType.decode(boneKind);\r
188         this.currentBone.setBoneType(type);\r
189         return;\r
190     }\r
191 \r
192     /**\r
193      * {@inheritDoc}\r
194      * @param parentId {@inheritDoc}\r
195      * @param tailId {@inheritDoc}\r
196      * @param ikId {@inheritDoc}\r
197      */\r
198     @Override\r
199     public void pmdBoneLink(int parentId, int tailId, int ikId){\r
200         BoneInfo prevBone = null;\r
201         if(0 <= parentId && parentId < PmdLimits.MAX_BONE){\r
202             prevBone = this.boneList.get(parentId);\r
203         }\r
204 \r
205         BoneInfo nextBone = null;\r
206         if(tailId != 0){\r
207             nextBone = this.boneList.get(tailId);\r
208         }\r
209 \r
210         BoneInfo ikBone = null;\r
211         if(this.currentBone.getBoneType() == BoneType.LINKEDROT){\r
212             ikBone = null;\r
213             int ratio = ikId;\r
214             this.currentBone.setRotationRatio(ratio);\r
215         }else if(0 < ikId && ikId < PmdLimits.MAX_BONE){\r
216             ikBone = this.boneList.get(ikId);\r
217         }\r
218 \r
219         this.currentBone.setPrevBone(prevBone);\r
220         this.currentBone.setNextBone(nextBone);\r
221         this.currentBone.setIKBone(ikBone);\r
222 \r
223         return;\r
224     }\r
225 \r
226     /**\r
227      * {@inheritDoc}\r
228      * @param xPos {@inheritDoc}\r
229      * @param yPos {@inheritDoc}\r
230      * @param zPos {@inheritDoc}\r
231      */\r
232     @Override\r
233     public void pmdBonePosition(float xPos, float yPos, float zPos){\r
234         Pos3d position = this.currentBone.getPosition();\r
235         position.setXPos(xPos);\r
236         position.setYPos(yPos);\r
237         position.setZPos(zPos);\r
238         return;\r
239     }\r
240 \r
241     /**\r
242      * {@inheritDoc}\r
243      * @param boneId {@inheritDoc}\r
244      * @param targetId {@inheritDoc}\r
245      * @param depth {@inheritDoc}\r
246      * @param weight {@inheritDoc}\r
247      */\r
248     @Override\r
249     public void pmdIKInfo(int boneId, int targetId, int depth, float weight){\r
250         BoneInfo bone = this.boneList.get(boneId);\r
251         this.currentIkChain.setIkBone(bone);\r
252 \r
253         BoneInfo target = this.boneList.get(targetId);\r
254         this.currentIkChain.getChainedBoneList().add(0, target);\r
255 \r
256         this.currentIkChain.setIKDepth(depth);\r
257         this.currentIkChain.setIKWeight(weight);\r
258 \r
259         return;\r
260     }\r
261 \r
262     /**\r
263      * {@inheritDoc}\r
264      * @param childId {@inheritDoc}\r
265      */\r
266     @Override\r
267     public void pmdIKChainInfo(int childId){\r
268         BoneInfo chain = this.boneList.get(childId);\r
269         this.currentIkChain.getChainedBoneList().add(chain);\r
270         return;\r
271     }\r
272 \r
273     /**\r
274      * {@inheritDoc}\r
275      * @param groupName {@inheritDoc}\r
276      */\r
277     @Override\r
278     public void pmdBoneGroupInfo(String groupName){\r
279         this.currentBoneGroup.getGroupName().setPrimaryText(groupName);\r
280         return;\r
281     }\r
282 \r
283     /**\r
284      * {@inheritDoc}\r
285      * @param boneId {@inheritDoc}\r
286      * @param groupId {@inheritDoc}\r
287      */\r
288     @Override\r
289     public void pmdGroupedBoneInfo(int boneId, int groupId){\r
290         BoneInfo bone = this.boneList.get(boneId);\r
291         BoneGroup group = this.boneGroupList.get(groupId);\r
292         group.getBoneList().add(bone);\r
293         return;\r
294     }\r
295 \r
296 }\r