2 * building morph information
4 * License : The MIT License
5 * Copyright(c) 2010 MikuToga Partners
8 package jp.sourceforge.mikutoga.pmd.pmdloader;
10 import java.util.ArrayList;
11 import java.util.Iterator;
12 import java.util.LinkedList;
13 import java.util.List;
15 import jp.sourceforge.mikutoga.corelib.ListUtil;
16 import jp.sourceforge.mikutoga.parser.ParseStage;
17 import jp.sourceforge.mikutoga.pmd.MorphType;
18 import jp.sourceforge.mikutoga.pmd.Pos3d;
19 import jp.sourceforge.mikutoga.pmd.model.MorphPart;
20 import jp.sourceforge.mikutoga.pmd.model.MorphVertex;
21 import jp.sourceforge.mikutoga.pmd.model.PmdModel;
22 import jp.sourceforge.mikutoga.pmd.model.Vertex;
23 import jp.sourceforge.mikutoga.pmd.parser.PmdMorphHandler;
28 class MorphBuilder implements PmdMorphHandler {
30 private final Map<MorphType, List<MorphPart>> morphMap;
32 private List<MorphPart> morphPartList;
33 private Iterator<MorphPart> morphPartIt;
34 private MorphPart currentMorphPart;
35 private final List<Vertex> vertexList;
37 private final List<Vertex> morphVertexList = new ArrayList<Vertex>();
43 MorphBuilder(PmdModel model){
45 this.vertexList = model.getVertexList();
46 this.morphMap = model.getMorphMap();
51 * PMDファイル中の出現順で各モーフを格納するためのリストを設定する。
52 * 主な用途はモーフ英名との突き合わせ作業。
53 * @param list モーフ格納リスト
55 void setMorphPartList(List<MorphPart> list){
56 this.morphPartList = list;
62 * @param stage {@inheritDoc}
63 * @param loops {@inheritDoc}
66 public void loopStart(ParseStage stage, int loops){
67 if(stage == PmdMorphHandler.MORPH_LIST){
68 ListUtil.prepareDefConsList(this.morphPartList,
71 ListUtil.assignIndexedSerial(this.morphPartList);
73 this.morphPartIt = this.morphPartList.iterator();
74 if(this.morphPartIt.hasNext()){
75 this.currentMorphPart = this.morphPartIt.next();
77 }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
79 }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
83 throw new AssertionError();
91 * @param stage {@inheritDoc}
94 public void loopNext(ParseStage stage){
95 if(stage == PmdMorphHandler.MORPH_LIST){
96 if(this.morphPartIt.hasNext()){
97 this.currentMorphPart = this.morphPartIt.next();
99 }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
101 }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
105 throw new AssertionError();
113 * @param stage {@inheritDoc}
116 public void loopEnd(ParseStage stage){
117 if(stage == PmdMorphHandler.MORPH_LIST){
119 }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
121 }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
125 throw new AssertionError();
132 * @param morphName {@inheritDoc}
133 * @param morphType {@inheritDoc}
136 public void pmdMorphInfo(String morphName, byte morphType){
137 this.currentMorphPart.getMorphName().setPrimaryText(morphName);
138 MorphType type = MorphType.decode(morphType);
139 this.currentMorphPart.setMorphType(type);
146 * @param serialId {@inheritDoc}
147 * @param xPos {@inheritDoc}
148 * @param yPos {@inheritDoc}
149 * @param zPos {@inheritDoc}
152 public void pmdMorphVertexInfo(int serialId,
153 float xPos, float yPos, float zPos){
154 MorphVertex morphVertex;
155 morphVertex = new MorphVertex();
156 Pos3d position = morphVertex.getOffset();
157 position.setXPos(xPos);
158 position.setYPos(yPos);
159 position.setZPos(zPos);
162 if(this.currentMorphPart.getMorphType().isBase()){
163 vertex = this.vertexList.get(serialId);
164 this.morphVertexList.add(vertex);
166 vertex = this.morphVertexList.get(serialId);
168 morphVertex.setBaseVertex(vertex);
170 this.currentMorphPart.getMorphVertexList().add(morphVertex);
177 * @param morphId {@inheritDoc}
180 public void pmdMorphOrderInfo(int morphId){
181 MorphPart part = this.morphPartList.get(morphId);
182 MorphType type = part.getMorphType();
184 List<MorphPart> partList = this.morphMap.get(type);
185 if(partList == null){
186 partList = new LinkedList<MorphPart>();
187 this.morphMap.put(type, partList);