Erain 3D
advert here

Light Explorer

This little interactive applet demonstrates basic properties of 3.0.2 lighting model.

Whole thing was inspired by and is based on Away3D lighting demo by Anggie Bratadinata.

Demo Source code

You will need to install Flex SDK (and JRE) to compile this code.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
	backgroundGradientAlphas="[1, 1]" backgroundGradientColors="[#000000, #000000]"
	creationComplete="init()">
 
	<mx:Script>
		<![CDATA[
			import mx.core.UIComponent;
			import mx.events.ColorPickerEvent;
			import mx.events.SliderEvent;
 
			import flash.display.*;
			import flash.events.*;
 
			import sandy.core.*
			import sandy.core.data.*
			import sandy.core.light.*
			import sandy.core.scenegraph.*
			import sandy.materials.*
			import sandy.materials.attributes.*
			import sandy.primitive.*
 
 
			private var _container:Sprite;
 
			private var _scene:Scene3D;
			private var _light:Light3D;
			private var _obj3d:Shape3D;
			private var _attrs:ALightAttributes;
 
			[Embed(source="pic024.jpg")]
			private var Texture:Class;
 
			private function init():void {
				var wrapper:UIComponent = new UIComponent();
 
				_container = new Sprite();
 
				wrapper.addChild(_container);
				MainCanvas.addChild(wrapper);
 
				_scene = new Scene3D ("scene", _container, new Camera3D (200, 200), new Group ("root"));
				_light = _scene.light; _light.setDirectionVector (new Vector (0, 0, -500));
 
				// create sphere matching one in away demo
				_obj3d = new Sphere ("sphere", 200, 16, 16);
 
				// set up flat lighting resembling one in away demo
				setShader();
 
				var b:Bitmap = new Texture ();
				var m:BitmapMaterial = new BitmapMaterial (
					b.bitmapData, new MaterialAttributes (_attrs));
				m.lightingEnable = true;
				_obj3d.appearance = new Appearance (m);
				_scene.root.addChild (_obj3d);
				_scene.camera.z = -1000;
 
				addEventListener (Event.ENTER_FRAME, enterFrameListener);
			}
 
			private function enterFrameListener(e:Event):void {
				_obj3d.tilt++; _obj3d.rotateY++;
				_scene.render();
 
				// we do this here and not on switchLight() to
				// have at least one render() call that will
				// clear light color transform on object
				_obj3d.appearance.frontMaterial.lightingEnable = lightSwitch.selected;
			}
 
			private function setLightingParams():void {
				_attrs.ambient = lightAmbient.value;
				_attrs.diffuse = lightDiffuse.value;
				_attrs.specular = lightSpecular.value;
				_attrs.gloss = lightGloss.value;
			}
 
			private function sliderListener(e:SliderEvent):void {
				var d:Vector = new Vector (lightX.value, lightY.value, lightZ.value);
				if (d.getNorm () < 1e-2) d.z = 1;
 
				_light.setDirectionVector (d);
 
				setLightingParams();
			}
 
			private function colorPickerListener(e:ColorPickerEvent):void{
				_light.color = lightSwitch.selected ? colorPicker.selectedColor : 0xFFFFFF;
			}
 
			private function switchLight():void {
				colorPickerListener (null);
			}
 
			private function setShader():void {
				switch (shaderType.selectedIndex) {
					case 0: _attrs = new LightAttributes (true); break;
					case 1: _attrs = new GouraudAttributes (true); break;
					case 2: _attrs = new PhongAttributes (true, 0, 15); break;
				}
				setLightingParams ();
				_obj3d.appearance.frontMaterial.attributes = new MaterialAttributes (_attrs);
			}
 
		]]>
	</mx:Script>
 
 
	<mx:Style>
		.light{
			color:#FFFFFF;
			fontWeight:normal;
		}
		Label{
			color:#FFFFFF;
			fontWeight: bold;	
		}
		HSlider{
			labelStyleName:light;
		}
	</mx:Style>
 
	<mx:Grid x="10" y="10" width="328" verticalGap="10">
		<mx:GridRow>
			<mx:GridItem>
				<mx:Label text="Light Explorer" textAlign="left" />
			</mx:GridItem>
			<mx:GridItem>
				<mx:CheckBox id="lightSwitch" selected="true" label="Light On" disabledColor="#CCCCCC" styleName="light" click="switchLight()" textRollOverColor="#FFFFFF" x="10" y="10"/>
			</mx:GridItem>
		</mx:GridRow>
		<mx:GridRow>
			<mx:GridItem>
				<mx:VBox>
					<mx:Label text="x"/>
					<mx:HSlider id="lightX" minimum="-400" value="0" maximum="400" liveDragging="true" labels="['-400','400']" labelStyleName="light"
					change="sliderListener(event)"/>
				</mx:VBox>
			</mx:GridItem>
			<mx:GridItem>
				<mx:VBox>
					<mx:Label text="Ambient"/>
					<mx:HSlider id="lightAmbient" minimum="0" value="0.1" maximum="1" liveDragging="true" labels="['0','1']" labelStyleName="light"
					change="sliderListener(event)"/>
				</mx:VBox>
			</mx:GridItem>
		</mx:GridRow>
		<mx:GridRow>
			<mx:GridItem>
				<mx:VBox>
					<mx:Label text="y"/>
					<mx:HSlider id="lightY" minimum="-400" value="0" maximum="400" liveDragging="true" labels="['-400','400']" labelStyleName="light"
					change="sliderListener(event)"/>
				</mx:VBox>
			</mx:GridItem>
			<mx:GridItem>
				<mx:VBox>
					<mx:Label text="Diffuse"/>
					<mx:HSlider id="lightDiffuse" minimum="0" value="0" maximum="2" liveDragging="true" labels="['0','2']" labelStyleName="light"
					change="sliderListener(event)"/>
				</mx:VBox>
			</mx:GridItem>
		</mx:GridRow>
		<mx:GridRow>
			<mx:GridItem>
				<mx:VBox>
					<mx:Label text="z"/>
					<mx:HSlider id="lightZ" minimum="-500" value="500" maximum="500" liveDragging="true" labels="['-500','500']" labelStyleName="light"
					change="sliderListener(event)"/>
				</mx:VBox>
			</mx:GridItem>
			<mx:GridItem>
				<mx:VBox>
					<mx:Label text="Specular"/>
					<mx:HSlider id="lightSpecular" minimum="0" value="0" maximum="2" liveDragging="true" labels="['0','2']" labelStyleName="light" 
					change="sliderListener(event)"/>
				</mx:VBox>
			</mx:GridItem>
		</mx:GridRow>
		<mx:GridRow>
			<mx:GridItem>
				<mx:VBox>
					<mx:HBox>
						<mx:Label text="Color"/>
						<mx:ColorPicker id="colorPicker" change="colorPickerListener(event)"  selectedColor="#FFFFFF"/>
					</mx:HBox>
 
					<mx:Label text="Shader"/>
					<mx:ComboBox id="shaderType" change="setShader();">
						<mx:dataProvider>
							<mx:Array>
								<mx:String>Flat</mx:String>
								<mx:String>Gouraud</mx:String>
								<mx:String>Phong</mx:String>
							</mx:Array>
						</mx:dataProvider>
					</mx:ComboBox>
				</mx:VBox>
			</mx:GridItem>
			<mx:GridItem>
				<mx:VBox>
					<mx:Label text="Gloss"/>
					<mx:HSlider id="lightGloss" minimum="0" value="5" maximum="15" liveDragging="true" labels="['0','15']" labelStyleName="light" 
					change="sliderListener(event)"/>
				</mx:VBox>
			</mx:GridItem>
		</mx:GridRow>
	</mx:Grid>
 
	<mx:Canvas x="346" y="110" width="200" height="400" id="MainCanvas">
	</mx:Canvas>
 
</mx:Application>