@awayjs/stage
Version:
Stage for AwayJS
243 lines (242 loc) • 9.45 kB
JavaScript
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;
}());