OSDN Git Service

78a87f4415a9d2395b0885ba4a09ce3b321f239c
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / vmd / model / xml / XmlCameraLoader.java
1 /*
2  * xml camera loader
3  *
4  * License : The MIT License
5  * Copyright(c) 2011 MikuToga Partners
6  */
7
8 package jp.sourceforge.mikutoga.vmd.model.xml;
9
10 import java.util.List;
11 import jp.sourceforge.mikutoga.math.MkPos3D;
12 import jp.sourceforge.mikutoga.vmd.model.BezierParam;
13 import jp.sourceforge.mikutoga.vmd.model.CameraMotion;
14 import jp.sourceforge.mikutoga.vmd.model.CameraRotation;
15 import jp.sourceforge.mikutoga.vmd.model.PosCurve;
16 import jp.sourceforge.mikutoga.vmd.model.VmdMotion;
17 import jp.sourceforge.mikutoga.xml.TogaXmlException;
18 import org.w3c.dom.Element;
19
20 /**
21  * XMLによるカメラ制御データを読み取る。
22  */
23 final class XmlCameraLoader {
24
25     /**
26      * 隠しコンストラクタ。
27      */
28     private XmlCameraLoader(){
29         assert false;
30         throw new AssertionError();
31     }
32
33
34     /**
35      * カメラシーケンスを読み込む。
36      * @param vmdMotionElem vmdMotion要素
37      * @param vmdMotion モーション
38      * @throws TogaXmlException 構文エラー
39      */
40     static void buildCameraSeq(Element vmdMotionElem, VmdMotion vmdMotion)
41             throws TogaXmlException{
42         List<CameraMotion> cameraList = vmdMotion.getCameraMotionList();
43
44         Element cameraSeqElem =
45                 Xml.getChild(vmdMotionElem, "cameraSequence");
46
47         Iterable<Element> childs =
48                 Xml.eachChild(cameraSeqElem, "cameraMotion");
49         for(Element cameraMotionElem : childs){
50             buildCameraMotion(cameraMotionElem, cameraList);
51         }
52
53         return;
54     }
55
56     /**
57      * カメラモーションを読み込む。
58      * @param cameraMotionElem cameraMotion要素
59      * @param cameraList カメラモーションリスト
60      * @throws TogaXmlException 構文エラー
61      */
62     private static void buildCameraMotion(Element cameraMotionElem,
63                                           List<CameraMotion> cameraList)
64             throws TogaXmlException{
65         CameraMotion cameraMotion = new CameraMotion();
66
67         int frameNo = Xml.getIntegerAttr(cameraMotionElem, "frame");
68         cameraMotion.setFrameNumber(frameNo);
69
70         if(cameraMotionElem.hasAttributeNS(Xml.NS_NULL, "hasPerspective")){
71             boolean hasPerspective =
72                     Xml.getBooleanAttr(cameraMotionElem, "hasPerspective");
73             cameraMotion.setPerspectiveMode(hasPerspective);
74         }
75
76         buildCameraTarget(cameraMotionElem, cameraMotion);
77         buildCameraRotation(cameraMotionElem, cameraMotion);
78         buildCameraRange(cameraMotionElem, cameraMotion);
79         buildProjection(cameraMotionElem, cameraMotion);
80
81         cameraList.add(cameraMotion);
82
83         return;
84     }
85
86     /**
87      * カメラターゲット情報を読み込む。
88      * @param cameraMotionElem cameraMotion要素
89      * @param cameraMotion カメラモーション
90      * @throws TogaXmlException 構文エラー
91      */
92     private static void buildCameraTarget(Element cameraMotionElem,
93                                           CameraMotion cameraMotion)
94             throws TogaXmlException{
95         Element cameraTargetElem =
96                 Xml.getChild(cameraMotionElem, "cameraTarget");
97         MkPos3D targetPos = cameraMotion.getCameraTarget();
98
99         float xPos = Xml.getFloatAttr(cameraTargetElem, "xPos");
100         float yPos = Xml.getFloatAttr(cameraTargetElem, "yPos");
101         float zPos = Xml.getFloatAttr(cameraTargetElem, "zPos");
102         targetPos.setPosition(xPos, yPos, zPos);
103
104         PosCurve curve = cameraMotion.getTargetPosCurve();
105         Xml.buildPosCurve(cameraTargetElem, curve);
106
107         return;
108     }
109
110     /**
111      * カメラ回転情報を読み込む。
112      * @param cameraMotionElem cameraMotion要素
113      * @param cameraMotion カメラモーション
114      * @throws TogaXmlException 構文エラー
115      */
116     private static void buildCameraRotation(Element cameraMotionElem,
117                                             CameraMotion cameraMotion)
118             throws TogaXmlException{
119         Element cameraRotationElem =
120                 Xml.getChild(cameraMotionElem, "cameraRotation");
121         CameraRotation cameraRotation = cameraMotion.getCameraRotation();
122
123         float latitude  = Xml.getFloatAttr(cameraRotationElem, "xRad");
124         float longitude = Xml.getFloatAttr(cameraRotationElem, "yRad");
125         float roll      = Xml.getFloatAttr(cameraRotationElem, "zRad");
126         cameraRotation.setLatitude(latitude);
127         cameraRotation.setLongitude(longitude);
128         cameraRotation.setRoll(roll);
129
130         BezierParam rotationCurve = cameraMotion.getIntpltRotation();
131         Xml.buildCurve(cameraRotationElem, rotationCurve);
132
133         return;
134     }
135
136     /**
137      * カメラ距離情報を読み込む。
138      * @param cameraMotionElem cameraMotion要素
139      * @param cameraMotion カメラモーション
140      * @throws TogaXmlException 構文エラー
141      */
142     private static void buildCameraRange(Element cameraMotionElem,
143                                          CameraMotion cameraMotion)
144             throws TogaXmlException{
145         Element cameraRangeElem =
146                 Xml.getChild(cameraMotionElem, "cameraRange");
147
148         float range = Xml.getFloatAttr(cameraRangeElem, "range");
149         cameraMotion.setRange(range);
150
151         BezierParam rangeCurve = cameraMotion.getIntpltRange();
152         Xml.buildCurve(cameraRangeElem, rangeCurve);
153
154         return;
155     }
156
157     /**
158      * カメラ投影情報を読み込む。
159      * @param cameraMotionElem cameraMotion要素
160      * @param cameraMotion カメラモーション
161      * @throws TogaXmlException 構文エラー
162      */
163     private static void buildProjection(Element cameraMotionElem,
164                                         CameraMotion cameraMotion)
165             throws TogaXmlException{
166         Element projectionElem =
167                 Xml.getChild(cameraMotionElem, "projection");
168
169         int vertDeg = Xml.getIntegerAttr(projectionElem, "vertDeg");
170         cameraMotion.setProjectionAngle(vertDeg);
171
172         BezierParam projCurve = cameraMotion.getIntpltProjection();
173         Xml.buildCurve(projectionElem, projCurve);
174
175         return;
176     }
177
178 }