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