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
65 public void loopStart(ParseStage stage, int loops){
\r
66 assert stage instanceof PmdMorphStage;
\r
68 if(stage == PmdMorphHandler.MORPH_LIST){
\r
69 ListUtil.prepareDefConsList(this.morphPartList,
\r
72 ListUtil.assignIndexedSerial(this.morphPartList);
\r
74 this.morphPartIt = this.morphPartList.iterator();
\r
75 if(this.morphPartIt.hasNext()){
\r
76 this.currentMorphPart = this.morphPartIt.next();
\r
78 }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
\r
80 }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
\r
89 * @param stage {@inheritDoc}
\r
91 public void loopNext(ParseStage stage){
\r
92 assert stage instanceof PmdMorphStage;
\r
94 if(stage == PmdMorphHandler.MORPH_LIST){
\r
95 if(this.morphPartIt.hasNext()){
\r
96 this.currentMorphPart = this.morphPartIt.next();
\r
98 }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
\r
100 }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
\r
109 * @param stage {@inheritDoc}
\r
111 public void loopEnd(ParseStage stage){
\r
112 assert stage instanceof PmdMorphStage;
\r
113 if(stage == PmdMorphHandler.MORPH_LIST){
\r
115 }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
\r
117 }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
\r
125 * @param morphName {@inheritDoc}
\r
126 * @param morphType {@inheritDoc}
\r
128 public void pmdMorphInfo(String morphName, byte morphType){
\r
129 this.currentMorphPart.getMorphName().setPrimaryText(morphName);
\r
130 MorphType type = MorphType.decode(morphType);
\r
131 this.currentMorphPart.setMorphType(type);
\r
138 * @param serialId {@inheritDoc}
\r
139 * @param xPos {@inheritDoc}
\r
140 * @param yPos {@inheritDoc}
\r
141 * @param zPos {@inheritDoc}
\r
143 public void pmdMorphVertexInfo(int serialId,
\r
144 float xPos, float yPos, float zPos){
\r
145 MorphVertex morphVertex;
\r
146 morphVertex = new MorphVertex();
\r
147 Pos3d position = morphVertex.getOffset();
\r
148 position.setXPos(xPos);
\r
149 position.setYPos(yPos);
\r
150 position.setZPos(zPos);
\r
153 if(this.currentMorphPart.getMorphType().isBase()){
\r
154 vertex = this.vertexList.get(serialId);
\r
155 this.morphVertexList.add(vertex);
\r
157 vertex = this.morphVertexList.get(serialId);
\r
159 morphVertex.setBaseVertex(vertex);
\r
161 this.currentMorphPart.getMorphVertexList().add(morphVertex);
\r
168 * @param morphId {@inheritDoc}
\r
170 public void pmdMorphOrderInfo(int morphId){
\r
171 MorphPart part = this.morphPartList.get(morphId);
\r
172 MorphType type = part.getMorphType();
\r
174 List<MorphPart> partList = this.morphMap.get(type);
\r
175 if(partList == null){
\r
176 partList = new LinkedList<MorphPart>();
\r
177 this.morphMap.put(type, partList);
\r
179 partList.add(part);
\r