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.parser.pmd.PmdMorphHandler;
18 import jp.sourceforge.mikutoga.pmd.MorphPart;
19 import jp.sourceforge.mikutoga.pmd.MorphType;
20 import jp.sourceforge.mikutoga.pmd.MorphVertex;
21 import jp.sourceforge.mikutoga.pmd.PmdModel;
22 import jp.sourceforge.mikutoga.pmd.Pos3d;
23 import jp.sourceforge.mikutoga.pmd.Vertex;
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 assert stage instanceof PmdMorphStage;
69 if(stage == PmdMorphHandler.MORPH_LIST){
70 ListUtil.prepareDefConsList(this.morphPartList,
73 ListUtil.assignIndexedSerial(this.morphPartList);
75 this.morphPartIt = this.morphPartList.iterator();
76 if(this.morphPartIt.hasNext()){
77 this.currentMorphPart = this.morphPartIt.next();
79 }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
81 }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
90 * @param stage {@inheritDoc}
93 public void loopNext(ParseStage stage){
94 assert stage instanceof PmdMorphStage;
96 if(stage == PmdMorphHandler.MORPH_LIST){
97 if(this.morphPartIt.hasNext()){
98 this.currentMorphPart = this.morphPartIt.next();
100 }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
102 }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
111 * @param stage {@inheritDoc}
114 public void loopEnd(ParseStage stage){
115 assert stage instanceof PmdMorphStage;
116 if(stage == PmdMorphHandler.MORPH_LIST){
118 }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
120 }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
128 * @param morphName {@inheritDoc}
129 * @param morphType {@inheritDoc}
132 public void pmdMorphInfo(String morphName, byte morphType){
133 this.currentMorphPart.getMorphName().setPrimaryText(morphName);
134 MorphType type = MorphType.decode(morphType);
135 this.currentMorphPart.setMorphType(type);
142 * @param serialId {@inheritDoc}
143 * @param xPos {@inheritDoc}
144 * @param yPos {@inheritDoc}
145 * @param zPos {@inheritDoc}
148 public void pmdMorphVertexInfo(int serialId,
149 float xPos, float yPos, float zPos){
150 MorphVertex morphVertex;
151 morphVertex = new MorphVertex();
152 Pos3d position = morphVertex.getOffset();
153 position.setXPos(xPos);
154 position.setYPos(yPos);
155 position.setZPos(zPos);
158 if(this.currentMorphPart.getMorphType().isBase()){
159 vertex = this.vertexList.get(serialId);
160 this.morphVertexList.add(vertex);
162 vertex = this.morphVertexList.get(serialId);
164 morphVertex.setBaseVertex(vertex);
166 this.currentMorphPart.getMorphVertexList().add(morphVertex);
173 * @param morphId {@inheritDoc}
176 public void pmdMorphOrderInfo(int morphId){
177 MorphPart part = this.morphPartList.get(morphId);
178 MorphType type = part.getMorphType();
180 List<MorphPart> partList = this.morphMap.get(type);
181 if(partList == null){
182 partList = new LinkedList<MorphPart>();
183 this.morphMap.put(type, partList);