UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

111 lines 7.3 kB
import { TgdVec4 } from "./../../math/index.js"; import { TgdPainter } from "./../painter.js"; import { TgdPainterProgram } from "./../program.js"; import { TgdUniformBufferObject } from "./../../uniform/index.js"; import { ensureTgdVec4 } from "./../../utils/index.js"; export class PainterSprite extends TgdPainter { constructor(context, { texture, atlas = [ { x: 0, y: 0, width: 1, height: 1, }, ], index = 0, color, }) { super(); this._index = -1; this._color = new TgdVec4(); this.uniUV = new TgdVec4(); const uniformBlock = (this.uniformBlock = new TgdUniformBufferObject(context, { uniforms: { uniUV: "vec4", uniColor: "vec4", }, })); // prettier-ignore const attPos = [ +1, -1, +1, +1, -1, -1, -1, +1 ]; // prettier-ignore const attUV = [ 1, 1, 1, 0, 0, 1, 0, 0 ]; this.program = new TgdPainterProgram(context, { drawMode: "TRIANGLE_STRIP", state: { depth: "off", cull: "off", blend: "off", }, textures: { uniTexture: texture, }, uniforms: { uniformBlock }, dataset: { attribs: { attPos: { type: "vec2", data: new Float32Array(attPos), }, attUV: { type: "vec2", data: new Float32Array(attUV), }, }, }, varying: { varUV: "vec2", }, vert: { mainCode: ["varUV = attUV * uniUV.zw + uniUV.xy;", "gl_Position = vec4(attPos, 0.0, 1.0);"], }, frag: { mainCode: [ "vec4 color = texture(uniTexture, varUV);", `if (color.a < ${2 / 0xff}) discard;`, "FragColor = uniColor * color;", ], }, }); this.atlas = atlas; this.index = index; this.color = ensureTgdVec4(color, new TgdVec4(1, 1, 1, 1)); } get index() { return this._index; } set index(index) { if (this._index === index) return; this._index = index; const { x, y, width, height } = this.atlas[index] ?? { x: 0, y: 0, width: 0, height: 0 }; this.uniUV.x = x; this.uniUV.y = y; this.uniUV.z = width; this.uniUV.w = height; this.uniUV.debug(); this.uniformBlock.values.uniUV = this.uniUV; } get color() { return this._color; } set color(color) { if (this._color === color) return; this._color = color; this.uniformBlock.values.uniColor = color; } delete() { this.program.delete(); } paint(time, delta) { this.program.paint(time, delta); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ByaXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BhaW50ZXIvaWNvbi9zcHJpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFJeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFRMUMsTUFBTSxPQUFPLGFBQWMsU0FBUSxVQUFVO0lBUXpDLFlBQ0ksT0FBbUIsRUFDbkIsRUFDSSxPQUFPLEVBQ1AsS0FBSyxHQUFHO1FBQ0o7WUFDSSxDQUFDLEVBQUUsQ0FBQztZQUNKLENBQUMsRUFBRSxDQUFDO1lBQ0osS0FBSyxFQUFFLENBQUM7WUFDUixNQUFNLEVBQUUsQ0FBQztTQUNaO0tBQ0osRUFDRCxLQUFLLEdBQUcsQ0FBQyxFQUNULEtBQUssR0FDYztRQUV2QixLQUFLLEVBQUUsQ0FBQTtRQXBCSCxXQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDWCxXQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtRQUNiLFVBQUssR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO1FBbUJsQyxNQUFNLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxPQUFPLEVBQUU7WUFDMUUsUUFBUSxFQUFFO2dCQUNOLEtBQUssRUFBRSxNQUFNO2dCQUNiLFFBQVEsRUFBRSxNQUFNO2FBQ25CO1NBQ0osQ0FBQyxDQUFDLENBQUE7UUFDSCxrQkFBa0I7UUFDbEIsTUFBTSxNQUFNLEdBQUc7WUFDWCxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDTixDQUFDLENBQUMs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