X-Git-Url: http://git.osdn.net/view?p=mikutoga%2FPmd2XML.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fjp%2Fsfjp%2Fmikutoga%2Fpmd%2Fmodel%2FPmdModel.java;fp=src%2Fmain%2Fjava%2Fjp%2Fsfjp%2Fmikutoga%2Fpmd%2Fmodel%2FPmdModel.java;h=d44c89c1d558a6c9620a62a6dde386801486bc4b;hp=cbd0695471ed0686a786b7690e3770832f6c163f;hb=9b83b2ab88046245489726207bf9fe2dd5db4453;hpb=b12782f3ce4b78faa618062b553cca3db556b406 diff --git a/src/main/java/jp/sfjp/mikutoga/pmd/model/PmdModel.java b/src/main/java/jp/sfjp/mikutoga/pmd/model/PmdModel.java index cbd0695..d44c89c 100644 --- a/src/main/java/jp/sfjp/mikutoga/pmd/model/PmdModel.java +++ b/src/main/java/jp/sfjp/mikutoga/pmd/model/PmdModel.java @@ -49,6 +49,7 @@ public class PmdModel { private ToonMap toonMap = new ToonMap(); + /** * コンストラクタ。 */ @@ -66,6 +67,7 @@ public class PmdModel { return; } + /** * モデル名を返す。 * @return モデル名 @@ -198,10 +200,7 @@ public class PmdModel { if(bone.getBoneName().hasGlobalText()) return true; } - List typeList = new ArrayList(); - typeList.addAll(this.morphMap.keySet()); - for(MorphType type : typeList){ - List partList = this.morphMap.get(type); + for(List partList : this.morphMap.values()){ for(MorphPart part : partList){ if(part.getMorphName().hasGlobalText()) return true; } @@ -215,6 +214,53 @@ public class PmdModel { } /** + * 全モーフが使う全モーフ頂点の出現順リストを返す。 + * モーフ種別毎に固まっている事が保証される。 + * @return モーフ頂点リスト + */ + private List getAllMorphVertexList(){ + List allList = new ArrayList(); + + for(MorphType type : this.morphMap.keySet()){ + if(type.isBase()) continue; + + List partList = this.morphMap.get(type); + if(partList == null) continue; + + for(MorphPart part : partList){ + List morphVertexList = + part.getMorphVertexList(); + allList.addAll(morphVertexList); + } + } + + return allList; + } + + /** + * 重複する頂点参照を除いたモーフ頂点リストを返す。 + * @param allList モーフ頂点リスト + * @return 重複が除かれたモーフ頂点リスト + */ + private List getUniqueMorphVertexList( + List allList ){ + List result = new ArrayList(); + + Set mergedVertexSet = new HashSet(); + + for(MorphVertex morphVertex : allList){ + Vertex vertex = morphVertex.getBaseVertex(); + + if(mergedVertexSet.contains(vertex)) continue; + + mergedVertexSet.add(vertex); + result.add(morphVertex); + } + + return result; + } + + /** * モーフで使われる全てのモーフ頂点のリストを返す。 * モーフ間で重複する頂点はマージされる。 * 頂点IDでソートされる。 @@ -224,47 +270,29 @@ public class PmdModel { * @return モーフに使われるモーフ頂点のリスト */ public List mergeMorphVertex(){ - List result = new ArrayList(); + List result; - Set mergedVertexSet = new HashSet(); - for(MorphType type : this.morphMap.keySet()){ - if(type.isBase()) continue; - List partList = this.morphMap.get(type); - if(partList == null) continue; - for(MorphPart part : partList){ - for(MorphVertex morphVertex : part){ - Vertex vertex = morphVertex.getBaseVertex(); - if(mergedVertexSet.contains(vertex)) continue; - mergedVertexSet.add(vertex); - result.add(morphVertex); - } - } - } + List allList = getAllMorphVertexList(); + result = getUniqueMorphVertexList(allList); Collections.sort(result, MorphVertex.VIDCOMPARATOR); - for(int idx = 0; idx < result.size(); idx++){ - MorphVertex morphVertex = result.get(idx); - morphVertex.setSerialNumber(idx); - } + ListUtil.assignIndexedSerial(result); Map numberedMap = new HashMap(); for(MorphVertex morphVertex : result){ - numberedMap.put(morphVertex.getBaseVertex(), morphVertex); + Vertex vertex = morphVertex.getBaseVertex(); + numberedMap.put(vertex, morphVertex); } - for(MorphType type : this.morphMap.keySet()){ - if(type.isBase()) continue; - List partList = this.morphMap.get(type); - if(partList == null) continue; - for(MorphPart part : partList){ - for(MorphVertex morphVertex : part){ - Vertex vertex = morphVertex.getBaseVertex(); - MorphVertex numbered = numberedMap.get(vertex); - assert numbered != null; - morphVertex.setSerialNumber(numbered.getSerialNumber()); - } - } + for(MorphVertex morphVertex : allList){ + Vertex vertex = morphVertex.getBaseVertex(); + + MorphVertex numbered = numberedMap.get(vertex); + assert numbered != null; + + int serialNo = numbered.getSerialNumber(); + morphVertex.setSerialNumber(serialNo); } return result;