/src/away3d/core/render/DepthRenderer.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 184 lines · 133 code · 30 blank · 21 comment · 23 complexity · 4139a926a29af74a1df0f92957efa3c8 MD5 · raw file

  1. package away3d.core.render
  2. {
  3. import away3d.arcane;
  4. import away3d.cameras.Camera3D;
  5. import away3d.core.base.IRenderable;
  6. import away3d.core.data.RenderableListItem;
  7. import away3d.core.math.Plane3D;
  8. import away3d.core.traverse.EntityCollector;
  9. import away3d.entities.Entity;
  10. import away3d.materials.MaterialBase;
  11. import flash.display3D.Context3DBlendFactor;
  12. import flash.display3D.Context3DCompareMode;
  13. import flash.display3D.textures.TextureBase;
  14. import flash.geom.Rectangle;
  15. use namespace arcane;
  16. /**
  17. * The DepthRenderer class renders 32-bit depth information encoded as RGBA
  18. */
  19. public class DepthRenderer extends RendererBase
  20. {
  21. private var _activeMaterial:MaterialBase;
  22. private var _renderBlended:Boolean;
  23. private var _distanceBased:Boolean;
  24. private var _disableColor:Boolean;
  25. /**
  26. * Creates a new DepthRenderer object.
  27. * @param renderBlended Indicates whether semi-transparent objects should be rendered.
  28. * @param distanceBased Indicates whether the written depth value is distance-based or projected depth-based
  29. */
  30. public function DepthRenderer(renderBlended:Boolean = false, distanceBased:Boolean = false)
  31. {
  32. super();
  33. _renderBlended = renderBlended;
  34. _distanceBased = distanceBased;
  35. _backgroundR = 1;
  36. _backgroundG = 1;
  37. _backgroundB = 1;
  38. }
  39. public function get disableColor():Boolean
  40. {
  41. return _disableColor;
  42. }
  43. public function set disableColor(value:Boolean):void
  44. {
  45. _disableColor = value;
  46. }
  47. arcane override function set backgroundR(value:Number):void
  48. {
  49. }
  50. arcane override function set backgroundG(value:Number):void
  51. {
  52. }
  53. arcane override function set backgroundB(value:Number):void
  54. {
  55. }
  56. arcane function renderCascades(entityCollector:EntityCollector, target:TextureBase, numCascades:uint, scissorRects:Vector.<Rectangle>, cameras:Vector.<Camera3D>):void
  57. {
  58. _renderTarget = target;
  59. _renderTargetSurface = 0;
  60. _renderableSorter.sort(entityCollector);
  61. _stage3DProxy.setRenderTarget(target, true, 0);
  62. _context.clear(1, 1, 1, 1, 1, 0);
  63. _context.setBlendFactors(Context3DBlendFactor.ONE, Context3DBlendFactor.ZERO);
  64. _context.setDepthTest(true, Context3DCompareMode.LESS);
  65. var head:RenderableListItem = entityCollector.opaqueRenderableHead;
  66. var first:Boolean = true;
  67. for (var i:int = numCascades - 1; i >= 0; --i) {
  68. _stage3DProxy.scissorRect = scissorRects[i];
  69. drawCascadeRenderables(head, cameras[i], first? null : cameras[i].frustumPlanes);
  70. first = false;
  71. }
  72. if (_activeMaterial)
  73. _activeMaterial.deactivateForDepth(_stage3DProxy);
  74. _activeMaterial = null;
  75. //line required for correct rendering when using away3d with starling. DO NOT REMOVE UNLESS STARLING INTEGRATION IS RETESTED!
  76. _context.setDepthTest(false, Context3DCompareMode.LESS_EQUAL);
  77. _stage3DProxy.scissorRect = null;
  78. }
  79. private function drawCascadeRenderables(item:RenderableListItem, camera:Camera3D, cullPlanes:Vector.<Plane3D>):void
  80. {
  81. var material:MaterialBase;
  82. while (item) {
  83. if (item.cascaded) {
  84. item = item.next;
  85. continue;
  86. }
  87. var renderable:IRenderable = item.renderable;
  88. var entity:Entity = renderable.sourceEntity;
  89. // if completely in front, it will fall in a different cascade
  90. // do not use near and far planes
  91. if (!cullPlanes || entity.worldBounds.isInFrustum(cullPlanes, 4)) {
  92. material = renderable.material;
  93. if (_activeMaterial != material) {
  94. if (_activeMaterial)
  95. _activeMaterial.deactivateForDepth(_stage3DProxy);
  96. _activeMaterial = material;
  97. _activeMaterial.activateForDepth(_stage3DProxy, camera, false);
  98. }
  99. _activeMaterial.renderDepth(renderable, _stage3DProxy, camera, camera.viewProjection);
  100. } else
  101. item.cascaded = true;
  102. item = item.next;
  103. }
  104. }
  105. /**
  106. * @inheritDoc
  107. */
  108. override protected function draw(entityCollector:EntityCollector, target:TextureBase):void
  109. {
  110. _context.setBlendFactors(Context3DBlendFactor.ONE, Context3DBlendFactor.ZERO);
  111. _context.setDepthTest(true, Context3DCompareMode.LESS);
  112. drawRenderables(entityCollector.opaqueRenderableHead, entityCollector);
  113. if (_disableColor)
  114. _context.setColorMask(false, false, false, false);
  115. if (_renderBlended)
  116. drawRenderables(entityCollector.blendedRenderableHead, entityCollector);
  117. if (_activeMaterial)
  118. _activeMaterial.deactivateForDepth(_stage3DProxy);
  119. if (_disableColor)
  120. _context.setColorMask(true, true, true, true);
  121. _activeMaterial = null;
  122. }
  123. /**
  124. * Draw a list of renderables.
  125. * @param renderables The renderables to draw.
  126. * @param entityCollector The EntityCollector containing all potentially visible information.
  127. */
  128. private function drawRenderables(item:RenderableListItem, entityCollector:EntityCollector):void
  129. {
  130. var camera:Camera3D = entityCollector.camera;
  131. var item2:RenderableListItem;
  132. while (item) {
  133. _activeMaterial = item.renderable.material;
  134. // otherwise this would result in depth rendered anyway because fragment shader kil is ignored
  135. if (_disableColor && _activeMaterial.hasDepthAlphaThreshold()) {
  136. item2 = item;
  137. // fast forward
  138. do
  139. item2 = item2.next;
  140. while (item2 && item2.renderable.material == _activeMaterial);
  141. } else {
  142. _activeMaterial.activateForDepth(_stage3DProxy, camera, _distanceBased);
  143. item2 = item;
  144. do {
  145. _activeMaterial.renderDepth(item2.renderable, _stage3DProxy, camera, _rttViewProjectionMatrix);
  146. item2 = item2.next;
  147. } while (item2 && item2.renderable.material == _activeMaterial);
  148. _activeMaterial.deactivateForDepth(_stage3DProxy);
  149. }
  150. item = item2;
  151. }
  152. }
  153. }
  154. }