4 * License : The MIT License
5 * Copyright(c) 2013 MikuToga Partners
8 package jp.sfjp.mikutoga.pmd.model.xml;
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;
25 class ExporterShape extends ProxyXmlExporter {
27 private final ExtraExporter exp;
34 ExporterShape(PmdXmlExporter delegate) {
36 this.exp = new ExtraExporter(delegate);
43 * @throws IOException 出力エラー
45 void putSurfaceGroupList(PmdModel model)
47 ind().putSimpleSTag(PmdTag.SURFACE_GROUP_LIST.tag()).ln();
51 boolean dumped = false;
52 List<Material> materialList = model.getMaterialList();
53 for(Material material : materialList){
54 List<Surface> surfaceList = material.getSurfaceList();
56 putSurfaceList(surfaceList, ct++);
61 ind().putETag(PmdTag.SURFACE_GROUP_LIST.tag()).ln(2);
68 * @param surfaceList サーフェイスのリスト
69 * @param index グループインデックス
70 * @throws IOException 出力エラー
72 private void putSurfaceList(List<Surface> surfaceList,
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();
81 for(Surface surface : surfaceList){
86 ind().putETag(PmdTag.SURFACE_GROUP.tag()).ln(2);
93 * @param surface サーフェイス
94 * @throws IOException 出力エラー
96 private void putSurface(Surface surface)
98 ind().putOpenSTag(PmdTag.SURFACE.tag()).sp();
100 Vertex vertex1 = surface.getVertex1();
101 Vertex vertex2 = surface.getVertex2();
102 Vertex vertex3 = surface.getVertex3();
104 this.exp.putNumberedIdAttr(PmdAttr.VERTEX_IDREF_1,
105 ExtraExporter.PFX_VERTEX, vertex1);
107 this.exp.putNumberedIdAttr(PmdAttr.VERTEX_IDREF_2,
108 ExtraExporter.PFX_VERTEX, vertex2);
110 this.exp.putNumberedIdAttr(PmdAttr.VERTEX_IDREF_3,
111 ExtraExporter.PFX_VERTEX, vertex3);
114 putCloseEmpty().ln();
120 * @param model モデルデータ
121 * @throws IOException 出力エラー
123 void putVertexList(PmdModel model)
125 ind().putSimpleSTag(PmdTag.VERTEX_LIST.tag()).ln();
128 boolean dumped = false;
129 List<Vertex> vertexList = model.getVertexList();
130 for(Vertex vertex : vertexList){
137 ind().putETag(PmdTag.VERTEX_LIST.tag()).ln(2);
145 * @throws IOException 出力エラー
147 private void putVertex(Vertex vertex)
150 if(vertex.getEdgeAppearance()) bool = "true";
153 ind().putOpenSTag(PmdTag.VERTEX.tag()).sp();
154 this.exp.putNumberedIdAttr(PmdAttr.VERTEX_ID,
155 ExtraExporter.PFX_VERTEX, vertex);
157 putAttr(PmdAttr.SHOW_EDGE.attr(), bool);
158 sp().putCloseSTag().ln();
161 putVertexBody(vertex);
164 ind().putETag(PmdTag.VERTEX.tag()).ln(2);
172 * @throws IOException 出力エラー
174 private void putVertexBody(Vertex vertex)
176 MkPos3D position = vertex.getPosition();
178 this.exp.putPosition(position);
181 MkVec3D normal = vertex.getNormal();
182 ind().putOpenSTag(PmdTag.NORMAL.tag()).sp();
183 putFloatAttr(PmdAttr.X.attr(), (float) normal.getXVal())
185 putFloatAttr(PmdAttr.Y.attr(), (float) normal.getYVal())
187 putFloatAttr(PmdAttr.Z.attr(), (float) normal.getZVal())
189 putCloseEmpty().ln();
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();
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);
204 this.exp.putNumberedIdAttr(PmdAttr.BONE_IDREF_2,
205 ExtraExporter.PFX_BONE, boneB);
207 putIntAttr(PmdAttr.WEIGHT_BALANCE.attr(), weight).sp();
208 putCloseEmpty().ln();