<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
    creationComplete="creationCompleteHandler(event)"
    xmlns:degrafa="com.degrafa.*" xmlns:paint="com.degrafa.paint.*" xmlns:geometry="com.degrafa.geometry.*">
    <mx:Script>
    <![CDATA[
    import org.papervision3d.core.math.Matrix3D;
    import org.papervision3d.cameras.FrustumCamera3D;
    import org.papervision3d.core.geom.CustomRendering3D;
    import com.degrafa.IGraphic;
    import org.papervision3d.core.geom.renderables.Curve3D;
    import org.papervision3d.core.geom.Curves3D;
    import org.papervision3d.core.geom.renderables.Vertex3D;
    import org.papervision3d.core.geom.Lines3D;
    import org.papervision3d.materials.special.LineMaterial;
    import org.papervision3d.core.geom.renderables.Line3D;
    import org.papervision3d.materials.MovieMaterial;
    import org.papervision3d.core.math.Plane3D;
    import org.papervision3d.objects.primitives.Plane;
    import org.papervision3d.core.render.data.RenderHitData;
    import org.papervision3d.core.geom.renderables.Triangle3D;
    import org.papervision3d.events.InteractiveScene3DEvent;
    import org.papervision3d.core.proto.MaterialObject3D;
    import org.papervision3d.objects.primitives.Cone;
    import org.papervision3d.view.Viewport3D;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.materials.utils.MaterialsList;
    import org.papervision3d.materials.ColorMaterial;
    import org.papervision3d.objects.primitives.Cube;
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.scenes.Scene3D;
    import mx.core.UIComponent;

    private var parentUIC:UIComponent;
    private var scene:Scene3D;
    private var camera1:Camera3D;
    private var fcamera2:FrustumCamera3D;
    private var renderer:BasicRenderEngine;
    private var viewPort:Viewport3D;

    private var whatever:Cube;
    private var line:Lines3D;
    private var curves:Curves3D;
    private var custom:CustomRendering3D;

    private function creationCompleteHandler(event:Event):void {
        parentUIC = new UIComponent();
        parentUIC.percentWidth = 100;
        parentUIC.percentHeight = 100;
        main.addChild(parentUIC);

        viewPort = new Viewport3D(10,10,true,true);
        parentUIC.addChild(viewPort);

        scene = new Scene3D();
        renderer = new BasicRenderEngine();

        var mat:ColorMaterial = new ColorMaterial(0xEE4477,1,true);
        mat.interactive = true;
        var ml:MaterialsList = new MaterialsList();
        ml.addMaterial(mat, "all");
        whatever = new Cube(ml, 200, 200, 200);
        whatever.pitch(-30);

        //scene.addChild(whatever);

        var redLine:LineMaterial = new LineMaterial(0xF00F00,1);
        var greenLine:LineMaterial = new LineMaterial(0x00FF00,1);
        var blueLine:LineMaterial = new LineMaterial(0x0000FF,1);
        line = new Lines3D(redLine, "lineTest");
        line.addLine(new Line3D(line, greenLine, 2, new Vertex3D(-1000, 0, 0), new Vertex3D(1000, 0, 0)));
        line.addLine(new Line3D(line, redLine, 2, new Vertex3D(0, -1000, 0), new Vertex3D(0, 1000, 0)));
        line.addLine(new Line3D(line, blueLine, 2, new Vertex3D(0, 0, -1000), new Vertex3D(0, 0, 1000)));
        scene.addChild(line);

        curves = new Curves3D(redLine, "curveTest");
        curves.addCurve(new Curve3D(curves, redLine, 2, new Vertex3D(0, 0, -1000), new Vertex3D(0, 0, 1000),
            new Vertex3D(0, 300, 500)));
        scene.addChild(curves);

        scene.addChild(a.displayObject3D);
        scene.addChild(b.displayObject3D);
        scene.addChild(c.displayObject3D);
        scene.addChild(d.displayObject3D);
        d.displayObject3D.pitch(50);

        camera1 = new Camera3D(null, 2);
        camera1.x = 100;
        camera1.y = 200;
        camera1.z = -1000;

        parentUIC.addEventListener(Event.ENTER_FRAME, enterFrameHandler, false, 0, true);
        renderer.renderScene(scene, camera1, viewPort);

        fcamera2 = new FrustumCamera3D(viewPort);
        fcamera2.far = 5000;
        fcamera2.x = 100;
        fcamera2.y = 200;
        fcamera2.z = -2000;
        fcamera2.near = 10;
        fcamera2.fov = 90;

        originalTransform = fcamera2.transform;
    }

    private function enterFrameHandler(event:Event):void {
        whatever.yaw(5);
        b.displayObject3D.yaw(5);
        //renderer.renderScene(scene, camera1, viewPort);
        renderer.renderScene(scene, fcamera2, viewPort);
    }

    protected function updateRotationFromSliders():void
    {
        originalTransform = Matrix3D.translationMatrix(xSlider.value, ySlider.value, zSlider.value);
        fcamera2.transform = Matrix3D.multiply(originalTransform,
            Matrix3D.multiply(
                Matrix3D.rotationX(pitchSlider.value*Math.PI/180),
                Matrix3D.multiply(
                    Matrix3D.rotationY(yawSlider.value*Math.PI/180),
                    Matrix3D.rotationZ(rollSlider.value*Math.PI/180))
                )
            );
    }

    protected var originalTransform:Matrix3D;

    ]]>
    </mx:Script>
    <mx:Grid width="100%">
        <mx:GridRow width="100%">
            <mx:GridItem>
                <mx:Label text="X-Axis"/>
            </mx:GridItem>
            <mx:GridItem width="100%">
                <mx:HSlider id="xSlider" width="100%" change="fcamera2.x = xSlider.value" liveDragging="true"
                    minimum="-1000" maximum="1000" value="100"/>
            </mx:GridItem>
        </mx:GridRow>
        <mx:GridRow width="100%">
            <mx:GridItem>
                <mx:Label text="Y-Axis"/>
            </mx:GridItem>
            <mx:GridItem width="100%">
                <mx:HSlider id="ySlider" width="100%" change="fcamera2.y = ySlider.value" liveDragging="true"
                    minimum="-1000" maximum="1000" value="200"/>
            </mx:GridItem>
        </mx:GridRow>
        <mx:GridRow width="100%">
            <mx:GridItem>
                <mx:Label text="Z-Axis"/>
            </mx:GridItem>
            <mx:GridItem width="100%">
                <mx:HSlider id="zSlider" width="100%" change="fcamera2.z = zSlider.value" liveDragging="true"
                    minimum="-5000" maximum="1000" value="-2000"/>
            </mx:GridItem>
        </mx:GridRow>
        <mx:GridRow width="100%">
            <mx:GridItem>
                <mx:Label text="Pitch"/>
            </mx:GridItem>
            <mx:GridItem width="100%">
                <mx:HSlider id="pitchSlider" width="100%" change="updateRotationFromSliders()" liveDragging="true"
                    minimum="-180" maximum="180" value="0"/>
            </mx:GridItem>
        </mx:GridRow>
        <mx:GridRow width="100%">
            <mx:GridItem>
                <mx:Label text="Yaw"/>
            </mx:GridItem>
            <mx:GridItem width="100%">
                <mx:HSlider id="yawSlider" width="100%" change="updateRotationFromSliders()" liveDragging="true"
                    minimum="-180" maximum="180" value="0"/>
            </mx:GridItem>
        </mx:GridRow>
        <mx:GridRow width="100%">
            <mx:GridItem>
                <mx:Label text="Roll"/>
            </mx:GridItem>
            <mx:GridItem width="100%">
                <mx:HSlider id="rollSlider" width="100%" change="updateRotationFromSliders()" liveDragging="true"
                    minimum="-180" maximum="180" value="0"/>
            </mx:GridItem>
        </mx:GridRow>
    </mx:Grid>
    <mx:Panel title="Test" id="main" width="100%" height="100%" backgroundColor="black"/>
    <mx:UIComponent id="me" height="500" visible="false" includeInLayout="false"/>
    <degrafa:Surface id="surf" verticalCenter="0" horizontalCenter="-125">
        <degrafa:fills>
            <paint:SolidFill id="aqua" color="aqua"/>
            <paint:SolidFill id="chartreuse" color="chartreuse"/>
            <paint:SolidFill id="mintcream" color="mintcream"/>
            <paint:SolidFill id="fuchsia" color="fuchsia"/>
            <paint:SolidFill id="gold" color="gold"/>
            <paint:SolidFill id="peru" color="peru"/>
        </degrafa:fills>
        <degrafa:strokes>
            <paint:SolidStroke id="whiteStroke" color="white" alpha="1" weight="2"/>
            <paint:SolidStroke id="aquaStroke" color="aqua" alpha="1" weight="2"/>
            <paint:SolidStroke id="blackStroke" color="DARKSLATEBLUE" alpha="1" weight="1"/>
            <paint:SolidStroke id="greenStroke" color="green" alpha="1" weight="2"/>
            <paint:SolidStroke id="redStroke" color="red" alpha="1" weight="2"/>
        </degrafa:strokes>
        <degrafa:GeometryGroup3d id="a">
            <geometry:Line stroke="{greenStroke}" x="100" x1="290" y="-50" y1="-250"/>
        </degrafa:GeometryGroup3d>
        <degrafa:GeometryGroup3d id="b">
            <geometry:Circle fill="{gold}" radius="20" centerX="50" centerY="60"/>
            <geometry:CubicBezier stroke="{aquaStroke}" x="0" y="0" cx="50" cy="50" cx1="80" cy1="20" x1="100" y1="100"/>
            <geometry:Ellipse fill="{mintcream}" width="100" height="30" x="250" y="50"/>
            <geometry:RegularRectangle fill="{aqua}" stroke="{aquaStroke}" y="100" height="100" width="50"/>
            <geometry:EllipticalArc x="400" closureType="open" arc="180" width="200"
                height="200" startAngle="10" stroke="{aquaStroke}"/>
            <geometry:EllipticalArc closureType="pie" arc="30" width="200"
                height="200" startAngle="10" y="150" stroke="{aquaStroke}" fill="{gold}"/>
            <geometry:HorizontalLine stroke="{greenStroke}" x="260" x1="320" y="-140"/>
            <geometry:VerticalLine stroke="{redStroke}" y="10" y1="60" x="300"/>
            <geometry:Line stroke="{greenStroke}" x="100" x1="290" y="-50" y1="-250"/>
            <geometry:Path stroke="{redStroke}">
                <geometry:data>M-83.982,82.53c22.185,22.189,51.686,34.411,83.066,34.411c31.38,0,60.881-12.222,83.069-34.411
 c22.189-22.189,34.406-51.689,34.406-83.065c0-31.381-12.217-60.881-34.405-83.07c-22.189-22.19-51.69-34.406-83.07-34.406
 c-31.379,0-60.878,12.218-83.066,34.406c-22.191,22.188-34.408,51.688-34.408,83.07C-118.39,30.841-106.174,60.341-83.982,82.53z
 M-79.77-79.392c21.064-21.064,49.066-32.663,78.854-32.663s57.793,11.601,78.853,32.663
 c21.067,21.062,32.666,49.068,32.666,78.857c0,29.786-11.599,57.79-32.666,78.855c-21.06,21.061-49.063,32.663-78.853,32.663
 S-58.706,99.381-79.77,78.32c-21.066-21.065-32.664-49.069-32.664-78.855C-112.434-30.324-100.835-58.33-79.77-79.392z
                </geometry:data>
            </geometry:Path>
            <geometry:Polygon stroke="{aquaStroke}" x="100" y="300">
                <geometry:data>
-0.201,-108.65 24.134,-33.754 102.885,-33.754 39.174,12.535 63.509,87.431 -0.201,41.143 -63.912,87.431 -39.577,12.535 -103.287,-33.754 -24.537,-33.754
                </geometry:data>
            </geometry:Polygon>
            <geometry:Polyline stroke="{whiteStroke}" autoClose="false" x="150" y="300">
                <geometry:data>0,0 0,20 20,20 20,40 40,40 40,60</geometry:data>
            </geometry:Polyline>
            <!--
            <geometry:PolygonLibrary/>
            <geometry:QuadraticBezier/>
            -->
        </degrafa:GeometryGroup3d>
        <degrafa:GeometryGroup3d id="d" z="-60" y="100">
            <geometry:RoundedRectangle fill="{mintcream}" stroke="{blackStroke}" width="300" height="20" cornerRadius="10"/>
        </degrafa:GeometryGroup3d>
        <degrafa:GeometryGroup3d id="c" z="-60">
            <geometry:RoundedRectangleComplex fill="{peru}" y="-50" width="200"/>
        </degrafa:GeometryGroup3d>
    </degrafa:Surface>
</mx:VBox>