@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
156 lines • 13.9 kB
JavaScript
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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