OSDN Git Service

SAX対応
[mikutoga/Pmd2XML.git] / src / main / java / jp / sfjp / mikutoga / pmd / model / xml / ExporterShape.java
1 /*
2  * shape xml exporter
3  *
4  * License : The MIT License
5  * Copyright(c) 2013 MikuToga Partners
6  */
7
8 package jp.sfjp.mikutoga.pmd.model.xml;
9
10 import java.io.IOException;
11 import java.util.List;
12 import jp.sfjp.mikutoga.math.MkPos2D;
13 import jp.sfjp.mikutoga.math.MkPos3D;
14 import jp.sfjp.mikutoga.math.MkVec3D;
15 import jp.sfjp.mikutoga.pmd.model.BoneInfo;
16 import jp.sfjp.mikutoga.pmd.model.Material;
17 import jp.sfjp.mikutoga.pmd.model.PmdModel;
18 import jp.sfjp.mikutoga.pmd.model.Surface;
19 import jp.sfjp.mikutoga.pmd.model.Vertex;
20 import jp.sfjp.mikutoga.xml.ProxyXmlExporter;
21
22 /**
23  * 形状設定のXMLエクスポーター。
24  */
25 class ExporterShape extends ProxyXmlExporter {
26
27     private final ExtraExporter exp;
28
29
30     /**
31      * コンストラクタ。
32      * @param delegate 委譲先
33      */
34     ExporterShape(PmdXmlExporter delegate) {
35         super(delegate);
36         this.exp = new ExtraExporter(delegate);
37         return;
38     }
39
40     /**
41      * サーフェイスグループリストを出力する。
42      * @param model モデルデータ
43      * @throws IOException 出力エラー
44      */
45     void putSurfaceGroupList(PmdModel model)
46             throws IOException{
47         ind().putSimpleSTag(PmdTag.SURFACE_GROUP_LIST.tag()).ln();
48
49         pushNest();
50         int ct = 0;
51         boolean dumped = false;
52         List<Material> materialList = model.getMaterialList();
53         for(Material material : materialList){
54             List<Surface> surfaceList = material.getSurfaceList();
55             if( ! dumped ) ln();
56             putSurfaceList(surfaceList, ct++);
57             dumped = true;
58         }
59         popNest();
60
61         ind().putETag(PmdTag.SURFACE_GROUP_LIST.tag()).ln(2);
62
63         return;
64     }
65
66     /**
67      * 個別のサーフェイスグループを出力する。
68      * @param surfaceList サーフェイスのリスト
69      * @param index グループインデックス
70      * @throws IOException 出力エラー
71      */
72     private void putSurfaceList(List<Surface> surfaceList,
73                                               int index)
74             throws IOException{
75         ind().putOpenSTag(PmdTag.SURFACE_GROUP.tag()).sp();
76         this.exp.putNumberedIdAttr(PmdAttr.SURFACE_GROUP_ID,
77                           ExtraExporter.PFX_SURFACEGROUP, index);
78         sp().putCloseSTag().ln();
79         pushNest();
80
81         for(Surface surface : surfaceList){
82             putSurface(surface);
83         }
84
85         popNest();
86         ind().putETag(PmdTag.SURFACE_GROUP.tag()).ln(2);
87
88         return;
89     }
90
91     /**
92      * 個別のサーフェイスを出力する。
93      * @param surface サーフェイス
94      * @throws IOException 出力エラー
95      */
96     private void putSurface(Surface surface)
97             throws IOException{
98         ind().putOpenSTag(PmdTag.SURFACE.tag()).sp();
99
100         Vertex vertex1 = surface.getVertex1();
101         Vertex vertex2 = surface.getVertex2();
102         Vertex vertex3 = surface.getVertex3();
103
104         this.exp.putNumberedIdAttr(PmdAttr.VERTEX_IDREF_1,
105                           ExtraExporter.PFX_VERTEX, vertex1);
106         sp();
107         this.exp.putNumberedIdAttr(PmdAttr.VERTEX_IDREF_2,
108                           ExtraExporter.PFX_VERTEX, vertex2);
109         sp();
110         this.exp.putNumberedIdAttr(PmdAttr.VERTEX_IDREF_3,
111                           ExtraExporter.PFX_VERTEX, vertex3);
112         sp();
113
114         putCloseEmpty().ln();
115         return;
116     }
117
118     /**
119      * 頂点リストを出力する。
120      * @param model モデルデータ
121      * @throws IOException 出力エラー
122      */
123     void putVertexList(PmdModel model)
124             throws IOException{
125         ind().putSimpleSTag(PmdTag.VERTEX_LIST.tag()).ln();
126
127         pushNest();
128         boolean dumped = false;
129         List<Vertex> vertexList = model.getVertexList();
130         for(Vertex vertex : vertexList){
131             if( ! dumped ) ln();
132             putVertex(vertex);
133             dumped = true;
134         }
135         popNest();
136
137         ind().putETag(PmdTag.VERTEX_LIST.tag()).ln(2);
138
139         return;
140     }
141
142     /**
143      * 個別の頂点情報を出力する。
144      * @param vertex 頂点
145      * @throws IOException 出力エラー
146      */
147     private void putVertex(Vertex vertex)
148             throws IOException{
149         String bool;
150         if(vertex.getEdgeAppearance()) bool = "true";
151         else                           bool = "false";
152
153         ind().putOpenSTag(PmdTag.VERTEX.tag()).sp();
154         this.exp.putNumberedIdAttr(PmdAttr.VERTEX_ID,
155                 ExtraExporter.PFX_VERTEX, vertex);
156         sp();
157         putAttr(PmdAttr.SHOW_EDGE.attr(), bool);
158         sp().putCloseSTag().ln();
159         pushNest();
160
161         putVertexBody(vertex);
162
163         popNest();
164         ind().putETag(PmdTag.VERTEX.tag()).ln(2);
165
166         return;
167     }
168
169     /**
170      * 頂点情報の詳細を出力する。
171      * @param vertex 頂点
172      * @throws IOException 出力エラー
173      */
174     private void putVertexBody(Vertex vertex)
175             throws IOException{
176         MkPos3D position = vertex.getPosition();
177         ind();
178         this.exp.putPosition(position);
179         ln();
180
181         MkVec3D normal = vertex.getNormal();
182         ind().putOpenSTag(PmdTag.NORMAL.tag()).sp();
183         putFloatAttr(PmdAttr.X.attr(), (float) normal.getXVal())
184                 .sp();
185         putFloatAttr(PmdAttr.Y.attr(), (float) normal.getYVal())
186                 .sp();
187         putFloatAttr(PmdAttr.Z.attr(), (float) normal.getZVal())
188                 .sp();
189         putCloseEmpty().ln();
190
191         MkPos2D uvPos = vertex.getUVPosition();
192         ind().putOpenSTag(PmdTag.UV_MAP.tag()).sp();
193         putFloatAttr(PmdAttr.U.attr(), (float) uvPos.getXpos()).sp();
194         putFloatAttr(PmdAttr.V.attr(), (float) uvPos.getYpos()).sp();
195         putCloseEmpty().ln();
196
197         BoneInfo boneA = vertex.getBoneA();
198         BoneInfo boneB = vertex.getBoneB();
199         int weight = vertex.getWeightA();
200         ind().putOpenSTag(PmdTag.SKINNING.tag()).sp();
201         this.exp.putNumberedIdAttr(PmdAttr.BONE_IDREF_1,
202                 ExtraExporter.PFX_BONE, boneA);
203         sp();
204         this.exp.putNumberedIdAttr(PmdAttr.BONE_IDREF_2,
205                 ExtraExporter.PFX_BONE, boneB);
206         sp();
207         putIntAttr(PmdAttr.WEIGHT_BALANCE.attr(), weight).sp();
208         putCloseEmpty().ln();
209
210         return;
211     }
212
213 }