/*global define*/ define([ '../Core/BoundingRectangle', '../Core/Color', '../Core/defined', '../Core/destroyObject', '../Core/DeveloperError', '../Renderer/ShaderSource', '../Shaders/ViewportQuadFS', './BlendingState', './Material', './Pass' ], function( BoundingRectangle, Color, defined, destroyObject, DeveloperError, ShaderSource, ViewportQuadFS, BlendingState, Material, Pass) { "use strict"; /** * A viewport aligned quad. * * @alias ViewportQuad * @constructor * * @param {BoundingRectangle} [rectangle] The {@link BoundingRectangle} defining the quad's position within the viewport. * @param {Material} [material] The {@link Material} defining the surface appearance of the viewport quad. * * @example * var viewportQuad = new Cesium.ViewportQuad(new Cesium.BoundingRectangle(0, 0, 80, 40)); * viewportQuad.material.uniforms.color = new Cesium.Color(1.0, 0.0, 0.0, 1.0); */ var ViewportQuad = function(rectangle, material) { /** * Determines if the viewport quad primitive will be shown. * * @type {Boolean} * @default true */ this.show = true; if (!defined(rectangle)) { rectangle = new BoundingRectangle(); } /** * The BoundingRectangle defining the quad's position within the viewport. * * @type {BoundingRectangle} * * @example * viewportQuad.rectangle = new Cesium.BoundingRectangle(0, 0, 80, 40); */ this.rectangle = BoundingRectangle.clone(rectangle); if (!defined(material)) { material = Material.fromType(Material.ColorType, { color : new Color(1.0, 1.0, 1.0, 1.0) }); } /** * The surface appearance of the viewport quad. This can be one of several built-in {@link Material} objects or a custom material, scripted with * {@link https://github.com/AnalyticalGraphicsInc/cesium/wiki/Fabric|Fabric}. *
* The default material is Material.ColorType
.
*
* Do not call this function directly. This is documented just to * list the exceptions that may be propagated when the scene is rendered: *
* * @exception {DeveloperError} this.material must be defined. * @exception {DeveloperError} this.rectangle must be defined. */ ViewportQuad.prototype.update = function(context, frameState, commandList) { if (!this.show) { return; } //>>includeStart('debug', pragmas.debug); if (!defined(this.material)) { throw new DeveloperError('this.material must be defined.'); } if (!defined(this.rectangle)) { throw new DeveloperError('this.rectangle must be defined.'); } //>>includeEnd('debug'); var rs = this._rs; if ((!defined(rs)) || !BoundingRectangle.equals(rs.viewport, this.rectangle)) { this._rs = context.createRenderState({ blending : BlendingState.ALPHA_BLEND, viewport : this.rectangle }); } var pass = frameState.passes; if (pass.render) { if (this._material !== this.material || !defined(this._overlayCommand)) { // Recompile shader when material changes this._material = this.material; if (defined(this._overlayCommand)) { this._overlayCommand.shaderProgram.destroy(); } var fs = new ShaderSource({ sources : [this._material.shaderSource, ViewportQuadFS] }); this._overlayCommand = context.createViewportQuadCommand(fs, { renderState : this._rs, uniformMap : this._material._uniforms, owner : this }); this._overlayCommand.pass = Pass.OVERLAY; } this._material.update(context); this._overlayCommand.uniformMap = this._material._uniforms; commandList.push(this._overlayCommand); } }; /** * Returns true if this object was destroyed; otherwise, false. *isDestroyed
will result in a {@link DeveloperError} exception.
*
* @returns {Boolean} True if this object was destroyed; otherwise, false.
*
* @see ViewportQuad#destroy
*/
ViewportQuad.prototype.isDestroyed = function() {
return false;
};
/**
* Destroys the WebGL resources held by this object. Destroying an object allows for deterministic
* release of WebGL resources, instead of relying on the garbage collector to destroy this object.
* isDestroyed
will result in a {@link DeveloperError} exception. Therefore,
* assign the return value (undefined
) to the object as done in the example.
*
* @returns {undefined}
*
* @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
*
* @see ViewportQuad#isDestroyed
*
* @example
* quad = quad && quad.destroy();
*/
ViewportQuad.prototype.destroy = function() {
if (defined(this._overlayCommand)) {
this._overlayCommand.shaderProgram = this._overlayCommand.shaderProgram && this._overlayCommand.shaderProgram.destroy();
}
return destroyObject(this);
};
return ViewportQuad;
});