/com/li/minimole/core/View3D.as

https://github.com/dsk23LAB/minimole-core
ActionScript | 177 lines | 124 code | 40 blank | 13 comment | 9 complexity | 985e7a3ae9ac9ddf8f7137c1f7c245b0 MD5 | raw file
  1. package com.li.minimole.core
  2. {
  3. import com.li.minimole.camera.Camera3D;
  4. import com.li.minimole.core.render.DefaultRenderer;
  5. import com.li.minimole.core.render.RenderBase;
  6. import com.li.minimole.core.vo.RGB;
  7. import flash.display.Sprite;
  8. import flash.display.Stage3D;
  9. import flash.display3D.Context3D;
  10. import flash.events.Event;
  11. import flash.geom.Rectangle;
  12. /*
  13. Wraps a Scene3D and a Camera3D and manages 3D rendering.
  14. */
  15. public class View3D extends Sprite
  16. {
  17. // TODO: Does not yet support stage dims change.
  18. private var _camera:Camera3D;
  19. private var _scene:Scene3D;
  20. private var _canvasX:Number;
  21. private var _canvasY:Number;
  22. private var _canvasWidth:Number;
  23. private var _canvasHeight:Number;
  24. private var _aspectRatio:Number;
  25. private var _context3d:Context3D;
  26. private var _stage3d:Stage3D;
  27. private var _textureLayersHolder:Sprite;
  28. private var _renderer:RenderBase;
  29. private var _clearColor:RGB = new RGB( 0.25, 0.25, 0.25 );
  30. public function View3D( width:Number = -1, height:Number = -1, x:Number = 0, y:Number = 0 ) {
  31. super();
  32. _canvasWidth = width;
  33. _canvasHeight = height;
  34. _canvasX = x;
  35. _canvasY = y;
  36. _scene = new Scene3D();
  37. _camera = new Camera3D();
  38. // Connect core to view.
  39. Core3D.instance.view = this;
  40. _textureLayersHolder = new Sprite();
  41. _textureLayersHolder.mouseEnabled = _textureLayersHolder.mouseChildren = false;
  42. addChild( _textureLayersHolder );
  43. addEventListener( Event.ADDED_TO_STAGE, stageInitHandler );
  44. }
  45. private function stageInitHandler( evt:Event ):void {
  46. removeEventListener( Event.ADDED_TO_STAGE, stageInitHandler );
  47. // Set canvas to stage dims.
  48. _canvasWidth = _canvasWidth != -1 ? _canvasWidth : stage.stageWidth;
  49. _canvasHeight = _canvasHeight != -1 ? _canvasHeight : stage.stageHeight;
  50. // Init stage 3d.
  51. stage.stage3Ds[0].addEventListener( Event.CONTEXT3D_CREATE, context3dCreatedHandler );
  52. stage.stage3Ds[0].requestContext3D();
  53. stage.stage3Ds[0].x = _canvasX;
  54. stage.stage3Ds[0].y = _canvasY;
  55. }
  56. private function context3dCreatedHandler( evt:Event ):void {
  57. // Get stage 3d.
  58. _stage3d = Stage3D( evt.currentTarget );
  59. _context3d = _stage3d.context3D;
  60. // Alert if context3d fetch failed.
  61. if( _context3d == null )
  62. throw new Error( "Unable to get Context3D." );
  63. // Init context3d.
  64. _context3d.enableErrorChecking = true;
  65. updateAspectRatio();
  66. _context3d.configureBackBuffer( _canvasWidth, _canvasHeight, Core3D.instance.antiAlias, true );
  67. // Report context 3d to all elements that need it.
  68. // Scene3D takes care of distributing the reference.
  69. _scene.context3d = _context3d;
  70. }
  71. private function updateAspectRatio():void {
  72. // Init projection matrix.
  73. _aspectRatio = _canvasWidth / _canvasHeight;
  74. _camera.lens.aspectRatio = _aspectRatio;
  75. _camera.viewWidth = _canvasWidth; // Needed for un-projection.
  76. _camera.viewHeight = _canvasHeight;
  77. if( _context3d ) {
  78. _context3d.configureBackBuffer( _canvasWidth, _canvasHeight, Core3D.instance.antiAlias, true );
  79. }
  80. }
  81. public function render():void {
  82. if( !_renderer )
  83. _renderer = new DefaultRenderer();
  84. if( !_renderer.view )
  85. _renderer.view = this;
  86. _renderer.render();
  87. }
  88. public function get scene():Scene3D {
  89. return _scene;
  90. }
  91. public function get camera():Camera3D {
  92. return _camera;
  93. }
  94. public function get clearColor():RGB {
  95. return _clearColor;
  96. }
  97. public function set clearColor( value:RGB ):void {
  98. _clearColor = value;
  99. }
  100. public function get context3d():Context3D {
  101. return _context3d;
  102. }
  103. public function get renderer():RenderBase {
  104. return _renderer;
  105. }
  106. public function set renderer( value:RenderBase ):void {
  107. _renderer = value;
  108. }
  109. public function get aspectRatio():Number {
  110. return _aspectRatio;
  111. }
  112. public function get canvasWidth():Number {
  113. return _canvasWidth;
  114. }
  115. public function set canvasWidth( value:Number ):void {
  116. _canvasWidth = value;
  117. updateAspectRatio();
  118. }
  119. public function get canvasHeight():Number {
  120. return _canvasHeight;
  121. }
  122. public function set canvasHeight( value:Number ):void {
  123. _canvasHeight = value;
  124. updateAspectRatio();
  125. }
  126. public function set canvasX( value:Number ):void {
  127. if( _context3d ) {
  128. stage.stage3Ds[0].x = value;
  129. }
  130. }
  131. public function set canvasY( value:Number ):void {
  132. if( _context3d ) {
  133. stage.stage3Ds[0].y = value;
  134. }
  135. }
  136. }
  137. }