OSDN Git Service

本番スキーマ移行
[mikutoga/Vmd2XML.git] / src / main / java / jp / sfjp / mikutoga / vmd / model / xml / SaxMotionListener.java
1 /*
2  * motion listener from XML
3  *
4  * License : The MIT License
5  * Copyright(c) 2013 MikuToga Partners
6  */
7
8 package jp.sfjp.mikutoga.vmd.model.xml;
9
10 import jp.sfjp.mikutoga.math.MkPos3D;
11 import jp.sfjp.mikutoga.math.MkQuat;
12 import jp.sfjp.mikutoga.vmd.model.BezierParam;
13 import jp.sfjp.mikutoga.vmd.model.BoneMotion;
14 import jp.sfjp.mikutoga.vmd.model.MorphMotion;
15 import jp.sfjp.mikutoga.vmd.model.PosCurve;
16 import jp.sfjp.mikutoga.vmd.model.VmdMotion;
17 import jp.sfjp.mikutoga.xml.SaxAttr;
18 import org.xml.sax.Attributes;
19
20 /**
21  * モーション関連のXML要素出現イベントを受信する。
22  */
23 class SaxMotionListener extends SaxVmdListener{
24
25     private BoneMotion boneMotion;
26     private String boneName;
27     private String morphName;
28
29
30     /**
31      * コンストラクタ。
32      */
33     SaxMotionListener() {
34         super();
35         return;
36     }
37
38
39     /**
40      * {@inheritDoc}
41      * @param tag {@inheritDoc}
42      * @param attr {@inheritDoc}
43      */
44     @Override
45     void openTag(VmdTag tag, Attributes attr){
46         switch(tag){
47         case BONE_PART:
48             openBonePart(attr);
49             break;
50         case BONE_MOTION:
51             openBoneMotion(attr);
52             break;
53         case BONE_POSITION:
54             openBonePosition(attr);
55             break;
56         case BONE_ROT_QUAT:
57             openBoneRotQuat(attr);
58             break;
59         case BONE_ROT_EYXZ:
60             openBoneRotEyxz(attr);
61             break;
62
63         case MORPH_PART:
64             openMorphPart(attr);
65             break;
66         case MORPH_MOTION:
67             openMorphMotion(attr);
68             break;
69
70         default:
71             super.openTag(tag, attr);
72             break;
73         }
74
75         return;
76     }
77
78     /**
79      * {@inheritDoc}
80      * @param tag {@inheritDoc}
81      */
82     @Override
83     void closeTag(VmdTag tag){
84         switch(tag){
85         case BONE_MOTION:
86             closeBoneMotion();
87             break;
88         case BONE_POSITION:
89             setCurrentPosCurve(null);
90             break;
91         case BONE_ROT_QUAT:
92         case BONE_ROT_EYXZ:
93             setCurrentBezierParam(null);
94             break;
95         default:
96             super.closeTag(tag);
97             break;
98         }
99
100         return;
101     }
102
103     /**
104      * bonePart要素開始の通知。
105      * @param attr 属性群
106      */
107     private void openBonePart(Attributes attr){
108         this.boneName = SaxAttr.getStringAttr(attr, XmlAttr.ATTR_NAME);
109         return;
110     }
111
112     /**
113      * boneMotion要素開始の通知。
114      * @param attr 属性群
115      */
116     private void openBoneMotion(Attributes attr){
117         this.boneMotion = new BoneMotion();
118         this.boneMotion.setBoneName(this.boneName);
119
120         int frameNo = SaxAttr.getIntAttr(attr, XmlAttr.ATTR_FRAME);
121         this.boneMotion.setFrameNumber(frameNo);
122
123         return;
124     }
125
126     /**
127      * boneMotion要素終了の通知。
128      */
129     private void closeBoneMotion(){
130         VmdMotion motion = getVmdMotion();
131         motion.addBoneMotion(this.boneMotion);
132         return;
133     }
134
135     /**
136      * bonePosition要素開始の通知。
137      * @param attr 属性群
138      */
139     private void openBonePosition(Attributes attr){
140         MkPos3D position = this.boneMotion.getPosition();
141
142         float xPos = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_X_POS);
143         float yPos = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_Y_POS);
144         float zPos = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_Z_POS);
145
146         position.setXpos(xPos);
147         position.setYpos(yPos);
148         position.setZpos(zPos);
149
150         PosCurve curve = this.boneMotion.getPosCurve();
151         setCurrentPosCurve(curve);
152
153         return;
154     }
155
156     /**
157      * boneRotQuat要素開始の通知。
158      * @param attr 属性群
159      */
160     private void openBoneRotQuat(Attributes attr){
161         MkQuat rotation = this.boneMotion.getRotation();
162
163         float qx = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_QX);
164         float qy = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_QY);
165         float qz = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_QZ);
166         float qw = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_QW);
167
168         rotation.setQ1(qx);
169         rotation.setQ2(qy);
170         rotation.setQ3(qz);
171         rotation.setQW(qw);
172
173         BezierParam bez = this.boneMotion.getIntpltRotation();
174         setCurrentBezierParam(bez);
175
176         return;
177     }
178
179     /**
180      * boneRotEyxz要素開始の通知。
181      * @param attr 属性群
182      */
183     private void openBoneRotEyxz(Attributes attr){
184         MkQuat rotation = this.boneMotion.getRotation();
185
186         float xDeg = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_X_DEG);
187         float yDeg = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_Y_DEG);
188         float zDeg = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_Z_DEG);
189
190         float xRad = (float)StrictMath.toRadians(xDeg);
191         float yRad = (float)StrictMath.toRadians(yDeg);
192         float zRad = (float)StrictMath.toRadians(zDeg);
193
194         rotation.setEulerYXZ(xRad, yRad, zRad);
195
196         BezierParam bez = this.boneMotion.getIntpltRotation();
197         setCurrentBezierParam(bez);
198
199         return;
200     }
201
202     /**
203      * morphPart要素開始の通知。
204      * @param attr 属性群
205      */
206     private void openMorphPart(Attributes attr){
207         this.morphName = SaxAttr.getStringAttr(attr, XmlAttr.ATTR_NAME);
208         return;
209     }
210
211     /**
212      * morphMotion要素開始の通知。
213      * @param attr 属性群
214      */
215     private void openMorphMotion(Attributes attr){
216         MorphMotion morphMotion = new MorphMotion();
217
218         int frameNo = SaxAttr.getIntAttr(attr, XmlAttr.ATTR_FRAME);
219         float flex = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_FLEX);
220
221         morphMotion.setMorphName(this.morphName);
222         morphMotion.setFrameNumber(frameNo);
223         morphMotion.setFlex(flex);
224
225         VmdMotion motion = getVmdMotion();
226         motion.addMorphMotion(morphMotion);
227
228         return;
229     }
230
231 }