OSDN Git Service

1.105.3-SNAPSHOT版開発開始
[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.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;
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         assert stage instanceof PmdMorphStage;
68
69         if(stage == PmdMorphHandler.MORPH_LIST){
70             ListUtil.prepareDefConsList(this.morphPartList,
71                                         MorphPart.class,
72                                         loops );
73             ListUtil.assignIndexedSerial(this.morphPartList);
74
75             this.morphPartIt = this.morphPartList.iterator();
76             if(this.morphPartIt.hasNext()){
77                 this.currentMorphPart = this.morphPartIt.next();
78             }
79         }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
80             // NOTHING
81         }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
82             // NOTHING
83         }
84
85         return;
86     }
87
88     /**
89      * {@inheritDoc}
90      * @param stage {@inheritDoc}
91      */
92     @Override
93     public void loopNext(ParseStage stage){
94         assert stage instanceof PmdMorphStage;
95
96         if(stage == PmdMorphHandler.MORPH_LIST){
97             if(this.morphPartIt.hasNext()){
98                 this.currentMorphPart = this.morphPartIt.next();
99             }
100         }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
101             // NOTHING
102         }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
103             // NOTHING
104         }
105
106         return;
107     }
108
109     /**
110      * {@inheritDoc}
111      * @param stage {@inheritDoc}
112      */
113     @Override
114     public void loopEnd(ParseStage stage){
115         assert stage instanceof PmdMorphStage;
116         if(stage == PmdMorphHandler.MORPH_LIST){
117             // NOTHING
118         }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
119             // NOTHING
120         }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
121             // NOTHING
122         }
123         return;
124     }
125
126     /**
127      * {@inheritDoc}
128      * @param morphName {@inheritDoc}
129      * @param morphType {@inheritDoc}
130      */
131     @Override
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);
136
137         return;
138     }
139
140     /**
141      * {@inheritDoc}
142      * @param serialId {@inheritDoc}
143      * @param xPos {@inheritDoc}
144      * @param yPos {@inheritDoc}
145      * @param zPos {@inheritDoc}
146      */
147     @Override
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);
156
157         Vertex vertex;
158         if(this.currentMorphPart.getMorphType().isBase()){
159             vertex = this.vertexList.get(serialId);
160             this.morphVertexList.add(vertex);
161         }else{
162             vertex = this.morphVertexList.get(serialId);
163         }
164         morphVertex.setBaseVertex(vertex);
165
166         this.currentMorphPart.getMorphVertexList().add(morphVertex);
167
168         return;
169     }
170
171     /**
172      * {@inheritDoc}
173      * @param morphId {@inheritDoc}
174      */
175     @Override
176     public void pmdMorphOrderInfo(int morphId){
177         MorphPart part = this.morphPartList.get(morphId);
178         MorphType type = part.getMorphType();
179
180         List<MorphPart> partList = this.morphMap.get(type);
181         if(partList == null){
182             partList = new LinkedList<MorphPart>();
183             this.morphMap.put(type, partList);
184         }
185         partList.add(part);
186
187         return;
188     }
189
190 }