advancedDynamicTexture.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /// <reference path="../../dist/preview release/babylon.d.ts"/>
  2. module BABYLON.GUI {
  3. export class AdvancedDynamicTexture extends DynamicTexture {
  4. private _dirty = false;
  5. private _renderObserver: Observer<Scene>;
  6. private _resizeObserver: Observer<Engine>;
  7. private _background: string;
  8. private _rootContainer = new Container("root");
  9. public get background(): string {
  10. return this._background;
  11. }
  12. public set background(value: string) {
  13. if (this._background === value) {
  14. return;
  15. }
  16. this._background = value;
  17. this._markAsDirty();
  18. }
  19. constructor(name: string, scene: Scene) {
  20. super(name, {}, scene, false, Texture.NEAREST_SAMPLINGMODE, Engine.TEXTUREFORMAT_RGBA);
  21. this._resizeObserver = this.getScene().getEngine().onResizeObservable.add(() => this._onResize());
  22. this._renderObserver = this.getScene().onBeforeRenderObservable.add(() => this._checkUpdate());
  23. this._onResize();
  24. }
  25. public addControl(control: Control): AdvancedDynamicTexture {
  26. control._setRoot(this._rootContainer);
  27. this._rootContainer.addControl(control);
  28. return this;
  29. }
  30. public removeControl(control: Control): AdvancedDynamicTexture {
  31. this._rootContainer.removeControl(control);
  32. return this;
  33. }
  34. public dispose() {
  35. this.getScene().onBeforeRenderObservable.remove(this._renderObserver);
  36. this.getScene().getEngine().onResizeObservable.remove(this._resizeObserver);
  37. super.dispose();
  38. }
  39. private _onResize(): void {
  40. // Check size
  41. var engine = this.getScene().getEngine();
  42. var textureSize = this.getSize();
  43. var renderWidth = engine.getRenderWidth();
  44. var renderHeight = engine.getRenderHeight();
  45. if (textureSize.width !== renderWidth || textureSize.height !== renderHeight) {
  46. this.scaleTo(renderWidth, renderHeight);
  47. }
  48. // Update constant pixel resources
  49. var scaleX = renderWidth / 1000.0;
  50. var scaleY = renderHeight / 1000.0;
  51. this._rootContainer._rescale(scaleX, scaleY);
  52. this._markAsDirty();
  53. }
  54. public _markAsDirty() {
  55. this._dirty = true;
  56. }
  57. private _checkUpdate(): void {
  58. if (!this._dirty) {
  59. return;
  60. }
  61. this._dirty = false;
  62. this._render();
  63. this.update();
  64. }
  65. private _render(): void {
  66. var engine = this.getScene().getEngine();
  67. var renderWidth = engine.getRenderWidth();
  68. var renderHeight = engine.getRenderHeight();
  69. // Clear
  70. var context = this.getContext();
  71. if (this._background) {
  72. context.save();
  73. context.fillStyle = this._background;
  74. context.fillRect(0, 0, renderWidth, renderHeight);
  75. context.restore();
  76. } else {
  77. this.clear();
  78. }
  79. // Render
  80. var measure = new Measure(0, 0, renderWidth, renderHeight);
  81. this._rootContainer._draw(measure, context);
  82. }
  83. }
  84. }