@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
90 lines • 7.27 kB
JavaScript
import { TgdDataset } from "./../../../dataset/index.js";
import { TgdPainter } from "./../../painter.js";
import { TgdPainterState } from "./../../state/index.js";
import { TgdProgram } from "./../../../program/index.js";
import { TgdShaderFragment, TgdShaderVertex } from "./../../../shader/index.js";
import { TgdVertexArray } from "./../../../vao/index.js";
export class PainterTipsMask extends TgdPainter {
constructor(context, options) {
super();
this.context = context;
this.size = options.size;
const prg = new TgdProgram(context.gl, {
vert: new TgdShaderVertex({
uniforms: {
uniIndex: "float",
uniTransfoMatrix: "mat4",
uniModelViewMatrix: "mat4",
uniProjectionMatrix: "mat4",
uniRadius: "float",
uniScreenHeightInPixels: "float",
},
attributes: {
attPoint: "vec3",
attIndex: "float",
},
varying: {
varIndex: "float",
},
mainCode: [
"varIndex = attIndex;",
"vec4 point = uniModelViewMatrix * vec4(attPoint.xyz, 1.0);",
"vec4 shift = point + vec4(0, uniRadius, 0, 0);",
"gl_Position = uniProjectionMatrix * point;",
"vec4 screenShift = uniProjectionMatrix * shift;",
"gl_PointSize = max(",
["8.0,", "abs(screenShift.y - gl_Position.y) * uniScreenHeightInPixels / gl_Position.w"],
");",
],
}),
frag: new TgdShaderFragment({
uniforms: {
uniTexture: "sampler2D",
},
outputs: {
FragColor: "vec4",
},
mainCode: [
"vec2 v = 2.0 * (gl_PointCoord - vec2(.5));",
"float d = dot(v, v);",
"if (d > 1.0) discard;",
`FragColor = vec4(vec3(varIndex), 1.0);`,
],
}),
});
this.prg = prg;
const dataset = new TgdDataset({
attPoint: "vec3",
attIndex: "float",
});
// prettier-ignore
dataset.set("attPoint", new Float32Array([
+1, 0, 0, 0, +1, 0, 0, 0, +1, -1, 0, 0, 0, -1, 0, 0, 0, -1,
]));
// prettier-ignore
dataset.set("attIndex", new Float32Array([1 / 8, 2 / 8, 3 / 8, 4 / 8, 5 / 8, 6 / 8]));
const vao = new TgdVertexArray(context.gl, prg, [dataset]);
this.vao = vao;
}
delete() {
this.prg.delete();
this.vao.delete();
}
paint(time, delta) {
const { context, prg, vao } = this;
const { gl, camera } = context;
prg.use();
prg.uniform1f("uniRadius", 0.333);
prg.uniform1f("uniScreenHeightInPixels", this.size);
prg.uniformMatrix4fv("uniModelViewMatrix", camera.matrixModelView);
prg.uniformMatrix4fv("uniProjectionMatrix", camera.matrixProjection);
vao.bind();
TgdPainterState.do(context, {
depth: "less",
blend: "off",
action: () => gl.drawArrays(gl.POINTS, 0, 6),
});
vao.unbind();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wYWludGVyL2dpem1vL3BhaW50ZXJzL21hc2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRXpDLE1BQU0sT0FBTyxlQUFnQixTQUFRLFVBQVU7SUFNM0MsWUFDb0IsT0FBbUIsRUFDbkMsT0FBeUI7UUFFekIsS0FBSyxFQUFFLENBQUE7UUFIUyxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBSW5DLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQTtRQUN4QixNQUFNLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFO1lBQ25DLElBQUksRUFBRSxJQUFJLGVBQWUsQ0FBQztnQkFDdEIsUUFBUSxFQUFFO29CQUNOLFFBQVEsRUFBRSxPQUFPO29CQUNqQixnQkFBZ0IsRUFBRSxNQUFNO29CQUN4QixrQkFBa0IsRUFBRSxNQUFNO29CQUMxQixtQkFBbUIsRUFBRSxNQUFNO29CQUMzQixTQUFTLEVBQUUsT0FBTztvQkFDbEIsdUJBQXVCLEVBQUUsT0FBTztpQkFDbkM7Z0JBQ0QsVUFBVSxFQUFFO29CQUNSLFFBQVEsRUFBRSxNQUFNO29CQUNoQixRQUFRLEVBQUUsT0FBTztpQkFDcEI7Z0JBQ0QsT0FBTyxFQUFFO29CQUNMLFFBQVEsRUFBRSxPQUFPO2lCQUNwQjtnQkFDRCxRQUFRLEVBQUU7b0JBQ04sc0JBQXNCO29CQUN0Qiw0REFBNEQ7b0JBQzVELGdEQUFnRDtvQkFDaEQsNENBQTRDO29CQUM1QyxpREFBaUQ7b0JBQ2pELHFCQUFxQjtvQkFDckIsQ0FBQyxNQUFNLEVBQUUsOEVBQThFLENBQUM7b0JBQ3hGLElBQUk7aUJBQ1A7YUFDSixDQUFDO1lBQ0YsSUFBSSxFQUFFLElBQUksaUJBQWlCLENBQUM7Z0JBQ3hCLFFBQVEsRUFBRTtvQkFDTixVQUFVLEVBQUUsV0FBVztpQkFDMUI7Z0JBQ0QsT0FBTyxFQUFFO29CQUNMLFNBQVMsRUFBRSxNQUFNO2lCQUNwQjtnQkFDRCxRQUFRLEVBQUU7b0JBQ04sNENBQTRDO29CQUM1QyxzQkFBc0I7b0JBQ3RCLHVCQUF1QjtvQkFDdkIsd0NBQXdDO2lCQUMzQzthQUNKLENBQUM7U0FDTCxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNkLE1BQU0sT0FBTyxHQUFHLElBQUksVUFBVSxDQUFDO1lBQzNCLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLFFBQVEsRUFBRSxPQUFPO1NBQ3BCLENBQUMsQ0FBQTtRQUNGLGtCQUFrQjtRQUNsQixPQUFPLENBQUMsR0FBRyxDQUNoQixVQUFVLEVBQ1YsSUFBSSxZQUFZLENBQUM7WUFDaEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzFELENBQUMsQ0FDRixDQUFBO1FBQ0ssa0JBQWtCO1FBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQ2hCLFVBQVUsRUFDVixJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FDNUQsQ0FBQTtRQUNLLE1BQU0sR0FBRyxHQUFHLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUMxRCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtJQUNsQixDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQVksRUFBRSxLQUFhO1FBQzdCLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQTtRQUNsQyxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQTtRQUM5QixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDVCxHQUFHLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUNqQyxHQUFHLENBQUMsU0FBUyxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuRCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQ2xFLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUNwRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDVixlQUFlLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRTtZQUN4QixLQUFLLEVBQUUsTUFBTTtZQUNiLEtBQUssRUFBRSxLQUFLO1lBQ1osTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQy9DLENBQUMsQ0FBQTtRQUNGLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUNoQixDQUFDO0NBQ0oifQ==