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 org.xml.sax.Attributes;
20 * モーション関連のXML要素出現イベントを受信する。
22 class SaxMotionListener extends SaxVmdListener{
24 private BoneMotion boneMotion;
25 private String boneName;
26 private String morphName;
40 * @param tag {@inheritDoc}
41 * @param attr {@inheritDoc}
44 void openTag(VmdTag tag, Attributes attr){
53 openBonePosition(attr);
56 openBoneRotQuat(attr);
59 openBoneRotEyxz(attr);
66 openMorphMotion(attr);
70 super.openTag(tag, attr);
79 * @param tag {@inheritDoc}
82 void closeTag(VmdTag tag){
88 setCurrentPosCurve(null);
92 setCurrentBezierParam(null);
106 private void openBonePart(Attributes attr){
107 this.boneName = SaxAttr.getStringAttr(attr, XmlAttr.ATTR_NAME);
115 private void openBoneMotion(Attributes attr){
116 this.boneMotion = new BoneMotion();
117 this.boneMotion.setBoneName(this.boneName);
119 int frameNo = SaxAttr.getIntAttr(attr, XmlAttr.ATTR_FRAME);
120 this.boneMotion.setFrameNumber(frameNo);
128 private void closeBoneMotion(){
129 VmdMotion motion = getVmdMotion();
130 motion.addBoneMotion(this.boneMotion);
135 * bonePosition要素開始の通知。
138 private void openBonePosition(Attributes attr){
139 MkPos3D position = this.boneMotion.getPosition();
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);
145 position.setXpos(xPos);
146 position.setYpos(yPos);
147 position.setZpos(zPos);
149 PosCurve curve = this.boneMotion.getPosCurve();
150 setCurrentPosCurve(curve);
156 * boneRotQuat要素開始の通知。
159 private void openBoneRotQuat(Attributes attr){
160 MkQuat rotation = this.boneMotion.getRotation();
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);
172 BezierParam bez = this.boneMotion.getIntpltRotation();
173 setCurrentBezierParam(bez);
179 * boneRotEyxz要素開始の通知。
182 private void openBoneRotEyxz(Attributes attr){
183 MkQuat rotation = this.boneMotion.getRotation();
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);
189 float xRad = (float)StrictMath.toRadians(xDeg);
190 float yRad = (float)StrictMath.toRadians(yDeg);
191 float zRad = (float)StrictMath.toRadians(zDeg);
193 rotation.setEulerYXZ(xRad, yRad, zRad);
195 BezierParam bez = this.boneMotion.getIntpltRotation();
196 setCurrentBezierParam(bez);
205 private void openMorphPart(Attributes attr){
206 this.morphName = SaxAttr.getStringAttr(attr, XmlAttr.ATTR_NAME);
211 * morphMotion要素開始の通知。
214 private void openMorphMotion(Attributes attr){
215 MorphMotion morphMotion = new MorphMotion();
217 int frameNo = SaxAttr.getIntAttr(attr, XmlAttr.ATTR_FRAME);
218 float flex = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_FLEX);
220 morphMotion.setMorphName(this.morphName);
221 morphMotion.setFrameNumber(frameNo);
222 morphMotion.setFlex(flex);
224 VmdMotion motion = getVmdMotion();
225 motion.addMorphMotion(morphMotion);