@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
111 lines • 7.3 kB
JavaScript
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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