81 lines
2 KiB
TypeScript
81 lines
2 KiB
TypeScript
|
|
import { STRIDE, type Mesh } from "./Mesh"
|
||
|
|
|
||
|
|
type Corner = [number, number, number]
|
||
|
|
|
||
|
|
export namespace MeshBuilder {
|
||
|
|
export function quad(
|
||
|
|
mesh: Mesh,
|
||
|
|
a: Corner,
|
||
|
|
b: Corner,
|
||
|
|
c: Corner,
|
||
|
|
d: Corner,
|
||
|
|
uScale: number,
|
||
|
|
vScale: number,
|
||
|
|
): void {
|
||
|
|
const base = mesh.verts.length / STRIDE
|
||
|
|
mesh.verts.push(
|
||
|
|
a[0],
|
||
|
|
a[1],
|
||
|
|
a[2],
|
||
|
|
0,
|
||
|
|
0,
|
||
|
|
b[0],
|
||
|
|
b[1],
|
||
|
|
b[2],
|
||
|
|
uScale,
|
||
|
|
0,
|
||
|
|
c[0],
|
||
|
|
c[1],
|
||
|
|
c[2],
|
||
|
|
uScale,
|
||
|
|
vScale,
|
||
|
|
d[0],
|
||
|
|
d[1],
|
||
|
|
d[2],
|
||
|
|
0,
|
||
|
|
vScale,
|
||
|
|
)
|
||
|
|
mesh.indices.push(base, base + 1, base + 2, base, base + 2, base + 3)
|
||
|
|
}
|
||
|
|
|
||
|
|
export function slab(
|
||
|
|
mesh: Mesh,
|
||
|
|
x0: number,
|
||
|
|
x1: number,
|
||
|
|
z0: number,
|
||
|
|
z1: number,
|
||
|
|
y0: number,
|
||
|
|
y1: number,
|
||
|
|
tilesPerUnit: number,
|
||
|
|
): void {
|
||
|
|
const dx = (x1 - x0) * tilesPerUnit
|
||
|
|
const dz = (z1 - z0) * tilesPerUnit
|
||
|
|
const dy = (y1 - y0) * tilesPerUnit
|
||
|
|
quad(mesh, [x0, y1, z0], [x1, y1, z0], [x1, y1, z1], [x0, y1, z1], dx, dz)
|
||
|
|
quad(mesh, [x0, y0, z0], [x1, y0, z0], [x1, y1, z0], [x0, y1, z0], dx, dy)
|
||
|
|
quad(mesh, [x1, y0, z1], [x0, y0, z1], [x0, y1, z1], [x1, y1, z1], dx, dy)
|
||
|
|
quad(mesh, [x0, y0, z1], [x0, y0, z0], [x0, y1, z0], [x0, y1, z1], dz, dy)
|
||
|
|
quad(mesh, [x1, y0, z0], [x1, y0, z1], [x1, y1, z1], [x1, y1, z0], dz, dy)
|
||
|
|
}
|
||
|
|
|
||
|
|
export function box(
|
||
|
|
mesh: Mesh,
|
||
|
|
centerX: number,
|
||
|
|
centerZ: number,
|
||
|
|
half: number,
|
||
|
|
base: number,
|
||
|
|
height: number,
|
||
|
|
): void {
|
||
|
|
const x0 = centerX - half
|
||
|
|
const x1 = centerX + half
|
||
|
|
const z0 = centerZ - half
|
||
|
|
const z1 = centerZ + half
|
||
|
|
const y1 = base + height
|
||
|
|
quad(mesh, [x0, y1, z0], [x1, y1, z0], [x1, y1, z1], [x0, y1, z1], 1, 1)
|
||
|
|
quad(mesh, [x0, base, z0], [x1, base, z0], [x1, y1, z0], [x0, y1, z0], 1, 1)
|
||
|
|
quad(mesh, [x1, base, z1], [x0, base, z1], [x0, y1, z1], [x1, y1, z1], 1, 1)
|
||
|
|
quad(mesh, [x1, base, z0], [x1, base, z1], [x1, y1, z1], [x1, y1, z0], 1, 1)
|
||
|
|
quad(mesh, [x0, base, z1], [x0, base, z0], [x0, y1, z0], [x0, y1, z1], 1, 1)
|
||
|
|
}
|
||
|
|
}
|