2 * material xml exporter
4 * License : The MIT License
5 * Copyright(c) 2013 MikuToga Partners
8 package jp.sfjp.mikutoga.pmd.model.xml;
10 import java.awt.Color;
11 import java.io.IOException;
12 import java.util.List;
13 import jp.sfjp.mikutoga.corelib.I18nText;
14 import jp.sfjp.mikutoga.pmd.model.Material;
15 import jp.sfjp.mikutoga.pmd.model.PmdModel;
16 import jp.sfjp.mikutoga.pmd.model.ShadeInfo;
17 import jp.sfjp.mikutoga.pmd.model.ToonMap;
18 import jp.sfjp.mikutoga.xml.ProxyXmlExporter;
23 class ExporterMaterial extends ProxyXmlExporter {
26 private static final int IDX_RED = 0;
27 private static final int IDX_GREEN = 1;
28 private static final int IDX_BLUE = 2;
29 private static final int IDX_ALPHA = 3;
32 private final ExtraExporter exp;
39 ExporterMaterial(PmdXmlExporter delegate) {
41 this.exp = new ExtraExporter(delegate);
48 * @throws IOException 出力エラー
50 void putMaterialList(PmdModel model)
52 ind().putSimpleSTag(PmdTag.MATERIAL_LIST.tag()).ln();
56 boolean dumped = false;
57 List<Material> materialList = model.getMaterialList();
58 for(Material material : materialList){
60 putMaterial(material, ct++);
65 ind().putETag(PmdTag.MATERIAL_LIST.tag()).ln(2);
72 * @param material マテリアル素材
74 * @throws IOException 出力エラー
76 private void putMaterial(Material material, int no)
78 I18nText name = material.getMaterialName();
79 String primary = name.getPrimaryText();
80 String local = name.getText();
81 if(local != null && local.length() > 0){
82 ind().putLineComment(local).ln();
85 ind().putOpenSTag(PmdTag.MATERIAL.tag()).sp();
86 if(primary != null && primary.length() > 0){
87 putAttr(PmdAttr.NAME.attr(), primary).sp();
90 if(material.getEdgeAppearance()) bool = "true";
92 putAttr(PmdAttr.SHOW_EDGE.attr(), bool);
94 this.exp.putNumberedIdAttr(PmdAttr.SURFACE_GROUP_IDREF,
95 ExtraExporter.PFX_SURFACEGROUP, no);
96 sp().putCloseSTag().ln();
99 this.exp.putI18nName(name);
101 putPhongShade(material);
103 ShadeInfo shade = material.getShadeInfo();
105 if(shade.isValidToonIndex()){
112 ind().putETag(PmdTag.MATERIAL.tag()).ln(2);
119 * @param material マテリアル
120 * @throws IOException 出力エラー
122 private void putPhongShade(Material material)
126 ind().putOpenSTag(PmdTag.DIFFUSE.tag()).sp();
127 Color diffuse = material.getDiffuseColor();
128 rgba = diffuse.getRGBComponents(rgba);
130 putFloatAttr(PmdAttr.ALPHA.attr(), rgba[IDX_ALPHA]).sp();
131 putCloseEmpty().ln();
133 float shininess = material.getShininess();
134 ind().putOpenSTag(PmdTag.SPECULAR.tag()).sp();
135 Color specular = material.getSpecularColor();
136 rgba = specular.getRGBComponents(rgba);
138 putFloatAttr(PmdAttr.SHININESS.attr(), shininess).sp();
139 putCloseEmpty().ln();
141 ind().putOpenSTag(PmdTag.AMBIENT.tag()).sp();
142 Color ambient = material.getAmbientColor();
143 rgba = ambient.getRGBComponents(rgba);
145 putCloseEmpty().ln();
153 * @throws IOException 出力エラー
155 private void putTriColor(float[] rgb)
157 putFloatAttr(PmdAttr.R.attr(), rgb[IDX_RED] ).sp();
158 putFloatAttr(PmdAttr.G.attr(), rgb[IDX_GREEN]).sp();
159 putFloatAttr(PmdAttr.B.attr(), rgb[IDX_BLUE] ).sp();
166 * @param shade シェーディング情報
167 * @throws IOException 出力エラー
169 private void putToon(ShadeInfo shade)
171 ind().putOpenSTag(PmdTag.TOON.tag()).sp();
173 int toonIdx = shade.getToonIndex();
174 this.exp.putNumberedIdAttr(PmdAttr.TOONFILE_IDREF,
175 ExtraExporter.PFX_TOONFILE, toonIdx);
180 String toonFileName = shade.getToonFileName();
181 if(toonFileName != null && toonFileName.length() > 0){
182 sp().putLineComment(toonFileName);
190 * シェーディングファイル情報を出力する。
191 * @param shade シェーディング情報
192 * @throws IOException 出力エラー
194 private void putShadeFile(ShadeInfo shade)
196 String textureFileName = shade.getTextureFileName();
197 String spheremapFileName = shade.getSpheremapFileName();
199 if(textureFileName != null && textureFileName.length() > 0){
200 ind().putOpenSTag(PmdTag.TEXTURE_FILE.tag()).sp();
201 putAttr(PmdAttr.WINFILE_NAME.attr(),
202 textureFileName).sp();
203 putCloseEmpty().ln();
206 if(spheremapFileName != null && spheremapFileName.length() > 0){
207 ind().putOpenSTag(PmdTag.SPHEREMAP_FILE.tag()).sp();
208 putAttr(PmdAttr.WINFILE_NAME.attr(),
209 spheremapFileName).sp();
210 putCloseEmpty().ln();
217 * トゥーンファイルマッピング情報を出力する。
218 * @param model モデルデータ
219 * @throws IOException 出力エラー
221 void putToonMap(PmdModel model)
223 ind().putSimpleSTag(PmdTag.TOON_MAP.tag()).ln();
226 ToonMap map = model.getToonMap();
227 for(int index = 0; index < ToonMap.MAX_CUSTOM_TOON; index++){
229 putToonDef(map, index);
234 ind().putETag(PmdTag.TOON_MAP.tag()).ln(2);
239 * 個別のトゥーンファイル情報を出力する。
241 * @param index インデックス値
242 * @throws IOException 出力エラー
244 private void putToonDef(ToonMap map, int index)
246 putOpenSTag(PmdTag.TOON_DEF.tag()).sp();
247 this.exp.putNumberedIdAttr(PmdAttr.TOONFILE_ID,
248 ExtraExporter.PFX_TOONFILE, index);
250 putIntAttr(PmdAttr.INDEX.attr(), index).sp();
251 String toonFile = map.getIndexedToon(index);
252 putAttr(PmdAttr.WINFILE_NAME.attr(), toonFile).sp();
254 this.exp.putUnescapedComment(toonFile);