geometry = {
const start = new Date();
const error = 0;
const martini = new Martini(gridSize);
const tile = martini.createTile(terrain);
const mesh = tile.getMesh(error);
const geometry = new THREE.BufferGeometry();
const vertices = new Float32Array((mesh.vertices.length / 2) * 3);
const terrainExaggeration = 1;
let index = 0;
for (let i = 0; i < mesh.vertices.length / 2; i++) {
let x = mesh.vertices[i * 2],
y = mesh.vertices[i * 2 + 1];
vertices[index++] = x * aequidistance[0] + bbox.minX;
vertices[index++] = y * aequidistance[1] + bbox.minY;
vertices[index++] = terrain[x * gridSize + y] * terrainExaggeration;
}
geometry.setAttribute("position", new THREE.BufferAttribute(vertices, 3));
geometry.setIndex(new THREE.BufferAttribute(mesh.triangles, 1));
geometry.computeVertexNormals();
geometry.computeBoundingBox();
let { min, max } = geometry.boundingBox;
let offset = new THREE.Vector2(0 - min.x, 0 - min.y);
let range = new THREE.Vector2(max.x - min.x, max.y - min.y);
const position = geometry.attributes.position;
const martiniEnd = new Date();
mutable martiniMS = martiniEnd - start;
const uvs = [];
for (let i = 0; i < position.count; i++) {
const v3 = new THREE.Vector3().fromBufferAttribute(position, i);
uvs.push((v3.x + offset.x) / range.x);
uvs.push((v3.y + offset.y) / range.y);
}
geometry.setAttribute(
"uv",
new THREE.BufferAttribute(new Float32Array(uvs), 2)
);
geometry.setAttribute(
"uv2",
new THREE.BufferAttribute(new Float32Array(uvs), 2)
);
geometry.attributes.uv.needsUpdate = true;
geometry.attributes.uv2.needsUpdate = true;
const end = new Date();
console.log("Calculating UVs", end - martiniEnd);
return geometry;
}