2 * SAX ID-reference helper
4 * License : The MIT License
5 * Copyright(c) 2013 MikuToga Partners
8 package jp.sfjp.mikutoga.pmd.model.xml;
10 import java.util.Collection;
11 import java.util.HashMap;
12 import java.util.LinkedList;
13 import java.util.List;
15 import jp.sfjp.mikutoga.pmd.model.BoneInfo;
16 import jp.sfjp.mikutoga.pmd.model.Material;
17 import jp.sfjp.mikutoga.pmd.model.MorphVertex;
18 import jp.sfjp.mikutoga.pmd.model.RigidGroup;
19 import jp.sfjp.mikutoga.pmd.model.RigidInfo;
20 import jp.sfjp.mikutoga.pmd.model.ShadeInfo;
21 import jp.sfjp.mikutoga.pmd.model.Surface;
22 import jp.sfjp.mikutoga.pmd.model.Vertex;
30 private final List<IdRefHolder<Material>> materialSfcGroupIdRefList =
32 private final List<IdRefHolder<Material>> materialToonIdRefList =
34 private final Map<String, Integer> toonIdxMap =
38 private final Map<String, BoneInfo> boneIdMap =
40 private final List<IdRefHolder<BoneInfo>> boneChainIdRefList =
42 private final List<IdRefHolder<BoneInfo>> boneSourceIdRefList =
46 private final List<IdRefHolder<MorphVertex>> morphVertexIdRefList =
50 private final Map<String, RigidInfo> rigidIdMap =
52 private final Map<String, RigidGroup> rigidGroupIdMap =
54 private final List<IdRefHolder<RigidInfo>> thghRigidGroupIdRefList =
58 private final Map<String, List<Surface>> surfaceGroupIdMap =
60 private final List<IdRefHolder<Surface>> surfaceVertexIdRef =
64 private final Map<String, Vertex> vertexIdMap =
78 * マテリアルからのサーフェイスグループID参照を登録する。
79 * @param material マテリアル
80 * @param idRef サーフェイスグループID参照
82 void addSurfaceGroupIdRef(Material material, String idRef){
83 IdRefHolder<Material> holder =
84 new IdRefHolder<>(material, idRef);
85 this.materialSfcGroupIdRefList.add(holder);
91 * サーフェイスグループの構成サーフェイスを登録する。
92 * @param surfaceGroupId サーフェイスグループID
93 * @param surface サーフェイス
95 void addSurfaceGroup(String surfaceGroupId, Surface surface){
96 List<Surface> surfaceGroup =
97 this.surfaceGroupIdMap.get(surfaceGroupId);
98 if(surfaceGroup == null){
99 surfaceGroup = new LinkedList<>();
100 this.surfaceGroupIdMap.put(surfaceGroupId, surfaceGroup);
103 surfaceGroup.add(surface);
109 * マテリアルからのサーフェイスグループID参照を解決する。
111 void resolveMaterialSurfaceGroupId(){
112 for(IdRefHolder<Material> holder : this.materialSfcGroupIdRefList){
113 Material material = holder.getBody();
114 String surfaceGroupIdRef = holder.getIdRef();
116 List<Surface> surfaceGroup =
117 this.surfaceGroupIdMap.get(surfaceGroupIdRef);
119 List<Surface> surfaceList = material.getSurfaceList();
120 surfaceList.addAll(surfaceGroup);
127 * マテリアルからの共有トゥーンファイルID参照を追加登録する。
128 * @param material マテリアル
129 * @param idRef トゥーンファイルID参照
131 void addToonFileIdRef(Material material, String idRef){
132 IdRefHolder<Material> holder =
133 new IdRefHolder<>(material, idRef);
134 this.materialToonIdRefList.add(holder);
139 * 共有トゥーンファイルのインデックスを登録する。
140 * @param toonFileId ToonファイルID
141 * @param idx 共有Toonインデックス
143 void addToonIdx(String toonFileId, int idx){
144 this.toonIdxMap.put(toonFileId, idx);
149 * マテリアルからの共有トゥーンインデックスの参照問題を解決する。
151 void resolveToonIdx(){
152 for(IdRefHolder<Material> holder : this.materialToonIdRefList){
153 Material material = holder.getBody();
154 String toonFileIdRef = holder.getIdRef();
155 int toonIdx = this.toonIdxMap.get(toonFileIdRef);
157 ShadeInfo shadeInfo = material.getShadeInfo();
158 shadeInfo.setToonIndex(toonIdx);
166 * @param boneId ボーンID
167 * @param boneInfo ボーン情報
169 void addBoneId(String boneId, BoneInfo boneInfo){
170 this.boneIdMap.put(boneId, boneInfo);
176 * @param boneId ボーンID
179 BoneInfo findBoneId(String boneId){
180 BoneInfo result = this.boneIdMap.get(boneId);
187 * @param prevBoneIdRef 前ボーンID参照
188 * @param nextBoneIdRef 次ボーンID参照
190 void addBoneChain(BoneInfo bone,
191 String prevBoneIdRef, String nextBoneIdRef ){
192 IdRefHolder<BoneInfo> holder =
193 new IdRefHolder<>(bone, prevBoneIdRef, nextBoneIdRef);
194 this.boneChainIdRefList.add(holder);
201 void resolveBoneChainIdRef(){
202 for(IdRefHolder<BoneInfo> holder : this.boneChainIdRefList){
203 BoneInfo bone = holder.getBody();
204 String prevBoneIdRef = holder.getIdRef();
205 String nextBoneIdRef = holder.getIdRef2();
207 if(prevBoneIdRef != null){
208 BoneInfo prevBone = this.boneIdMap.get(prevBoneIdRef);
209 bone.setPrevBone(prevBone);
212 if(nextBoneIdRef != null){
213 BoneInfo nextBone = this.boneIdMap.get(nextBoneIdRef);
214 bone.setNextBone(nextBone);
222 * ボーン情報からのソースボーンID参照を登録する。
224 * @param srcBoneIdRef ソースボーンID参照
226 void addSrcBoneIdRef(BoneInfo bone, String srcBoneIdRef){
227 IdRefHolder<BoneInfo> holder =
228 new IdRefHolder<>(bone, srcBoneIdRef);
229 this.boneSourceIdRefList.add(holder);
234 * ボーン情報からのソースボーンID参照を解決する。
236 void resolveSrcBoneIdRef(){
237 for(IdRefHolder<BoneInfo> holder : this.boneSourceIdRefList){
238 BoneInfo bone = holder.getBody();
239 String srcBoneIdRef = holder.getIdRef();
240 if(srcBoneIdRef == null) continue;
242 BoneInfo srcBone = this.boneIdMap.get(srcBoneIdRef);
243 bone.setSrcBone(srcBone);
250 * モーフ頂点からの頂点ID参照を登録する。
251 * @param morphVertex モーフ頂点
252 * @param vertexIdRef 頂点ID参照
254 void addMorphVertexIdRef(MorphVertex morphVertex, String vertexIdRef){
255 IdRefHolder<MorphVertex> holder =
256 new IdRefHolder<>(morphVertex, vertexIdRef);
257 this.morphVertexIdRefList.add(holder);
263 * @param rigidId 剛体ID
266 void addRigidId(String rigidId, RigidInfo rigid){
267 this.rigidIdMap.put(rigidId, rigid);
273 * @param rigidId 剛体ID
276 RigidInfo findRigidId(String rigidId){
277 RigidInfo result = this.rigidIdMap.get(rigidId);
282 * 剛体からの通過剛体グループID参照を登録する。
284 * @param rigidGroupIdRef 剛体グループID参照
286 void addThroughRigidGroupIdRef(RigidInfo rigid, String rigidGroupIdRef){
287 IdRefHolder<RigidInfo> holder =
288 new IdRefHolder<>(rigid, rigidGroupIdRef);
289 this.thghRigidGroupIdRefList.add(holder);
295 * @param rigidGroupId 剛体グループID
296 * @param rigidGroup 剛体グループ
298 void addRigidGroupId(String rigidGroupId, RigidGroup rigidGroup){
299 this.rigidGroupIdMap.put(rigidGroupId, rigidGroup);
306 void resolveThroughRigidGroupIdRef(){
307 for(IdRefHolder<RigidInfo> holder : this.thghRigidGroupIdRefList){
308 RigidInfo rigid = holder.getBody();
309 String rigidGroupIdRef = holder.getIdRef();
310 RigidGroup group = this.rigidGroupIdMap.get(rigidGroupIdRef);
312 Collection<RigidGroup> throughGroups =
313 rigid.getThroughGroupColl();
314 throughGroups.add(group);
321 * 三角ポリゴンサーフェイス面からの頂点ID参照を登録する。
322 * @param surface surface面
323 * @param vtxIdRef1 頂点ID参照その1
324 * @param vtxIdRef2 頂点ID参照その2
325 * @param vtxIdRef3 頂点ID参照その3
327 void addSurfaceVertex(Surface surface,
331 IdRefHolder<Surface> holder =
332 new IdRefHolder<>(surface,
337 this.surfaceVertexIdRef.add(holder);
344 * @param vertexId 頂点ID
347 void addVertexId(String vertexId, Vertex vertex){
348 this.vertexIdMap.put(vertexId, vertex);
353 * モーフ頂点からの頂点ID参照を解決する。
355 void resolveMorphVertexIdRef(){
356 for(IdRefHolder<MorphVertex> holder : this.morphVertexIdRefList){
357 MorphVertex morphVertex = holder.getBody();
358 String vertexIdRef = holder.getIdRef();
359 Vertex vertex = this.vertexIdMap.get(vertexIdRef);
361 morphVertex.setBaseVertex(vertex);
368 * サーフェイスからの頂点ID参照を解決する。
370 void resolveSurfaceVertexIdRef(){
371 for(IdRefHolder<Surface> holder : this.surfaceVertexIdRef){
372 Surface surface = holder.getBody();
373 String vertexIdRef1 = holder.getIdRef();
374 String vertexIdRef2 = holder.getIdRef2();
375 String vertexIdRef3 = holder.getIdRef3();
377 Vertex vtx1 = this.vertexIdMap.get(vertexIdRef1);
378 Vertex vtx2 = this.vertexIdMap.get(vertexIdRef2);
379 Vertex vtx3 = this.vertexIdMap.get(vertexIdRef3);
381 surface.setTriangle(vtx1, vtx2, vtx3);
389 * 必要に応じて参照IDを3つまで持てる。
390 * @param <E> ID参照元インスタンス型
392 private static final class IdRefHolder<E> {
394 private final E body;
396 private final String idRef;
397 private final String idRef2;
398 private final String idRef3;
402 * @param body ID参照元インスタンス
405 IdRefHolder(E body, String idRef){
406 this(body, idRef, null, null);
412 * @param body ID参照元インスタンス
414 * @param idRef2 参照IDその2
416 IdRefHolder(E body, String idRef, String idRef2){
417 this(body, idRef, idRef2, null);
423 * @param body ID参照元インスタンス
425 * @param idRef2 参照IDその2
426 * @param idRef3 参照IDその3
437 this.idRef2 = idRef2;
438 this.idRef3 = idRef3;
446 * @return ID参照元インスタンス
456 private String getIdRef(){
464 private String getIdRef2(){
472 private String getIdRef3(){