diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2018-10-31 14:24:38 +0100 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2018-10-31 14:24:38 +0100 |
commit | af04cbe3592656cf6981232550a460f1b10e2560 (patch) | |
tree | e39a0c01385d4aec6c8b85bf93b4555c33c63fc1 /src/view/tile.ts | |
parent | 272e37a4084526688cb4408d9e2b959f57c0d2c7 (diff) | |
download | rpgedit-af04cbe3592656cf6981232550a460f1b10e2560.tar rpgedit-af04cbe3592656cf6981232550a460f1b10e2560.zip |
view: refactor generic parts of MapView into a TileView
Diffstat (limited to 'src/view/tile.ts')
-rw-r--r-- | src/view/tile.ts | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/view/tile.ts b/src/view/tile.ts new file mode 100644 index 0000000..d748ec9 --- /dev/null +++ b/src/view/tile.ts @@ -0,0 +1,74 @@ +import Renderer from './renderer/Renderer'; + +export type TileCoords = [number, number, number, number]; + +export class TileViewBuilder { + private static pushTile(buf: number[], coords: TileCoords): void { + const [x1, y1, x2, y2] = coords; + + buf.push(x1); buf.push(y1); + buf.push(x2); buf.push(y1); + buf.push(x1); buf.push(y2); + + buf.push(x1); buf.push(y2); + buf.push(x2); buf.push(y1); + buf.push(x2); buf.push(y2); + } + + private readonly vertexData: number[] = []; + private readonly textureData: number[] = []; + + constructor(private readonly r: Renderer, private readonly texture: WebGLTexture) {} + + public addTile(vertexCoords: TileCoords, texCoords: TileCoords): void { + TileViewBuilder.pushTile(this.vertexData, vertexCoords); + TileViewBuilder.pushTile(this.textureData, texCoords); + } + + public build(): TileView { + return new TileView(this.r, this.texture, this.vertexData, this.textureData); + } +} + +export class TileView { + private readonly primitiveCount: number; + private readonly vertexBuffer: WebGLBuffer; + private readonly textureBuffer: WebGLBuffer; + + constructor( + private readonly r: Renderer, + private readonly texture: WebGLTexture, + vertexData: number[], + textureData: number[], + ) { + const gl = r.getContext(); + + this.vertexBuffer = r.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertexData), gl.STATIC_DRAW); + + this.textureBuffer = r.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, this.textureBuffer); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(textureData), gl.STATIC_DRAW); + + this.primitiveCount = vertexData.length / 3; + } + + public render(): void { + const gl = this.r.getContext(); + + gl.clear(gl.COLOR_BUFFER_BIT); + + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, this.texture); + gl.uniform1i(this.r.getSamplerLoc(), 0); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); + gl.vertexAttribPointer(this.r.getVertexPosLoc(), 2, gl.FLOAT, false, 0, 0); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.textureBuffer); + gl.vertexAttribPointer(this.r.getTextureCoordLoc(), 2, gl.FLOAT, false, 0, 0); + + gl.drawArrays(gl.TRIANGLES, 0, this.primitiveCount); + } +} |