UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

167 lines 12.9 kB
import { webglLookup } from "./../../utils/index.js"; import { webglBlendGet, webglBlendSet, webglCullGet, webglCullSet, webglDepthGet, webglDepthSet, webglPresetBlend, webglPresetCull, webglPresetDepth, webglPresetStencil, webglStencilGet, webglStencilSet, } from "./../../utils/state/index.js"; import { TgdPainterGroup } from "../group.js"; export class TgdPainterState extends TgdPainterGroup { static do(context, options) { const self = { color: { red: true, green: true, blue: true, alpha: true, }, }; const { onEnterActions, onExitActions } = prepareActions(self, context, options); for (const actionEnter of onEnterActions) actionEnter(); options.action(); for (const actionExit of onExitActions) actionExit(); } static debug(context) { const depth = webglDepthGet(context); console.debug("Depth:", { enabled: depth.enabled, func: webglLookup(depth.func), mask: depth.mask, range: [depth.rangeMin, depth.rangeMax], }); } constructor(context, options = {}) { super(options.children); this.color = { red: true, green: true, blue: true, alpha: true, }; const { onEnterActions, onExitActions } = prepareActions(this, context, options); this.onEnter = (time, delta) => { options.onEnter?.(time, delta); for (const f of onEnterActions) f(); }; this.onExit = (time, delta) => { for (const f of onExitActions) f(); options.onExit?.(time, delta); }; this.name = options.name ?? `State/${this.name}`; } } function figureOutColorMask(color) { if (color === true) return [true, true, true, true]; if (color === false) return [false, false, false, false]; return color; } function prepareActions(self, context, options) { const { gl } = context; const { color, viewport } = options; const blend = resolveBlend(options.blend); const cull = resolveCull(options.cull); const depth = resolveDepth(options.depth); const stencil = resolveStencil(options.stencil); const onEnterActions = []; const onExitActions = []; const colorMask = figureOutColorMask(color); const [red, green, blue, alpha] = colorMask ?? [true, true, true, true]; self.color.red = red; self.color.green = green; self.color.blue = blue; self.color.alpha = alpha; const p = context.webglParams; if (Array.isArray(colorMask)) { let savedColorMask; onEnterActions.push(() => { savedColorMask = gl.getParameter(gl.COLOR_WRITEMASK); gl.colorMask(self.color.red, self.color.green, self.color.blue, self.color.alpha); }); onExitActions.push(() => { gl.colorMask(...(savedColorMask ?? [true, true, true, true])); }); } if (viewport) { let savedViewport; onEnterActions.push(() => { savedViewport = p.viewport; const [x, y, w, h] = viewport; p.setViewport(x, y, w, h); }); onExitActions.push(() => { if (savedViewport) p.viewport = savedViewport; }); } if (blend) { let savedBlend; onEnterActions.push(() => { savedBlend = webglBlendGet(context); webglBlendSet(context, blend); }); onExitActions.push(() => { if (savedBlend) webglBlendSet(context, savedBlend); }); } if (depth) { let savedDepth; onEnterActions.push(() => { savedDepth = webglDepthGet(context); webglDepthSet(context, depth); }); onExitActions.push(() => { if (savedDepth) webglDepthSet(context, savedDepth); }); } if (cull) { let savedCull; onEnterActions.push(() => { savedCull = webglCullGet(context); webglCullSet(context, cull); }); onExitActions.push(() => { if (savedCull) webglCullSet(context, savedCull); }); } if (stencil) { let savedStencil; onEnterActions.push(() => { savedStencil = webglStencilGet(gl); webglStencilSet(gl, stencil); }); onExitActions.push(() => { if (savedStencil) webglStencilSet(gl, savedStencil); }); } return { onEnterActions, onExitActions }; } function resolveBlend(blend) { if (typeof blend === "string") { return webglPresetBlend[blend]; } return blend; } function resolveCull(stencil) { if (typeof stencil === "string") { return webglPresetCull[stencil]; } return stencil; } function resolveDepth(depth) { if (typeof depth === "string") { return webglPresetDepth[depth]; } return depth; } function resolveStencil(stencil) { if (typeof stencil === "string") { return webglPresetStencil[stencil]; } return stencil; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGFpbnRlci9zdGF0ZS9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFLSCxhQUFhLEVBQ2IsYUFBYSxFQUNiLFlBQVksRUFDWixZQUFZLEVBQ1osYUFBYSxFQUNiLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLGVBQWUsR0FDbEIsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBNEIxQyxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxlQUFlO0lBQ3pDLE1BQU0sQ0FBQyxFQUFFLENBQ1osT0FBaUUsRUFDakUsT0FFQztRQUVELE1BQU0sSUFBSSxHQUFHO1lBQ1QsS0FBSyxFQUFFO2dCQUNILEdBQUcsRUFBRSxJQUFJO2dCQUNULEtBQUssRUFBRSxJQUFJO2dCQUNYLElBQUksRUFBRSxJQUFJO2dCQUNWLEtBQUssRUFBRSxJQUFJO2FBQ2Q7U0FDSixDQUFBO1FBQ0QsTUFBTSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUNoRixLQUFLLE1BQU0sV0FBVyxJQUFJLGNBQWM7WUFBRSxXQUFXLEVBQUUsQ0FBQTtRQUN2RCxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDaEIsS0FBSyxNQUFNLFVBQVUsSUFBSSxhQUFhO1lBQUUsVUFBVSxFQUFFLENBQUE7SUFDeEQsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBcUM7UUFDckQsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3BDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ3BCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixJQUFJLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDN0IsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQztTQUMxQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBU0QsWUFDSSxPQUFpRSxFQUNqRSxVQUEyQyxFQUFFO1FBRTdDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7UUFYbEIsVUFBSyxHQUFHO1lBQ2IsR0FBRyxFQUFFLElBQUk7WUFDVCxLQUFLLEVBQUUsSUFBSTtZQUNYLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLElBQUk7U0FDZCxDQUFBO1FBT0csTUFBTSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUNoRixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDOUIsS0FBSyxNQUFNLENBQUMsSUFBSSxjQUFjO2dCQUFFLENBQUMsRUFBRSxDQUFBO1FBQ3ZDLENBQUMsQ0FBQTtRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDMUIsS0FBSyxNQUFNLENBQUMsSUFBSSxhQUFhO2dCQUFFLENBQUMsRUFBRSxDQUFBO1lBQ2xDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDakMsQ0FBQyxDQUFBO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3BELENBQUM7Q0FDSjtBQUVELFNBQVMsa0JBQWtCLENBQ3ZCLEtBQWlFO0lBRWpFLElBQUksS0FBSyxLQUFLLElBQUk7UUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDbkQsSUFBSSxLQUFLLEtBQUssS0FBSztRQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUN4RCxPQUFPLEtBQUssQ0FBQTtBQUNoQixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQ25CLElBRUMsRUFDRCxPQUFpRSxFQUNqRSxPQUF3QztJQUV4QyxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFBO0lBQ3RCLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFBO0lBQ25DLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDekMsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN0QyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDL0MsTUFBTSxjQUFjLEdBQXNCLEVBQUUsQ0FBQTtJQUM1QyxNQUFNLGFBQWEsR0FBc0IsRUFBRSxDQUFBO0lBQzNDLE1BQU0sU0FBUyxHQUFxRCxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM3RixNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsU0FBUyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDdkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBO0lBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7SUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ3hCLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUE7SUFDN0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDM0IsSUFBSSxjQUF1RSxDQUFBO1FBQzNFLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JCLGNBQWMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQXlDLENBQUE7WUFDNUYsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JGLENBQUMsQ0FBQyxDQUFBO1FBQ0YsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDcEIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2pFLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUNELElBQUksUUFBUSxFQUFFLENBQUM7UUFDWCxJQUFJLGFBQXFDLENBQUE7UUFDekMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckIsYUFBYSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUE7WUFDMUIsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQTtZQUM3QixDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzdCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDcEIsSUFBSSxhQUFhO2dCQUFFLENBQUMsQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFBO1FBQ2pELENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUNELElBQUksS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLFVBQTZCLENBQUE7UUFDakMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckIsVUFBVSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNuQyxhQUFhLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ2pDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDcEIsSUFBSSxVQUFVO2dCQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDdEQsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBQ0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksVUFBNkIsQ0FBQTtRQUNqQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNyQixVQUFVLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ25DLGFBQWEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDakMsQ0FBQyxDQUFDLENBQUE7UUFDRixhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNwQixJQUFJLFVBQVU7Z0JBQUUsYUFBYSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUN0RCxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFDRCxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ1AsSUFBSSxTQUEyQixDQUFBO1FBQy9CLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JCLFNBQVMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDakMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUMvQixDQUFDLENBQUMsQ0FBQTtRQUNGLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3BCLElBQUksU0FBUztnQkFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQ25ELENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUNELElBQUksT0FBTyxFQUFFLENBQUM7UUFDVixJQUFJLFlBQWlDLENBQUE7UUFDckMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckIsWUFBWSxHQUFHLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUNsQyxlQUFlLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ2hDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDcEIsSUFBSSxZQUFZO2dCQUFFLGVBQWUsQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFDdkQsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBQ0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsQ0FBQTtBQUM1QyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQ2pCLEtBQW1FO0lBRW5FLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUIsT0FBTyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDaEIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUNoQixPQUFtRTtJQUVuRSxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ25DLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQTtBQUNsQixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQ2pCLEtBQW1FO0lBRW5FLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUIsT0FBTyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDaEIsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUNuQixPQUF5RTtJQUV6RSxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDdEMsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFBO0FBQ2xCLENBQUMifQ==