package away3d.materials
{
import away3d.arcane;
import away3d.core.utils.*;
import away3d.materials.shaders.*;
import flash.display.*;
use namespace arcane;
/**
* Color material with phong shading.
*/
public class PhongColorMaterial extends CompositeMaterial
{
private var _shininess:Number;
private var _specular:Number;
private var _phongShader:CompositeMaterial;
private var _ambientShader:AmbientShader;
private var _diffusePhongShader:DiffusePhongShader;
private var _specularPhongShader:SpecularPhongShader;
/**
* Updates the colortransform object applied to the texture from the color and alpha properties.
*
* @see away3d.materials.CompositeMaterial#color
* @see away3d.materials.CompositeMaterial#alpha
*/
protected override function setColorTransform():void
{
_colorTransformDirty = false;
if (_specular) {
_colorTransform = null;
_phongShader.color = _color;
_phongShader.alpha = _alpha;
} else {
_phongShader.color = 0xFFFFFF;
_phongShader.alpha = 1;
super.setColorTransform();
}
}
/**
* The exponential dropoff value used for specular highlights.
*/
public function get shininess():Number
{
return _shininess;
}
public function set shininess(val:Number):void
{
_shininess = val;
if (_specularPhongShader)
_specularPhongShader.shininess = val;
}
/**
* Coefficient for specular light level.
*/
public function get specular():Number
{
return _specular;
}
public function set specular(val:Number):void
{
if (_specular == val)
return;
_specular = val;
if (_specular) {
_specularPhongShader.shininess = _shininess;
_specularPhongShader.specular = _specular;
removeMaterial(_ambientShader);
removeMaterial(_diffusePhongShader);
addMaterial(_phongShader);
addMaterial(_specularPhongShader);
} else {
removeMaterial(_phongShader);
removeMaterial(_specularPhongShader);
addMaterial(_ambientShader);
addMaterial(_diffusePhongShader);
}
_colorTransformDirty = true;
}
/**
* Creates a new PhongBitmapMaterial object.
*
* @param color A string, hex value or colorname representing the color of the material.
* @param init [optional] An initialisation object for specifying default instance properties.
*/
public function PhongColorMaterial(color:*, init:Object = null)
{
if (init && init.materials)
delete init.materials;
super(init);
this.color = Cast.trycolor(color);
_shininess = ini.getNumber("shininess", 20);
_specular = ini.getNumber("specular", 0.7, {min:0, max:1});
//create new materials
_phongShader = new CompositeMaterial();
_phongShader.addMaterial(_ambientShader = new AmbientShader({blendMode:BlendMode.ADD}));
_phongShader.addMaterial(_diffusePhongShader = new DiffusePhongShader({blendMode:BlendMode.ADD}));
_specularPhongShader = new SpecularPhongShader({shininess:_shininess, specular:_specular, blendMode:BlendMode.ADD});
//add to materials array
if (_specular) {
addMaterial(_phongShader);
addMaterial(_specularPhongShader);
} else {
addMaterial(_ambientShader);
addMaterial(_diffusePhongShader);
}
}
}
}