@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
167 lines • 12.9 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGFpbnRlci9zdGF0ZS9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFLSCxhQUFhLEVBQ2IsYUFBYSxFQUNiLFlBQVksRUFDWixZQUFZLEVBQ1osYUFBYSxFQUNiLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLGVBQWUsR0FDbEIsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBNEIxQyxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxlQUFlO0lBQ3pDLE1BQU0sQ0FBQyxFQUFFLENBQ1osT0FBaUUsRUFDakUsT0FFQztRQUVELE1BQU0sSUFBSSxHQUFHO1lBQ1QsS0FBSyxFQUFFO2dCQUNILEdBQUcsRUFBRSxJQUFJO2dCQUNULEtBQUssRUFBRSxJQUFJO2dCQUNYLElBQUksRUFBRSxJQUFJO2dCQUNWLEtBQUssRUFBRSxJQUFJO2FBQ2Q7U0FDSixDQUFBO1FBQ0QsTUFBTSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUNoRixLQUFLLE1BQU0sV0FBVyxJQUFJLGNBQWM7WUFBRSxXQUFXLEVBQUUsQ0FBQTtRQUN2RCxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDaEIsS0FBSyxNQUFNLFVBQVUsSUFBSSxhQUFhO1lBQUUsVUFBVSxFQUFFLENBQUE7SUFDeEQsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBcUM7UUFDckQsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3BDLE9BQU8sQ0FBQyxLQUFL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