OSDN Git Service

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