UNPKG

pixi.js

Version:

<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">

1 lines 8.15 kB
{"version":3,"file":"GlStencilSystem.mjs","sources":["../../../../src/rendering/renderers/gl/GlStencilSystem.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { GpuStencilModesToPixi } from '../gpu/state/GpuStencilModesToPixi';\nimport { STENCIL_MODES } from '../shared/state/const';\n\nimport type { RenderTarget } from '../shared/renderTarget/RenderTarget';\nimport type { System } from '../shared/system/System';\nimport type { WebGLRenderer } from './WebGLRenderer';\n\n/**\n * This manages the stencil buffer. Used primarily for masking\n * @category rendering\n * @advanced\n */\nexport class GlStencilSystem implements System\n{\n /** @ignore */\n public static extension = {\n type: [\n ExtensionType.WebGLSystem,\n ],\n name: 'stencil',\n } as const;\n\n private _gl: WebGLRenderingContext;\n\n private readonly _stencilCache = {\n enabled: false,\n stencilReference: 0,\n stencilMode: STENCIL_MODES.NONE,\n };\n\n private _renderTargetStencilState: Record<number, {\n stencilMode: STENCIL_MODES;\n stencilReference: number;\n }> = Object.create(null);\n\n private _stencilOpsMapping: {\n keep: number;\n zero: number;\n replace: number;\n invert: number;\n 'increment-clamp': number;\n 'decrement-clamp': number;\n 'increment-wrap': number;\n 'decrement-wrap': number;\n };\n\n private _comparisonFuncMapping: {\n always: number;\n never: number;\n equal: number;\n 'not-equal': number;\n less: number;\n 'less-equal': number;\n greater: number;\n 'greater-equal': number;\n };\n\n private _activeRenderTarget: RenderTarget;\n\n constructor(renderer: WebGLRenderer)\n {\n renderer.renderTarget.onRenderTargetChange.add(this);\n }\n\n protected contextChange(gl: WebGLRenderingContext)\n {\n // TODO - this could be declared in a gl const\n // we know the numbers don't tend to change!\n this._gl = gl;\n\n this._comparisonFuncMapping = {\n always: gl.ALWAYS,\n never: gl.NEVER,\n equal: gl.EQUAL,\n 'not-equal': gl.NOTEQUAL,\n less: gl.LESS,\n 'less-equal': gl.LEQUAL,\n greater: gl.GREATER,\n 'greater-equal': gl.GEQUAL,\n };\n\n this._stencilOpsMapping = {\n keep: gl.KEEP,\n zero: gl.ZERO,\n replace: gl.REPLACE,\n invert: gl.INVERT,\n 'increment-clamp': gl.INCR,\n 'decrement-clamp': gl.DECR,\n 'increment-wrap': gl.INCR_WRAP,\n 'decrement-wrap': gl.DECR_WRAP,\n };\n\n this.resetState();\n }\n\n protected onRenderTargetChange(renderTarget: RenderTarget)\n {\n if (this._activeRenderTarget === renderTarget) return;\n\n this._activeRenderTarget = renderTarget;\n\n let stencilState = this._renderTargetStencilState[renderTarget.uid];\n\n if (!stencilState)\n {\n stencilState = this._renderTargetStencilState[renderTarget.uid] = {\n stencilMode: STENCIL_MODES.DISABLED,\n stencilReference: 0,\n };\n }\n\n // restore the current render targets stencil state..\n this.setStencilMode(stencilState.stencilMode, stencilState.stencilReference);\n }\n\n public resetState()\n {\n // reset stencil cache\n this._stencilCache.enabled = false;\n this._stencilCache.stencilMode = STENCIL_MODES.NONE;\n this._stencilCache.stencilReference = 0;\n }\n\n public setStencilMode(stencilMode: STENCIL_MODES, stencilReference: number)\n {\n const stencilState = this._renderTargetStencilState[this._activeRenderTarget.uid];\n\n const gl = this._gl;\n const mode = GpuStencilModesToPixi[stencilMode];\n\n const _stencilCache = this._stencilCache;\n\n // store the stencil state for restoration later, if a render target changes\n stencilState.stencilMode = stencilMode;\n stencilState.stencilReference = stencilReference;\n\n if (stencilMode === STENCIL_MODES.DISABLED)\n {\n if (this._stencilCache.enabled)\n {\n this._stencilCache.enabled = false;\n\n gl.disable(gl.STENCIL_TEST);\n }\n\n return;\n }\n\n if (!this._stencilCache.enabled)\n {\n this._stencilCache.enabled = true;\n gl.enable(gl.STENCIL_TEST);\n }\n\n if (stencilMode !== _stencilCache.stencilMode || _stencilCache.stencilReference !== stencilReference)\n {\n _stencilCache.stencilMode = stencilMode;\n _stencilCache.stencilReference = stencilReference;\n\n // this is pretty simple mapping.\n // will work for pixi's simple mask cases.\n // although a true mapping of the GPU state to webGL state should be done\n gl.stencilFunc(this._comparisonFuncMapping[mode.stencilBack.compare], stencilReference, 0xFF);\n gl.stencilOp(gl.KEEP, gl.KEEP, this._stencilOpsMapping[mode.stencilBack.passOp]);\n }\n }\n\n public destroy?: () => void;\n}\n"],"names":[],"mappings":"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"}