OSDN Git Service

c88161f43c65bb54c77408ebddee719c1fe57ef6
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / pmd / Material.java
1 /*\r
2  * material information\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2010 MikuToga Partners\r
6  */\r
7 \r
8 package jp.sourceforge.mikutoga.pmd;\r
9 \r
10 import java.awt.Color;\r
11 import java.awt.Transparency;\r
12 import java.util.ArrayList;\r
13 import java.util.Iterator;\r
14 import java.util.List;\r
15 import jp.sourceforge.mikutoga.corelib.I18nText;\r
16 \r
17 /**\r
18  * マテリアル素材情報。\r
19  */\r
20 public class Material implements Iterable<Surface> {\r
21 \r
22     private final I18nText materialName = new I18nText();\r
23 \r
24     private Color diffuseColor;\r
25 \r
26     private Color specularColor;\r
27     private float shininess;\r
28 \r
29     private Color ambientColor;\r
30 \r
31     private final ShadeInfo shadeInfo = new ShadeInfo();\r
32 \r
33     private boolean edgeAppearance = true;\r
34 \r
35     private final List<Surface> surfaceList = new ArrayList<Surface>();\r
36 \r
37     /**\r
38      * コンストラクタ。\r
39      */\r
40     public Material(){\r
41         super();\r
42         return;\r
43     }\r
44 \r
45     /**\r
46      * 色を不透明化する。\r
47      * @param color 色\r
48      * @return 不透明化した色。引数と同じ場合もありうる。\r
49      */\r
50     private static Color forceOpaque(Color color){\r
51         if(color.getTransparency() == Transparency.OPAQUE){\r
52             return color;\r
53         }\r
54 \r
55         float[] rgba = new float[4];\r
56         color.getRGBColorComponents(rgba);\r
57 \r
58         Color result = new Color(rgba[0], rgba[1], rgba[2], 1.0f);\r
59 \r
60         return result;\r
61     }\r
62 \r
63     /**\r
64      * マテリアル名を返す。\r
65      * PMDEditorのみでのサポート?\r
66      * @return マテリアル名\r
67      */\r
68     public I18nText getMaterialName(){\r
69         return this.materialName;\r
70     }\r
71 \r
72     /**\r
73      * 拡散光を設定する。\r
74      * アルファ成分も反映される。\r
75      * @param color 拡散光\r
76      * @throws NullPointerException 引数がnull\r
77      */\r
78     public void setDiffuseColor(Color color) throws NullPointerException{\r
79         if(color == null) throw new NullPointerException();\r
80         this.diffuseColor = color;\r
81         return;\r
82     }\r
83 \r
84     /**\r
85      * 拡散光を返す。\r
86      * @return 拡散光\r
87      */\r
88     public Color getDiffuseColor(){\r
89         return this.diffuseColor;\r
90     }\r
91 \r
92     /**\r
93      * 反射光を設定する。\r
94      * 透過成分があれば不透明化される。\r
95      * @param color 反射光\r
96      * @throws NullPointerException 引数がnull\r
97      */\r
98     public void setSpecularColor(Color color)\r
99             throws NullPointerException{\r
100         if(color == null) throw new NullPointerException();\r
101         this.specularColor = forceOpaque(color);\r
102         return;\r
103     }\r
104 \r
105     /**\r
106      * 反射光を返す。\r
107      * @return 反射光\r
108      */\r
109     public Color getSpecularColor(){\r
110         return this.specularColor;\r
111     }\r
112 \r
113     /**\r
114      * 環境光を設定する。\r
115      * 透過成分があれば不透明化される。\r
116      * @param color 環境光\r
117      * @throws NullPointerException 引数がnull\r
118      */\r
119     public void setAmbientColor(Color color)\r
120             throws NullPointerException{\r
121         if(color == null) throw new NullPointerException();\r
122         this.ambientColor = forceOpaque(color);\r
123         return;\r
124     }\r
125 \r
126     /**\r
127      * 環境光を返す。\r
128      * @return 環境光\r
129      */\r
130     public Color getAmbientColor(){\r
131         return this.ambientColor;\r
132     }\r
133 \r
134     /**\r
135      * 光沢強度を設定する。\r
136      * MMDで用いられるのは1.0〜15.0あたり。\r
137      * @param shininess 光沢強度\r
138      */\r
139     public void setShininess(float shininess){\r
140         this.shininess = shininess;\r
141         return;\r
142     }\r
143 \r
144     /**\r
145      * 光沢強度を返す。\r
146      * @return 光沢強度\r
147      */\r
148     public float getShininess(){\r
149         return this.shininess;\r
150     }\r
151 \r
152     /**\r
153      * シェーディング設定を返す。\r
154      * @return シェーディング設定\r
155      */\r
156     public ShadeInfo getShadeInfo(){\r
157         return this.shadeInfo;\r
158     }\r
159 \r
160     /**\r
161      * エッジを表示するか設定する。\r
162      * 頂点単位の設定より優先度は低い。\r
163      * @param show 表示するならtrue\r
164      */\r
165     public void setEdgeAppearance(boolean show){\r
166         this.edgeAppearance = show;\r
167         return;\r
168     }\r
169 \r
170     /**\r
171      * エッジを表示するか判定する。\r
172      * 頂点単位の設定より優先度は低い。\r
173      * @return 表示するならtrue\r
174      */\r
175     public boolean getEdgeAppearance(){\r
176         return this.edgeAppearance;\r
177     }\r
178 \r
179     /**\r
180      * 面リストを返す。\r
181      * @return 面リスト\r
182      */\r
183     public List<Surface> getSurfaceList(){\r
184         return this.surfaceList;\r
185     }\r
186 \r
187     /**\r
188      * {@inheritDoc}\r
189      * @return {@inheritDoc}\r
190      */\r
191     public Iterator<Surface> iterator(){\r
192         return this.surfaceList.iterator();\r
193     }\r
194 \r
195     /**\r
196      * {@inheritDoc}\r
197      * @return {@inheritDoc}\r
198      */\r
199     @Override\r
200     public String toString(){\r
201         StringBuilder result = new StringBuilder();\r
202 \r
203         result.append("Material ");\r
204 \r
205         float[] rgba = new float[4];\r
206 \r
207         this.diffuseColor.getRGBComponents(rgba);\r
208         result.append("diffuse=[")\r
209               .append(rgba[0]).append(", ")\r
210               .append(rgba[1]).append(", ")\r
211               .append(rgba[2]).append(", ")\r
212               .append(rgba[3]).append(']')\r
213               .append(' ');\r
214 \r
215         this.specularColor.getRGBComponents(rgba);\r
216         result.append("specular=[")\r
217               .append(rgba[0]).append(", ")\r
218               .append(rgba[1]).append(", ")\r
219               .append(rgba[2]).append(", ")\r
220               .append(rgba[3]).append(']')\r
221               .append(' ');\r
222 \r
223         this.ambientColor.getRGBComponents(rgba);\r
224         result.append("ambient=[")\r
225               .append(rgba[0]).append(", ")\r
226               .append(rgba[1]).append(", ")\r
227               .append(rgba[2]).append(", ")\r
228               .append(rgba[3]).append(']')\r
229               .append(' ');\r
230 \r
231         result.append("shininess=")\r
232               .append(this.shininess)\r
233               .append(' ');\r
234         result.append("edge=")\r
235               .append(this.edgeAppearance)\r
236               .append(' ');\r
237         result.append("surfaces=")\r
238               .append(this.surfaceList.size())\r
239               .append(' ');\r
240         result.append(this.shadeInfo);\r
241 \r
242         return result.toString();\r
243     }\r
244 \r
245 }\r