babylon.layerSceneComponent.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. module BABYLON {
  2. export interface AbstractScene {
  3. /**
  4. * The list of layers (background and foreground) of the scene
  5. */
  6. layers: Array<Layer>;
  7. }
  8. /**
  9. * Defines the layer scene component responsible to manage any layers
  10. * in a given scene.
  11. */
  12. export class LayerSceneComponent implements ISceneComponent {
  13. /**
  14. * The component name helpfull to identify the component in the list of scene components.
  15. */
  16. public readonly name = SceneComponentConstants.NAME_LAYER;
  17. /**
  18. * The scene the component belongs to.
  19. */
  20. public scene: Scene;
  21. private _engine: Engine;
  22. /**
  23. * Creates a new instance of the component for the given scene
  24. * @param scene Defines the scene to register the component in
  25. */
  26. constructor(scene: Scene) {
  27. this.scene = scene;
  28. this._engine = scene.getEngine();
  29. scene.layers = new Array<Layer>();
  30. }
  31. /**
  32. * Registers the component in a given scene
  33. */
  34. public register(): void {
  35. this.scene._beforeCameraDrawStage.registerStep(SceneComponentConstants.STEP_BEFORECAMERADRAW_LAYER, this, this._drawCameraBackground);
  36. this.scene._afterCameraDrawStage.registerStep(SceneComponentConstants.STEP_AFTERCAMERADRAW_LAYER, this, this._drawCameraForeground);
  37. this.scene._beforeRenderTargetDrawStage.registerStep(SceneComponentConstants.STEP_BEFORERENDERTARGETDRAW_LAYER, this, this._drawRenderTargetBackground);
  38. this.scene._afterRenderTargetDrawStage.registerStep(SceneComponentConstants.STEP_AFTERRENDERTARGETDRAW_LAYER, this, this._drawRenderTargetForeground);
  39. }
  40. /**
  41. * Rebuilds the elements related to this component in case of
  42. * context lost for instance.
  43. */
  44. public rebuild(): void {
  45. let layers = this.scene.layers;
  46. for (let layer of layers) {
  47. layer._rebuild();
  48. }
  49. }
  50. /**
  51. * Disposes the component and the associated ressources.
  52. */
  53. public dispose(): void {
  54. let layers = this.scene.layers;
  55. while (layers.length) {
  56. layers[0].dispose();
  57. }
  58. }
  59. private _draw(predicate: (layer: Layer) => boolean): void {
  60. let layers = this.scene.layers;
  61. if (layers.length) {
  62. this._engine.setDepthBuffer(false);
  63. for (let layer of layers) {
  64. if (predicate(layer)) {
  65. layer.render();
  66. }
  67. }
  68. this._engine.setDepthBuffer(true);
  69. }
  70. }
  71. private _drawCameraPredicate(layer: Layer, isBackground: boolean, cameraLayerMask: number): boolean {
  72. return !layer.renderOnlyInRenderTargetTextures &&
  73. layer.isBackground === isBackground &&
  74. ((layer.layerMask & cameraLayerMask) !== 0);
  75. }
  76. private _drawCameraBackground(camera: Camera): void {
  77. this._draw((layer: Layer) => {
  78. return this._drawCameraPredicate(layer, true, camera.layerMask);
  79. });
  80. }
  81. private _drawCameraForeground(camera: Camera): void {
  82. this._draw((layer: Layer) => {
  83. return this._drawCameraPredicate(layer, false, camera.layerMask);
  84. });
  85. }
  86. private _drawRenderTargetPredicate(layer: Layer, isBackground: boolean, cameraLayerMask: number, renderTargetTexture: RenderTargetTexture): boolean {
  87. return (layer.renderTargetTextures.length > 0) &&
  88. layer.isBackground === isBackground &&
  89. (layer.renderTargetTextures.indexOf(renderTargetTexture) > -1) &&
  90. ((layer.layerMask & cameraLayerMask) !== 0);
  91. }
  92. private _drawRenderTargetBackground(renderTarget: RenderTargetTexture): void {
  93. this._draw((layer: Layer) => {
  94. return this._drawRenderTargetPredicate(layer, true, this.scene.activeCamera!.layerMask, renderTarget);
  95. });
  96. }
  97. private _drawRenderTargetForeground(renderTarget: RenderTargetTexture): void {
  98. this._draw((layer: Layer) => {
  99. return this._drawRenderTargetPredicate(layer, false, this.scene.activeCamera!.layerMask, renderTarget);
  100. });
  101. }
  102. }
  103. }