@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
84 lines • 6.53 kB
JavaScript
import { createTipsTexture } from "./tips.js";
import { TgdPainterProgram } from "./../../program.js";
import { TgdUniformBufferObject } from "./../../../uniform/index.js";
export class PainterTipsNormal extends TgdPainterProgram {
static async create(context, options) {
const texture = await createTipsTexture(context);
return new PainterTipsNormal(context, { texture, ...options });
}
constructor(context, { uniformCamera, size, texture }) {
const uniformPainter = new TgdUniformBufferObject(context, {
uniforms: {
uniIndex: "float",
uniRadius: "float",
uniScreenHeightInPixels: "float",
},
values: {
uniRadius: 0.333,
},
});
const U = 1 / 3;
const V = 1 / 2;
super(context, {
drawMode: "POINTS",
textures: {
uniTexture: texture,
},
uniforms: {
uniformCamera,
uniformPainter,
},
dataset: {
attribs: {
attPoint: {
type: "vec3",
data: new Float32Array([+1, 0, 0, 0, +1, 0, 0, 0, +1, -1, 0, 0, 0, -1, 0, 0, 0, -1]),
},
attUV: { type: "vec2", data: new Float32Array([0, 0, U, 0, 2 * U, 0, 0, V, U, V, 2 * U, V]) },
attIndex: { type: "float", data: new Float32Array([0, 1, 2, 3, 4, 5]) },
},
},
varying: {
varUV: "vec2",
varLight: "float",
},
vert: {
mainCode: [
"varUV = attUV;",
"varLight = (attIndex == uniIndex) ? 0.5 : 0.0;",
"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: {
mainCode: [
`vec4 color = texture(uniTexture, varUV + gl_PointCoord * vec2(${1 / 3}, 0.5));`,
`if (color.a < ${1 / 0xff}) discard;`,
"color.xyz *= 1.0 - varLight;",
"color.xyz += vec3(varLight);",
"FragColor = color;",
],
},
state: {
depth: "less",
blend: "alpha",
},
onEnter: () => {
uniformPainter.values.uniIndex = this.index;
uniformPainter.values.uniScreenHeightInPixels = this.size;
},
onDelete: () => {
texture.delete();
uniformPainter.delete();
},
});
this.index = -1;
this.size = size;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BhaW50ZXIvZ2l6bW8vcGFpbnRlcnMvbm9ybWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFRckQsTUFBTSxPQUFPLGlCQUFrQixTQUFRLGlCQUFpQjtJQUM3QyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFtQixFQUFFLE9BQWtEO1FBQzlGLE1BQU0sT0FBTyxHQUFHLE1BQU0saUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDaEQsT0FBTyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFDbEUsQ0FBQztJQUtELFlBQW9CLE9BQW1CLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBNEI7UUFDL0YsTUFBTSxjQUFjLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxPQUFPLEVBQUU7WUFDdkQsUUFBUSxFQUFFO2dCQUNOLFFBQVEsRUFBRSxPQUFPO2dCQUNqQixTQUFTLEVBQUUsT0FBTztnQkFDbEIsdUJBQXVCLEVBQUUsT0FBTzthQUNuQztZQUNELE1BQU0sRUFBRTtnQkFDSixTQUFTLEVBQUUsS0FBSzthQUNuQjtTQUNKLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDZixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2YsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUNYLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRTtnQkFDTixVQUFVLEVB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