2 * building morph information
\r
4 * License : The MIT License
\r
5 * Copyright(c) 2010 MikuToga Partners
\r
8 package jp.sourceforge.mikutoga.pmd.pmdloader;
\r
10 import jp.sourceforge.mikutoga.corelib.ListUtil;
\r
11 import java.util.ArrayList;
\r
12 import java.util.Iterator;
\r
13 import java.util.LinkedList;
\r
14 import java.util.List;
\r
15 import java.util.Map;
\r
16 import jp.sourceforge.mikutoga.parser.ParseStage;
\r
17 import jp.sourceforge.mikutoga.parser.pmd.PmdMorphHandler;
\r
18 import jp.sourceforge.mikutoga.pmd.MorphPart;
\r
19 import jp.sourceforge.mikutoga.pmd.MorphType;
\r
20 import jp.sourceforge.mikutoga.pmd.MorphVertex;
\r
21 import jp.sourceforge.mikutoga.pmd.PmdModel;
\r
22 import jp.sourceforge.mikutoga.pmd.Pos3d;
\r
23 import jp.sourceforge.mikutoga.pmd.Vertex;
\r
26 * モーフ関係の通知をパーサから受け取る。
\r
28 class MorphBuilder implements PmdMorphHandler {
\r
30 private final Map<MorphType, List<MorphPart>> morphMap;
\r
32 private List<MorphPart> morphPartList;
\r
33 private Iterator<MorphPart> morphPartIt;
\r
34 private MorphPart currentMorphPart;
\r
35 private final List<Vertex> vertexList;
\r
37 private final List<Vertex> morphVertexList = new ArrayList<Vertex>();
\r
43 MorphBuilder(PmdModel model){
\r
45 this.vertexList = model.getVertexList();
\r
46 this.morphMap = model.getMorphMap();
\r
51 * PMDファイル中の出現順で各モーフを格納するためのリストを設定する。
\r
52 * 主な用途はモーフ英名との突き合わせ作業。
\r
53 * @param list モーフ格納リスト
\r
55 void setMorphPartList(List<MorphPart> list){
\r
56 this.morphPartList = list;
\r
62 * @param stage {@inheritDoc}
\r
63 * @param loops {@inheritDoc}
\r
66 public void loopStart(ParseStage stage, int loops){
\r
67 assert stage instanceof PmdMorphStage;
\r
69 if(stage == PmdMorphHandler.MORPH_LIST){
\r
70 ListUtil.prepareDefConsList(this.morphPartList,
\r
73 ListUtil.assignIndexedSerial(this.morphPartList);
\r
75 this.morphPartIt = this.morphPartList.iterator();
\r
76 if(this.morphPartIt.hasNext()){
\r
77 this.currentMorphPart = this.morphPartIt.next();
\r
79 }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
\r
81 }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
\r
90 * @param stage {@inheritDoc}
\r
93 public void loopNext(ParseStage stage){
\r
94 assert stage instanceof PmdMorphStage;
\r
96 if(stage == PmdMorphHandler.MORPH_LIST){
\r
97 if(this.morphPartIt.hasNext()){
\r
98 this.currentMorphPart = this.morphPartIt.next();
\r
100 }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
\r
102 }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
\r
111 * @param stage {@inheritDoc}
\r
114 public void loopEnd(ParseStage stage){
\r
115 assert stage instanceof PmdMorphStage;
\r
116 if(stage == PmdMorphHandler.MORPH_LIST){
\r
118 }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
\r
120 }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
\r
128 * @param morphName {@inheritDoc}
\r
129 * @param morphType {@inheritDoc}
\r
132 public void pmdMorphInfo(String morphName, byte morphType){
\r
133 this.currentMorphPart.getMorphName().setPrimaryText(morphName);
\r
134 MorphType type = MorphType.decode(morphType);
\r
135 this.currentMorphPart.setMorphType(type);
\r
142 * @param serialId {@inheritDoc}
\r
143 * @param xPos {@inheritDoc}
\r
144 * @param yPos {@inheritDoc}
\r
145 * @param zPos {@inheritDoc}
\r
148 public void pmdMorphVertexInfo(int serialId,
\r
149 float xPos, float yPos, float zPos){
\r
150 MorphVertex morphVertex;
\r
151 morphVertex = new MorphVertex();
\r
152 Pos3d position = morphVertex.getOffset();
\r
153 position.setXPos(xPos);
\r
154 position.setYPos(yPos);
\r
155 position.setZPos(zPos);
\r
158 if(this.currentMorphPart.getMorphType().isBase()){
\r
159 vertex = this.vertexList.get(serialId);
\r
160 this.morphVertexList.add(vertex);
\r
162 vertex = this.morphVertexList.get(serialId);
\r
164 morphVertex.setBaseVertex(vertex);
\r
166 this.currentMorphPart.getMorphVertexList().add(morphVertex);
\r
173 * @param morphId {@inheritDoc}
\r
176 public void pmdMorphOrderInfo(int morphId){
\r
177 MorphPart part = this.morphPartList.get(morphId);
\r
178 MorphType type = part.getMorphType();
\r
180 List<MorphPart> partList = this.morphMap.get(type);
\r
181 if(partList == null){
\r
182 partList = new LinkedList<MorphPart>();
\r
183 this.morphMap.put(type, partList);
\r
185 partList.add(part);
\r