@pixi/core
Version:
Core PixiJS
108 lines (105 loc) • 3.84 kB
JavaScript
import { Color } from '@pixi/color';
import { ExtensionType, extensions } from '@pixi/extensions';
import { Rectangle } from '@pixi/math';
const tempRect = new Rectangle();
const tempRect2 = new Rectangle();
class RenderTextureSystem {
constructor(renderer) {
this.renderer = renderer;
this.defaultMaskStack = [];
this.current = null;
this.sourceFrame = new Rectangle();
this.destinationFrame = new Rectangle();
this.viewportFrame = new Rectangle();
}
bind(renderTexture = null, sourceFrame, destinationFrame) {
const renderer = this.renderer;
this.current = renderTexture;
let baseTexture;
let framebuffer;
let resolution;
if (renderTexture) {
baseTexture = renderTexture.baseTexture;
resolution = baseTexture.resolution;
if (!sourceFrame) {
tempRect.width = renderTexture.frame.width;
tempRect.height = renderTexture.frame.height;
sourceFrame = tempRect;
}
if (!destinationFrame) {
tempRect2.x = renderTexture.frame.x;
tempRect2.y = renderTexture.frame.y;
tempRect2.width = sourceFrame.width;
tempRect2.height = sourceFrame.height;
destinationFrame = tempRect2;
}
framebuffer = baseTexture.framebuffer;
} else {
resolution = renderer.resolution;
if (!sourceFrame) {
tempRect.width = renderer._view.screen.width;
tempRect.height = renderer._view.screen.height;
sourceFrame = tempRect;
}
if (!destinationFrame) {
destinationFrame = tempRect;
destinationFrame.width = sourceFrame.width;
destinationFrame.height = sourceFrame.height;
}
}
const viewportFrame = this.viewportFrame;
viewportFrame.x = destinationFrame.x * resolution;
viewportFrame.y = destinationFrame.y * resolution;
viewportFrame.width = destinationFrame.width * resolution;
viewportFrame.height = destinationFrame.height * resolution;
if (!renderTexture) {
viewportFrame.y = renderer.view.height - (viewportFrame.y + viewportFrame.height);
}
viewportFrame.ceil();
this.renderer.framebuffer.bind(framebuffer, viewportFrame);
this.renderer.projection.update(destinationFrame, sourceFrame, resolution, !framebuffer);
if (renderTexture) {
this.renderer.mask.setMaskStack(baseTexture.maskStack);
} else {
this.renderer.mask.setMaskStack(this.defaultMaskStack);
}
this.sourceFrame.copyFrom(sourceFrame);
this.destinationFrame.copyFrom(destinationFrame);
}
clear(clearColor, mask) {
const fallbackColor = this.current ? this.current.baseTexture.clear : this.renderer.background.backgroundColor;
const color = clearColor ? Color.shared.setValue(clearColor) : fallbackColor;
const destinationFrame = this.destinationFrame;
const baseFrame = this.current ? this.current.baseTexture : this.renderer._view.screen;
const clearMask = destinationFrame.width !== baseFrame.width || destinationFrame.height !== baseFrame.height;
if (clearMask) {
let { x, y, width, height } = this.viewportFrame;
x = Math.round(x);
y = Math.round(y);
width = Math.round(width);
height = Math.round(height);
this.renderer.gl.enable(this.renderer.gl.SCISSOR_TEST);
this.renderer.gl.scissor(x, y, width, height);
}
this.renderer.framebuffer.clear(color.red, color.green, color.blue, color.alpha, mask);
if (clearMask) {
this.renderer.scissor.pop();
}
}
resize() {
this.bind(null);
}
reset() {
this.bind(null);
}
destroy() {
this.renderer = null;
}
}
RenderTextureSystem.extension = {
type: ExtensionType.RendererSystem,
name: "renderTexture"
};
extensions.add(RenderTextureSystem);
export { RenderTextureSystem };
//# sourceMappingURL=RenderTextureSystem.mjs.map