/src/away3d/core/render/BackgroundImageRenderer.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 151 lines · 129 code · 22 blank · 0 comment · 9 complexity · a8871a6e5e210b7f8e4b8fe43a4b1910 MD5 · raw file

  1. package away3d.core.render
  2. {
  3. import away3d.core.managers.Stage3DProxy;
  4. import away3d.debug.Debug;
  5. import away3d.textures.Texture2DBase;
  6. import com.adobe.utils.AGALMiniAssembler;
  7. import flash.display3D.Context3D;
  8. import flash.display3D.Context3DBlendFactor;
  9. import flash.display3D.Context3DProgramType;
  10. import flash.display3D.Context3DTextureFormat;
  11. import flash.display3D.Context3DVertexBufferFormat;
  12. import flash.display3D.IndexBuffer3D;
  13. import flash.display3D.Program3D;
  14. import flash.display3D.VertexBuffer3D;
  15. public class BackgroundImageRenderer
  16. {
  17. private var _program3d:Program3D;
  18. private var _texture:Texture2DBase;
  19. private var _indexBuffer:IndexBuffer3D;
  20. private var _vertexBuffer:VertexBuffer3D;
  21. private var _stage3DProxy:Stage3DProxy;
  22. private var _context:Context3D;
  23. public function BackgroundImageRenderer(stage3DProxy:Stage3DProxy)
  24. {
  25. this.stage3DProxy = stage3DProxy;
  26. }
  27. public function get stage3DProxy():Stage3DProxy
  28. {
  29. return _stage3DProxy;
  30. }
  31. public function set stage3DProxy(value:Stage3DProxy):void
  32. {
  33. if (value == _stage3DProxy)
  34. return;
  35. _stage3DProxy = value;
  36. removeBuffers();
  37. }
  38. private function removeBuffers():void
  39. {
  40. if (_vertexBuffer) {
  41. _vertexBuffer.dispose();
  42. _vertexBuffer = null;
  43. _program3d.dispose();
  44. _program3d = null;
  45. _indexBuffer.dispose();
  46. _indexBuffer = null;
  47. }
  48. }
  49. private function getVertexCode():String
  50. {
  51. return "mov op, va0\n" +
  52. "mov v0, va1";
  53. }
  54. private function getFragmentCode():String
  55. {
  56. var format:String;
  57. switch (_texture.format) {
  58. case Context3DTextureFormat.COMPRESSED:
  59. format = "dxt1,";
  60. break;
  61. case "compressedAlpha":
  62. format = "dxt5,";
  63. break;
  64. default:
  65. format = "";
  66. }
  67. return "tex ft0, v0, fs0 <2d, " + format + "linear> \n" +
  68. "mov oc, ft0";
  69. }
  70. public function dispose():void
  71. {
  72. removeBuffers();
  73. }
  74. public function render():void
  75. {
  76. var context:Context3D = _stage3DProxy.context3D;
  77. if (context != _context) {
  78. removeBuffers();
  79. _context = context;
  80. }
  81. if (!context)
  82. return;
  83. if (!_vertexBuffer)
  84. initBuffers(context);
  85. context.setBlendFactors(Context3DBlendFactor.ONE, Context3DBlendFactor.ZERO);
  86. context.setProgram(_program3d);
  87. context.setTextureAt(0, _texture.getTextureForStage3D(_stage3DProxy));
  88. context.setVertexBufferAt(0, _vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_2);
  89. context.setVertexBufferAt(1, _vertexBuffer, 2, Context3DVertexBufferFormat.FLOAT_2);
  90. context.drawTriangles(_indexBuffer, 0, 2);
  91. context.setVertexBufferAt(0, null);
  92. context.setVertexBufferAt(1, null);
  93. context.setTextureAt(0, null);
  94. }
  95. private function initBuffers(context:Context3D):void
  96. {
  97. _vertexBuffer = context.createVertexBuffer(4, 4);
  98. _program3d = context.createProgram();
  99. _indexBuffer = context.createIndexBuffer(6);
  100. _indexBuffer.uploadFromVector(Vector.<uint>([2, 1, 0, 3, 2, 0]), 0, 6);
  101. _program3d.upload(new AGALMiniAssembler(Debug.active).assemble(Context3DProgramType.VERTEX, getVertexCode()),
  102. new AGALMiniAssembler(Debug.active).assemble(Context3DProgramType.FRAGMENT, getFragmentCode())
  103. );
  104. var w:Number = 2;
  105. var h:Number = 2;
  106. var x:Number = -1;
  107. var y:Number = 1;
  108. if (_stage3DProxy.scissorRect) {
  109. x = (_stage3DProxy.scissorRect.x * 2 - _stage3DProxy.viewPort.width) / _stage3DProxy.viewPort.width;
  110. y = (_stage3DProxy.scissorRect.y * 2 - _stage3DProxy.viewPort.height) / _stage3DProxy.viewPort.height * -1;
  111. w = 2 / (_stage3DProxy.viewPort.width / _stage3DProxy.scissorRect.width);
  112. h = 2 / (_stage3DProxy.viewPort.height / _stage3DProxy.scissorRect.height);
  113. }
  114. _vertexBuffer.uploadFromVector(Vector.<Number>([x, y-h, 0, 1,
  115. x+w, y-h, 1, 1,
  116. x+w, y, 1, 0,
  117. x, y, 0, 0
  118. ]), 0, 4);
  119. }
  120. public function get texture():Texture2DBase
  121. {
  122. return _texture;
  123. }
  124. public function set texture(value:Texture2DBase):void
  125. {
  126. _texture = value;
  127. }
  128. }
  129. }