perf: faster still

This commit is contained in:
Dan Finch 2026-08-04 19:12:09 +02:00
parent ef5029da1d
commit 67cd54fe33
8 changed files with 280 additions and 203 deletions

View file

@ -1,6 +1,6 @@
import { Color } from "../engine/render/Color"
import type { CloudLayer, SkyConfig } from "../engine/render/Sky"
import type { Mesh } from "../engine/scene/Mesh"
import { STRIDE, type Mesh } from "../engine/scene/Mesh"
import { Boulder } from "../engine/scene/Boulder"
import { Terrain } from "../engine/scene/Terrain"
import { Tree } from "../engine/scene/Tree"
@ -231,13 +231,17 @@ function bounds(meshes: Mesh[]): Pick<Chunk, "minX" | "minY" | "minZ" | "maxX" |
let maxY = -Infinity
let maxZ = -Infinity
for (const m of meshes) {
for (const v of m.vertices) {
minX = Math.min(minX, v.pos.x)
minY = Math.min(minY, v.pos.y)
minZ = Math.min(minZ, v.pos.z)
maxX = Math.max(maxX, v.pos.x)
maxY = Math.max(maxY, v.pos.y)
maxZ = Math.max(maxZ, v.pos.z)
const verts = m.verts
for (let i = 0; i < verts.length; i += STRIDE) {
const x = verts[i]
const y = verts[i + 1]
const z = verts[i + 2]
minX = Math.min(minX, x)
minY = Math.min(minY, y)
minZ = Math.min(minZ, z)
maxX = Math.max(maxX, x)
maxY = Math.max(maxY, y)
maxZ = Math.max(maxZ, z)
}
}
return maxX < minX ? null : { minX, minY, minZ, maxX, maxY, maxZ }
@ -310,7 +314,7 @@ function mulberry(seed: number): () => number {
}
function mesh(): Mesh {
return { vertices: [], indices: [] }
return { verts: [], indices: [] }
}
/** A perimeter wall collider: blocks from the sides, and `standable` so you can
@ -324,13 +328,8 @@ function wall(minX: number, maxX: number, minZ: number, maxZ: number): Aabb {
* needed -- texturing is perspective-correct, so a single quad looks right at
* any size. */
function quad(m: Mesh, a: Corner, b: Corner, c: Corner, d: Corner, us: number, vs: number): void {
const base = m.vertices.length
m.vertices.push(
{ pos: { x: a[0], y: a[1], z: a[2] }, uv: { x: 0, y: 0 } },
{ pos: { x: b[0], y: b[1], z: b[2] }, uv: { x: us, y: 0 } },
{ pos: { x: c[0], y: c[1], z: c[2] }, uv: { x: us, y: vs } },
{ pos: { x: d[0], y: d[1], z: d[2] }, uv: { x: 0, y: vs } },
)
const base = m.verts.length / STRIDE
m.verts.push(a[0], a[1], a[2], 0, 0, b[0], b[1], b[2], us, 0, c[0], c[1], c[2], us, vs, d[0], d[1], d[2], 0, vs)
m.indices.push(base, base + 1, base + 2, base, base + 2, base + 3)
}