///
module BABYLON.GUI {
export class AdvancedDynamicTexture extends DynamicTexture {
private _dirty = false;
private _renderObserver: Observer;
private _resizeObserver: Observer;
private _background: string;
private _rootContainer = new Container("root");
public get background(): string {
return this._background;
}
public set background(value: string) {
if (this._background === value) {
return;
}
this._background = value;
this._markAsDirty();
}
constructor(name: string, scene: Scene) {
super(name, {}, scene, false, Texture.NEAREST_SAMPLINGMODE, Engine.TEXTUREFORMAT_RGBA);
this._resizeObserver = this.getScene().getEngine().onResizeObservable.add(() => this._onResize());
this._renderObserver = this.getScene().onBeforeRenderObservable.add(() => this._checkUpdate());
this._onResize();
}
public addControl(control: Control): AdvancedDynamicTexture {
control._setRoot(this._rootContainer);
this._rootContainer.addControl(control);
return this;
}
public removeControl(control: Control): AdvancedDynamicTexture {
this._rootContainer.removeControl(control);
return this;
}
public dispose() {
this.getScene().onBeforeRenderObservable.remove(this._renderObserver);
this.getScene().getEngine().onResizeObservable.remove(this._resizeObserver);
super.dispose();
}
private _onResize(): void {
// Check size
var engine = this.getScene().getEngine();
var textureSize = this.getSize();
var renderWidth = engine.getRenderWidth();
var renderHeight = engine.getRenderHeight();
if (textureSize.width !== renderWidth || textureSize.height !== renderHeight) {
this.scaleTo(renderWidth, renderHeight);
}
// Update constant pixel resources
var scaleX = renderWidth / 1000.0;
var scaleY = renderHeight / 1000.0;
this._rootContainer._rescale(scaleX, scaleY);
this._markAsDirty();
}
public _markAsDirty() {
this._dirty = true;
}
private _checkUpdate(): void {
if (!this._dirty) {
return;
}
this._dirty = false;
this._render();
this.update();
}
private _render(): void {
var engine = this.getScene().getEngine();
var renderWidth = engine.getRenderWidth();
var renderHeight = engine.getRenderHeight();
// Clear
var context = this.getContext();
if (this._background) {
context.save();
context.fillStyle = this._background;
context.fillRect(0, 0, renderWidth, renderHeight);
context.restore();
} else {
this.clear();
}
// Render
var measure = new Measure(0, 0, renderWidth, renderHeight);
this._rootContainer._draw(measure, context);
}
}
}