/* global Uint8Array */
import { Utils } from '../common/Utils'
import { BaseStaticTexture } from './BaseStaticTexture';
const __ = {
private: Symbol('private'),
}
/**
* RenderTexture - 渲染纹理
*
* 用于创建渲染纹理资源,可将场景渲染结果保存为纹理用于后期处理。
* @class RenderTexture
* @memberof THING
* @extends THING.BaseStaticTexture
* @public
* @example
const renderTexture = new THING.RenderTexture({
size: [512, 512],
});
*/
class RenderTexture extends BaseStaticTexture {
/**
* @param {object}param 参数列表
* @param {number[]} param.size 渲染纹理的尺寸,包含宽和高两个元素
* @constructor
* @public
*/
constructor(param = {}) {
super(param);
this[__.private] = {};
let _private = this[__.private];
_private.size = Utils.parseArray(param['size'], [1, 1]);
// Complete
this.onNotifyComplete();
}
// #region Overrides
onDispose() {
let _private = this[__.private];
_private.resource = null;
super.onDispose();
}
onCreateTextureResource() {
let _private = this[__.private];
let renderTexture = Utils.createObject('RenderTextureResource', { scene: this.app.scene.context, view: this.app.view });
renderTexture.setSize(_private.size);
return renderTexture;
}
// #endregion
/**
从图片资源中拷贝数据。
* @param {THING.RenderTexture} source 图片源.
* @returns {THING.RenderTexture} 返回当前渲染纹理。
* @public
*/
copy(source) {
super.copy(source);
let _private = this[__.private];
_private.size = source.size;
return this;
}
/**
克隆图片
* @returns {THING.RenderTexture} 返回克隆的渲染纹理。
* @example
* let renderTexture = new THING.RenderTexture();
* let cloneRenderTexture = renderTexture.clone();
* // @expect(cloneRenderTexture !== renderTexture);
* @public
*/
clone() {
let resource = new RenderTexture({ app: this.app });
resource.copy(this);
return resource;
}
/**
以PNG文件格式下载文件作为图像资源。
* @param {string} fileName 文件名。
* @example
* renderTexture.download('myScreenshot');
* @public
*/
download(fileName) {
let _private = this[__.private];
let size = _private.size;
let imageWidth = size[0];
let imageHeight = size[1];
let image = Utils.saveAsImage(imageWidth, imageHeight, this.pixelBuffer);
Utils.saveAsFile(fileName + '.png', image, 'png');
}
// #region Accessors
/**
获取或设置大小。
* @type {Array<number>}
* @public
*/
get size() {
let _private = this[__.private];
return _private.size.slice(0);
}
set size(value) {
let _private = this[__.private];
_private.size = value.slice(0);
this.getTextureResource().setSize(_private.size);
}
/**
获取以RGBA颜色格式的像素缓冲区。
* @type {Uint8Array}
* @example
* let renderTexture = new THING.RenderTexture();
* let pixelBuffer = renderTexture.pixelBuffer;
* // @expect(pixelBuffer !== null);
* @public
*/
get pixelBuffer() {
return this.getTextureResource().getPixelBuffer();
}
// #endregion
/**
Check class type.
* @type {boolean}
*/
get isRenderTexture() {
return true;
}
// #endregion
}
export { RenderTexture }