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