babylon.layer.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. var BABYLON;
  2. (function (BABYLON) {
  3. var Layer = (function () {
  4. function Layer(name, imgUrl, scene, isBackground, color) {
  5. this.name = name;
  6. this.scale = new BABYLON.Vector2(1, 1);
  7. this.offset = new BABYLON.Vector2(0, 0);
  8. this.alphaBlendingMode = BABYLON.Engine.ALPHA_COMBINE;
  9. this._vertexBuffers = {};
  10. // Events
  11. /**
  12. * An event triggered when the layer is disposed.
  13. * @type {BABYLON.Observable}
  14. */
  15. this.onDisposeObservable = new BABYLON.Observable();
  16. /**
  17. * An event triggered before rendering the scene
  18. * @type {BABYLON.Observable}
  19. */
  20. this.onBeforeRenderObservable = new BABYLON.Observable();
  21. /**
  22. * An event triggered after rendering the scene
  23. * @type {BABYLON.Observable}
  24. */
  25. this.onAfterRenderObservable = new BABYLON.Observable();
  26. this.texture = imgUrl ? new BABYLON.Texture(imgUrl, scene, true) : null;
  27. this.isBackground = isBackground === undefined ? true : isBackground;
  28. this.color = color === undefined ? new BABYLON.Color4(1, 1, 1, 1) : color;
  29. this._scene = scene;
  30. this._scene.layers.push(this);
  31. var engine = scene.getEngine();
  32. // VBO
  33. var vertices = [];
  34. vertices.push(1, 1);
  35. vertices.push(-1, 1);
  36. vertices.push(-1, -1);
  37. vertices.push(1, -1);
  38. var vertexBuffer = new BABYLON.VertexBuffer(engine, vertices, BABYLON.VertexBuffer.PositionKind, false, false, 2);
  39. this._vertexBuffers[BABYLON.VertexBuffer.PositionKind] = vertexBuffer;
  40. // Indices
  41. var indices = [];
  42. indices.push(0);
  43. indices.push(1);
  44. indices.push(2);
  45. indices.push(0);
  46. indices.push(2);
  47. indices.push(3);
  48. this._indexBuffer = engine.createIndexBuffer(indices);
  49. // Effects
  50. this._effect = engine.createEffect("layer", [BABYLON.VertexBuffer.PositionKind], ["textureMatrix", "color", "scale", "offset"], ["textureSampler"], "");
  51. this._alphaTestEffect = engine.createEffect("layer", [BABYLON.VertexBuffer.PositionKind], ["textureMatrix", "color", "scale", "offset"], ["textureSampler"], "#define ALPHATEST");
  52. }
  53. Object.defineProperty(Layer.prototype, "onDispose", {
  54. set: function (callback) {
  55. if (this._onDisposeObserver) {
  56. this.onDisposeObservable.remove(this._onDisposeObserver);
  57. }
  58. this._onDisposeObserver = this.onDisposeObservable.add(callback);
  59. },
  60. enumerable: true,
  61. configurable: true
  62. });
  63. Object.defineProperty(Layer.prototype, "onBeforeRender", {
  64. set: function (callback) {
  65. if (this._onBeforeRenderObserver) {
  66. this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver);
  67. }
  68. this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback);
  69. },
  70. enumerable: true,
  71. configurable: true
  72. });
  73. Object.defineProperty(Layer.prototype, "onAfterRender", {
  74. set: function (callback) {
  75. if (this._onAfterRenderObserver) {
  76. this.onAfterRenderObservable.remove(this._onAfterRenderObserver);
  77. }
  78. this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback);
  79. },
  80. enumerable: true,
  81. configurable: true
  82. });
  83. Layer.prototype.render = function () {
  84. var currentEffect = this.alphaTest ? this._alphaTestEffect : this._effect;
  85. // Check
  86. if (!currentEffect.isReady() || !this.texture || !this.texture.isReady())
  87. return;
  88. var engine = this._scene.getEngine();
  89. this.onBeforeRenderObservable.notifyObservers(this);
  90. // Render
  91. engine.enableEffect(currentEffect);
  92. engine.setState(false);
  93. // Texture
  94. currentEffect.setTexture("textureSampler", this.texture);
  95. currentEffect.setMatrix("textureMatrix", this.texture.getTextureMatrix());
  96. // Color
  97. currentEffect.setFloat4("color", this.color.r, this.color.g, this.color.b, this.color.a);
  98. // Scale / offset
  99. currentEffect.setVector2("offset", this.offset);
  100. currentEffect.setVector2("scale", this.scale);
  101. // VBOs
  102. engine.bindBuffers(this._vertexBuffers, this._indexBuffer, currentEffect);
  103. // Draw order
  104. if (!this.alphaTest) {
  105. engine.setAlphaMode(this.alphaBlendingMode);
  106. engine.draw(true, 0, 6);
  107. engine.setAlphaMode(BABYLON.Engine.ALPHA_DISABLE);
  108. }
  109. else {
  110. engine.draw(true, 0, 6);
  111. }
  112. this.onAfterRenderObservable.notifyObservers(this);
  113. };
  114. Layer.prototype.dispose = function () {
  115. var vertexBuffer = this._vertexBuffers[BABYLON.VertexBuffer.PositionKind];
  116. if (vertexBuffer) {
  117. vertexBuffer.dispose();
  118. this._vertexBuffers[BABYLON.VertexBuffer.PositionKind] = null;
  119. }
  120. if (this._indexBuffer) {
  121. this._scene.getEngine()._releaseBuffer(this._indexBuffer);
  122. this._indexBuffer = null;
  123. }
  124. if (this.texture) {
  125. this.texture.dispose();
  126. this.texture = null;
  127. }
  128. // Remove from scene
  129. var index = this._scene.layers.indexOf(this);
  130. this._scene.layers.splice(index, 1);
  131. // Callback
  132. this.onDisposeObservable.notifyObservers(this);
  133. this.onDisposeObservable.clear();
  134. this.onAfterRenderObservable.clear();
  135. this.onBeforeRenderObservable.clear();
  136. };
  137. return Layer;
  138. }());
  139. BABYLON.Layer = Layer;
  140. })(BABYLON || (BABYLON = {}));