OSDN Git Service

本番スキーマ移行
[mikutoga/Vmd2XML.git] / src / main / java / jp / sfjp / mikutoga / vmd / model / xml / CameraXmlExporter.java
1 /*
2  * camera xml exporter
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 java.io.IOException;
11 import java.util.List;
12 import jp.sfjp.mikutoga.math.MkPos3D;
13 import jp.sfjp.mikutoga.vmd.model.BezierParam;
14 import jp.sfjp.mikutoga.vmd.model.CameraMotion;
15 import jp.sfjp.mikutoga.vmd.model.CameraRotation;
16 import jp.sfjp.mikutoga.vmd.model.PosCurve;
17 import jp.sfjp.mikutoga.vmd.model.VmdMotion;
18 import jp.sfjp.mikutoga.xml.ProxyXmlExporter;
19
20 /**
21  *カメラ情報のXMLエクスポーター。
22  */
23 class CameraXmlExporter extends ProxyXmlExporter {
24
25     private final ExtraXmlExporter extraExporter;
26
27
28     /**
29      * コンストラクタ。
30      * @param delegate 委譲先
31      */
32     CameraXmlExporter(VmdXmlExporter delegate) {
33         super(delegate);
34         this.extraExporter = new ExtraXmlExporter(delegate);
35         return;
36     }
37
38
39     /**
40      * カメラ演出データを出力する。
41      * @param vmdMotion 演出データ
42      * @throws IOException 出力エラー
43      */
44     void putCameraSequence(VmdMotion vmdMotion)
45             throws IOException{
46         List<CameraMotion> list = vmdMotion.getCameraMotionList();
47         if( ! list.isEmpty() ){
48             ind().putBlockComment(XmlComment.CAMERA_COMMENT);
49             ind().putBlockComment(XmlComment.BEZIER_COMMENT);
50         }
51
52         ind().putSimpleSTag(VmdTag.CAMERA_SEQUENCE.tag()).ln();
53
54         pushNest();
55         if( ! list.isEmpty() ) ln();
56         for(CameraMotion camera : list){
57             putCameraMotion(camera);
58         }
59         popNest();
60
61         ind().putETag(VmdTag.CAMERA_SEQUENCE.tag()).ln(2);
62
63         return;
64     }
65
66     /**
67      * カメラモーションを出力する。
68      * @param cameraMotion カメラモーション
69      * @throws IOException 出力エラー
70      */
71     private void putCameraMotion(CameraMotion cameraMotion)
72             throws IOException{
73         ind().putOpenSTag(VmdTag.CAMERA_MOTION.tag()).sp();
74         int frameNo = cameraMotion.getFrameNumber();
75         putIntAttr(XmlAttr.ATTR_FRAME, frameNo).sp();
76         if( ! cameraMotion.hasPerspective() ){
77             putAttr(XmlAttr.ATTR_HAS_PERSPECTIVE, "false").sp();
78         }
79         putCloseSTag().ln();
80
81         pushNest();
82         putCameraTarget(cameraMotion);
83         putCameraRotation(cameraMotion);
84         putCameraRange(cameraMotion);
85         putProjection(cameraMotion);
86         popNest();
87
88         ind().putETag(VmdTag.CAMERA_MOTION.tag()).ln(2);
89
90         return;
91     }
92
93     /**
94      * カメラターゲット情報を出力する。
95      * @param cameraMotion カメラモーション
96      * @throws IOException 出力エラー
97      */
98     private void putCameraTarget(CameraMotion cameraMotion)
99             throws IOException{
100         ind().putOpenSTag(VmdTag.CAMERA_TARGET.tag()).sp();
101
102         MkPos3D position = cameraMotion.getCameraTarget();
103
104         float xPos = (float) position.getXpos();
105         float yPos = (float) position.getYpos();
106         float zPos = (float) position.getZpos();
107
108         putFloatAttr(XmlAttr.ATTR_X_POS, xPos).sp();
109         putFloatAttr(XmlAttr.ATTR_Y_POS, yPos).sp();
110         putFloatAttr(XmlAttr.ATTR_Z_POS, zPos).sp();
111
112         PosCurve posCurve = cameraMotion.getTargetPosCurve();
113         if(posCurve.isDefaultLinear()){
114             putCloseEmpty().ln();
115         }else{
116             putCloseSTag().ln();
117
118             pushNest();
119             this.extraExporter.putPositionCurve(posCurve);
120             popNest();
121
122             ind().putETag(VmdTag.CAMERA_TARGET.tag()).ln();
123         }
124
125         return;
126     }
127
128     /**
129      * カメラ回転情報を出力する。
130      * @param cameraMotion カメラモーション
131      * @throws IOException 出力エラー
132      */
133     private void putCameraRotation(CameraMotion cameraMotion)
134             throws IOException{
135         ind().putOpenSTag(VmdTag.CAMERA_ROTATION.tag()).sp();
136
137         CameraRotation rotation = cameraMotion.getCameraRotation();
138
139         float latitude  = (float) rotation.getLatitude();
140         float longitude = (float) rotation.getLongitude();
141         float roll      = (float) rotation.getRoll();
142
143         putFloatAttr(XmlAttr.ATTR_X_RAD, latitude) .sp();
144         putFloatAttr(XmlAttr.ATTR_Y_RAD, longitude).sp();
145         putFloatAttr(XmlAttr.ATTR_Z_RAD, roll)     .sp();
146
147         BezierParam rotCurve = cameraMotion.getIntpltRotation();
148         if(rotCurve.isDefaultLinear()){
149             putCloseEmpty().ln();
150         }else{
151             putCloseSTag().ln();
152             pushNest();
153             ind();
154             this.extraExporter.putBezierCurve(rotCurve);
155             ln();
156             popNest();
157             ind().putETag(VmdTag.CAMERA_ROTATION.tag()).ln();
158         }
159
160         return;
161     }
162
163     /**
164      * カメラ距離情報を出力する。
165      * @param cameraMotion カメラモーション
166      * @throws IOException 出力エラー
167      */
168     private void putCameraRange(CameraMotion cameraMotion)
169             throws IOException{
170         ind().putOpenSTag(VmdTag.CAMERA_RANGE.tag()).sp();
171
172         float range = (float) cameraMotion.getRange();
173         putFloatAttr(XmlAttr.ATTR_RANGE, range).sp();
174
175         BezierParam rangeCurve = cameraMotion.getIntpltRange();
176         if(rangeCurve.isDefaultLinear()){
177             putCloseEmpty().ln();
178         }else{
179             putCloseSTag().ln();
180             pushNest();
181             ind();
182             this.extraExporter.putBezierCurve(rangeCurve);
183             ln();
184             popNest();
185             ind().putETag(VmdTag.CAMERA_RANGE.tag()).ln();
186         }
187
188         return;
189     }
190
191     /**
192      * スクリーン投影情報を出力する。
193      * @param cameraMotion カメラモーション
194      * @throws IOException 出力エラー
195      */
196     private void putProjection(CameraMotion cameraMotion)
197             throws IOException{
198         ind().putOpenSTag(VmdTag.PROJECTION.tag()).sp();
199
200         int angle = cameraMotion.getProjectionAngle();
201         putIntAttr(XmlAttr.ATTR_VERT_DEG, angle).sp();
202
203         BezierParam projCurve = cameraMotion.getIntpltProjection();
204         if(projCurve.isDefaultLinear()){
205             putCloseEmpty().ln();
206         }else{
207             putCloseSTag().ln();
208             pushNest();
209             ind();
210             this.extraExporter.putBezierCurve(projCurve);
211             ln();
212             popNest();
213             ind().putETag(VmdTag.PROJECTION.tag()).ln();
214         }
215
216         return;
217     }
218
219 }