OSDN Git Service

[no commit message]
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / pmd / pmdloader / MorphBuilder.java
1 /*
2  * building morph information
3  *
4  * License : The MIT License
5  * Copyright(c) 2010 MikuToga Partners
6  */
7
8 package jp.sourceforge.mikutoga.pmd.pmdloader;
9
10 import java.util.ArrayList;
11 import java.util.Iterator;
12 import java.util.LinkedList;
13 import java.util.List;
14 import java.util.Map;
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;
24
25 /**
26  * モーフ関係の通知をパーサから受け取る。
27  */
28 class MorphBuilder implements PmdMorphHandler {
29
30     private final Map<MorphType, List<MorphPart>> morphMap;
31
32     private List<MorphPart> morphPartList;
33     private Iterator<MorphPart> morphPartIt;
34     private MorphPart currentMorphPart;
35     private final List<Vertex> vertexList;
36
37     private final List<Vertex> morphVertexList = new ArrayList<Vertex>();
38
39     /**
40      * コンストラクタ。
41      * @param model モデル
42      */
43     MorphBuilder(PmdModel model){
44         super();
45         this.vertexList = model.getVertexList();
46         this.morphMap = model.getMorphMap();
47         return;
48     }
49
50     /**
51      * PMDファイル中の出現順で各モーフを格納するためのリストを設定する。
52      * 主な用途はモーフ英名との突き合わせ作業。
53      * @param list モーフ格納リスト
54      */
55     void setMorphPartList(List<MorphPart> list){
56         this.morphPartList = list;
57         return;
58     }
59
60     /**
61      * {@inheritDoc}
62      * @param stage {@inheritDoc}
63      * @param loops {@inheritDoc}
64      */
65     @Override
66     public void loopStart(ParseStage stage, int loops){
67         if(stage == PmdMorphHandler.MORPH_LIST){
68             ListUtil.prepareDefConsList(this.morphPartList,
69                                         MorphPart.class,
70                                         loops );
71             ListUtil.assignIndexedSerial(this.morphPartList);
72
73             this.morphPartIt = this.morphPartList.iterator();
74             if(this.morphPartIt.hasNext()){
75                 this.currentMorphPart = this.morphPartIt.next();
76             }
77         }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
78             // NOTHING
79         }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
80             // NOTHING
81         }else{
82             assert false;
83             throw new AssertionError();
84         }
85
86         return;
87     }
88
89     /**
90      * {@inheritDoc}
91      * @param stage {@inheritDoc}
92      */
93     @Override
94     public void loopNext(ParseStage stage){
95         if(stage == PmdMorphHandler.MORPH_LIST){
96             if(this.morphPartIt.hasNext()){
97                 this.currentMorphPart = this.morphPartIt.next();
98             }
99         }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
100             // NOTHING
101         }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
102             // NOTHING
103         }else{
104             assert false;
105             throw new AssertionError();
106         }
107
108         return;
109     }
110
111     /**
112      * {@inheritDoc}
113      * @param stage {@inheritDoc}
114      */
115     @Override
116     public void loopEnd(ParseStage stage){
117         if(stage == PmdMorphHandler.MORPH_LIST){
118             // NOTHING
119         }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
120             // NOTHING
121         }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
122             // NOTHING
123         }else{
124             assert false;
125             throw new AssertionError();
126         }
127         return;
128     }
129
130     /**
131      * {@inheritDoc}
132      * @param morphName {@inheritDoc}
133      * @param morphType {@inheritDoc}
134      */
135     @Override
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);
140
141         return;
142     }
143
144     /**
145      * {@inheritDoc}
146      * @param serialId {@inheritDoc}
147      * @param xPos {@inheritDoc}
148      * @param yPos {@inheritDoc}
149      * @param zPos {@inheritDoc}
150      */
151     @Override
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);
160
161         Vertex vertex;
162         if(this.currentMorphPart.getMorphType().isBase()){
163             vertex = this.vertexList.get(serialId);
164             this.morphVertexList.add(vertex);
165         }else{
166             vertex = this.morphVertexList.get(serialId);
167         }
168         morphVertex.setBaseVertex(vertex);
169
170         this.currentMorphPart.getMorphVertexList().add(morphVertex);
171
172         return;
173     }
174
175     /**
176      * {@inheritDoc}
177      * @param morphId {@inheritDoc}
178      */
179     @Override
180     public void pmdMorphOrderInfo(int morphId){
181         MorphPart part = this.morphPartList.get(morphId);
182         MorphType type = part.getMorphType();
183
184         List<MorphPart> partList = this.morphMap.get(type);
185         if(partList == null){
186             partList = new LinkedList<MorphPart>();
187             this.morphMap.put(type, partList);
188         }
189         partList.add(part);
190
191         return;
192     }
193
194 }