<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="vertical" applicationComplete="init();" pageTitle="Objects Controls in Papervision 2.0" viewSourceURL="srcview/index.html">
<mx:Script>
    <![CDATA[    
        import mx.core.UIComponent;
        import org.papervision3d.materials.utils.MaterialsList;
        import org.papervision3d.materials.shadematerials.*;
        import org.papervision3d.materials.shaders.*;
        import org.papervision3d.objects.primitives.Cube;
        import org.papervision3d.render.BasicRenderEngine;
        import org.papervision3d.lights.PointLight3D;
        import org.papervision3d.view.Viewport3D;
        import org.papervision3d.scenes.*;
        import org.papervision3d.cameras.*;
        import org.papervision3d.objects.*;
        import org.papervision3d.materials.*;
        import com.paranoidart.*;
        import flash.display.Stage;
        private var scene:Scene3D;
        private var camera:Camera3D;
        private var view:Viewport3D;
        private var thelight:PointLight3D;
        private var renderer:BasicRenderEngine;
        
        private var obj3d:DisplayObject3D;
        [Bindable]
        private var disObjArr:Array = new Array("Torus", "Greeble", "Bike");
        private var matList:MaterialsList
        private function init():void {
            var uiRef:UIComponent = new UIComponent();            
            papercanvas.addChild(uiRef);
            scene = new Scene3D();
            camera = new Camera3D();
            camera.x = 0;
            camera.zoom = 15;
            view = new Viewport3D(400, 400, false, false, true);
            
            uiRef.addChild(view);
            renderer = new BasicRenderEngine();
            
            thelight = new PointLight3D(true);
            scene.addChild(thelight);
            matList = new MaterialsList(
            {
                all: new FlatShadeMaterial(thelight, diffuseid.selectedColor, 0x000000)
            });
            
            obj3d = new Torus();
            //obj3d.material = new CellMaterial(thelight, diffuseid.selectedColor, ambid.selectedColor, 50);
            setShade();
            scene.addChild(obj3d, "obj3d");
            
            renderer.renderScene(scene, camera, view);
            
            addEventListener(Event.ENTER_FRAME, loop);
            credit.htmlText = "<b>Thanks To:</b> <a href='http://the.fontvir.us/b10g/' target='blank'>xero</a>, <a href='http://seraf.mediabox.fr/showcase/as3-geom-class-exporter-for-3ds-max-english/' target='blank'> dreammania</a>, <a href='http://mrdoob.com/blog' target='blank'>mrdoob</a> & <a href='http://www.papervision3d.org/' target='blank'>papervision community</a>";
            
        }
        private function createObj():void {
            scene.removeChildByName("obj3d");
            if (combo.selectedLabel == "Torus") {                
                obj3d = new Torus();
                camera.zoom = 15;
            }else if(combo.selectedLabel == "Greeble") {
                obj3d = new Greeble();
                camera.zoom = 15;            
            }else if(combo.selectedLabel == "Bike"){
                obj3d = new Bike();
                camera.zoom = 1500;                
            }
            setShade();
            //obj3d.material = new CellMaterial(thelight, diffuseid.selectedColor, ambid.selectedColor, 50);
            scene.addChild(obj3d, "obj3d");
            renderer.renderScene(scene, camera, view);
        }
        private function loop(e:Event):void {
            obj3d.pitch(speedid.value);
            obj3d.yaw(speedid.value);
            renderer.renderScene(scene, camera, view);
        }
        private function setLgtDiffuse(e:Event):void {
            setShade();
            //obj3d.material = new CellMaterial(thelight, diffuseid.selectedColor, ambid.selectedColor, 50);
            paperpanel.setStyle("backgroundColor", bgcolor.selectedColor);
        }
        private function setShade(e:Event = null):void {
            
            switch (shadeGrp.selectedValue){
                case "cell":
                obj3d.material = new CellMaterial(thelight, diffuseid.selectedColor, ambid.selectedColor, 50);
                break;
                case "flat":
                obj3d.material = new FlatShadeMaterial(thelight, diffuseid.selectedColor, ambid.selectedColor);
                break;
                case "gouraud":
                obj3d.material = new GouraudMaterial(thelight, diffuseid.selectedColor, ambid.selectedColor);
                break;
                case "phong":
                obj3d.material = new PhongMaterial(thelight, diffuseid.selectedColor, ambid.selectedColor, 50);
                break;
            }
        }
    ]]>
</mx:Script>
<mx:HBox>
<mx:Panel id="paperpanel" title="Objects in Papervision3D 2.0" layout="horizontal" height="400"
    paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5" backgroundColor="#FFFFFF">
    <mx:Canvas id="papercanvas" width="400"/>
</mx:Panel>

<mx:Panel id="pan" title="Controls" height="400" cachePolicy="on"
    paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5" >
    
    <mx:VBox width="100%" >
    <mx:VBox borderStyle="solid" backgroundColor="0xCCCCCC" backgroundAlpha="0.5" 
        paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5" width="100%" >
    <mx:Label text="Select Object:" fontWeight="bold"/>
    <mx:ComboBox id="combo" dataProvider="{disObjArr}" close="createObj();"/>
    </mx:VBox>
    <mx:VBox borderStyle="solid" backgroundColor="0xCCCCCC" backgroundAlpha="0.5" 
        paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5" width="100%" >
        <mx:Label text="Light Controls:" fontWeight="bold"/>
        <mx:HBox verticalAlign="middle" width="100%">
            <mx:Label text="Diffuse"  width="100%"/>
            <mx:ColorPicker id="diffuseid" selectedColor="0x000033" close="setLgtDiffuse(event);" textAlign="right"/>
        </mx:HBox>
        <mx:HBox verticalAlign="middle" width="100%">
            <mx:Label text="Ambient"  width="100%"/>
            <mx:ColorPicker id="ambid" selectedColor="0x00FFFF" close="setLgtDiffuse(event);" textAlign="right"/>
        </mx:HBox>
    </mx:VBox>
    <mx:VBox borderStyle="solid" backgroundColor="0xCCCCCC" backgroundAlpha="0.5" 
        paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5" width="100%">
        <mx:HBox verticalAlign="middle" width="100%">
        <mx:Label text="Background:"  width="100%"/>
        <mx:ColorPicker id="bgcolor" selectedColor="0xFFFFFF" close="setLgtDiffuse(event);" textAlign="right"/>
        </mx:HBox>
        <mx:HBox verticalAlign="middle" width="100%">
        <mx:Label text="Speed:"  width="100%"/>
        <mx:NumericStepper id="speedid" minimum="1" maximum="10" width="40"/>
        </mx:HBox>
    </mx:VBox>
    <mx:VBox borderStyle="solid" backgroundColor="0xCCCCCC" backgroundAlpha="0.5" 
        paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5" width="100%" >
        <mx:Label text="Select Shade:"  fontWeight="bold" />
        <mx:RadioButtonGroup id="shadeGrp" itemClick="setShade(event);"/>
        <mx:RadioButton label="FlatShade" value="flat" groupName="shadeGrp" selected="true" />
        <mx:RadioButton label="Cell" value="cell" groupName="shadeGrp"/>
        <mx:RadioButton label="Gouraud" value="gouraud" groupName="shadeGrp"/>
        <mx:RadioButton label="Phong" value="phong" groupName="shadeGrp"/>
    </mx:VBox>
</mx:VBox>

</mx:Panel>
</mx:HBox>
<mx:HBox>
    <mx:Text id="credit" />
</mx:HBox>
</mx:Application>