2 * camera listener from XML
4 * License : The MIT License
5 * Copyright(c) 2013 MikuToga Partners
8 package jp.sfjp.mikutoga.vmd.model.xml;
10 import java.util.List;
11 import jp.sfjp.mikutoga.math.MkPos3D;
12 import jp.sfjp.mikutoga.vmd.model.BezierParam;
13 import jp.sfjp.mikutoga.vmd.model.CameraMotion;
14 import jp.sfjp.mikutoga.vmd.model.CameraRotation;
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 SaxCameraListener extends SaxVmdListener{
24 private CameraMotion currentCamera = null;
38 * @param tag {@inheritDoc}
39 * @param attr {@inheritDoc}
42 void openTag(VmdTag tag, Attributes attr){
45 openCameraMotion(attr);
48 openCameraTarget(attr);
51 openCameraRotation(attr);
54 openCameraRange(attr);
61 super.openTag(tag, attr);
70 * @param tag {@inheritDoc}
73 void closeTag(VmdTag tag){
79 setCurrentPosCurve(null);
84 setCurrentBezierParam(null);
95 * cameraMotion要素開始の通知。
98 private void openCameraMotion(Attributes attr){
99 this.currentCamera = new CameraMotion();
101 int frameNo = SaxAttr.getIntAttr(attr, XmlAttr.ATTR_FRAME);
102 this.currentCamera.setFrameNumber(frameNo);
104 boolean hasPerspective =
105 SaxAttr.getBooleanAttr(attr,
106 XmlAttr.ATTR_HAS_PERSPECTIVE,
108 this.currentCamera.setPerspectiveMode(hasPerspective);
114 * cameraMotion要素終了の通知。
116 private void closeCameraMotion(){
117 VmdMotion motion = getVmdMotion();
118 List<CameraMotion> cameraList = motion.getCameraMotionList();
119 cameraList.add(this.currentCamera);
121 this.currentCamera = null;
127 * cameraTarget要素開始の通知。
130 private void openCameraTarget(Attributes attr){
131 MkPos3D targetPos = this.currentCamera.getCameraTarget();
133 float xPos = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_X_POS);
134 float yPos = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_Y_POS);
135 float zPos = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_Z_POS);
137 targetPos.setPosition(xPos, yPos, zPos);
139 PosCurve curve = this.currentCamera.getTargetPosCurve();
140 setCurrentPosCurve(curve);
146 * cameraRotation要素開始の通知。
149 private void openCameraRotation(Attributes attr){
150 CameraRotation cameraRotation =
151 this.currentCamera.getCameraRotation();
153 float latitude = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_X_RAD);
154 float longitude = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_Y_RAD);
155 float roll = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_Z_RAD);
157 cameraRotation.setLatitude(latitude);
158 cameraRotation.setLongitude(longitude);
159 cameraRotation.setRoll(roll);
161 BezierParam bez = this.currentCamera.getIntpltRotation();
162 setCurrentBezierParam(bez);
168 * cameraRange要素開始の通知。
171 private void openCameraRange(Attributes attr){
172 float range = SaxAttr.getFloatAttr(attr, XmlAttr.ATTR_RANGE);
173 this.currentCamera.setRange(range);
175 BezierParam bez = this.currentCamera.getIntpltRange();
176 setCurrentBezierParam(bez);
185 private void openProjection(Attributes attr){
186 int vertDeg = SaxAttr.getIntAttr(attr, XmlAttr.ATTR_VERT_DEG);
187 this.currentCamera.setProjectionAngle(vertDeg);
189 BezierParam bez = this.currentCamera.getIntpltProjection();
190 setCurrentBezierParam(bez);