OSDN Git Service

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