-/*\r
- * material information\r
- *\r
- * License : The MIT License\r
- * Copyright(c) 2010 MikuToga Partners\r
- */\r
-\r
-package jp.sourceforge.mikutoga.pmd;\r
-\r
-import java.awt.Color;\r
-import java.awt.Transparency;\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import jp.sourceforge.mikutoga.corelib.I18nText;\r
-\r
-/**\r
- * マテリアル素材情報。\r
- */\r
-public class Material implements Iterable<Surface> {\r
-\r
- private final I18nText materialName = new I18nText();\r
-\r
- private Color diffuseColor;\r
-\r
- private Color specularColor;\r
- private float shininess;\r
-\r
- private Color ambientColor;\r
-\r
- private final ShadeInfo shadeInfo = new ShadeInfo();\r
-\r
- private boolean edgeAppearance = true;\r
-\r
- private final List<Surface> surfaceList = new ArrayList<Surface>();\r
-\r
- /**\r
- * コンストラクタ。\r
- */\r
- public Material(){\r
- super();\r
- return;\r
- }\r
-\r
- /**\r
- * 色を不透明化する。\r
- * @param color 色\r
- * @return 不透明化した色。引数と同じ場合もありうる。\r
- */\r
- private static Color forceOpaque(Color color){\r
- if(color.getTransparency() == Transparency.OPAQUE){\r
- return color;\r
- }\r
-\r
- float[] rgba = new float[4];\r
- color.getRGBColorComponents(rgba);\r
-\r
- Color result = new Color(rgba[0], rgba[1], rgba[2], 1.0f);\r
-\r
- return result;\r
- }\r
-\r
- /**\r
- * マテリアル名を返す。\r
- * PMDEditorのみでのサポート?\r
- * @return マテリアル名\r
- */\r
- public I18nText getMaterialName(){\r
- return this.materialName;\r
- }\r
-\r
- /**\r
- * 拡散光を設定する。\r
- * アルファ成分も反映される。\r
- * @param color 拡散光\r
- * @throws NullPointerException 引数がnull\r
- */\r
- public void setDiffuseColor(Color color) throws NullPointerException{\r
- if(color == null) throw new NullPointerException();\r
- this.diffuseColor = color;\r
- return;\r
- }\r
-\r
- /**\r
- * 拡散光を返す。\r
- * @return 拡散光\r
- */\r
- public Color getDiffuseColor(){\r
- return this.diffuseColor;\r
- }\r
-\r
- /**\r
- * 反射光を設定する。\r
- * 透過成分があれば不透明化される。\r
- * @param color 反射光\r
- * @throws NullPointerException 引数がnull\r
- */\r
- public void setSpecularColor(Color color)\r
- throws NullPointerException{\r
- if(color == null) throw new NullPointerException();\r
- this.specularColor = forceOpaque(color);\r
- return;\r
- }\r
-\r
- /**\r
- * 反射光を返す。\r
- * @return 反射光\r
- */\r
- public Color getSpecularColor(){\r
- return this.specularColor;\r
- }\r
-\r
- /**\r
- * 環境光を設定する。\r
- * 透過成分があれば不透明化される。\r
- * @param color 環境光\r
- * @throws NullPointerException 引数がnull\r
- */\r
- public void setAmbientColor(Color color)\r
- throws NullPointerException{\r
- if(color == null) throw new NullPointerException();\r
- this.ambientColor = forceOpaque(color);\r
- return;\r
- }\r
-\r
- /**\r
- * 環境光を返す。\r
- * @return 環境光\r
- */\r
- public Color getAmbientColor(){\r
- return this.ambientColor;\r
- }\r
-\r
- /**\r
- * 光沢強度を設定する。\r
- * MMDで用いられるのは1.0〜15.0あたり。\r
- * @param shininess 光沢強度\r
- */\r
- public void setShininess(float shininess){\r
- this.shininess = shininess;\r
- return;\r
- }\r
-\r
- /**\r
- * 光沢強度を返す。\r
- * @return 光沢強度\r
- */\r
- public float getShininess(){\r
- return this.shininess;\r
- }\r
-\r
- /**\r
- * シェーディング設定を返す。\r
- * @return シェーディング設定\r
- */\r
- public ShadeInfo getShadeInfo(){\r
- return this.shadeInfo;\r
- }\r
-\r
- /**\r
- * エッジを表示するか設定する。\r
- * 頂点単位の設定より優先度は低い。\r
- * @param show 表示するならtrue\r
- */\r
- public void setEdgeAppearance(boolean show){\r
- this.edgeAppearance = show;\r
- return;\r
- }\r
-\r
- /**\r
- * エッジを表示するか判定する。\r
- * 頂点単位の設定より優先度は低い。\r
- * @return 表示するならtrue\r
- */\r
- public boolean getEdgeAppearance(){\r
- return this.edgeAppearance;\r
- }\r
-\r
- /**\r
- * 面リストを返す。\r
- * @return 面リスト\r
- */\r
- public List<Surface> getSurfaceList(){\r
- return this.surfaceList;\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * @return {@inheritDoc}\r
- */\r
- public Iterator<Surface> iterator(){\r
- return this.surfaceList.iterator();\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * @return {@inheritDoc}\r
- */\r
- @Override\r
- public String toString(){\r
- StringBuilder result = new StringBuilder();\r
-\r
- result.append("Material ");\r
-\r
- float[] rgba = new float[4];\r
-\r
- this.diffuseColor.getRGBComponents(rgba);\r
- result.append("diffuse=[")\r
- .append(rgba[0]).append(", ")\r
- .append(rgba[1]).append(", ")\r
- .append(rgba[2]).append(", ")\r
- .append(rgba[3]).append(']')\r
- .append(' ');\r
-\r
- this.specularColor.getRGBComponents(rgba);\r
- result.append("specular=[")\r
- .append(rgba[0]).append(", ")\r
- .append(rgba[1]).append(", ")\r
- .append(rgba[2]).append(", ")\r
- .append(rgba[3]).append(']')\r
- .append(' ');\r
-\r
- this.ambientColor.getRGBComponents(rgba);\r
- result.append("ambient=[")\r
- .append(rgba[0]).append(", ")\r
- .append(rgba[1]).append(", ")\r
- .append(rgba[2]).append(", ")\r
- .append(rgba[3]).append(']')\r
- .append(' ');\r
-\r
- result.append("shininess=")\r
- .append(this.shininess)\r
- .append(' ');\r
- result.append("edge=")\r
- .append(this.edgeAppearance)\r
- .append(' ');\r
- result.append("surfaces=")\r
- .append(this.surfaceList.size())\r
- .append(' ');\r
- result.append(this.shadeInfo);\r
-\r
- return result.toString();\r
- }\r
-\r
-}\r
+/*
+ * material information
+ *
+ * License : The MIT License
+ * Copyright(c) 2010 MikuToga Partners
+ */
+
+package jp.sourceforge.mikutoga.pmd;
+
+import java.awt.Color;
+import java.awt.Transparency;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import jp.sourceforge.mikutoga.corelib.I18nText;
+
+/**
+ * マテリアル素材情報。
+ */
+public class Material implements Iterable<Surface> {
+
+ private final I18nText materialName = new I18nText();
+
+ private Color diffuseColor;
+
+ private Color specularColor;
+ private float shininess;
+
+ private Color ambientColor;
+
+ private final ShadeInfo shadeInfo = new ShadeInfo();
+
+ private boolean edgeAppearance = true;
+
+ private final List<Surface> surfaceList = new ArrayList<Surface>();
+
+ /**
+ * コンストラクタ。
+ */
+ public Material(){
+ super();
+ return;
+ }
+
+ /**
+ * 色を不透明化する。
+ * @param color 色
+ * @return 不透明化した色。引数と同じ場合もありうる。
+ */
+ private static Color forceOpaque(Color color){
+ if(color.getTransparency() == Transparency.OPAQUE){
+ return color;
+ }
+
+ float[] rgba = new float[4];
+ color.getRGBColorComponents(rgba);
+
+ Color result = new Color(rgba[0], rgba[1], rgba[2], 1.0f);
+
+ return result;
+ }
+
+ /**
+ * マテリアル名を返す。
+ * PMDEditorのみでのサポート?
+ * @return マテリアル名
+ */
+ public I18nText getMaterialName(){
+ return this.materialName;
+ }
+
+ /**
+ * 拡散光を設定する。
+ * アルファ成分も反映される。
+ * @param color 拡散光
+ * @throws NullPointerException 引数がnull
+ */
+ public void setDiffuseColor(Color color) throws NullPointerException{
+ if(color == null) throw new NullPointerException();
+ this.diffuseColor = color;
+ return;
+ }
+
+ /**
+ * 拡散光を返す。
+ * @return 拡散光
+ */
+ public Color getDiffuseColor(){
+ return this.diffuseColor;
+ }
+
+ /**
+ * 反射光を設定する。
+ * 透過成分があれば不透明化される。
+ * @param color 反射光
+ * @throws NullPointerException 引数がnull
+ */
+ public void setSpecularColor(Color color)
+ throws NullPointerException{
+ if(color == null) throw new NullPointerException();
+ this.specularColor = forceOpaque(color);
+ return;
+ }
+
+ /**
+ * 反射光を返す。
+ * @return 反射光
+ */
+ public Color getSpecularColor(){
+ return this.specularColor;
+ }
+
+ /**
+ * 環境光を設定する。
+ * 透過成分があれば不透明化される。
+ * @param color 環境光
+ * @throws NullPointerException 引数がnull
+ */
+ public void setAmbientColor(Color color)
+ throws NullPointerException{
+ if(color == null) throw new NullPointerException();
+ this.ambientColor = forceOpaque(color);
+ return;
+ }
+
+ /**
+ * 環境光を返す。
+ * @return 環境光
+ */
+ public Color getAmbientColor(){
+ return this.ambientColor;
+ }
+
+ /**
+ * 光沢強度を設定する。
+ * MMDで用いられるのは1.0〜15.0あたり。
+ * @param shininess 光沢強度
+ */
+ public void setShininess(float shininess){
+ this.shininess = shininess;
+ return;
+ }
+
+ /**
+ * 光沢強度を返す。
+ * @return 光沢強度
+ */
+ public float getShininess(){
+ return this.shininess;
+ }
+
+ /**
+ * シェーディング設定を返す。
+ * @return シェーディング設定
+ */
+ public ShadeInfo getShadeInfo(){
+ return this.shadeInfo;
+ }
+
+ /**
+ * エッジを表示するか設定する。
+ * 頂点単位の設定より優先度は低い。
+ * @param show 表示するならtrue
+ */
+ public void setEdgeAppearance(boolean show){
+ this.edgeAppearance = show;
+ return;
+ }
+
+ /**
+ * エッジを表示するか判定する。
+ * 頂点単位の設定より優先度は低い。
+ * @return 表示するならtrue
+ */
+ public boolean getEdgeAppearance(){
+ return this.edgeAppearance;
+ }
+
+ /**
+ * 面リストを返す。
+ * @return 面リスト
+ */
+ public List<Surface> getSurfaceList(){
+ return this.surfaceList;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @return {@inheritDoc}
+ */
+ @Override
+ public Iterator<Surface> iterator(){
+ return this.surfaceList.iterator();
+ }
+
+ /**
+ * {@inheritDoc}
+ * @return {@inheritDoc}
+ */
+ @Override
+ public String toString(){
+ StringBuilder result = new StringBuilder();
+
+ result.append("Material ");
+
+ float[] rgba = new float[4];
+
+ this.diffuseColor.getRGBComponents(rgba);
+ result.append("diffuse=[")
+ .append(rgba[0]).append(", ")
+ .append(rgba[1]).append(", ")
+ .append(rgba[2]).append(", ")
+ .append(rgba[3]).append(']')
+ .append(' ');
+
+ this.specularColor.getRGBComponents(rgba);
+ result.append("specular=[")
+ .append(rgba[0]).append(", ")
+ .append(rgba[1]).append(", ")
+ .append(rgba[2]).append(", ")
+ .append(rgba[3]).append(']')
+ .append(' ');
+
+ this.ambientColor.getRGBComponents(rgba);
+ result.append("ambient=[")
+ .append(rgba[0]).append(", ")
+ .append(rgba[1]).append(", ")
+ .append(rgba[2]).append(", ")
+ .append(rgba[3]).append(']')
+ .append(' ');
+
+ result.append("shininess=")
+ .append(this.shininess)
+ .append(' ');
+ result.append("edge=")
+ .append(this.edgeAppearance)
+ .append(' ');
+ result.append("surfaces=")
+ .append(this.surfaceList.size())
+ .append(' ');
+ result.append(this.shadeInfo);
+
+ return result.toString();
+ }
+
+}