OSDN Git Service

c59d8610ebbe2c61ca31183ec2e3ef2a1713485b
[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     @Override\r
192     public Iterator<Surface> iterator(){\r
193         return this.surfaceList.iterator();\r
194     }\r
195 \r
196     /**\r
197      * {@inheritDoc}\r
198      * @return {@inheritDoc}\r
199      */\r
200     @Override\r
201     public String toString(){\r
202         StringBuilder result = new StringBuilder();\r
203 \r
204         result.append("Material ");\r
205 \r
206         float[] rgba = new float[4];\r
207 \r
208         this.diffuseColor.getRGBComponents(rgba);\r
209         result.append("diffuse=[")\r
210               .append(rgba[0]).append(", ")\r
211               .append(rgba[1]).append(", ")\r
212               .append(rgba[2]).append(", ")\r
213               .append(rgba[3]).append(']')\r
214               .append(' ');\r
215 \r
216         this.specularColor.getRGBComponents(rgba);\r
217         result.append("specular=[")\r
218               .append(rgba[0]).append(", ")\r
219               .append(rgba[1]).append(", ")\r
220               .append(rgba[2]).append(", ")\r
221               .append(rgba[3]).append(']')\r
222               .append(' ');\r
223 \r
224         this.ambientColor.getRGBComponents(rgba);\r
225         result.append("ambient=[")\r
226               .append(rgba[0]).append(", ")\r
227               .append(rgba[1]).append(", ")\r
228               .append(rgba[2]).append(", ")\r
229               .append(rgba[3]).append(']')\r
230               .append(' ');\r
231 \r
232         result.append("shininess=")\r
233               .append(this.shininess)\r
234               .append(' ');\r
235         result.append("edge=")\r
236               .append(this.edgeAppearance)\r
237               .append(' ');\r
238         result.append("surfaces=")\r
239               .append(this.surfaceList.size())\r
240               .append(' ');\r
241         result.append(this.shadeInfo);\r
242 \r
243         return result.toString();\r
244     }\r
245 \r
246 }\r