1. package
  2. {
  3. import away3d.cameras.Camera3D;
  4. import away3d.containers.View3D;
  5. import away3d.core.math.Number3D;
  6. import away3d.core.render.Renderer;
  7.  
  8. import flash.display.BlendMode;
  9. import flash.events.*;
  10.  
  11. import mx.collections.ArrayCollection;
  12. import mx.core.UIComponent;
  13.  
  14. public class EngineManager extends UIComponent
  15. {
  16. public static const version:String = "1.0.0";
  17. protected static const MEASURED_MIN_WIDTH:int = 25;
  18. protected static const MEASURED_MIN_HEIGHT:int = 25;
  19. protected static const MEASURED_WIDTH:int = 100;
  20. protected static const MEASURED_HEIGHT:int = 100;
  21.  
  22. // Away3D view
  23. internal var view:View3D = null;
  24. // Away3D camera
  25. internal var cam:Camera3D = null;
  26. // a collection of the BaseObjects
  27. protected var baseObjects:ArrayCollection = new ArrayCollection();
  28. // a collection where new BaseObjects are placed, to avoid adding items
  29. // to baseObjects while in the baseObjects collection while it is in a loop
  30. protected var newBaseObjects:ArrayCollection = new ArrayCollection();
  31. // a collection where removed BaseObjects are placed, to avoid removing items
  32. // to baseObjects while in the baseObjects collection while it is in a loop
  33. protected var removedBaseObjects:ArrayCollection = new ArrayCollection();
  34. // the last frame time
  35. protected var lastFrame:Date;
  36. // the application manager
  37. protected var applicationManager:ApplicationManager = null;
  38. // the resource manager
  39. protected var myResourceManager:ResourceManager = null;
  40. // true when we have added the Away3D controls
  41. protected var addedToStage:Boolean = false;
  42. // true if some properties have been modifed
  43. protected var propertiesDirty:Boolean = false;
  44.  
  45. internal function get MyResourceManager():ResourceManager
  46. {
  47. return myResourceManager;
  48. }
  49.  
  50. protected function propertyChanged():void
  51. {
  52. propertiesDirty = true;
  53. invalidateProperties();
  54. invalidateDisplayList();
  55. }
  56.  
  57. public static function ConvertArrayCollectionToString(array:ArrayCollection):String
  58. {
  59. var retValue:String = "";
  60. var i:int = 0;
  61. for each (var element:String in array)
  62. {
  63. if (i != 0) retValue += ",";
  64. retValue += element;
  65. ++i;
  66. }
  67.  
  68. return retValue;
  69. }
  70.  
  71. public function EngineManager()
  72. {
  73. super();
  74. }
  75.  
  76. override protected function measure():void
  77. {
  78. super.measure();
  79.  
  80. // set a bunch of predefined sizes
  81. this.measuredMinWidth = MEASURED_MIN_WIDTH;
  82. this.measuredMinHeight = MEASURED_MIN_HEIGHT;
  83. this.measuredHeight = MEASURED_HEIGHT;
  84. this.measuredWidth = MEASURED_WIDTH;
  85. }
  86.  
  87. override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
  88. {
  89. super.updateDisplayList(unscaledWidth, unscaledHeight);
  90.  
  91. if (view != null)
  92. {
  93. // resize the viewport to match the new settings
  94. view.height = this.height;
  95. view.width = this.width;
  96. }
  97. }
  98.  
  99. override protected function commitProperties():void
  100. {
  101. super.commitProperties();
  102.  
  103. if (propertiesDirty)
  104. {
  105. propertiesDirty = false;
  106.  
  107. if (addedToStage)
  108. {
  109. myResourceManager.shutdown();
  110. myResourceManager.startupResourceManager();
  111. applicationManager.shutdown();
  112. applicationManager.startupApplicationManager(this);
  113. }
  114. }
  115. }
  116.  
  117. override protected function createChildren():void
  118. {
  119. super.createChildren();
  120.  
  121. addEventListener(Event.ADDED_TO_STAGE, createChildrenEx);
  122. addEventListener(Event.REMOVED_FROM_STAGE, shutdown);
  123. }
  124.  
  125. protected function shutdown(event:Event):void
  126. {
  127. if (applicationManager != null)
  128. applicationManager.shutdown();
  129.  
  130. shutdownAll();
  131.  
  132. this.removeChild(view);
  133.  
  134. applicationManager = null;
  135. addedToStage = false;
  136. view = null;
  137. cam = null;
  138. }
  139.  
  140. protected function createChildrenEx(event:Event):void
  141. {
  142. if (!addedToStage)
  143. {
  144. cam = new Camera3D({focus:50, x:0, y:0, z:-100, lookat:new Number3D(0, 0, 0)});
  145.  
  146. view = new View3D({x:stage.width/2, y:stage.height/2, camera:cam});
  147. view.renderer = Renderer.BASIC;
  148. addChild(view);
  149. addEventListener(Event.ENTER_FRAME, onEnterFrame);
  150.  
  151. // set the initial frame time
  152. lastFrame = new Date();
  153.  
  154. // load any resources
  155. myResourceManager = new ResourceManager(this);
  156. myResourceManager.startupResourceManager();
  157.  
  158. // start the application manager
  159. applicationManager = new ApplicationManager().startupApplicationManager(this);
  160.  
  161. addedToStage = true;
  162. }
  163. }
  164.  
  165. protected function onEnterFrame(event:Event):void
  166. {
  167. // Calculate the time since the last frame
  168. var thisFrame:Date = new Date();
  169. var seconds:Number = (thisFrame.getTime() - lastFrame.getTime())/1000.0;
  170. lastFrame = thisFrame;
  171.  
  172. // sync the baseObjects collection with any BaseObjects created or removed during the
  173. // render loop
  174. removeDeletedBaseObjects();
  175. insertNewBaseObjects();
  176.  
  177. // allow each BaseObject to update itself
  178. for each (var baseObject:BaseObject in baseObjects)
  179. baseObject.enterFrame(seconds);
  180.  
  181. // render the scene
  182. view.render();
  183. }
  184.  
  185. public function addBaseObject(baseObject:BaseObject):void
  186. {
  187. newBaseObjects.addItem(baseObject);
  188. }
  189.  
  190. public function removeBaseObject(baseObject:BaseObject):void
  191. {
  192. removedBaseObjects.addItem(baseObject);
  193. }
  194.  
  195. public function shutdownAll():void
  196. {
  197. // don't dispose objects twice
  198. for each (var baseObject:BaseObject in baseObjects)
  199. {
  200. var found:Boolean = false;
  201. for each (var removedObject:BaseObject in removedBaseObjects)
  202. {
  203. if (removedObject == baseObject)
  204. {
  205. found = true;
  206. break;
  207. }
  208. }
  209.  
  210. if (!found)
  211. baseObject.shutdown();
  212. }
  213. }
  214.  
  215. protected function insertNewBaseObjects():void
  216. {
  217. for each (var baseObject:BaseObject in newBaseObjects)
  218. baseObjects.addItem(baseObject);
  219.  
  220. newBaseObjects.removeAll();
  221. }
  222.  
  223. protected function removeDeletedBaseObjects():void
  224. {
  225. for each (var removedObject:BaseObject in removedBaseObjects)
  226. {
  227. var i:int = 0;
  228. for (i = 0; i < baseObjects.length; ++i)
  229. {
  230. if (baseObjects.getItemAt(i) == removedObject)
  231. {
  232. baseObjects.removeItemAt(i);
  233. break;
  234. }
  235. }
  236.  
  237. }
  238.  
  239. removedBaseObjects.removeAll();
  240. }
  241. }
  242. }
  243.