2 * material information
\r
4 * License : The MIT License
\r
5 * Copyright(c) 2010 MikuToga Partners
\r
8 package jp.sourceforge.mikutoga.pmd;
\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
20 public class Material implements Iterable<Surface> {
\r
22 private final I18nText materialName = new I18nText();
\r
24 private Color diffuseColor;
\r
26 private Color specularColor;
\r
27 private float shininess;
\r
29 private Color ambientColor;
\r
31 private final ShadeInfo shadeInfo = new ShadeInfo();
\r
33 private boolean edgeAppearance = true;
\r
35 private final List<Surface> surfaceList = new ArrayList<Surface>();
\r
48 * @return 不透明化した色。引数と同じ場合もありうる。
\r
50 private static Color forceOpaque(Color color){
\r
51 if(color.getTransparency() == Transparency.OPAQUE){
\r
55 float[] rgba = new float[4];
\r
56 color.getRGBColorComponents(rgba);
\r
58 Color result = new Color(rgba[0], rgba[1], rgba[2], 1.0f);
\r
65 * PMDEditorのみでのサポート?
\r
68 public I18nText getMaterialName(){
\r
69 return this.materialName;
\r
76 * @throws NullPointerException 引数がnull
\r
78 public void setDiffuseColor(Color color) throws NullPointerException{
\r
79 if(color == null) throw new NullPointerException();
\r
80 this.diffuseColor = color;
\r
88 public Color getDiffuseColor(){
\r
89 return this.diffuseColor;
\r
96 * @throws NullPointerException 引数がnull
\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
109 public Color getSpecularColor(){
\r
110 return this.specularColor;
\r
117 * @throws NullPointerException 引数がnull
\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
130 public Color getAmbientColor(){
\r
131 return this.ambientColor;
\r
136 * MMDで用いられるのは1.0〜15.0あたり。
\r
137 * @param shininess 光沢強度
\r
139 public void setShininess(float shininess){
\r
140 this.shininess = shininess;
\r
148 public float getShininess(){
\r
149 return this.shininess;
\r
154 * @return シェーディング設定
\r
156 public ShadeInfo getShadeInfo(){
\r
157 return this.shadeInfo;
\r
163 * @param show 表示するならtrue
\r
165 public void setEdgeAppearance(boolean show){
\r
166 this.edgeAppearance = show;
\r
173 * @return 表示するならtrue
\r
175 public boolean getEdgeAppearance(){
\r
176 return this.edgeAppearance;
\r
183 public List<Surface> getSurfaceList(){
\r
184 return this.surfaceList;
\r
189 * @return {@inheritDoc}
\r
191 public Iterator<Surface> iterator(){
\r
192 return this.surfaceList.iterator();
\r
197 * @return {@inheritDoc}
\r
200 public String toString(){
\r
201 StringBuilder result = new StringBuilder();
\r
203 result.append("Material ");
\r
205 float[] rgba = new float[4];
\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
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
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
231 result.append("shininess=")
\r
232 .append(this.shininess)
\r
234 result.append("edge=")
\r
235 .append(this.edgeAppearance)
\r
237 result.append("surfaces=")
\r
238 .append(this.surfaceList.size())
\r
240 result.append(this.shadeInfo);
\r
242 return result.toString();
\r