68 lines
1.9 KiB
JavaScript
68 lines
1.9 KiB
JavaScript
import { Mesh, Node } from '../../mesh'
|
|
|
|
class Terrain extends Node {
|
|
constructor (pos, sWidth, sHeight) {
|
|
super(pos)
|
|
|
|
this.width = sWidth
|
|
this.height = sHeight
|
|
|
|
this.mesh = null
|
|
}
|
|
|
|
createMesh (gl, heightMap) {
|
|
let VERTICES = heightMap.size
|
|
let count = VERTICES * VERTICES
|
|
let vertices = new Array(count * 3)
|
|
let normals = new Array(count * 3)
|
|
let textureCoords = new Array(count * 2)
|
|
let indices = new Array(6 * (VERTICES - 1) * (VERTICES - 1))
|
|
let vertexPointer = 0
|
|
|
|
for (let i = 0; i < VERTICES; i++) {
|
|
for (let j = 0; j < VERTICES; j++) {
|
|
vertices[vertexPointer * 3] = j / (VERTICES - 1) * this.width
|
|
vertices[vertexPointer * 3 + 1] = heightMap.getHeight(j, i)
|
|
vertices[vertexPointer * 3 + 2] = i / (VERTICES - 1) * this.height
|
|
let normal = heightMap.getNormal(j, i)
|
|
normals[vertexPointer * 3] = normal[0]
|
|
normals[vertexPointer * 3 + 1] = normal[1]
|
|
normals[vertexPointer * 3 + 2] = normal[2]
|
|
textureCoords[vertexPointer * 2] = j / (VERTICES - 1)
|
|
textureCoords[vertexPointer * 2 + 1] = i / (VERTICES - 1)
|
|
vertexPointer++
|
|
}
|
|
}
|
|
|
|
let pointer = 0
|
|
for (let gz = 0; gz < VERTICES - 1; gz++) {
|
|
for (let gx = 0; gx < VERTICES - 1; gx++) {
|
|
let topLeft = (gz * VERTICES) + gx
|
|
let topRight = topLeft + 1
|
|
let bottomLeft = ((gz + 1) * VERTICES) + gx
|
|
let bottomRight = bottomLeft + 1
|
|
indices[pointer++] = topLeft
|
|
indices[pointer++] = bottomLeft
|
|
indices[pointer++] = topRight
|
|
indices[pointer++] = topRight
|
|
indices[pointer++] = bottomLeft
|
|
indices[pointer++] = bottomRight
|
|
}
|
|
}
|
|
|
|
this.mesh = Mesh.construct(gl, vertices, indices, textureCoords, normals)
|
|
}
|
|
|
|
setMaterial (mat) {
|
|
this.mesh.material = mat
|
|
}
|
|
|
|
draw (gl, shader) {
|
|
if (!this.mesh) return
|
|
super.draw(gl, shader)
|
|
this.mesh.draw(gl, shader)
|
|
}
|
|
}
|
|
|
|
export { Terrain }
|