2 * motion listener from XML
4 * License : The MIT License
5 * Copyright(c) 2013 MikuToga Partners
8 package jp.sfjp.mikutoga.vmd.model.xml;
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;
21 * モーション関連のXML要素出現イベントを受信する。
23 class SaxMotionListener extends SaxVmdListener{
25 private BoneMotion boneMotion;
26 private String boneName;
27 private String morphName;
41 * @param tag {@inheritDoc}
42 * @param attr {@inheritDoc}
45 void openTag(VmdTag tag, Attributes attr){
54 openBonePosition(attr);
57 openBoneRotQuat(attr);
60 openBoneRotEyxz(attr);
67 openMorphMotion(attr);
71 super.openTag(tag, attr);
80 * @param tag {@inheritDoc}
83 void closeTag(VmdTag tag){
89 setCurrentPosCurve(null);
93 setCurrentBezierParam(null);
107 private void openBonePart(Attributes attr){
108 this.boneName = SaxAttr.getStringAttr(attr, XmlAttr.ATTR_NAME);
116 private void openBoneMotion(Attributes attr){
117 this.boneMotion = new BoneMotion();
118 this.boneMotion.setBoneName(this.boneName);
120 int frameNo = SaxAttr.getIntAttr(attr, XmlAttr.ATTR_FRAME);
121 this.boneMotion.setFrameNumber(frameNo);
129 private void closeBoneMotion(){
130 VmdMotion motion = getVmdMotion();
131 motion.addBoneMotion(this.boneMotion);
136 * bonePosition要素開始の通知。
139 private void openBonePosition(Attributes attr){
140 MkPos3D position = this.boneMotion.getPosition();
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);
146 position.setXpos(xPos);
147 position.setYpos(yPos);
148 position.setZpos(zPos);
150 PosCurve curve = this.boneMotion.getPosCurve();
151 setCurrentPosCurve(curve);
157 * boneRotQuat要素開始の通知。
160 private void openBoneRotQuat(Attributes attr){
161 MkQuat rotation = this.boneMotion.getRotation();
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);
173 BezierParam bez = this.boneMotion.getIntpltRotation();
174 setCurrentBezierParam(bez);
180 * boneRotEyxz要素開始の通知。
183 private void openBoneRotEyxz(Attributes attr){
184 MkQuat rotation = this.boneMotion.getRotation();
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);
190 float xRad = (float)StrictMath.toRadians(xDeg);
191 float yRad = (float)StrictMath.toRadians(yDeg);
192 float zRad = (float)StrictMath.toRadians(zDeg);
194 rotation.setEulerYXZ(xRad, yRad, zRad);
196 BezierParam bez = this.boneMotion.getIntpltRotation();
197 setCurrentBezierParam(bez);
206 private void openMorphPart(Attributes attr){
207 this.morphName = SaxAttr.getStringAttr(attr, XmlAttr.ATTR_NAME);
212 * morphMotion要素開始の通知。
215 private void openMorphMotion(Attributes attr){
216 MorphMotion morphMotion = new MorphMotion();
218 int frameNo = SaxAttr.getIntAttr(attr, XmlAttr.ATTR_FRAME);
219 float flex = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_FLEX);
221 morphMotion.setMorphName(this.morphName);
222 morphMotion.setFrameNumber(frameNo);
223 morphMotion.setFlex(flex);
225 VmdMotion motion = getVmdMotion();
226 motion.addMorphMotion(morphMotion);