UNPKG

@pixi/core

Version:
108 lines (105 loc) 3.84 kB
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