4 * License : The MIT License
5 * Copyright(c) 2010 MikuToga Partners
8 package jp.sfjp.mikutoga.pmd.model;
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.sfjp.mikutoga.corelib.I18nText;
20 public class Material implements Iterable<Surface> {
23 private static final int IDX_RED = 0;
24 private static final int IDX_GREEN = 1;
25 private static final int IDX_BLUE = 2;
26 private static final int IDX_ALPHA = 3;
29 private final I18nText materialName = new I18nText();
31 private Color diffuseColor;
33 private Color specularColor;
34 private float shininess;
36 private Color ambientColor;
38 private final ShadeInfo shadeInfo = new ShadeInfo();
40 private boolean edgeAppearance = true;
42 private final List<Surface> surfaceList = new ArrayList<Surface>();
57 * @return 不透明化した色。引数と同じ場合もありうる。
59 private static Color forceOpaque(Color color){
60 if(color.getTransparency() == Transparency.OPAQUE){
65 rgba = color.getRGBColorComponents(rgba);
67 Color result = new Color(rgba[IDX_RED],
81 public I18nText getMaterialName(){
82 return this.materialName;
89 * @throws NullPointerException 引数がnull
91 public void setDiffuseColor(Color color) throws NullPointerException{
92 if(color == null) throw new NullPointerException();
93 this.diffuseColor = color;
101 public Color getDiffuseColor(){
102 return this.diffuseColor;
109 * @throws NullPointerException 引数がnull
111 public void setSpecularColor(Color color)
112 throws NullPointerException{
113 if(color == null) throw new NullPointerException();
114 this.specularColor = forceOpaque(color);
122 public Color getSpecularColor(){
123 return this.specularColor;
130 * @throws NullPointerException 引数がnull
132 public void setAmbientColor(Color color)
133 throws NullPointerException{
134 if(color == null) throw new NullPointerException();
135 this.ambientColor = forceOpaque(color);
143 public Color getAmbientColor(){
144 return this.ambientColor;
149 * MMDで用いられるのは1.0〜15.0あたり。
150 * @param shininess 光沢強度
152 public void setShininess(float shininess){
153 this.shininess = shininess;
161 public float getShininess(){
162 return this.shininess;
169 public ShadeInfo getShadeInfo(){
170 return this.shadeInfo;
176 * @param show 表示するならtrue
178 public void setEdgeAppearance(boolean show){
179 this.edgeAppearance = show;
188 public boolean getEdgeAppearance(){
189 return this.edgeAppearance;
196 public List<Surface> getSurfaceList(){
197 return this.surfaceList;
202 * @return {@inheritDoc}
205 public Iterator<Surface> iterator(){
206 return this.surfaceList.iterator();
211 * @return {@inheritDoc}
214 public String toString(){
215 StringBuilder result = new StringBuilder();
216 final String delim = ", ";
218 result.append("Material ");
222 rgba = this.diffuseColor.getRGBComponents(rgba);
223 result.append("diffuse=[")
224 .append(rgba[IDX_RED]).append(delim)
225 .append(rgba[IDX_GREEN]).append(delim)
226 .append(rgba[IDX_BLUE]).append(delim)
227 .append(rgba[IDX_ALPHA]).append(']')
230 this.specularColor.getRGBComponents(rgba);
231 result.append("specular=[")
232 .append(rgba[IDX_RED]).append(delim)
233 .append(rgba[IDX_GREEN]).append(delim)
234 .append(rgba[IDX_BLUE]).append(delim)
235 .append(rgba[IDX_ALPHA]).append(']')
238 this.ambientColor.getRGBComponents(rgba);
239 result.append("ambient=[")
240 .append(rgba[IDX_RED]).append(delim)
241 .append(rgba[IDX_GREEN]).append(delim)
242 .append(rgba[IDX_BLUE]).append(delim)
243 .append(rgba[IDX_ALPHA]).append(']')
246 result.append("shininess=")
247 .append(this.shininess)
249 result.append("edge=")
250 .append(this.edgeAppearance)
252 result.append("surfaces=")
253 .append(this.surfaceList.size())
255 result.append(this.shadeInfo);
257 return result.toString();