UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

156 lines 13.9 kB
import { debug, highlightEnum } from "./../../debug/index.js"; import { WebglEnumStencilFunction, WebglEnumStencilOperation } from "./../../types/index.js"; export const webglPresetStencil = { off: { enabled: false, maskBack: 0, maskFront: 0, functionBack: WebglEnumStencilFunction.ALWAYS, functionBackMask: 0, functionBackRef: 0, functionFront: WebglEnumStencilFunction.ALWAYS, functionFrontMask: 0, functionFrontRef: 0, operationBack1FailStencil: WebglEnumStencilOperation.KEEP, operationBack2FailDepth: WebglEnumStencilOperation.KEEP, operationBack3Pass: WebglEnumStencilOperation.KEEP, operationFront1FailStencil: WebglEnumStencilOperation.KEEP, operationFront2FailDepth: WebglEnumStencilOperation.KEEP, operationFront3Pass: WebglEnumStencilOperation.KEEP, }, /** Set the stencil to `value` for each fragment. */ write: (value) => ({ enabled: true, maskBack: 0xff, maskFront: 0xff, functionBack: WebglEnumStencilFunction.ALWAYS, functionBackRef: value, functionBackMask: 0xff, functionFront: WebglEnumStencilFunction.ALWAYS, functionFrontRef: value, functionFrontMask: 0xff, operationBack1FailStencil: WebglEnumStencilOperation.KEEP, operationBack2FailDepth: WebglEnumStencilOperation.KEEP, operationBack3Pass: WebglEnumStencilOperation.REPLACE, operationFront1FailStencil: WebglEnumStencilOperation.KEEP, operationFront2FailDepth: WebglEnumStencilOperation.KEEP, operationFront3Pass: WebglEnumStencilOperation.REPLACE, }), /** Paint only if the stencil is equal to `value` */ paintIfEqual: (value) => ({ enabled: true, maskBack: 0x00, maskFront: 0x00, functionBack: WebglEnumStencilFunction.EQUAL, functionBackRef: value, functionBackMask: 0xff, functionFront: WebglEnumStencilFunction.EQUAL, functionFrontRef: value, functionFrontMask: 0xff, operationBack1FailStencil: WebglEnumStencilOperation.KEEP, operationBack2FailDepth: WebglEnumStencilOperation.KEEP, operationBack3Pass: WebglEnumStencilOperation.KEEP, operationFront1FailStencil: WebglEnumStencilOperation.KEEP, operationFront2FailDepth: WebglEnumStencilOperation.KEEP, operationFront3Pass: WebglEnumStencilOperation.KEEP, }), }; export function webglStencilSet(gl, stencil) { if (stencil.enabled) { gl.enable(gl.STENCIL_TEST); gl.stencilFuncSeparate(gl.FRONT, stencil.functionFront, stencil.functionFrontRef, stencil.functionFrontMask); gl.stencilFuncSeparate(gl.BACK, stencil.functionBack, stencil.functionBackRef, stencil.functionBackMask); gl.stencilOpSeparate(gl.FRONT, stencil.operationFront1FailStencil, stencil.operationFront2FailDepth, stencil.operationFront3Pass); gl.stencilOpSeparate(gl.BACK, stencil.operationBack1FailStencil, stencil.operationBack2FailDepth, stencil.operationBack3Pass); gl.stencilMaskSeparate(gl.FRONT, stencil.maskFront); gl.stencilMaskSeparate(gl.BACK, stencil.maskBack); } else { gl.disable(gl.STENCIL_TEST); } } export function webglStencilGet(gl) { const enabled = Boolean(gl.getParameter(gl.STENCIL_TEST)); if (!enabled) return { ...webglPresetStencil.off }; return { enabled, maskBack: gl.getParameter(gl.STENCIL_BACK_WRITEMASK), maskFront: gl.getParameter(gl.STENCIL_WRITEMASK), functionFront: gl.getParameter(gl.STENCIL_FUNC), functionFrontMask: gl.getParameter(gl.STENCIL_VALUE_MASK), functionFrontRef: gl.getParameter(gl.STENCIL_REF), functionBack: gl.getParameter(gl.STENCIL_BACK_FUNC), functionBackMask: gl.getParameter(gl.STENCIL_BACK_VALUE_MASK), functionBackRef: gl.getParameter(gl.STENCIL_BACK_REF), operationFront1FailStencil: gl.getParameter(gl.STENCIL_FAIL), operationFront2FailDepth: gl.getParameter(gl.STENCIL_PASS_DEPTH_FAIL), operationFront3Pass: gl.getParameter(gl.STENCIL_PASS_DEPTH_PASS), operationBack1FailStencil: gl.getParameter(gl.STENCIL_BACK_FAIL), operationBack2FailDepth: gl.getParameter(gl.STENCIL_BACK_PASS_DEPTH_FAIL), operationBack3Pass: gl.getParameter(gl.STENCIL_BACK_PASS_DEPTH_PASS), }; } export function webglStencilExec(gl, stencil, action) { const currentState = webglStencilGet(gl); webglStencilSet(gl, stencil); try { action(); } finally { webglStencilSet(gl, currentState); } } export function webglDebugStencil(gl, caption = "Stencil test:") { const stencil = webglStencilGet(gl); debug([`Stencil ${caption}: `, stencil.enabled]); console.debug(stencil); if (stencil.enabled) { debug([ { cls: "code" }, ["gl.enable(", highlightEnum("STENCIL_TEST"), ")\n"], [ "gl.stencilFuncSeparate(", highlightEnum("FRONT"), ", ", highlightEnum(stencil.functionFront), `, ${stencil.functionFrontRef}, 0b${stencil.functionFrontMask.toString(2)})\n`, ], [ "gl.stencilFuncSeparate(", highlightEnum("BACK"), ", ", highlightEnum(stencil.functionBack), `, ${stencil.functionBackRef}, 0b${stencil.functionBackMask.toString(2)})\n`, ], [ "gl.stencilOpSeparate(", highlightEnum("FRONT"), ", ", highlightEnum(stencil.operationFront1FailStencil), ", ", highlightEnum(stencil.operationFront2FailDepth), ", ", highlightEnum(stencil.operationFront3Pass), ")\n", ], [ "gl.stencilOpSeparate(", highlightEnum("BACK"), ", ", highlightEnum(stencil.operationBack1FailStencil), ", ", highlightEnum(stencil.operationBack2FailDepth), ", ", highlightEnum(stencil.operationBack3Pass), ")\n", ], ["gl.stencilMaskSeparate(", highlightEnum("FRONT"), `, 0b${stencil.maskFront.toString(2)})\n`], ["gl.stencilMaskSeparate(", highlightEnum("BACK"), `, 0b${stencil.maskBack.toString(2)})\n`], ]); } else { debug([{ cls: "code" }, ["gl.disable(", highlightEnum("STENCIL_TEST")]]); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlbmNpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zdGF0ZS9zdGVuY2lsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ2pELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQW9CaEYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDOUIsR0FBRyxFQUFFO1FBQ0QsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsQ0FBQztRQUNYLFNBQVMsRUFBRSxDQUFDO1FBQ1osWUFBWSxFQUFFLHdCQUF3QixDQUFDLE1BQU07UUFDN0MsZ0JBQWdCLEVBQUUsQ0FBQztRQUNuQixlQUFlLEVBQUUsQ0FBQztRQUNsQixhQUFhLEVBQUUsd0JBQXdCLENBQUMsTUFBTTtRQUM5QyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3BCLGdCQUFnQixFQUFFLENBQUM7UUFDbkIseUJBQXlCLEVBQUUseUJBQXlCLENBQUMsSUFBSTtRQUN6RCx1QkFBdUIsRUFBRSx5QkFBeUIsQ0FBQyxJQUFJO1FBQ3ZELGtCQUFrQixFQUFFLHlCQUF5QixDQUFDLElBQUk7UUFDbEQsMEJBQTBCLEVBQUUseUJBQXlCLENBQUMsSUFBSTtRQUMxRCx3QkFBd0IsRUFBRSx5QkFBeUIsQ0FBQyxJQUFJO1FBQ3hELG1CQUFtQixFQUFFLHlCQUF5QixDQUFDLElBQUk7S0FDdEQ7SUFDRCxvREFBb0Q7SUFDcEQsS0FBSyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxJQUFJO1FBQ2IsUUFBUSxFQUFFLElBQUk7UUFDZCxTQUFTLEVBQUUsSUFBSTtRQUNmLFlBQVksRUFBRSx3QkFBd0IsQ0FBQyxNQUFNO1FBQzdDLGVBQWUsRUFBRSxLQUFLO1FBQ3RCLGdCQUFnQixFQUFFLElB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