UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

95 lines 7.55 kB
import { TgdTexture2D } from "./../../texture/index.js"; import { TgdPainter } from "../painter.js"; import { TgdDataset } from "./../../dataset/index.js"; import { TgdProgram } from "./../../program/index.js"; import { TgdVertexArray } from "./../../vao/index.js"; import { tgdCanvasCreateGradientHorizontal } from "./../../utils/index.js"; import { tgdColorMakeHueWheel } from "./../../color/index.js"; import { TgdShaderFragment, TgdShaderVertex } from "./../../shader/index.js"; export class TgdPainterLines extends TgdPainter { constructor(context, options) { super(); this.context = context; /** * V coord on the texture. * * It allows you to change the color palette * by selecting a line in the texture. */ this.v = 0; this.dataPoint = options.dataPoint; if ((this.dataPoint.length & 3) !== 0) { throw new Error("dataPoint must have a length that is an integral multiple of 4: [x, y, z, radius, ...]!"); } if (options.texture) { this.texture = options.texture; this.textureMustBeDeleted = false; } else { this.texture = new TgdTexture2D(context).loadBitmap(tgdCanvasCreateGradientHorizontal(128, tgdColorMakeHueWheel({ luminance: 90 }))); this.textureMustBeDeleted = true; } this.count = this.dataPoint.length >> 2; this.dataset = this.createDataset(); this.program = this.createProgram(); this.vao = new TgdVertexArray(context.gl, this.program, [this.dataset]); } delete() { if (this.textureMustBeDeleted) this.texture.delete(); this.program.delete(); this.vao.delete(); } paint() { const { context, program, vao, texture, count } = this; const { gl, camera } = context; program.use(); texture.activate(0, program, "uniTexture"); program.uniform1f("uniV", this.v); program.uniformMatrix4fv("uniModelViewMatrix", camera.matrixModelView); program.uniformMatrix4fv("uniProjectionMatrix", camera.matrixProjection); vao.bind(); gl.drawArrays(gl.LINES, 0, count); vao.unbind(); } createDataset() { const dataset = new TgdDataset({ attPoint: "vec4", }); dataset.set("attPoint", this.dataPoint); return dataset; } createProgram() { const vert = new TgdShaderVertex({ uniforms: { uniV: "float", uniModelViewMatrix: "mat4", uniProjectionMatrix: "mat4", }, attributes: { attPoint: "vec4", }, varying: { varUV: "vec2", }, mainCode: [ "varUV = vec2(attPoint.w, uniV);", "vec4 point = vec4(attPoint.xyz, 1.0);", "gl_Position = uniProjectionMatrix * uniModelViewMatrix * point;", ], }).code; const frag = new TgdShaderFragment({ uniforms: { uniTexture: "sampler2D", }, varying: { varUV: "vec2", }, outputs: { FragColor: "vec4" }, mainCode: ["vec4 color = texture(uniTexture, varUV);", "FragColor = color;"], }).code; const program = new TgdProgram(this.context.gl, { vert, frag }); return program; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGFpbnRlci9saW5lcy9saW5lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDdkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFekMsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQzlELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBV2hFLE1BQU0sT0FBTyxlQUFnQixTQUFRLFVBQVU7SUFpQjNDLFlBQ29CLE9BQW1CLEVBQ25DLE9BQStCO1FBRS9CLEtBQUssRUFBRSxDQUFBO1FBSFMsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQWZ2Qzs7Ozs7V0FLRztRQUNJLE1BQUMsR0FBRyxDQUFDLENBQUE7UUFhUixJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUE7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMseUZBQXlGLENBQUMsQ0FBQTtRQUM5RyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFBO1lBQzlCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUE7UUFDckMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FDL0MsaUNBQWlDLENBQUMsR0FBRyxFQUFFLG9CQUFvQixDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FDbEYsQ0FBQTtZQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUE7UUFDcEMsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFBO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ25DLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ25DLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFDM0UsQ0FBQztJQUVELE1BQU07UUFDRixJQUFJLElBQUksQ0FBQyxvQkFBb0I7WUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUNyQixDQUFDO0lBRUQsS0FBSztRQUNELE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFBO1FBQ3RELE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFBO1FBQzlCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUNiLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQTtRQUMxQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDakMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUN0RSxPQUFPLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDeEUsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ1YsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUNqQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUE7SUFDaEIsQ0FBQztJQUVPLGFBQWE7UUFDakIsTUFBTSxPQUFPLEdBQUcsSUFBSSxVQUFVLENBQUM7WUFDM0IsUUFBUSxFQUFFLE1BQU07U0FDbkIsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3ZDLE9BQU8sT0FBTyxDQUFBO0lBQ2xCLENBQUM7SUFFTyxhQUFhO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLElBQUksZUFBZSxDQUFDO1lBQzdCLFFBQVEsRUFBRTtnQkFDTixJQUFJLEVBQUUsT0FBTztnQkFDYixrQkFBa0IsRUFBRSxNQUFNO2dCQUMxQixtQkFBbUIsRUFBRSxNQUFNO2FBQzlCO1lBQ0QsVUFBVSxFQUFFO2dCQUNSLFFBQVEsRUFBRSxNQUFNO2FBQ25CO1lBQ0QsT0FBTyxFQUFFO2dCQUNMLEtBQUssRUFBRSxNQUFNO2FBQ2hCO1lBQ0QsUUFBUSxFQUFFO2dCQUNOLGlDQUFpQztnQkFDakMsdUNBQXVDO2dCQUN2QyxpRUFBaUU7YUFDcEU7U0FDSixDQUFDLENBQUMsSUFBSSxDQUFBO1FBQ1AsTUFBTSxJQUFJLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQztZQUMvQixRQUFRLEVBQUU7Z0JBQ04sVUFBVSxFQUFFLFdBQVc7YUFDMUI7WUFDRCxPQUFPLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLE1BQU07YUFDaEI7WUFDRCxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFO1lBQzlCLFFBQVEsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLG9CQUFvQixDQUFDO1NBQy9FLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFDUCxNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQy9ELE9BQU8sT0FBTyxDQUFBO0lBQ2xCLENBQUM7Q0FDSiJ9