4 * License : The MIT License
5 * Copyright(c) 2010 MikuToga Partners
8 package jp.sourceforge.mikutoga.pmd;
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;
20 public class Material implements Iterable<Surface> {
22 private final I18nText materialName = new I18nText();
24 private Color diffuseColor;
26 private Color specularColor;
27 private float shininess;
29 private Color ambientColor;
31 private final ShadeInfo shadeInfo = new ShadeInfo();
33 private boolean edgeAppearance = true;
35 private final List<Surface> surfaceList = new ArrayList<Surface>();
48 * @return 不透明化した色。引数と同じ場合もありうる。
50 private static Color forceOpaque(Color color){
51 if(color.getTransparency() == Transparency.OPAQUE){
55 float[] rgba = new float[4];
56 color.getRGBColorComponents(rgba);
58 Color result = new Color(rgba[0], rgba[1], rgba[2], 1.0f);
68 public I18nText getMaterialName(){
69 return this.materialName;
76 * @throws NullPointerException 引数がnull
78 public void setDiffuseColor(Color color) throws NullPointerException{
79 if(color == null) throw new NullPointerException();
80 this.diffuseColor = color;
88 public Color getDiffuseColor(){
89 return this.diffuseColor;
96 * @throws NullPointerException 引数がnull
98 public void setSpecularColor(Color color)
99 throws NullPointerException{
100 if(color == null) throw new NullPointerException();
101 this.specularColor = forceOpaque(color);
109 public Color getSpecularColor(){
110 return this.specularColor;
117 * @throws NullPointerException 引数がnull
119 public void setAmbientColor(Color color)
120 throws NullPointerException{
121 if(color == null) throw new NullPointerException();
122 this.ambientColor = forceOpaque(color);
130 public Color getAmbientColor(){
131 return this.ambientColor;
136 * MMDで用いられるのは1.0〜15.0あたり。
137 * @param shininess 光沢強度
139 public void setShininess(float shininess){
140 this.shininess = shininess;
148 public float getShininess(){
149 return this.shininess;
156 public ShadeInfo getShadeInfo(){
157 return this.shadeInfo;
163 * @param show 表示するならtrue
165 public void setEdgeAppearance(boolean show){
166 this.edgeAppearance = show;
175 public boolean getEdgeAppearance(){
176 return this.edgeAppearance;
183 public List<Surface> getSurfaceList(){
184 return this.surfaceList;
189 * @return {@inheritDoc}
192 public Iterator<Surface> iterator(){
193 return this.surfaceList.iterator();
198 * @return {@inheritDoc}
201 public String toString(){
202 StringBuilder result = new StringBuilder();
204 result.append("Material ");
206 float[] rgba = new float[4];
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(']')
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(']')
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(']')
232 result.append("shininess=")
233 .append(this.shininess)
235 result.append("edge=")
236 .append(this.edgeAppearance)
238 result.append("surfaces=")
239 .append(this.surfaceList.size())
241 result.append(this.shadeInfo);
243 return result.toString();