1     /**
2      * ...
3      * @author Matthew Casperson
4      */
5
6     package ;
7
8     import sandy.core.Scene3D;
9     import sandy.core.scenegraph.Camera3D;
10    import sandy.core.scenegraph.Group;
11    import sandy.view.ViewPort;
12    import sandy.events.SandyEvent;
13    import sandy.parser.Parser;
14    import flash.display.Sprite;
15    import flash.events.Event;
16    import flash.Lib;
17
18    import fr.seraf.wow.core.WOWEngine;
19    import fr.seraf.wow.core.data.WVector;
20
21    class EngineManager extends Sprite
22    {
23       private var scene:Scene3D;
24        private var myCamera:Camera3D;
25       private var myRootGroup:Group;
26       private var lastFrame:Float;
27       private var newBaseObjects:List<BaseObject>;
28       private var removedBaseObjects:List<BaseObject>;
29       private var baseObjects:List<BaseObject>;
30       private var myApplicationManager:ApplicationManager;
31       private var myResourceManager:ResourceManager;
32       private var myWow:WOWEngine;
33       private var wowTimeStep:Float;
34
35       public function new()
36       {
37          super();
38
39          newBaseObjects = new List<BaseObject>();
40          removedBaseObjects = new List<BaseObject>();
41          baseObjects = new List<BaseObject>();
42
43          myCamera = new Camera3D( 0, 0, -10);
44          myCamera.lookAt(0,0,0);
45          myCamera.viewport = new ViewPort( 400, 300 );
46          myRootGroup = new Group();
47          scene = new Scene3D( "scene", this, myCamera, myRootGroup );
48          Lib.current.stage.addChild(this);
49
50          lastFrame = Date.now().getTime();
51
52          //create an instance of the physic engine
53          myWow = new WOWEngine(1/30);
54            // SELECTIVE is better for dealing with lots of little particles colliding,
55            myWow.collisionResponseMode = wow.SELECTIVE;
56            // gravity -- particles of varying masses are affected the same
57            myWow.addMasslessForce(new WVector(0 , -10 , 0));
58
59          wowTimeStep = 0;
60
61          myResourceManager = new ResourceManager(this);
62       }
63
64       public var rootGroup(getRootGroup, null) : Group;
65       public var camera(getCamera, null) : Camera3D;
66       public var resourceManager(getResourceManager, null) : ResourceManager;
67       public var wow(getWow, null) : WOWEngine;
68
69       private function getWow() : WOWEngine
70       {
71          return myWow;
72       }
73
74
75       private function getRootGroup() : Group
76       {
77          return myRootGroup;
78       }
79
80       private function getCamera() : Camera3D
81       {
82          return myCamera;
83       }
84
85       private function getResourceManager() : ResourceManager
86       {
87          return myResourceManager;
88       }
89
90       public function resourcesLoaded():Void
91       {
92          myApplicationManager = new ApplicationManager(this);
93          myApplicationManager.startupApplicationManager();
94
95          addEventListener( Event.ENTER_FRAME, enterFrameHandler );
96       }
97
98       public function resourceLoadError():Void
99       {
100         trace("An error was raised while loading the resources.");
101      }
102
103      private function enterFrameHandler( ?event : Event ) : Void
104      {
105         var thisFrame:Float = Date.now().getTime();
106         var dt:Float = (thisFrame - lastFrame) / 1000;
107         lastFrame = thisFrame;
108
109         //run the engine once
110         wowTimeStep += dt;
111         while (wowTimeStep > 1/30)
112         {
113            myWow.step();
114            wowTimeStep -= 1/30;
115         }
116
117         addNewBaseObjects();
118         removeOldBaseObjects();
119
120         for (object in baseObjects)
121            object.enterFrame(dt);
122
123         scene.render();
124      }
125
126      public function addBaseObject(object:BaseObject) : Void
127      {
128         newBaseObjects.add(object);
129      }
130
131      public function removeBaseObject(object:BaseObject) : Void
132      {
133         removedBaseObjects.add(object);
134      }
135
136      private function addNewBaseObjects() : Void
137      {
138         for (object in newBaseObjects)
139            baseObjects.add(object);
140
141         newBaseObjects.clear();
142      }
143
144      private function removeOldBaseObjects() : Void
145      {
146         for (object in removedBaseObjects)
147            baseObjects.remove(object);
148
149         removedBaseObjects.clear();
150      }
151
152      static function main()
153       {
154         #if js
155            neash.Lib.Init("Container", 400, 400);
156            neash.Lib.Run();
157         #end
158           new EngineManager();
159       }
160
161   }

Top