<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="absolute" applicationComplete="init()" viewSourceURL="srcview/index.html" width="500" height="350">
    <mx:Metadata>
        [SWF( frameRate="100")]
    </mx:Metadata>
    <mx:Script>
        <![CDATA[
            import org.papervision3d.lights.PointLight3D;
            import flash.utils.getTimer;
            import org.papervision3d.objects.DisplayObject3D;
            import com.pricope.miti.odedemo.PCube;
            import com.pricope.miti.odedemo.IPObject;
            import com.pricope.miti.odedemo.PSphere;
            import org.ode.OdeInit;
            import mx.collections.ArrayCollection;
            private var world:uint;
            private var contactGroup:uint;
            private var objects:ArrayCollection = new ArrayCollection();
            private var space:uint;
            
            private var view:MyView;
                        
            private function init():void {
    
                OdeInit.dInitODE2(new Number(0));
                world = OdeInit.dWorldCreate();
                OdeInit.dWorldSetGravity(world,0,-9.8,0);
                space = OdeInit.dSimpleSpaceCreate(0);
                
                var tmSphere:PSphere = new PSphere(world,space,60,100,0,10,1,0.2);
                objects.addItem(tmSphere);
                tmSphere = new PSphere(world,space,1,150,0,10,1,0.2);
                objects.addItem(tmSphere);
                tmSphere = new PSphere(world,space,60,150,0,10,1,0.2);
                objects.addItem(tmSphere);
                tmSphere = new PSphere(world,space,60,180,1,10,1,0.2);
                objects.addItem(tmSphere);
                
                
                var c:PCube = new PCube(world,space,0,0,0,200,1,200);
                objects.addItem(c);
                c = new PCube(world,space, 100,100,0,1, 198, 200);
                objects.addItem(c);
                c = new PCube(world,space, -100,100,0,1, 198, 200);
                objects.addItem(c);
                c = new PCube(world,space, 0,100,100,198, 198, 1);
                objects.addItem(c);
                c = new PCube(world,space, 0,100,-100,198, 198, 1);
                objects.addItem(c);
                c = new PCube(world,space, 0,200,0,200, 1, 200);
                objects.addItem(c);
                
                contactGroup = OdeInit.dJointGroupCreate(0);
                
                view = new MyView();
                view.camera.zoom +=70;
                view.camera.moveLeft(400);
                view.camera.moveUp(600);
                var o3d:DisplayObject3D = new DisplayObject3D();
                o3d.x = 0;
                o3d.y = 50;
                o3d.z = 0;
                view.camera.target = o3d;
                
                for (var i:int = 0; i < objects.length;i++) {
                    IPObject(objects.getItemAt(i)).draw(view.scene);
                }
                
                container.addChild(view);
                view.startRendering();
                stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
                
            }

            private var T:int = getTimer();
            private function onEnterFrame(e:Event):void {
                for (var i:int = 0; i < objects.length;i++) {
                    IPObject(objects.getItemAt(i)).refresh();
                }
                OdeInit.dSpaceCollide(space,collideCallback);
                OdeInit.dWorldStep(world,0.05);
                OdeInit.dJointGroupEmpty(contactGroup);
                OdeInit.dSpaceCollide(space,collideCallback);
                OdeInit.dWorldStep(world,0.05);
                OdeInit.dJointGroupEmpty(contactGroup);
                OdeInit.dSpaceCollide(space,collideCallback);
                OdeInit.dWorldStep(world,0.05);
                OdeInit.dJointGroupEmpty(contactGroup);
                var fps:Number = 1000/(getTimer() - T);
                T = getTimer();
                lFPS.text = "FPS: " + String(int(fps));
                
            }

            public function collideCallback(o1:uint, o2:uint):void {
                var b1:uint, b2:uint;
                b1 = OdeInit.dGeomGetBody(o1);
                b2 = OdeInit.dGeomGetBody(o2);
                var contact:uint = OdeInit.alloc_dContact();
                var sParams:Object = {"mode":0x004,"mu":1,"bounce":1};
                OdeInit.setContactSurfaceParams(contact,sParams);
                var nContact:int = OdeInit.dCollide(o1,o2,1,contact);
                if (nContact > 0) {
                    var c:uint = OdeInit.dJointCreateContact(world,contactGroup,contact);
                    OdeInit.dJointAttach(c,b1,b2);
                }
                OdeInit.free(contact);
            }
        ]]>
    </mx:Script>
    <mx:UIComponent width="500" height="350" id="container" />    
    <mx:Label x="10" y="10" id="lFPS" text="Label"/>
</mx:Application>