UNPKG

@awayjs/stage

Version:
243 lines (242 loc) 9.45 kB
import { __extends } from "tslib"; import { Rectangle, EventDispatcher } from '@awayjs/core'; import { RTTEvent } from '../events/RTTEvent'; import ImageUtils from '../utils/ImageUtils'; var RTTBufferManager = /** @class */ (function (_super) { __extends(RTTBufferManager, _super); function RTTBufferManager(stage, powerOfTwo) { if (powerOfTwo === void 0) { powerOfTwo = true; } var _this = _super.call(this) || this; _this._viewOffsetX = 0; _this._viewOffsetY = 0; _this._viewWidth = -1; _this._viewHeight = -1; _this._textureWidth = -1; _this._textureHeight = -1; _this._buffersInvalid = true; _this._renderToTextureRect = new Rectangle(); _this._stage = stage; _this._powerOfTwo = powerOfTwo; return _this; } RTTBufferManager.getInstance = function (stage) { if (!stage) throw new Error('stage key cannot be null!'); if (RTTBufferManager._instances == null) RTTBufferManager._instances = new Array(); var rttBufferManager = RTTBufferManager.getRTTBufferManagerFromStage(stage); if (rttBufferManager == null) { rttBufferManager = new RTTBufferManager(stage); var vo = new RTTBufferManagerVO(); vo.stage3d = stage; vo.rttbfm = rttBufferManager; RTTBufferManager._instances.push(vo); } return rttBufferManager; }; RTTBufferManager.getRTTBufferManagerFromStage = function (stage) { var l = RTTBufferManager._instances.length; var r; for (var c = 0; c < l; c++) { r = RTTBufferManager._instances[c]; if (r.stage3d === stage) return r.rttbfm; } return null; }; RTTBufferManager.deleteRTTBufferManager = function (stage) { var l = RTTBufferManager._instances.length; var r; for (var c = 0; c < l; c++) { r = RTTBufferManager._instances[c]; if (r.stage3d === stage) { RTTBufferManager._instances.splice(c, 1); return; } } }; Object.defineProperty(RTTBufferManager.prototype, "textureRatioX", { get: function () { if (this._buffersInvalid) this.updateRTTBuffers(); return this._textureRatioX; }, enumerable: false, configurable: true }); Object.defineProperty(RTTBufferManager.prototype, "textureRatioY", { get: function () { if (this._buffersInvalid) this.updateRTTBuffers(); return this._textureRatioY; }, enumerable: false, configurable: true }); Object.defineProperty(RTTBufferManager.prototype, "viewOffsetX", { get: function () { return this._viewOffsetX; }, set: function (value) { this._viewOffsetX = value; this._buffersInvalid = true; }, enumerable: false, configurable: true }); Object.defineProperty(RTTBufferManager.prototype, "viewOffsetY", { get: function () { return this._viewOffsetY; }, set: function (value) { this._viewOffsetY = value; this._buffersInvalid = true; }, enumerable: false, configurable: true }); Object.defineProperty(RTTBufferManager.prototype, "viewWidth", { get: function () { return this._viewWidth; }, set: function (value) { if (value == this._viewWidth) return; this._viewWidth = value; this._buffersInvalid = true; this._textureWidth = this._powerOfTwo ? ImageUtils.getBestPowerOf2(this._viewWidth) : this._viewWidth; if (this._textureWidth > this._viewWidth) { this._renderToTextureRect.x = Math.floor((this._textureWidth - this._viewWidth) * .5); this._renderToTextureRect.width = this._viewWidth; } else { this._renderToTextureRect.x = 0; this._renderToTextureRect.width = this._textureWidth; } this.dispatchEvent(new RTTEvent(RTTEvent.RESIZE, this)); }, enumerable: false, configurable: true }); Object.defineProperty(RTTBufferManager.prototype, "viewHeight", { get: function () { return this._viewHeight; }, set: function (value) { if (value == this._viewHeight) return; this._viewHeight = value; this._buffersInvalid = true; this._textureHeight = this._powerOfTwo ? ImageUtils.getBestPowerOf2(this._viewHeight) : this._viewHeight; if (this._textureHeight > this._viewHeight) { this._renderToTextureRect.y = Math.floor((this._textureHeight - this._viewHeight) * .5); this._renderToTextureRect.height = this._viewHeight; } else { this._renderToTextureRect.y = 0; this._renderToTextureRect.height = this._textureHeight; } this.dispatchEvent(new RTTEvent(RTTEvent.RESIZE, this)); }, enumerable: false, configurable: true }); Object.defineProperty(RTTBufferManager.prototype, "renderToTextureVertexBuffer", { get: function () { if (this._buffersInvalid) this.updateRTTBuffers(); return this._renderToTextureVertexBuffer; }, enumerable: false, configurable: true }); Object.defineProperty(RTTBufferManager.prototype, "renderToScreenVertexBuffer", { get: function () { if (this._buffersInvalid) this.updateRTTBuffers(); return this._renderToScreenVertexBuffer; }, enumerable: false, configurable: true }); Object.defineProperty(RTTBufferManager.prototype, "indexBuffer", { get: function () { if (this._buffersInvalid) this.updateRTTBuffers(); return this._indexBuffer; }, enumerable: false, configurable: true }); Object.defineProperty(RTTBufferManager.prototype, "renderToTextureRect", { get: function () { if (this._buffersInvalid) this.updateRTTBuffers(); return this._renderToTextureRect; }, enumerable: false, configurable: true }); Object.defineProperty(RTTBufferManager.prototype, "textureWidth", { get: function () { return this._textureWidth; }, enumerable: false, configurable: true }); Object.defineProperty(RTTBufferManager.prototype, "textureHeight", { get: function () { return this._textureHeight; }, enumerable: false, configurable: true }); RTTBufferManager.prototype.dispose = function () { RTTBufferManager.deleteRTTBufferManager(this._stage); if (this._indexBuffer) { this._indexBuffer.dispose(); this._renderToScreenVertexBuffer.dispose(); this._renderToTextureVertexBuffer.dispose(); this._renderToScreenVertexBuffer = null; this._renderToTextureVertexBuffer = null; this._indexBuffer = null; } }; // todo: place all this in a separate model, since it's used all over the place // maybe it even has a place in the core (together with screenRect etc)? // needs to be stored per view of course RTTBufferManager.prototype.updateRTTBuffers = function () { var context = this._stage.context; var textureVerts; var screenVerts; var x; var y; if (this._renderToTextureVertexBuffer == null) this._renderToTextureVertexBuffer = context.createVertexBuffer(4, 20); if (this._renderToScreenVertexBuffer == null) this._renderToScreenVertexBuffer = context.createVertexBuffer(4, 20); if (!this._indexBuffer) { this._indexBuffer = context.createIndexBuffer(6); this._indexBuffer.uploadFromArray(new Uint16Array([2, 1, 0, 3, 2, 0]), 0, 6); } this._textureRatioX = x = Math.min(this._viewWidth / this._textureWidth, 1); this._textureRatioY = y = Math.min(this._viewHeight / this._textureHeight, 1); var u1 = (1 - x) * .5; var u2 = (x + 1) * .5; var v1 = (1 - y) * .5; var v2 = (y + 1) * .5; // last element contains indices for data per vertex that can be passed to the vertex shader if necessary (ie: frustum corners for deferred rendering) textureVerts = new Float32Array([-x, -y, u1, v1, 0, x, -y, u2, v1, 1, x, y, u2, v2, 2, -x, y, u1, v2, 3]); screenVerts = new Float32Array([-1, -1, u1, v1, 0, 1, -1, u2, v1, 1, 1, 1, u2, v2, 2, -1, 1, u1, v2, 3]); this._renderToTextureVertexBuffer.uploadFromArray(textureVerts, 0, 4); this._renderToScreenVertexBuffer.uploadFromArray(screenVerts, 0, 4); this._buffersInvalid = false; }; return RTTBufferManager; }(EventDispatcher)); export { RTTBufferManager }; var RTTBufferManagerVO = /** @class */ (function () { function RTTBufferManagerVO() { } return RTTBufferManagerVO; }());