OSDN Git Service

SAXパーサ対応
[mikutoga/Vmd2XML.git] / src / main / java / jp / sfjp / mikutoga / vmd / model / xml / LightingXmlExpoter.java
1 /*
2  * lighting 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.MkVec3D;
13 import jp.sfjp.mikutoga.vmd.model.LuminousColor;
14 import jp.sfjp.mikutoga.vmd.model.LuminousMotion;
15 import jp.sfjp.mikutoga.vmd.model.ShadowMode;
16 import jp.sfjp.mikutoga.vmd.model.ShadowMotion;
17 import jp.sfjp.mikutoga.vmd.model.VmdMotion;
18 import jp.sourceforge.mikutoga.xml.ProxyXmlExporter;
19 import jp.sourceforge.mikutoga.xml.XmlExporter;
20
21 /**
22  * ライティング情報のXMLエクスポーター。
23  */
24 class LightingXmlExpoter extends ProxyXmlExporter {
25
26     /**
27      * コンストラクタ。
28      * @param delegate 委譲先
29      */
30     LightingXmlExpoter(XmlExporter delegate) {
31         super(delegate);
32         return;
33     }
34
35
36     /**
37      * 照明演出データを出力する。
38      * @param vmdMotion 演出データ
39      * @throws IOException 出力エラー
40      */
41     void putLuminousSequence(VmdMotion vmdMotion)
42             throws IOException{
43         ind().putSimpleSTag(VmdTag.LUMI_SEQUENCE.tag()).ln();
44
45         pushNest();
46         List<LuminousMotion> list = vmdMotion.getLuminousMotionList();
47         if( ! list.isEmpty() ) ln();
48         for(LuminousMotion luminous : list){
49             putLuminousMotion(luminous);
50         }
51         popNest();
52
53         ind().putETag(VmdTag.LUMI_SEQUENCE.tag()).ln(2);
54
55         return;
56     }
57
58     /**
59      * 照明モーションを出力する。
60      * @param luminousMotion 照明モーション
61      * @throws IOException 出力エラー
62      */
63     private void putLuminousMotion(LuminousMotion luminousMotion)
64             throws IOException{
65         ind().putOpenSTag(VmdTag.LUMINOUS_ACT.tag()).sp();
66
67         int frameNo = luminousMotion.getFrameNumber();
68         putIntAttr(XmlAttr.ATTR_FRAME, frameNo).sp();
69
70         putCloseSTag().ln();
71
72         LuminousColor color = luminousMotion.getColor();
73         MkVec3D vector = luminousMotion.getDirection();
74
75         pushNest();
76         putLuminousColor(color);
77         putLuminousDirection(vector);
78         popNest();
79
80         ind().putETag(VmdTag.LUMINOUS_ACT.tag()).ln(2);
81
82         return;
83     }
84
85     /**
86      * 光源色情報を出力する。
87      * @param color 光源色
88      * @throws IOException 出力エラー
89      */
90     private void putLuminousColor(LuminousColor color)
91             throws IOException{
92         ind().putOpenSTag(VmdTag.LUMI_COLOR.tag()).sp();
93
94         float colR = color.getColR();
95         float colG = color.getColG();
96         float colB = color.getColB();
97
98         putFloatAttr(XmlAttr.ATTR_R_COL, colR).sp();
99         putFloatAttr(XmlAttr.ATTR_G_COL, colG).sp();
100         putFloatAttr(XmlAttr.ATTR_B_COL, colB).sp();
101
102         putCloseEmpty().ln();
103
104         return;
105     }
106
107     /**
108      * 照明方向情報を出力する。
109      * @param vector 照明方向
110      * @throws IOException 出力エラー
111      */
112     private void putLuminousDirection(MkVec3D vector)
113             throws IOException{
114         ind().putOpenSTag(VmdTag.LUMI_DIRECTION.tag()).sp();
115
116         float xVec = (float) vector.getXVal();
117         float yVec = (float) vector.getYVal();
118         float zVec = (float) vector.getZVal();
119
120         putFloatAttr(XmlAttr.ATTR_X_VEC, xVec).sp();
121         putFloatAttr(XmlAttr.ATTR_Y_VEC, yVec).sp();
122         putFloatAttr(XmlAttr.ATTR_Z_VEC, zVec).sp();
123
124         putCloseEmpty().ln();
125
126         return;
127     }
128
129     /**
130      * シャドウ演出データを出力する。
131      * @param vmdMotion 演出データ
132      * @throws IOException 出力エラー
133      */
134     void putShadowSequence(VmdMotion vmdMotion)
135             throws IOException{
136         List<ShadowMotion> list = vmdMotion.getShadowMotionList();
137         if( ! list.isEmpty() ){
138             ind().putBlockComment(XmlComment.SHADOW_COMMENT);
139         }
140
141         ind().putSimpleSTag(VmdTag.SHADOW_SEQUENCE.tag()).ln();
142
143         pushNest();
144         for(ShadowMotion shadow : list){
145             putShadowMotion(shadow);
146         }
147         popNest();
148
149         ind().putETag(VmdTag.SHADOW_SEQUENCE.tag()).ln(2);
150
151         return;
152     }
153
154     /**
155      * シャドウモーションを出力する。
156      * @param shadowMotion シャドウモーション
157      * @throws IOException 出力エラー
158      */
159     private void putShadowMotion(ShadowMotion shadowMotion)
160             throws IOException{
161         ind().putOpenSTag(VmdTag.SHADOW_ACT.tag()).sp();
162
163         int frameNo = shadowMotion.getFrameNumber();
164         ShadowMode mode = shadowMotion.getShadowMode();
165         float rawParam = (float) shadowMotion.getRawScopeParam();
166
167         putIntAttr(XmlAttr.ATTR_FRAME, frameNo).sp();
168         putAttr(XmlAttr.ATTR_MODE, mode.name()).sp();
169         putFloatAttr(XmlAttr.ATTR_RAW_PARAM, rawParam).sp();
170
171         putCloseEmpty();
172
173         double uiVal = ShadowMotion.rawParamToScope(rawParam);
174         long lVal = Math.round(uiVal);
175         sp().putLineComment("UI:" + lVal).ln();
176
177         return;
178     }
179
180 }