UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

79 lines 6.95 kB
import { TgdDataset } from "./../../dataset/dataset.js"; import { TgdPainter } from "./../painter.js"; import { TgdProgram } from "./../../program/index.js"; import { TgdShaderFragment } from "./../../shader/fragment.js"; import { TgdShaderVertex } from "./../../shader/vertex.js"; import { TgdVertexArray } from "./../../vao/index.js"; export class TgdPainterMix extends TgdPainter { constructor(context, options = {}) { super(); this.context = context; this.texture1 = options.texture1; this.texture2 = options.texture2; this.strength = options.strength ?? 0.5; this.z = options.z ?? 0.999999; const vert = new TgdShaderVertex({ attributes: { attPoint: "vec2", attUV: "vec2", }, varying: { varUV: "vec2", }, uniforms: { uniZ: "float", }, mainCode: ["varUV = attUV;", "gl_Position = vec4(", ["attPoint,", "uniZ,", "1.0"], ");"], }).code; const frag = new TgdShaderFragment({ uniforms: { uniStrength: "float", uniTexture1: "sampler2D", uniTexture2: "sampler2D", }, varying: { varUV: "vec2", }, mainCode: [ "vec4 color1 = texture(uniTexture1, varUV);", "vec4 color2 = texture(uniTexture2, varUV);", "vec4 color = vec4(color1.rgb + color2.rgb * uniStrength, color1.a + color2.a);", "FragColor = color;", ], }).code; const program = new TgdProgram(context.gl, { vert, frag }); const vao = createVAO(context, program, options.flipY ? -1 : +1); this.program = program; this.vao = vao; this.name = options.name ?? `Mix/${this.name}`; } delete() { this.program.delete(); this.vao.delete(); } paint(_time, _delay) { const { program, vao, context, texture1, texture2, strength } = this; const { gl } = context; program.use(); program.uniform1f("uniZ", this.z); program.uniform1f("uniStrength", strength); texture1?.activate(0, program, "uniTexture1"); texture2?.activate(1, program, "uniTexture2"); vao.bind(); gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); vao.unbind(); } } function createVAO(context, program, flipY = +1) { const dataset = new TgdDataset({ attPoint: "vec2", attUV: "vec2", }); dataset.set("attPoint", new Float32Array([-1, -flipY, +1, -flipY, -1, +flipY, +1, +flipY])); dataset.set("attUV", new Float32Array([0, 0, 1, 0, 0, 1, 1, 1])); const vao = new TgdVertexArray(context.gl, program, [dataset]); if (!vao) throw new Error("Unable to create WebGL VAO!"); return vao; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BhaW50ZXIvbWl4L21peC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRXBELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFXekMsTUFBTSxPQUFPLGFBQWMsU0FBUSxVQUFVO0lBU3pDLFlBQ3FCLE9BQXVDLEVBQ3hELFVBQXlDLEVBQUU7UUFFM0MsS0FBSyxFQUFFLENBQUE7UUFIVSxZQUFPLEdBQVAsT0FBTyxDQUFnQztRQUl4RCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUE7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFBO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUE7UUFDdkMsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQTtRQUU5QixNQUFNLElBQUksR0FBRyxJQUFJLGVBQWUsQ0FBQztZQUM3QixVQUFVLEVBQUU7Z0JBQ1IsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLEtBQUssRUFBRSxNQUFNO2FBQ2hCO1lBQ0QsT0FBTyxFQUFFO2dCQUNMLEtBQUssRUFBRSxNQUFNO2FBQ2hCO1lBQ0QsUUFBUSxFQUFFO2dCQUNOLElBQUksRUFBRSxPQUFPO2FBQ2hCO1lBQ0QsUUFBUSxFQUFFLENBQUMsZ0JBQWdCLEVB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