72 lines
2.3 KiB
TypeScript
72 lines
2.3 KiB
TypeScript
import { expect, test } from "bun:test"
|
|
import type { Texture } from "../engine/render/Texture"
|
|
import { buildLevel } from "../game/level"
|
|
import type { Textures } from "../game/textures"
|
|
|
|
const texture: Texture = { width: 1, height: 1, data: new Uint32Array([0xFFFFFFFF]) }
|
|
const textures: Textures = {
|
|
floor: texture,
|
|
grass: texture,
|
|
bark: texture,
|
|
birch: texture,
|
|
leaf: texture,
|
|
needle: texture,
|
|
rock: texture,
|
|
flower: texture,
|
|
wall: texture,
|
|
crate: texture,
|
|
npc: texture,
|
|
frog: texture,
|
|
bee: texture,
|
|
robin: texture,
|
|
skybox: texture,
|
|
}
|
|
|
|
test("game data compiles into a clone-safe engine render scene", () => {
|
|
const level = buildLevel(textures)
|
|
expect(level.actors).toHaveLength(60)
|
|
expect(Object.isFrozen(level.actors)).toBe(true)
|
|
expect(Object.isFrozen(level.render)).toBe(true)
|
|
expect(Object.isFrozen(level.render.prototypes)).toBe(true)
|
|
expect(level.render.prototypes).toHaveLength(3)
|
|
expect(level.render.maxInstances).toBe(level.actors.length)
|
|
expect(() => structuredClone(level.render)).not.toThrow()
|
|
})
|
|
|
|
test("actor prototype bounds cover local geometry", () => {
|
|
const level = buildLevel(textures)
|
|
for (const prototype of level.render.prototypes) {
|
|
let covered = true
|
|
for (const group of prototype.groups) {
|
|
const vertices = group.mesh.verts
|
|
for (let i = 0; i < vertices.length; i += 5) {
|
|
covered &&=
|
|
Math.abs(vertices[i]) <= prototype.radius + 1e-6 &&
|
|
vertices[i + 1] >= prototype.minY - 1e-6 &&
|
|
vertices[i + 1] <= prototype.maxY + 1e-6 &&
|
|
Math.abs(vertices[i + 2]) <= prototype.radius + 1e-6
|
|
}
|
|
}
|
|
expect(covered).toBe(true)
|
|
}
|
|
})
|
|
|
|
test("chunk bounds cover geometry in every LOD", () => {
|
|
const level = buildLevel(textures)
|
|
for (const chunk of level.render.chunks) {
|
|
let covered = true
|
|
for (const group of [...chunk.near, ...chunk.far]) {
|
|
const vertices = group.mesh.verts
|
|
for (let i = 0; i < vertices.length; i += 5) {
|
|
covered &&=
|
|
vertices[i] >= chunk.minX &&
|
|
vertices[i] <= chunk.maxX &&
|
|
vertices[i + 1] >= chunk.minY &&
|
|
vertices[i + 1] <= chunk.maxY &&
|
|
vertices[i + 2] >= chunk.minZ &&
|
|
vertices[i + 2] <= chunk.maxZ
|
|
}
|
|
}
|
|
expect(covered).toBe(true)
|
|
}
|
|
})
|