package away3d.lights { import away3d.containers.*; import away3d.core.base.*; import away3d.core.draw.*; import away3d.core.light.*; import away3d.core.render.*; import away3d.core.utils.*; import away3d.materials.*; import away3d.primitives.*; /** * Lightsource that colors all shaded materials evenly from any angle */ public class AmbientLight3D extends Object3D implements ILightProvider, IClonable { private var _color:int; private var _red:int; private var _green:int; private var _blue:int; private var _ambient:Number; private var _colorDirty:Boolean; private var _ambientDirty:Boolean; private var _ls:AmbientLight = new AmbientLight(); private var _debugPrimitive:Sphere; private var _debugMaterial:ColorMaterial; private var _debug:Boolean; /** * Defines the color of the light object. */ public function get color():int { return _color; } public function set color(val:int):void { _color = val; _red = (_color & 0xFF0000) >> 16; _green = (_color & 0xFF00) >> 8; _blue = (_color & 0xFF); _colorDirty = true; } /** * Defines a coefficient for the ambient light intensity. */ public function get ambient():Number { return _ambient; } public function set ambient(val:Number):void { _ambient = val; _ambientDirty = true; } /** * Toggles debug mode: light object is visualised in the scene. */ public function get debug():Boolean { return _debug; } public function set debug(val:Boolean):void { _debug = val; } public function get debugPrimitive():Object3D { if (!_debugPrimitive) _debugPrimitive = new Sphere(); if (!_debugMaterial) { _debugMaterial = new ColorMaterial(); _debugPrimitive.material = _debugMaterial; } _debugMaterial.color = color; return _debugPrimitive; } /** * Creates a new AmbientLight3D object. * * @param init [optional] An initialisation object for specifying default instance properties. */ public function AmbientLight3D(init:Object = null) { super(init); color = ini.getColor("color", 0xFFFFFF); ambient = ini.getNumber("ambient", 0.5, {min:0, max:1}); debug = ini.getBoolean("debug", false); } /** * @inheritDoc */ public function light(consumer:ILightConsumer):void { //update color if (_colorDirty) { _ls.red = _red; _ls.green = _green; _ls.blue = _blue; _colorDirty = false; } //update ambient if (_ambientDirty) { _ambientDirty = false; _ls.updateAmbientBitmap(_ambient); } consumer.ambientLight(_ls); } /** * Duplicates the light object's properties to another AmbientLight3D object * * @param object [optional] The new object instance into which all properties are copied * @return The new object instance with duplicated properties applied */ public override function clone(object:Object3D = null):Object3D { var light:AmbientLight3D = (object as AmbientLight3D) || new AmbientLight3D(); super.clone(light); light.color = color; light.ambient = ambient; light.debug = debug; return light; } } }