@adatechnology/game-destruction-three 0.7.3 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/index.d.ts +18 -2
- package/dist/index.global.js +550 -145
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +282 -49
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/renderer.ts","../src/math.ts","../src/fragments.ts","../src/ground.ts","../src/pieces.ts","../src/rebar.ts","../src/spec.ts","../src/heat.ts","../src/visual.ts","../src/audio/recipes.ts","../src/audio/sound.ts"],"sourcesContent":["import type * as THREE_NS from 'three'\nimport type { DebrisKind, DestructionEvent, Fragment, MaterialDef, PartSpec, Vec3 } from '@adatechnology/game-destruction'\nimport { createVfx, effectForEvent, EVENT_EFFECTS_MAP } from '@adatechnology/game-vfx'\nimport type { GameEvent } from '@adatechnology/game-vfx'\nimport type { VfxWorld } from '@adatechnology/game-vfx'\nimport { createVfxRenderer } from '@adatechnology/game-vfx-three'\nimport type { VfxRenderer } from '@adatechnology/game-vfx-three'\nimport { FragmentSystem } from './fragments'\nimport { GroundSpots } from './ground'\nimport type { Bound, HostVis, MeshVis, PartVis, PieceBody } from './internal'\nimport { clamp, createRng, hashNumbers, hashString, mixHex } from './math'\nimport { PieceSystem } from './pieces'\nimport { RebarCages } from './rebar'\nimport { partHintOf } from './spec'\nimport type { DestructionRenderer, BindOptions, ExplodeOptions, Mesh, MeshRange, Object3D, Piece, RendererOptions, ThreeNamespace } from './types'\nimport { Visuals } from './visual'\n\nlet rendererCount = 0\nconst IMPACT_TAGS = ['metal', 'glass', 'wood'] as const\n\ntype Ev<T extends DestructionEvent['type']> = Extract<DestructionEvent, { type: T }>\n\nconst GLOW_FROM_C = 430\nconst QUEUE_CAP = 4000\n/** A part's fire lasts until the part stops burning (`stopFire`); this is only the ceiling the effects world needs. */\nconst FIRE_CEILING_SECONDS = 3600\n/** The `generic` explosion is the M67's (15 m injury radius): a blast with no effect id of its own scales with its radius. */\nconst GENERIC_REFERENCE_RADIUS = 15\n/** The small flame of a part that a bullet or fire primed: it burns until the part goes off. */\nconst PRIMED_FIRE_RADIUS = 0.2\n\ninterface FireEmitter {\n object: string\n part: string\n point: Vec3\n /** The burning part's position, moved every frame; the effects world's fire follows it. */\n follow: { x: number; y: number; z: number }\n /** Handle of the fire in the effects world, once the part's box is known. */\n handle?: number\n}\n\ninterface Leak {\n object: string\n part: string\n fluid: string\n point: Vec3\n direction: Vec3\n rate: number\n pressurized: boolean\n acc: number\n}\n\nconst FLUID_COLORS: Record<string, number> = {\n water: 0x8cc8ff,\n fuel: 0xd9a032,\n oil: 0x2a2018,\n gas: 0xf2f2f2,\n sap: 0xb89b3a,\n acid: 0x9bd23c,\n blood: 0x8a0a0a,\n}\nconst SMOKE_TONES: Record<string, number> = { white: 0xe6e6e6, grey: 0x8a8a8a, black: 0x2a2a2a }\n\nconst DEFAULT_SPEED: Record<string, number> = {\n sparks: 3,\n splinters: 2.5,\n dust: 1,\n shards: 2.5,\n fibers: 1.2,\n leaves: 1.2,\n drips: 0.5,\n ash: 0.8,\n chips: 2.5,\n smoke: 0.8,\n steam: 1,\n fire: 1.2,\n flash: 0,\n foam: 2.5,\n}\n\n/** Sound key for an impact on a material. */\nfunction impactKey(def: MaterialDef | undefined): string {\n if (!def) return 'impact_wood'\n const tags = def.tags ?? []\n if (tags.includes('metal')) return 'impact_metal'\n if (def.visual?.transparent || def.fracture === 'shatter') return 'impact_glass'\n if (def.fracture === 'crumble') return 'impact_masonry'\n if (def.fracture === 'tear') return 'impact_soft'\n return def.fracture === 'none' ? 'impact_metal' : 'impact_wood'\n}\n\nfunction fractureKey(def: MaterialDef | undefined, style: string): string {\n switch (style) {\n case 'shatter':\n return 'shatter_glass'\n case 'crumble':\n return 'crumble'\n case 'splinter':\n return 'splinter'\n default:\n return impactKey(def)\n }\n}\n\nfunction fallbackColor(id: string, def: MaterialDef | undefined): number {\n if (def?.tags?.includes('metal')) return 0x8a8f96\n if (def?.visual?.transparent) return 0x9fd0e0\n const h = hashString(id)\n return mixHex(0x6b5a48, 0x9a9488, (h % 100) / 100)\n}\n\nfunction materialsOf(m: THREE_NS.Material | THREE_NS.Material[]): THREE_NS.Material[] {\n return Array.isArray(m) ? m : [m]\n}\n\nfunction isMeshRange(v: Object3D | MeshRange): v is MeshRange {\n const r = v as Partial<MeshRange>\n return !!r.mesh && Array.isArray(r.range)\n}\n\n/** Create the renderer. See `DestructionRenderer`. */\nexport function createDestructionRenderer(THREE: ThreeNamespace, options: RendererOptions): DestructionRenderer {\n return new Renderer(THREE, options)\n}\n\nclass Renderer implements DestructionRenderer {\n private readonly world: RendererOptions['world']\n private readonly scene: THREE_NS.Scene\n private readonly quality: 'low' | 'medium' | 'high'\n private readonly low: boolean\n private readonly groundAt: (x: number, z: number) => number\n private readonly gravity: number\n private readonly autoSplit: boolean\n private readonly maxFragments: number\n private readonly bounds = new Map<string, Bound>()\n private readonly queue: DestructionEvent[] = []\n private readonly unsubscribe: () => void\n private readonly visuals: Visuals\n private readonly fragments: FragmentSystem\n private readonly ground: GroundSpots\n private readonly pieceSys: PieceSystem\n private readonly cages: RebarCages\n private readonly active = new Map<string, { object: string; part: string }>()\n private readonly fires = new Map<string, FireEmitter>()\n /** Primed parts burning in the effects world until they go off: their burn loop ends when they are put out. */\n private readonly primedBurning = new Set<string>()\n private readonly leaks: Leak[] = []\n private readonly homeTags: string[] = []\n private readonly throttles = new Map<string, number>()\n private readonly rng = createRng(0xc0ffee)\n private readonly vfx: VfxWorld\n /** Names this renderer to the world's drips, so a shared world tells each renderer where its own landed. */\n private readonly owner = `destruction-${++rendererCount}`\n private readonly stopLanding: () => void\n /** The effects renderer made here when the host gave no shared world; it is stepped in `update`. */\n private readonly ownVfx: VfxRenderer | undefined\n private time = 0\n private scanTimer = 0\n private disposed = false\n private readonly box: THREE_NS.Box3\n private readonly tmpQ: THREE_NS.Quaternion\n private readonly v1: THREE_NS.Vector3\n private readonly v2: THREE_NS.Vector3\n\n constructor(\n private readonly THREE: ThreeNamespace,\n private readonly o: RendererOptions,\n ) {\n this.world = o.world\n this.scene = o.scene\n this.quality = o.quality ?? 'medium'\n this.low = this.quality === 'low'\n this.groundAt = o.groundAt ?? (() => 0)\n this.gravity = o.gravity ?? 9.81\n this.autoSplit = o.autoSplit !== false\n this.maxFragments = o.maxFragments ?? 160\n this.box = new THREE.Box3()\n this.tmpQ = new THREE.Quaternion()\n this.v1 = new THREE.Vector3()\n this.v2 = new THREE.Vector3()\n const maxParticles = Math.max(8, Math.floor((o.maxParticles ?? 2500) * (this.low ? 0.5 : 1)))\n this.visuals = new Visuals(THREE, this.low, 600)\n this.ground = new GroundSpots(THREE, o.scene, this.groundAt, 48)\n this.vfx = o.vfx ?? createVfx({ profile: this.quality, gravity: this.gravity, groundAt: this.groundAt, sprites: { capacity: maxParticles, density: this.low ? 0.6 : 1 } })\n this.ownVfx = o.vfx ? undefined : createVfxRenderer(THREE, { scene: o.scene, camera: o.camera ?? new THREE.PerspectiveCamera(), vfx: this.vfx, pointScale: o.pointScale ?? 700 })\n this.stopLanding = this.vfx.onLand(this.owner, (x, _y, z, color, tag) => {\n const home = this.homeTags[tag - 1] ?? ''\n this.ground.add('puddle', x, z, 0.05 + this.rng() * 0.04, color, home)\n })\n this.fragments = new FragmentSystem(THREE, {\n scene: o.scene,\n groundAt: this.groundAt,\n gravity: this.gravity,\n max: this.maxFragments,\n life: o.fragmentLife ?? 12,\n })\n this.cages = new RebarCages(THREE, o.scene)\n this.pieceSys = new PieceSystem(THREE, {\n groundAt: this.groundAt,\n gravity: this.gravity,\n scene: o.scene,\n onHardLanding: (p, point, speed) => this.hardLanding(p, point, speed),\n })\n this.unsubscribe = this.world.on('*', (ev) => {\n if (this.queue.length < QUEUE_CAP) this.queue.push(ev)\n })\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Binding\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n bind(objectId: string, root: Object3D, options: BindOptions = {}): void {\n if (this.bounds.has(objectId)) this.unbind(objectId)\n const state = this.world.state(objectId)\n const partIds = new Set((state?.parts ?? []).map((p) => p.id))\n const byPart = new Map<string, Array<{ mesh: Mesh; range?: [number, number] }>>()\n const taken = new Set<Mesh>()\n const put = (pid: string, e: { mesh: Mesh; range?: [number, number] }): void => {\n const l = byPart.get(pid)\n if (l) l.push(e)\n else byPart.set(pid, [e])\n }\n const add = (pid: string, m: Mesh): void => {\n if (taken.has(m)) return\n taken.add(m)\n put(pid, { mesh: m })\n }\n const addRange = (pid: string, r: MeshRange): void => {\n const n = (r.mesh.geometry.getAttribute('position')?.count ?? 0) as number\n const [v0, v1] = r.range\n if (!Number.isInteger(v0) || !Number.isInteger(v1) || v0 < 0 || v1 <= v0 || v1 > n) {\n throw new Error(`game-destruction-three: invalid vertex range [${v0}, ${v1}) for part \"${pid}\" (the mesh has ${n} vertices)`)\n }\n put(pid, { mesh: r.mesh, range: [v0, v1] })\n }\n const meshesIn = (o: Object3D): Mesh[] => {\n const out: Mesh[] = []\n o.traverse((c) => {\n if ((c as Mesh).isMesh) out.push(c as Mesh)\n })\n return out\n }\n if (options.parts) {\n for (const [pid, v] of Object.entries(options.parts)) {\n for (const o of Array.isArray(v) ? v : [v]) {\n if (isMeshRange(o)) addRange(pid, o)\n else for (const m of meshesIn(o)) add(pid, m)\n }\n }\n } else {\n const leftovers: Mesh[] = []\n for (const m of meshesIn(root)) {\n const ud = partHintOf(m.userData?.destructionPart)?.id\n if (ud !== undefined && partIds.has(ud)) add(ud, m)\n else if (partIds.has(m.name)) add(m.name, m)\n else leftovers.push(m)\n }\n if (leftovers.length) this.matchByBox(objectId, root, leftovers, add)\n }\n const bound: Bound = { id: objectId, root, sync: options.syncTransform !== false, parts: new Map(), lastPos: null, lastQuat: null, piece: null, isSplit: false }\n const hosts = new Map<Mesh, HostVis>()\n for (const pid of partIds) bound.parts.set(pid, this.makePartVis(objectId, pid, state?.parts.find((p) => p.id === pid)?.material ?? '', byPart.get(pid) ?? [], hosts))\n for (const [pid, meshes] of byPart) {\n if (!bound.parts.has(pid)) bound.parts.set(pid, this.makePartVis(objectId, pid, this.world.part(objectId, pid)?.material ?? '', meshes, hosts))\n }\n this.bounds.set(objectId, bound)\n }\n\n private makePartVis(home: string, id: string, material: string, meshes: Array<{ mesh: Mesh; range?: [number, number] }>, hosts: Map<Mesh, HostVis>): PartVis {\n return { id, home, material, meshes: meshes.map((m) => this.visuals.makeMeshVis(m.mesh, home, m.range, hosts)), charApplied: 0, glowApplied: 0, meltApplied: 0, gone: 'none' }\n }\n\n /** Match unlabelled meshes to the part whose shape contains the centre of the mesh's bounding box. */\n private matchByBox(objectId: string, root: Object3D, meshes: Mesh[], add: (pid: string, m: Mesh) => void): void {\n let specParts: PartSpec[] | undefined\n try {\n specParts = this.world.serialize?.().objects.find((o) => o.id === objectId)?.spec.parts\n } catch {\n specParts = undefined\n }\n if (!specParts) return\n root.updateMatrixWorld(true)\n const e = new this.THREE.Euler()\n const q = new this.THREE.Quaternion()\n for (const m of meshes) {\n this.box.setFromObject(m)\n if (this.box.isEmpty()) continue\n const c = root.worldToLocal(this.box.getCenter(this.v1))\n let best: PartSpec | null = null\n let bestVol = Infinity\n for (const p of specParts) {\n const l = this.v2.set(c.x - p.position[0], c.y - p.position[1], c.z - p.position[2])\n if (p.rotation) l.applyQuaternion(q.setFromEuler(e.set(p.rotation[0], p.rotation[1], p.rotation[2], 'XYZ')).invert())\n let inside = false\n let vol = 0\n const s = p.shape\n if (s.kind === 'box') {\n inside = Math.abs(l.x) <= s.size[0] / 2 && Math.abs(l.y) <= s.size[1] / 2 && Math.abs(l.z) <= s.size[2] / 2\n vol = s.size[0] * s.size[1] * s.size[2]\n } else if (s.kind === 'cylinder') {\n inside = Math.hypot(l.x, l.z) <= s.radius && Math.abs(l.y) <= s.height / 2\n vol = Math.PI * s.radius * s.radius * s.height\n } else {\n inside = l.length() <= s.radius\n vol = (4 / 3) * Math.PI * s.radius ** 3\n }\n if (inside && vol < bestVol) {\n best = p\n bestVol = vol\n }\n }\n if (best) add(best.id, m)\n }\n }\n\n unbind(objectId: string): void {\n const b = this.bounds.get(objectId)\n if (!b) return\n this.restore(objectId)\n this.pieceSys.remove(objectId)\n this.bounds.delete(objectId)\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Pieces\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n /** Half extents and centre of the box around some meshes, in the local space of `root`. */\n private measure(root: Object3D, meshes: MeshVis[]): { half: Vec3; center: THREE_NS.Vector3 } {\n root.updateMatrixWorld(true)\n const inv = root.matrixWorld.clone().invert()\n const total = new this.THREE.Box3()\n const m4 = new this.THREE.Matrix4()\n const lb = new this.THREE.Box3()\n for (const mv of meshes) {\n const m = mv.mesh\n m.updateWorldMatrix(true, false)\n this.visuals.localBox(mv, lb)\n if (lb.isEmpty()) continue\n total.union(lb.clone().applyMatrix4(m4.multiplyMatrices(inv, m.matrixWorld)))\n }\n if (total.isEmpty()) return { half: [0.25, 0.25, 0.25], center: new this.THREE.Vector3() }\n const size = total.getSize(new this.THREE.Vector3())\n return { half: [Math.max(0.02, size.x / 2), Math.max(0.02, size.y / 2), Math.max(0.02, size.z / 2)], center: total.getCenter(new this.THREE.Vector3()) }\n }\n\n private meshesOf(b: Bound): MeshVis[] {\n const out: MeshVis[] = []\n for (const pv of b.parts.values()) if (pv.gone === 'none') for (const mv of pv.meshes) out.push(mv)\n return out\n }\n\n private massOf(objectId: string): number {\n const st = this.world.state(objectId)\n if (!st) return 5\n let m = 0\n for (const p of st.parts) if (p.status !== 'broken' && p.status !== 'melted' && p.status !== 'ashes') m += p.mass\n return m > 0 ? m : 5\n }\n\n makePiece(objectId: string, options: { mass?: number; velocity?: Vec3 } = {}): Piece {\n const b = this.bounds.get(objectId)\n if (!b) throw new Error(`game-destruction-three: object \"${objectId}\" is not bound`)\n if (b.root.parent && b.root.parent !== this.scene) this.scene.attach(b.root)\n const { half, center } = this.measure(b.root, this.meshesOf(b))\n const piece = this.pieceSys.create(objectId, b.root, half, center, options.mass ?? this.massOf(objectId), options.velocity)\n b.piece = piece\n return piece\n }\n\n pieces(): Piece[] {\n return [...this.pieceSys.list]\n }\n\n piece(objectId: string): Piece | null {\n return this.pieceSys.get(objectId)\n }\n\n impulse(objectId: string, impulse: Vec3, point?: Vec3): void {\n const p = this.pieceSys.get(objectId)\n if (p) this.pieceSys.impulse(p, impulse, point)\n }\n\n private hardLanding(p: PieceBody, point: Vec3, speed: number): void {\n const key = this.impactSoundOf(p.objectId)\n this.sound(key, point, clamp(speed / 10, 0.2, 1))\n // the piece just moved this frame: the world must know where it is before the hit is resolved against its parts\n this.syncBound(p.objectId)\n try {\n this.world.hit(p.objectId, { type: 'blunt', point, energy: 0.5 * p.mass * speed * speed, radius: 0.08, direction: [0, -1, 0], source: 'fall' })\n } catch {\n // the object may have been removed from the world\n }\n }\n\n private impactSoundOf(objectId: string): string {\n const st = this.world.state(objectId)\n let best: MaterialDef | undefined\n let mass = -1\n for (const p of st?.parts ?? []) {\n if (p.mass > mass) {\n mass = p.mass\n best = this.world.materials.get(p.material)\n }\n }\n return impactKey(best)\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Update\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n update(dt: number): void {\n if (this.disposed) return\n dt = clamp(dt, 0, 0.1)\n this.time += dt\n this.drainQueue()\n this.updateActive(dt)\n this.updateLeaks(dt)\n this.pieceSys.update(dt)\n this.fragments.update(dt)\n this.ground.update(dt)\n this.ownVfx?.update(dt)\n this.syncTransforms()\n }\n\n private drainQueue(): void {\n // events produced while applying (a hard landing calls `hit`) wait for the next frame\n const batch = this.queue.splice(0, this.queue.length)\n for (const ev of batch) {\n try {\n this.apply(ev)\n } catch (err) {\n if (typeof console !== 'undefined') console.error('game-destruction-three: failed to apply', ev.type, err)\n }\n }\n }\n\n private syncTransforms(): void {\n for (const b of this.bounds.values()) this.syncOne(b)\n }\n\n /** Push the current transform of one bound object to the world right now (used before a landing hit). */\n private syncBound(objectId: string): void {\n const b = this.bounds.get(objectId)\n if (b) this.syncOne(b)\n }\n\n private syncOne(b: Bound): void {\n if (!b.sync) return\n const p = this.v1\n const q = this.tmpQ\n b.root.updateWorldMatrix(true, false)\n b.root.matrixWorld.decompose(p, q, this.v2)\n const last = b.lastPos\n const lq = b.lastQuat\n const moved = !last || !lq || Math.abs(p.x - last[0]) + Math.abs(p.y - last[1]) + Math.abs(p.z - last[2]) > 1e-5 || Math.abs(q.x - lq[0]) + Math.abs(q.y - lq[1]) + Math.abs(q.z - lq[2]) + Math.abs(q.w - lq[3]) > 1e-6\n if (!moved) return\n b.lastPos = [p.x, p.y, p.z]\n b.lastQuat = [q.x, q.y, q.z, q.w]\n if (this.world.has(b.id)) this.world.setTransform(b.id, [p.x, p.y, p.z], [q.x, q.y, q.z, q.w])\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Events\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n private apply(ev: DestructionEvent): void {\n switch (ev.type) {\n case 'damage':\n if (ev.damageType === 'heat' || ev.damageType === 'fire' || ev.damageType === 'explosive') this.activate(ev.object, ev.part)\n break\n case 'dent':\n this.onDent(ev)\n break\n case 'hole':\n this.onHole(ev)\n break\n case 'crack':\n this.onCrack(ev)\n break\n case 'ricochet': {\n const d = ev.direction\n this.vfx.burst('sparks', ev.point, d, 4 + Math.min(10, ev.energy / 150), 4)\n this.sound('ricochet', ev.point, 0.7)\n break\n }\n case 'debris':\n this.vfx.burst(ev.kind, ev.point, ev.normal, ev.count, ev.speed > 0 ? ev.speed : DEFAULT_SPEED[ev.kind] ?? 1, this.debrisOptions(ev.kind, ev.object, ev.part))\n break\n case 'fracture':\n this.onFracture(ev)\n break\n case 'detach':\n this.onDetach(ev)\n break\n case 'collapse':\n this.splitLoose(ev.object)\n this.playEvent({ kind: 'collapse' }, this.rootPoint(ev.object))\n break\n case 'disassemble_progress': {\n const k = `unscrew:${ev.joint}`\n if (this.time - (this.throttles.get(k) ?? -1) > 0.25) {\n this.throttles.set(k, this.time)\n this.sound('unscrew', this.rootPoint(ev.object), clamp(0.3 + ev.progress * 0.5, 0, 1))\n }\n break\n }\n case 'ignite':\n this.startFire(ev)\n this.activate(ev.object, ev.part)\n this.sound('ignite', ev.point, 0.7)\n this.sound('burn_loop', ev.point, 0.5)\n break\n case 'primed':\n // a bullet or fire sets the part burning until its delay runs out; a blast nearby only waits for the explosion\n if (ev.trigger !== 'explosion') {\n this.vfx.fire({ point: ev.point, radius: PRIMED_FIRE_RADIUS, life: ev.delay })\n this.primedBurning.add(`${ev.object}|${ev.part}`)\n this.activate(ev.object, ev.part)\n this.sound('ignite', ev.point, 0.7)\n this.sound('burn_loop', ev.point, 0.5)\n }\n break\n case 'spall':\n this.onSpall(ev)\n break\n case 'stage':\n this.onStage(ev)\n break\n case 'expose':\n this.cages.set(`${ev.object}|${ev.part}`, ev.bars)\n if (ev.bars.length > 0) {\n const [a, b] = ev.bars[0] as [Vec3, Vec3]\n this.playEvent({ kind: 'expose' }, [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2])\n }\n break\n case 'extinguish': {\n const f = this.fires.get(`${ev.object}|${ev.part}`)\n const primed = this.primedBurning.delete(`${ev.object}|${ev.part}`)\n if (f) {\n this.stopFire(`${ev.object}|${ev.part}`)\n this.vfx.burst('steam', f.point, [0, 1, 0], 14, 1.2)\n }\n if (f || primed) this.sound('burn_end', f?.point ?? this.rootPoint(ev.object), 0.5)\n this.activate(ev.object, ev.part)\n this.sound('extinguish', f?.point ?? this.rootPoint(ev.object), 0.6)\n break\n }\n case 'burnout': {\n this.stopFire(`${ev.object}|${ev.part}`)\n this.primedBurning.delete(`${ev.object}|${ev.part}`)\n this.sound('burn_end', ev.point, 0.5)\n this.vfx.burst('ash', ev.point, [0, 1, 0], 16, 1)\n this.vfx.burst('smoke', ev.point, [0, 1, 0], 6, 0.8, { color: SMOKE_TONES.grey })\n const pv = this.partVis(ev.object, ev.part)\n if (pv) {\n const def = this.world.materials.get(pv.material)\n this.visuals.setChar(pv, 1, def?.visual?.charColor ?? 0x1a1410)\n }\n this.activate(ev.object, ev.part)\n break\n }\n case 'melt':\n this.activate(ev.object, ev.part)\n if (this.time - (this.throttles.get(`melt:${ev.object}|${ev.part}`) ?? -9) > 1.5) {\n this.throttles.set(`melt:${ev.object}|${ev.part}`, this.time)\n this.sound('melt_sizzle', this.rootPoint(ev.object), 0.4)\n }\n break\n case 'drip': {\n const b = this.bounds.get(ev.object)\n const pv = b?.parts.get(ev.part)\n const def = this.world.materials.get(ev.material)\n const color = (pv && this.partColor(pv, def)) ?? fallbackColor(ev.material, def)\n let tag = this.homeTags.indexOf(ev.object) + 1\n if (tag === 0) tag = this.homeTags.push(ev.object)\n this.vfx.spawn('drips', ev.point, [(this.rng() - 0.5) * 0.1, -0.1, (this.rng() - 0.5) * 0.1], { color, tag, owner: this.owner })\n break\n }\n case 'leak': {\n const key = `${ev.object}|${ev.part}`\n const same = this.leaks.find((l) => l.object === ev.object && l.part === ev.part && Math.hypot(l.point[0] - ev.point[0], l.point[1] - ev.point[1], l.point[2] - ev.point[2]) < 0.03)\n if (same) {\n same.rate = ev.rate\n same.direction = ev.direction\n } else {\n if (this.leaks.length >= 24) this.leaks.shift()\n this.leaks.push({ object: ev.object, part: ev.part, fluid: ev.fluid, point: ev.point, direction: ev.direction, rate: ev.rate, pressurized: ev.pressurized, acc: 0 })\n }\n void key\n break\n }\n case 'explode':\n this.primedBurning.delete(`${ev.object}|${ev.part}`)\n this.onExplode(ev)\n break\n case 'destroyed':\n break\n }\n }\n\n private rootPoint(objectId: string): Vec3 {\n const b = this.bounds.get(objectId)\n return b ? [b.root.position.x, b.root.position.y, b.root.position.z] : [0, 0, 0]\n }\n\n private sound(key: string, point: Vec3, volume: number): void {\n this.o.onSound?.(key, point, volume)\n }\n\n private partVis(objectId: string, partId: string): PartVis | null {\n return this.bounds.get(objectId)?.parts.get(partId) ?? null\n }\n\n private activate(objectId: string, partId: string): void {\n this.active.set(`${objectId}|${partId}`, { object: objectId, part: partId })\n }\n\n /** Current colour of the part's first mesh (char included), or null. */\n private partColor(pv: PartVis, def: MaterialDef | undefined): number | null {\n const mv = pv.meshes[0]\n if (!mv) return null\n const mat = materialsOf(mv.mesh.material)[0] as THREE_NS.MeshStandardMaterial | undefined\n const c = mat?.color\n if (c && (c as THREE_NS.Color).isColor) {\n const tint = this.visuals.vertexTint(mv)\n return tint ? c.clone().multiply(tint).getHex() : c.getHex()\n }\n return def ? fallbackColor(def.id, def) : null\n }\n\n private debrisOptions(kind: DebrisKind, objectId: string, partId: string): { color?: number } | undefined {\n const pv = this.partVis(objectId, partId)\n const def = pv ? this.world.materials.get(pv.material) : undefined\n if (kind === 'smoke') return { color: SMOKE_TONES[def?.thermal.smoke ?? 'grey'] }\n if (kind === 'fibers' || kind === 'leaves') {\n const c = pv ? this.visuals.baseColorHex(pv.meshes[0] ?? ({} as never)) : -1\n return c >= 0 ? { color: c } : undefined\n }\n if (kind === 'dust' || kind === 'chips') {\n const c = pv && pv.meshes[0] ? this.visuals.baseColorHex(pv.meshes[0]) : -1\n return c >= 0 && kind === 'chips' ? { color: c } : undefined\n }\n return undefined\n }\n\n /** Mesh of the part closest to a world point. */\n private nearestMesh(pv: PartVis, p: THREE_NS.Vector3): PartVis['meshes'][number] | null {\n let best: PartVis['meshes'][number] | null = null\n let bd = Infinity\n for (const mv of pv.meshes) {\n if (!this.visuals.shown(mv)) continue\n const d = this.visuals.worldBox(mv, this.box).distanceToPoint(p)\n if (d < bd) {\n bd = d\n best = mv\n }\n }\n return best\n }\n\n private worldDir(b: Bound, v: Vec3): THREE_NS.Vector3 {\n b.root.updateWorldMatrix(true, false)\n return new this.THREE.Vector3(v[0], v[1], v[2]).applyQuaternion(b.root.getWorldQuaternion(this.tmpQ)).normalize()\n }\n\n private onDent(ev: Ev<'dent'>): void {\n const b = this.bounds.get(ev.object)\n const pv = b?.parts.get(ev.part)\n if (!b || !pv) return\n const def = this.world.materials.get(pv.material)\n const wp = new this.THREE.Vector3(ev.worldPoint[0], ev.worldPoint[1], ev.worldPoint[2])\n const wn = this.worldDir(b, ev.dent.normal)\n for (const mv of pv.meshes) {\n if (!this.visuals.shown(mv)) continue\n this.visuals.applyDent(mv, wp, wn, ev.dent)\n }\n if (def?.tags?.includes('metal')) this.vfx.burst('sparks', ev.worldPoint, [wn.x, wn.y, wn.z], 4 + Math.min(8, ev.dent.depth * 150), 3.2)\n this.sound(impactKey(def), ev.worldPoint, clamp(0.3 + ev.dent.depth * 12, 0.3, 1))\n }\n\n private onHole(ev: Ev<'hole'>): void {\n const b = this.bounds.get(ev.object)\n const pv = b?.parts.get(ev.part)\n if (!b || !pv) return\n const def = this.world.materials.get(pv.material)\n const n = this.worldDir(b, ev.hole.normal)\n const draw = (point: Vec3, normal: THREE_NS.Vector3): void => {\n const wp = new this.THREE.Vector3(point[0], point[1], point[2])\n const mv = this.nearestMesh(pv, wp)\n if (!mv) return\n if (def?.visual?.transparent) {\n const seed = hashNumbers(ev.time, point[0], point[1], point[2])\n this.visuals.addCrack(mv, wp, normal, 7, Math.max(0.05, ev.hole.diameter * 5), 0xe8f4ff, seed)\n } else {\n this.visuals.addHole(mv, wp, normal, ev.hole.diameter)\n }\n }\n draw(ev.worldPoint, n)\n if (ev.hole.through && ev.exitPoint) draw(ev.exitPoint, n.clone().negate())\n if (def?.tags?.includes('metal')) this.vfx.burst('sparks', ev.worldPoint, [n.x, n.y, n.z], 6, 3.5)\n this.sound(impactKey(def), ev.worldPoint, 0.6)\n }\n\n private onCrack(ev: Ev<'crack'>): void {\n const b = this.bounds.get(ev.object)\n const pv = b?.parts.get(ev.part)\n if (!b || !pv) return\n const def = this.world.materials.get(pv.material)\n const wp = new this.THREE.Vector3(ev.worldPoint[0], ev.worldPoint[1], ev.worldPoint[2])\n const mv = this.nearestMesh(pv, wp)\n if (mv) {\n const color = def?.visual?.transparent ? 0xe8f4ff : 0x2a2724\n this.visuals.addCrack(mv, wp, this.worldDir(b, ev.crack.normal), ev.crack.rays, ev.crack.length, color, hashNumbers(ev.time, ev.worldPoint[0], ev.worldPoint[1], ev.worldPoint[2]))\n }\n this.sound(impactKey(def), ev.worldPoint, 0.5)\n }\n\n /** Outward normal of the face of `mv` nearest to a world point: the thin axis of its world box (right for a wall; a sloped face is left to the vertex-range binding). */\n private faceNormal(mv: PartVis['meshes'][number], point: THREE_NS.Vector3): THREE_NS.Vector3 {\n const box = this.visuals.worldBox(mv, this.box)\n const size = box.getSize(this.v1)\n const axis = size.x <= size.y && size.x <= size.z ? 'x' : size.y <= size.z ? 'y' : 'z'\n const side = point[axis] >= (box.min[axis] + box.max[axis]) / 2 ? 1 : -1\n return new this.THREE.Vector3(axis === 'x' ? side : 0, axis === 'y' ? side : 0, axis === 'z' ? side : 0)\n }\n\n /** The material an impact effect is chosen by: the tags of the material (`metal`, `glass`, `wood`), else stone and the like are `concrete`. */\n private impactMaterial(def: MaterialDef | undefined): string {\n for (const tag of IMPACT_TAGS) if (def?.tags?.includes(tag)) return tag\n return 'concrete'\n }\n\n /**\n * Plays the effect the event map names for a destruction event (`data/event-effects.json` of `game-vfx`, or `RendererOptions.eventEffects`) at a point.\n * Answers whether one played, so the caller can leave out the burst it replaces.\n */\n private playEvent(event: GameEvent, point: Vec3): boolean {\n const id = effectForEvent(event, this.o.eventEffects ?? EVENT_EFFECTS_MAP)\n if (!id) return false\n return this.vfx.play(id, point, { seed: hashNumbers(point[0], point[1], point[2], this.time) }) !== null\n }\n\n /** A coat came off: a patch in the colour of the core under it, below the bullet holes and cracks. */\n private onSpall(ev: Ev<'spall'>): void {\n const pv = this.partVis(ev.object, ev.part)\n if (!pv) return\n const wp = new this.THREE.Vector3(ev.point[0], ev.point[1], ev.point[2])\n const mv = this.nearestMesh(pv, wp)\n if (!mv) return\n const def = this.world.materials.get(pv.material)\n this.playEvent({ kind: 'spall', material: this.impactMaterial(def) }, ev.point)\n this.visuals.addSpall(mv, wp, this.faceNormal(mv, wp), Math.sqrt(ev.area / Math.PI), fallbackColor(pv.material, def))\n }\n\n /**\n * Stage 2 of a staged part: the unit-sized fragments come out and the part stays drawn (hiding it is what `fracture` does). The opening itself\n * (cutting the wall's faces) is not drawn yet: it needs the per-vertex binding of the house renderer.\n */\n private onStage(ev: Ev<'stage'>): void {\n const played = this.playEvent({ kind: 'stage', stage: ev.stage }, ev.opening?.center ?? this.rootPoint(ev.object))\n if (!ev.fragments || !ev.opening) return\n const pv = this.partVis(ev.object, ev.part)\n const def = pv ? this.world.materials.get(pv.material) : undefined\n const color = (pv ? this.partColor(pv, def) : null) ?? fallbackColor(pv?.material ?? '', def)\n const maxAlive = this.low ? Math.floor(this.maxFragments / 2) : this.maxFragments\n const step = this.low ? 2 : 1\n for (let i = 0; i < ev.fragments.length; i += step) {\n const fr = ev.fragments[i] as Fragment\n const fdef = this.world.materials.get(fr.material)\n this.fragments.spawn(fr, this.fragments.materialFor(fr.material, fdef === def || !fdef ? color : fallbackColor(fr.material, fdef), false), ev.object, maxAlive)\n }\n if (!played) this.vfx.burst('dust', ev.opening.center, [0, 1, 0], 14, 1.2, { color })\n this.sound(impactKey(def), ev.opening.center, 0.8)\n }\n\n private onFracture(ev: Ev<'fracture'>): void {\n const b = this.bounds.get(ev.object)\n const pv = b?.parts.get(ev.part)\n const matId = pv?.material || (ev.fragments[0]?.material ?? '')\n const def = this.world.materials.get(matId)\n let color = fallbackColor(matId, def)\n let opacity = 0.5\n const transparent = def?.visual?.transparent === true\n if (pv) {\n const c = this.partColor(pv, def)\n if (c !== null) color = c\n const m = pv.meshes[0] ? (materialsOf(pv.meshes[0].origMaterial)[0] as THREE_NS.Material | undefined) : undefined\n if (m && m.transparent) opacity = clamp(m.opacity, 0.2, 0.8)\n this.visuals.hide(pv, 'broken')\n }\n const maxAlive = this.low ? Math.floor(this.maxFragments / 2) : this.maxFragments\n const step = this.low ? 2 : 1\n for (let i = 0; i < ev.fragments.length; i += step) {\n const fr = ev.fragments[i]\n const fdef = this.world.materials.get(fr.material)\n const mat = this.fragments.materialFor(fr.material, fdef === def || !fdef ? color : fallbackColor(fr.material, fdef), transparent || fdef?.visual?.transparent === true, opacity)\n this.fragments.spawn(fr, mat, ev.object, maxAlive)\n }\n const up: Vec3 = [0, 1, 0]\n const sizeK = clamp(ev.fragments.length / 10, 0.5, 2)\n switch (ev.style) {\n case 'shatter':\n this.vfx.burst('shards', ev.point, up, 18 * sizeK, 3)\n break\n case 'crumble':\n this.vfx.burst('dust', ev.point, up, 16 * sizeK, 1.2, { color: pv ? (this.partColor(pv, def) ?? undefined) : undefined })\n this.vfx.burst('chips', ev.point, up, 6, 3)\n break\n case 'splinter':\n this.vfx.burst('splinters', ev.point, up, 14 * sizeK, 3)\n this.vfx.burst('dust', ev.point, up, 5, 0.8, { color: 0xb59a74 })\n break\n case 'tear':\n this.vfx.burst('fibers', ev.point, up, 12 * sizeK, 1.6, { color: color })\n break\n case 'snap':\n this.vfx.burst('chips', ev.point, up, 8 * sizeK, 3)\n break\n default:\n this.vfx.burst('sparks', ev.point, up, 10, 4)\n }\n this.sound(fractureKey(def, ev.style), ev.point, clamp(0.4 + ev.fragments.length * 0.03, 0.4, 1))\n }\n\n private onDetach(ev: Ev<'detach'>): void {\n this.sound('detach', this.rootPoint(ev.object), 0.5)\n this.splitLoose(ev.object)\n }\n\n /** Turn every loose group of the object (a detach, a collapse) into a piece of its own. */\n private splitLoose(objectId: string): void {\n if (!this.autoSplit) return\n const b = this.bounds.get(objectId)\n if (!b) return\n const st = this.world.state(objectId)\n if (!st || st.groups.length < 2) return\n const loose = st.groups.length - 1\n for (let i = 0; i < loose; i++) {\n // the loose groups are always read from index 1: each split renumbers the rest\n let newId: string\n try {\n newId = this.world.splitGroup(objectId, 1)\n } catch {\n break\n }\n this.adoptSplit(b, newId)\n }\n const old = b.piece\n if (old) {\n const { half, center } = this.measure(b.root, this.meshesOf(b))\n old.halfExtents = half\n this.pieceSys.setCenter(old, center)\n old.mass = Math.max(0.05, this.massOf(objectId))\n old.sleeping = false\n }\n }\n\n /** The renderer side of `splitGroup`: a new group holding the meshes of the new object, made a piece. */\n private adoptSplit(from: Bound, newId: string): void {\n const state = this.world.state(newId)\n const root = from.root\n root.updateWorldMatrix(true, false)\n const group = new this.THREE.Group()\n group.name = `destruction-piece-${newId}`\n root.getWorldPosition(group.position)\n root.getWorldQuaternion(group.quaternion)\n this.scene.add(group)\n group.updateMatrixWorld(true)\n const nb: Bound = { id: newId, root: group, sync: true, parts: new Map(), lastPos: null, lastQuat: null, piece: null, isSplit: true }\n for (const p of state?.parts ?? []) {\n const pv = from.parts.get(p.id)\n if (!pv) continue\n from.parts.delete(p.id)\n nb.parts.set(p.id, pv)\n for (const mv of pv.meshes) {\n // a part drawn by a range of a merged mesh leaves its faces behind: it gets a mesh of its own\n if (mv.host && !mv.loose) this.visuals.extract(mv, group)\n else {\n group.attach(mv.mesh)\n mv.moved = true\n }\n }\n }\n this.bounds.set(newId, nb)\n const meshes = this.meshesOf(nb)\n if (meshes.length === 0) return\n const { half, center } = this.measure(group, meshes)\n let vel: Vec3 = [0, 0, 0]\n let ang: Vec3 = [0, 0, 0]\n const op = from.piece\n if (op) {\n vel = [...op.velocity]\n ang = [...op.angularVelocity]\n // linear velocity at the loose piece's centre\n const c = this.pieceSys.centerOf(op, new this.THREE.Vector3())\n const nc = center.clone().applyQuaternion(group.quaternion).add(group.position)\n vel[0] += ang[1] * (nc.z - c.z) - ang[2] * (nc.y - c.y)\n vel[1] += ang[2] * (nc.x - c.x) - ang[0] * (nc.z - c.z)\n vel[2] += ang[0] * (nc.y - c.y) - ang[1] * (nc.x - c.x)\n }\n const piece = this.pieceSys.create(newId, group, half, center, this.massOf(newId), vel, ang)\n nb.piece = piece\n this.o.onPiece?.(piece)\n }\n\n private onExplode(ev: Ev<'explode'>, options: ExplodeOptions = {}): void {\n const p = ev.point\n if (options.visual !== false) this.playExplosion(ev, options)\n this.vfx.push(p, ev.radius, 4)\n // shove pieces and fragments\n const c = this.v1\n const report = options.report\n const confinement = report?.find((r) => r.blast !== undefined)?.blast?.confinement ?? 1\n const energy = ev.energy * confinement\n for (const pc of this.pieceSys.list) {\n this.pieceSys.centerOf(pc, c)\n const dx = c.x - p[0]\n const dy = c.y - p[1]\n const dz = c.z - p[2]\n const d = Math.hypot(dx, dy, dz)\n if (d > ev.radius) continue\n const fall = (1 - d / ev.radius) ** 2\n // the energy that got to this piece after what stood in the way (`blast.shelter`); the old formula when the blast carries no report\n const reach = report?.find((r) => r.object === pc.objectId)?.blast?.shelter ?? 1\n const speed = Math.min(30, Math.sqrt((2 * energy * reach * 0.02) / pc.mass)) * fall\n const inv = d > 1e-4 ? 1 / d : 0\n const dir: Vec3 = d > 1e-4 ? [dx * inv, dy * inv + 0.3, dz * inv] : [0, 1, 0]\n const spread = pc.halfExtents[0]\n this.pieceSys.impulse(pc, [dir[0] * speed * pc.mass, dir[1] * speed * pc.mass, dir[2] * speed * pc.mass], [c.x + (this.rng() - 0.5) * spread, c.y + spread * 0.5, c.z + (this.rng() - 0.5) * spread])\n }\n this.fragments.blast(p, ev.radius, Math.min(20, Math.sqrt(energy) * 0.08))\n this.sound('explode', p, clamp(0.5 + ev.radius / 10, 0.5, 1))\n }\n\n private playExplosion(ev: Ev<'explode'>, options: ExplodeOptions): void {\n const named = options.effect ?? ev.effect\n const direction = options.direction\n const scale = clamp(ev.radius / GENERIC_REFERENCE_RADIUS, 0.2, 3)\n if (named !== undefined && this.vfx.explosion(named, ev.point, direction ? { direction } : {}) !== null) return\n this.vfx.explosion('generic', ev.point, { scale, ...(direction ? { direction } : {}) })\n }\n\n private startFire(ev: { object: string; part: string; point: Vec3 }): void {\n const key = `${ev.object}|${ev.part}`\n this.stopFire(key)\n this.fires.set(key, { object: ev.object, part: ev.part, point: ev.point, follow: { x: ev.point[0], y: ev.point[1], z: ev.point[2] } })\n }\n\n private stopFire(key: string): void {\n const fire = this.fires.get(key)\n if (!fire) return\n if (fire.handle !== undefined) this.vfx.stop(fire.handle)\n this.fires.delete(key)\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Fire, heat, char, melt, leaks\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n private updateActive(dt: number): void {\n this.scanTimer += dt\n if (this.scanTimer >= 0.4) {\n this.scanTimer = 0\n for (const b of this.bounds.values()) {\n for (const pv of b.parts.values()) {\n if (pv.gone !== 'none' && pv.gone !== 'broken') continue\n const ps = this.world.part(b.id, pv.id)\n if (!ps) continue\n const def = this.world.materials.get(pv.material)\n if (\n ps.burning ||\n (def?.visual?.glows && ps.temperature > GLOW_FROM_C) ||\n Math.abs(ps.char - pv.charApplied) > 0.01 ||\n Math.abs(ps.melt - pv.meltApplied) > 0.01 ||\n (pv.gone === 'none' && (ps.status === 'melted' || ps.status === 'ashes'))\n ) {\n this.activate(b.id, pv.id)\n }\n }\n }\n }\n for (const [key, a] of this.active) {\n const pv = this.partVis(a.object, a.part)\n const ps = pv ? this.world.part(a.object, a.part) : null\n if (!pv || !ps) {\n this.active.delete(key)\n continue\n }\n const def = this.world.materials.get(pv.material)\n if (pv.gone === 'none') {\n this.visuals.setChar(pv, ps.char, def?.visual?.charColor ?? 0x1a1410)\n if (def?.visual?.glows) this.visuals.setGlow(pv, ps.temperature)\n this.visuals.setMelt(pv, ps.melt)\n if (ps.status === 'melted') this.onGone(a.object, pv, 'melted', def)\n else if (ps.status === 'ashes') this.onGone(a.object, pv, 'ashes', def)\n }\n const fire = this.fires.get(key)\n if (fire) {\n if (ps.burning && ps.status !== 'broken' && ps.status !== 'ashes' && ps.status !== 'melted') this.emitFire(fire, pv, def)\n else this.stopFire(key)\n }\n const hot = def?.visual?.glows === true && ps.temperature > GLOW_FROM_C\n if (!ps.burning && !hot && Math.abs(ps.char - pv.charApplied) < 0.01 && Math.abs(ps.melt - pv.meltApplied) < 0.01) {\n if (def?.visual?.glows && pv.gone === 'none') this.visuals.setGlow(pv, 0)\n this.active.delete(key)\n }\n }\n }\n\n private onGone(objectId: string, pv: PartVis, reason: 'melted' | 'ashes', def: MaterialDef | undefined): void {\n const bb = new this.THREE.Box3()\n for (const mv of pv.meshes) bb.union(this.visuals.worldBox(mv, this.box))\n this.visuals.hide(pv, reason)\n if (bb.isEmpty()) return\n const c = bb.getCenter(new this.THREE.Vector3())\n const s = bb.getSize(new this.THREE.Vector3())\n const footprint = Math.sqrt(Math.max(s.x * s.z, 1e-4))\n if (reason === 'melted') {\n this.ground.add('puddle', c.x, c.z, clamp(footprint * 0.55, 0.05, 1), this.partColor(pv, def) ?? fallbackColor(pv.material, def), objectId)\n } else {\n this.ground.add('ash', c.x, c.z, clamp(footprint * 0.35, 0.04, 0.5), 0x1d1a18, objectId)\n this.vfx.burst('ash', [c.x, bb.max.y, c.z], [0, 1, 0], 10, 0.8)\n }\n }\n\n private emitFire(f: FireEmitter, pv: PartVis, def: MaterialDef | undefined): void {\n const bb = this.box\n bb.makeEmpty()\n const tmp = new this.THREE.Box3()\n for (const mv of pv.meshes) if (this.visuals.shown(mv)) bb.union(this.visuals.worldBox(mv, tmp))\n if (!bb.isEmpty()) {\n const c = bb.getCenter(this.v1)\n f.follow.x = c.x\n f.follow.y = bb.min.y\n f.follow.z = c.z\n }\n if (f.handle !== undefined) return\n const size = bb.isEmpty() ? this.v2.set(0.2, 0.2, 0.2) : bb.getSize(this.v2)\n const radius = clamp(Math.max(size.x, size.z) * 0.5, 0.12, 1.2)\n const smokeColor = SMOKE_TONES[def?.thermal.smoke ?? 'grey']\n f.handle = this.vfx.fire({ point: [f.follow.x, f.follow.y, f.follow.z], radius, life: FIRE_CEILING_SECONDS, follow: f.follow, ...(smokeColor !== undefined ? { smokeColor } : {}) })\n }\n\n private updateLeaks(dt: number): void {\n for (let i = this.leaks.length - 1; i >= 0; i--) {\n const l = this.leaks[i]\n const ps = this.world.part(l.object, l.part)\n if (!ps || ps.liters === undefined || ps.liters <= 0) {\n this.leaks.splice(i, 1)\n continue\n }\n l.acc += clamp(20 + l.rate * 400, 15, 120) * dt\n const color = FLUID_COLORS[l.fluid] ?? 0xaaaaaa\n const d = l.direction\n const dl = Math.hypot(d[0], d[1], d[2]) || 1\n const sp = l.pressurized ? 2.5 + this.rng() * 1.5 : 0.3 + this.rng() * 0.3\n while (l.acc >= 1) {\n l.acc -= 1\n const vel: Vec3 = [(d[0] / dl) * sp + (this.rng() - 0.5) * 0.25, (d[1] / dl) * sp + (this.rng() - 0.5) * 0.25, (d[2] / dl) * sp + (this.rng() - 0.5) * 0.25]\n if (l.fluid === 'gas') this.vfx.spawn('steam', l.point, vel, { color, size: 0.5, alpha: 0.5 })\n else this.vfx.spawn('drips', l.point, vel, { color, tag: this.rng() < 0.03 ? this.tagOf(l.object) : 0, owner: this.owner })\n }\n }\n }\n\n private tagOf(object: string): number {\n let tag = this.homeTags.indexOf(object) + 1\n if (tag === 0) tag = this.homeTags.push(object)\n return tag\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Emit, clear, restore, stats, dispose\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n emit(kind: DebrisKind | 'fire' | 'flash' | 'foam', point: Vec3, normal: Vec3, count: number, speed?: number): void {\n this.vfx.burst(kind, point, normal, count, speed ?? DEFAULT_SPEED[kind] ?? 1, kind === 'smoke' ? { color: SMOKE_TONES.grey } : undefined)\n }\n\n explode(point: Vec3, energy: number, radius: number, options?: ExplodeOptions): void {\n this.onExplode({ type: 'explode', object: '', part: '', time: this.time, point, energy, radius }, options)\n }\n\n restore(objectId: string): void {\n const homes = new Set<string>([objectId])\n const self = this.bounds.get(objectId)\n if (self?.isSplit) for (const pv of self.parts.values()) homes.add(pv.home)\n for (const home of homes) this.restoreHome(home)\n for (const [key, a] of [...this.active]) if (homes.has(a.object)) this.active.delete(key)\n for (const [key, f] of [...this.fires]) if (homes.has(f.object)) this.stopFire(key)\n for (let i = this.leaks.length - 1; i >= 0; i--) if (homes.has(this.leaks[i].object)) this.leaks.splice(i, 1)\n for (const home of homes) {\n this.fragments.removeHome(home)\n this.ground.removeHome(home)\n this.cages.removeObject(home)\n }\n }\n\n private restoreHome(home: string): void {\n const homeBound = this.bounds.get(home)\n for (const b of [...this.bounds.values()]) {\n for (const [pid, pv] of [...b.parts]) {\n if (pv.home !== home) continue\n this.visuals.restorePart(pv)\n if (b !== homeBound && homeBound) {\n b.parts.delete(pid)\n homeBound.parts.set(pid, pv)\n }\n }\n if (b.isSplit && b.parts.size === 0) {\n this.scene.remove(b.root)\n this.pieceSys.remove(b.id)\n this.bounds.delete(b.id)\n }\n }\n }\n\n clear(): void {\n this.queue.length = 0\n this.active.clear()\n for (const key of [...this.fires.keys()]) this.stopFire(key)\n this.leaks.length = 0\n for (const id of [...this.bounds.keys()]) if (this.bounds.has(id)) this.restore(id)\n // anything left of a split object whose home is gone\n for (const b of [...this.bounds.values()]) {\n if (b.isSplit) {\n for (const pv of b.parts.values()) this.visuals.restorePart(pv)\n this.scene.remove(b.root)\n this.pieceSys.remove(b.id)\n this.bounds.delete(b.id)\n }\n }\n this.fragments.clear()\n this.ground.clear()\n this.cages.clear()\n this.primedBurning.clear()\n this.vfx.sprites().clear()\n this.ownVfx?.world.clear()\n }\n\n stats(): { fragments: number; particles: number; pieces: number; decals: number } {\n return { fragments: this.fragments.count, particles: this.vfx.sprites().live + this.ownedVfxParticles(), pieces: this.pieceSys.list.length, decals: this.visuals.decalCount + this.ground.count }\n }\n\n private ownedVfxParticles(): number {\n if (!this.ownVfx) return 0\n const { puffs, sparks, glows, chunks } = this.vfx.stats()\n return puffs + sparks + glows + chunks\n }\n\n rebarCount(): number {\n return this.cages.count\n }\n\n dispose(): void {\n if (this.disposed) return\n this.unsubscribe()\n this.clear()\n for (const id of [...this.bounds.keys()]) this.unbind(id)\n this.fragments.dispose()\n this.ground.dispose()\n this.cages.dispose()\n this.stopLanding()\n this.visuals.dispose()\n this.ownVfx?.dispose()\n this.disposed = true\n }\n}\n","import type { Vec3 } from '@adatechnology/game-destruction'\n\n/** Small deterministic PRNG (mulberry32): returns a function giving numbers in [0, 1). */\nexport function createRng(seed: number): () => number {\n let a = seed >>> 0\n return () => {\n a = (a + 0x6d2b79f5) >>> 0\n let t = a\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\n/** Hash of a few numbers into an unsigned 32-bit seed. */\nexport function hashNumbers(...values: number[]): number {\n let h = 2166136261\n for (const v of values) {\n const n = Math.round(v * 1000) | 0\n h = Math.imul(h ^ n, 16777619)\n h ^= h >>> 13\n }\n return h >>> 0\n}\n\nexport function hashString(s: string): number {\n let h = 2166136261\n for (let i = 0; i < s.length; i++) h = Math.imul(h ^ s.charCodeAt(i), 16777619)\n return h >>> 0\n}\n\nexport const clamp = (v: number, lo: number, hi: number): number => (v < lo ? lo : v > hi ? hi : v)\nexport const lerp = (a: number, b: number, t: number): number => a + (b - a) * t\n\nexport function vec3Length(v: Vec3): number {\n return Math.hypot(v[0], v[1], v[2])\n}\n\nexport function normalize3(v: Vec3): Vec3 {\n const l = Math.hypot(v[0], v[1], v[2])\n return l > 1e-9 ? [v[0] / l, v[1] / l, v[2] / l] : [0, 1, 0]\n}\n\n/** `0xRRGGBB` -> `[r, g, b]` in 0..1. */\nexport function hexToRgb(hex: number): [number, number, number] {\n return [((hex >> 16) & 255) / 255, ((hex >> 8) & 255) / 255, (hex & 255) / 255]\n}\n\nexport function mixHex(a: number, b: number, t: number): number {\n const ar = (a >> 16) & 255\n const ag = (a >> 8) & 255\n const ab = a & 255\n const r = Math.round(ar + (((b >> 16) & 255) - ar) * t)\n const g = Math.round(ag + (((b >> 8) & 255) - ag) * t)\n const bl = Math.round(ab + ((b & 255) - ab) * t)\n return (r << 16) | (g << 8) | bl\n}\n","import type * as THREE_NS from 'three'\nimport type { Fragment } from '@adatechnology/game-destruction'\nimport { clamp, createRng, hashString } from './math'\n\ninterface Live {\n mesh: THREE_NS.Mesh\n home: string\n vel: THREE_NS.Vector3\n ang: THREE_NS.Vector3\n half: THREE_NS.Vector3\n baseScale: THREE_NS.Vector3\n still: number\n asleep: boolean\n /** Seconds at rest. */\n rest: number\n /** 1 while alive; counts down to 0 while shrinking away. */\n fade: number\n dying: boolean\n}\n\nexport interface FragmentSystemOptions {\n scene: THREE_NS.Scene\n groundAt: (x: number, z: number) => number\n gravity: number\n max: number\n life: number\n}\n\n/** Light physics for fracture debris: gravity, ground bounce and friction, spin damping, settling flat, sleep, shrink-away and removal. */\nexport class FragmentSystem {\n private readonly list: Live[] = []\n private readonly box: THREE_NS.BoxGeometry\n private shardGeos: THREE_NS.BufferGeometry[] = []\n private readonly materials = new Map<string, THREE_NS.Material>()\n private readonly q: THREE_NS.Quaternion\n private readonly dq: THREE_NS.Quaternion\n private readonly m: THREE_NS.Matrix4\n private readonly v: THREE_NS.Vector3\n private readonly w: THREE_NS.Vector3\n private readonly rng = createRng(0x51ed270b)\n\n constructor(\n private readonly THREE: typeof THREE_NS,\n private readonly o: FragmentSystemOptions,\n ) {\n this.box = new THREE.BoxGeometry(1, 1, 1)\n this.q = new THREE.Quaternion()\n this.dq = new THREE.Quaternion()\n this.m = new THREE.Matrix4()\n this.v = new THREE.Vector3()\n this.w = new THREE.Vector3()\n }\n\n get count(): number {\n return this.list.length\n }\n\n /** Meshes of every live fragment (tests and picking). */\n meshes(): THREE_NS.Mesh[] {\n return this.list.map((f) => f.mesh)\n }\n\n /** One shared material per source material id + colour (+ transparency). */\n materialFor(materialId: string, color: number, transparent: boolean, opacity = 0.5): THREE_NS.Material {\n const key = `${materialId}:${color}:${transparent ? 1 : 0}`\n let m = this.materials.get(key)\n if (!m) {\n m = transparent\n ? new this.THREE.MeshStandardMaterial({ color, roughness: 0.15, metalness: 0.1, transparent: true, opacity, side: this.THREE.DoubleSide, depthWrite: false })\n : new this.THREE.MeshLambertMaterial({ color })\n this.materials.set(key, m)\n }\n return m\n }\n\n private shardGeometry(seed: number): THREE_NS.BufferGeometry {\n const idx = seed % 6\n let g = this.shardGeos[idx]\n if (!g) {\n const r = createRng(1000 + idx)\n const n = 3 + Math.floor(r() * 3) // triangle, quad or pentagon, irregular\n const shape = new this.THREE.Shape()\n const pts: Array<[number, number]> = []\n for (let i = 0; i < n; i++) {\n const a = (i / n) * Math.PI * 2 + (r() - 0.5) * 0.7\n const rad = 0.35 + r() * 0.15\n pts.push([Math.cos(a) * rad, Math.sin(a) * rad])\n }\n shape.moveTo(pts[0][0], pts[0][1])\n for (let i = 1; i < n; i++) shape.lineTo(pts[i][0], pts[i][1])\n shape.closePath()\n g = new this.THREE.ExtrudeGeometry(shape, { depth: 1, bevelEnabled: false })\n g.translate(0, 0, -0.5)\n this.shardGeos[idx] = g\n }\n return g\n }\n\n private markGeometry: THREE_NS.CircleGeometry | null = null\n private markMaterial: THREE_NS.MeshBasicMaterial | null = null\n\n /**\n * Bullet holes that stay on a fragment (`Fragment.marks`): dark discs that are children of its mesh, so they fall, spin and settle with it. The mesh is\n * a unit box scaled to the fragment, so each disc is scaled back; exact for a mark on a face, which is where a bullet hole is.\n */\n addMarks(mesh: THREE_NS.Mesh, f: Fragment): void {\n if (!f.marks?.length) return\n this.markGeometry ??= new this.THREE.CircleGeometry(1, 10)\n this.markMaterial ??= new this.THREE.MeshBasicMaterial({ color: 0x0b0a09, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -4, polygonOffsetUnits: -4 })\n const sc = mesh.scale\n for (const mark of f.marks) {\n const disc = new this.THREE.Mesh(this.markGeometry, this.markMaterial)\n const radius = Math.max(0.004, mark.diameter) * 0.6\n const n = this.v.set(mark.normal[0], mark.normal[1], mark.normal[2]).normalize()\n disc.position.set(mark.point[0] / sc.x + (n.x * 0.002) / sc.x, mark.point[1] / sc.y + (n.y * 0.002) / sc.y, mark.point[2] / sc.z + (n.z * 0.002) / sc.z)\n disc.quaternion.setFromUnitVectors(this.w.set(0, 0, 1), n)\n disc.scale.set(radius / sc.x, radius / sc.y, radius / sc.z)\n mesh.add(disc)\n }\n }\n\n /** Create the mesh of a fragment and start its motion. `maxAllowed` is the live budget. */\n spawn(f: Fragment, material: THREE_NS.Material, home: string, maxAllowed: number): THREE_NS.Mesh {\n const geo = f.shape === 'shard' ? this.shardGeometry(hashString(f.id)) : this.box\n const mesh = new this.THREE.Mesh(geo, material)\n mesh.position.set(f.center[0], f.center[1], f.center[2])\n mesh.quaternion.set(f.rotation[0], f.rotation[1], f.rotation[2], f.rotation[3]).normalize()\n const sz = f.size\n const sc = new this.THREE.Vector3(Math.max(0.005, sz[0]), Math.max(0.005, sz[1]), Math.max(0.003, sz[2]))\n mesh.scale.copy(sc)\n mesh.castShadow = true\n this.o.scene.add(mesh)\n const live: Live = {\n mesh,\n home,\n vel: new this.THREE.Vector3(f.velocity[0], f.velocity[1], f.velocity[2]),\n ang: new this.THREE.Vector3(f.angularVelocity[0], f.angularVelocity[1], f.angularVelocity[2]),\n // shards are thin: the contact extent uses the real (small) thickness, the chunk uses half of each side\n half: sc.clone().multiplyScalar(0.5),\n baseScale: sc,\n still: 0,\n asleep: false,\n rest: 0,\n fade: 1,\n dying: false,\n }\n this.list.push(live)\n let alive = this.list.reduce((n, l) => n + (l.dying ? 0 : 1), 0)\n for (let i = 0; i < this.list.length && alive > maxAllowed; i++) {\n if (!this.list[i].dying) {\n this.list[i].dying = true\n alive--\n }\n }\n this.addMarks(mesh, f)\n return mesh\n }\n\n /** Add velocity to every fragment within `radius` of a point (blasts). */\n blast(point: [number, number, number], radius: number, speed: number): void {\n for (const f of this.list) {\n const d = this.v.copy(f.mesh.position).sub(this.w.set(point[0], point[1], point[2]))\n const dist = d.length()\n if (dist > radius || f.dying) continue\n const k = (1 - dist / radius) ** 2 * speed\n d.normalize().multiplyScalar(k)\n d.y += k * 0.4\n f.vel.add(d)\n f.ang.add(this.w.set(this.rng() - 0.5, this.rng() - 0.5, this.rng() - 0.5).multiplyScalar(k))\n f.asleep = false\n f.rest = 0\n }\n }\n\n update(dt: number): void {\n const g = this.o.gravity\n for (let i = this.list.length - 1; i >= 0; i--) {\n const f = this.list[i]\n if (f.dying) {\n f.fade -= dt / 0.6\n if (f.fade <= 0) {\n this.o.scene.remove(f.mesh)\n this.list.splice(i, 1)\n continue\n }\n f.mesh.scale.copy(f.baseScale).multiplyScalar(f.fade)\n }\n if (f.asleep) {\n f.rest += dt\n if (this.o.life > 0 && f.rest > this.o.life) f.dying = true\n continue\n }\n this.step(f, dt, g)\n }\n }\n\n private step(f: Live, dt: number, g: number): void {\n const mesh = f.mesh\n f.vel.y -= g * dt\n mesh.position.addScaledVector(f.vel, dt)\n const w = f.ang.length()\n if (w > 1e-5) {\n this.dq.setFromAxisAngle(this.v.copy(f.ang).multiplyScalar(1 / w), w * dt)\n mesh.quaternion.premultiply(this.dq).normalize()\n }\n // ground contact: lowest point of the oriented box\n this.m.makeRotationFromQuaternion(mesh.quaternion)\n const e = this.m.elements\n const h = f.half\n const sc = f.dying ? f.fade : 1\n const ext = (Math.abs(e[1]) * h.x + Math.abs(e[5]) * h.y + Math.abs(e[9]) * h.z) * sc\n const gy = this.o.groundAt(mesh.position.x, mesh.position.z)\n let contact = false\n if (mesh.position.y - ext < gy) {\n contact = true\n mesh.position.y = gy + ext\n if (f.vel.y < -0.6) {\n f.vel.y = -f.vel.y * 0.25\n f.vel.x *= 0.7\n f.vel.z *= 0.7\n f.ang.multiplyScalar(0.55)\n // a hit on a corner makes it tumble a little\n f.ang.x += (this.rng() - 0.5) * 2\n f.ang.z += (this.rng() - 0.5) * 2\n } else {\n f.vel.y = 0\n const fr = Math.exp(-7 * dt)\n f.vel.x *= fr\n f.vel.z *= fr\n f.ang.multiplyScalar(Math.exp(-6 * dt))\n }\n } else {\n f.ang.multiplyScalar(Math.exp(-0.15 * dt))\n }\n if (contact && f.vel.lengthSq() < 4) this.settle(f, dt)\n const slow = f.vel.lengthSq() < 0.012 && f.ang.lengthSq() < 0.2\n if (contact && slow) {\n f.still += dt\n if (f.still > 0.4) {\n f.asleep = true\n f.vel.set(0, 0, 0)\n f.ang.set(0, 0, 0)\n }\n } else {\n f.still = 0\n }\n }\n\n /** Tip the fragment towards lying on its flattest face. */\n private settle(f: Live, dt: number): void {\n const mesh = f.mesh\n this.m.makeRotationFromQuaternion(mesh.quaternion)\n const e = this.m.elements\n const up = [e[1], e[5], e[9]] // world-y component of each local axis\n const half = [f.half.x, f.half.y, f.half.z]\n let small = 0\n for (let i = 1; i < 3; i++) if (half[i] < half[small]) small = i\n let axis = small\n if (Math.abs(up[small]) < 0.35) {\n axis = 0\n for (let i = 1; i < 3; i++) if (Math.abs(up[i]) > Math.abs(up[axis])) axis = i\n }\n const sign = up[axis] >= 0 ? 1 : -1\n this.v.set(e[axis * 4], e[axis * 4 + 1], e[axis * 4 + 2]).multiplyScalar(sign)\n this.w.set(0, 1, 0)\n this.dq.setFromUnitVectors(this.v, this.w)\n this.q.copy(this.dq).multiply(mesh.quaternion)\n mesh.quaternion.slerp(this.q, clamp(dt * 7, 0, 1))\n }\n\n /** Remove the fragments of one object (after `restore`). */\n removeHome(home: string): void {\n for (let i = this.list.length - 1; i >= 0; i--) {\n if (this.list[i].home === home) {\n this.o.scene.remove(this.list[i].mesh)\n this.list.splice(i, 1)\n }\n }\n }\n\n clear(): void {\n for (const f of this.list) this.o.scene.remove(f.mesh)\n this.list.length = 0\n }\n\n dispose(): void {\n this.clear()\n this.box.dispose()\n this.markGeometry?.dispose()\n this.markMaterial?.dispose()\n for (const g of this.shardGeos) g?.dispose()\n this.shardGeos = []\n for (const m of this.materials.values()) m.dispose()\n this.materials.clear()\n }\n}\n","import type * as THREE_NS from 'three'\nimport { lerp } from './math'\n\ninterface Spot {\n mesh: THREE_NS.Mesh\n kind: 'puddle' | 'ash'\n home: string\n x: number\n z: number\n radius: number\n target: number\n}\n\nconst MAX_RADIUS = 1.2\n\n/** Flat discs on the ground: puddles of melted material and piles of ash. Nearby ones merge; the oldest go when the cap is reached. */\nexport class GroundSpots {\n private readonly spots: Spot[] = []\n private readonly geometry: THREE_NS.CircleGeometry\n private readonly materials = new Map<string, THREE_NS.MeshBasicMaterial>()\n\n constructor(\n private readonly THREE: typeof THREE_NS,\n private readonly scene: THREE_NS.Scene,\n private readonly groundAt: (x: number, z: number) => number,\n private readonly cap: number,\n ) {\n this.geometry = new THREE.CircleGeometry(1, 20)\n this.geometry.rotateX(-Math.PI / 2)\n }\n\n get count(): number {\n return this.spots.length\n }\n\n private material(kind: 'puddle' | 'ash', color: number): THREE_NS.MeshBasicMaterial {\n const key = `${kind}:${color}`\n let m = this.materials.get(key)\n if (!m) {\n m = new this.THREE.MeshBasicMaterial({\n color,\n transparent: true,\n opacity: kind === 'puddle' ? 0.88 : 0.95,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -2,\n polygonOffsetUnits: -2,\n })\n this.materials.set(key, m)\n }\n return m\n }\n\n /** Add (or grow) a spot at (x, z). `radius` is the radius this addition contributes. */\n add(kind: 'puddle' | 'ash', x: number, z: number, radius: number, color: number, home: string): void {\n for (const s of this.spots) {\n if (s.kind !== kind) continue\n const d = Math.hypot(s.x - x, s.z - z)\n if (d < Math.max(s.target, radius) * 0.9) {\n s.target = Math.min(MAX_RADIUS, Math.sqrt(s.target * s.target + radius * radius * 0.5))\n return\n }\n }\n while (this.spots.length >= this.cap) this.remove(this.spots[0])\n const mesh = new this.THREE.Mesh(this.geometry, this.material(kind, color))\n const y = this.groundAt(x, z) + 0.004 + (this.spots.length % 8) * 0.0004\n mesh.position.set(x, y, z)\n mesh.scale.setScalar(0.001)\n mesh.renderOrder = 1\n this.scene.add(mesh)\n this.spots.push({ mesh, kind, home, x, z, radius: 0.001, target: Math.min(MAX_RADIUS, radius) })\n }\n\n private remove(s: Spot): void {\n const i = this.spots.indexOf(s)\n if (i >= 0) this.spots.splice(i, 1)\n this.scene.remove(s.mesh)\n }\n\n update(dt: number): void {\n const k = Math.min(1, dt * 3)\n for (const s of this.spots) {\n if (Math.abs(s.radius - s.target) < 1e-4) continue\n s.radius = lerp(s.radius, s.target, k)\n s.mesh.scale.setScalar(s.radius)\n }\n }\n\n /** Remove the spots made for one object (after its `restore`). */\n removeHome(home: string): void {\n for (const s of [...this.spots]) if (s.home === home) this.remove(s)\n }\n\n clear(): void {\n for (const s of [...this.spots]) this.remove(s)\n }\n\n dispose(): void {\n this.clear()\n this.geometry.dispose()\n for (const m of this.materials.values()) m.dispose()\n this.materials.clear()\n }\n}\n","import type * as THREE_NS from 'three'\nimport type { Vec3 } from '@adatechnology/game-destruction'\nimport type { PieceBody } from './internal'\nimport { clamp } from './math'\n\nexport interface PieceSystemOptions {\n groundAt: (x: number, z: number) => number\n gravity: number\n /** A piece hit the ground faster than 3 m/s (throttled per piece). */\n onHardLanding: (piece: PieceBody, point: Vec3, speed: number) => void\n /** Notified when a piece is about to be removed. */\n scene: THREE_NS.Scene\n}\n\nconst SUB_DT = 1 / 120\nconst MU = 0.7\nconst SLEEP_AFTER = 0.5\nconst HARD_LANDING = 3\n/** Contact tolerance in metres: corners this close to the ground count as touching, which keeps the contact set (and a resting box) stable. */\nconst SLOP = 0.002\n/** A resting support narrower than this fraction of the centre-of-mass height is a balancing act, not a rest: the piece topples. */\nconst NARROW = 0.3\n/** Angular acceleration (rad/s^2 per metre of height) that pushes a balancing piece off its edge, toward the side its centre of mass leans to. */\nconst TOPPLE = 3\n\n/**\n * Light rigid-body physics for loose pieces: gravity, the 8 corners of the local box against the ground with an impulse (restitution, friction,\n * angular response), damping, sleeping, and a gentle horizontal separation between pieces. Not a general solver: no piece-vs-scenery contact.\n */\nexport class PieceSystem {\n readonly list: PieceBody[] = []\n private time = 0\n private readonly p: THREE_NS.Vector3\n private readonly q: THREE_NS.Quaternion\n private readonly dq: THREE_NS.Quaternion\n private readonly m: THREE_NS.Matrix4\n private readonly ax: THREE_NS.Vector3\n\n constructor(\n private readonly THREE: typeof THREE_NS,\n private readonly o: PieceSystemOptions,\n ) {\n this.p = new THREE.Vector3()\n this.q = new THREE.Quaternion()\n this.dq = new THREE.Quaternion()\n this.m = new THREE.Matrix4()\n this.ax = new THREE.Vector3()\n }\n\n get(objectId: string): PieceBody | null {\n return this.list.find((b) => b.objectId === objectId) ?? null\n }\n\n create(objectId: string, root: THREE_NS.Object3D, halfExtents: Vec3, localCenter: THREE_NS.Vector3, mass: number, velocity?: Vec3, angular?: Vec3): PieceBody {\n const existing = this.get(objectId)\n if (existing) {\n existing.root = root\n existing.halfExtents = halfExtents\n existing.mass = mass\n this.setCenter(existing, localCenter)\n if (velocity) existing.velocity = [...velocity]\n existing.sleeping = false\n return existing\n }\n const body: PieceBody = {\n objectId,\n root,\n velocity: velocity ? [...velocity] : [0, 0, 0],\n angularVelocity: angular ? [...angular] : [0, 0, 0],\n halfExtents: [Math.max(0.01, halfExtents[0]), Math.max(0.01, halfExtents[1]), Math.max(0.01, halfExtents[2])],\n mass: Math.max(0.05, mass),\n sleeping: false,\n held: false,\n localCenter: [localCenter.x, localCenter.y, localCenter.z],\n centerV: localCenter.clone(),\n still: 0,\n lastHit: -1,\n onGround: false,\n }\n this.list.push(body)\n return body\n }\n\n /** Move the centre of mass (after a part broke off). */\n setCenter(b: PieceBody, c: THREE_NS.Vector3): void {\n b.centerV.copy(c)\n b.localCenter = [c.x, c.y, c.z]\n }\n\n remove(objectId: string): void {\n const i = this.list.findIndex((b) => b.objectId === objectId)\n if (i >= 0) this.list.splice(i, 1)\n }\n\n clear(): void {\n this.list.length = 0\n }\n\n /** World position of the centre of mass. */\n centerOf(b: PieceBody, out: THREE_NS.Vector3): THREE_NS.Vector3 {\n return out.copy(b.centerV).applyQuaternion(b.root.quaternion).add(b.root.position)\n }\n\n impulse(b: PieceBody, impulse: Vec3, point?: Vec3): void {\n const inv = 1 / b.mass\n b.velocity[0] += impulse[0] * inv\n b.velocity[1] += impulse[1] * inv\n b.velocity[2] += impulse[2] * inv\n if (point) {\n const c = this.centerOf(b, this.p)\n const rx = point[0] - c.x\n const ry = point[1] - c.y\n const rz = point[2] - c.z\n // torque = r x J, angular velocity change = I^-1 torque\n const tx = ry * impulse[2] - rz * impulse[1]\n const ty = rz * impulse[0] - rx * impulse[2]\n const tz = rx * impulse[1] - ry * impulse[0]\n const w = this.mulInvInertia(b, tx, ty, tz)\n b.angularVelocity[0] += w[0]\n b.angularVelocity[1] += w[1]\n b.angularVelocity[2] += w[2]\n }\n b.sleeping = false\n b.still = 0\n }\n\n /** I^-1 * (x, y, z) in world space for a box with the body's half extents and mass (needs `this.m` to hold the body's rotation). */\n private mulInvInertia(b: PieceBody, x: number, y: number, z: number): Vec3 {\n this.m.makeRotationFromQuaternion(b.root.quaternion)\n return this.mulInvInertiaWith(b, this.m.elements, x, y, z)\n }\n\n private mulInvInertiaWith(b: PieceBody, e: ArrayLike<number>, x: number, y: number, z: number): Vec3 {\n const [hx, hy, hz] = b.halfExtents\n const k = 3 / b.mass\n const ix = k / (hy * hy + hz * hz)\n const iy = k / (hx * hx + hz * hz)\n const iz = k / (hx * hx + hy * hy)\n // local = R^T v (columns of R are the local axes in world space)\n const lx = (e[0] * x + e[1] * y + e[2] * z) * ix\n const ly = (e[4] * x + e[5] * y + e[6] * z) * iy\n const lz = (e[8] * x + e[9] * y + e[10] * z) * iz\n return [e[0] * lx + e[4] * ly + e[8] * lz, e[1] * lx + e[5] * ly + e[9] * lz, e[2] * lx + e[6] * ly + e[10] * lz]\n }\n\n update(dt: number): void {\n this.time += dt\n for (const b of this.list) {\n if (b.held) {\n b.velocity = [0, 0, 0]\n b.angularVelocity = [0, 0, 0]\n b.sleeping = false\n b.still = 0\n continue\n }\n if (b.sleeping) continue\n this.integrate(b, dt)\n }\n this.separate(dt)\n }\n\n private integrate(b: PieceBody, dt: number): void {\n const c = this.centerOf(b, this.p)\n const pos: Vec3 = [c.x, c.y, c.z]\n const q = this.q.copy(b.root.quaternion)\n const v = b.velocity\n const w = b.angularVelocity\n const [hx, hy, hz] = b.halfExtents\n const invM = 1 / b.mass\n const steps = clamp(Math.ceil(dt / SUB_DT), 1, 8)\n const h = dt / steps\n let landing = 0\n let landPoint: Vec3 = [pos[0], pos[1], pos[2]]\n let contactedLast = false\n let touched = false\n let unstable = false\n\n for (let s = 0; s < steps; s++) {\n v[1] -= this.o.gravity * h\n pos[0] += v[0] * h\n pos[1] += v[1] * h\n pos[2] += v[2] * h\n const wl = Math.hypot(w[0], w[1], w[2])\n if (wl > 1e-6) {\n this.dq.setFromAxisAngle(this.ax.set(w[0] / wl, w[1] / wl, w[2] / wl), wl * h)\n q.premultiply(this.dq).normalize()\n }\n const damp = Math.exp(-0.15 * h)\n w[0] *= damp\n w[1] *= damp\n w[2] *= damp\n\n this.m.makeRotationFromQuaternion(q)\n const e = this.m.elements\n const rs: Vec3[] = []\n let maxPen = 0\n for (let i = 0; i < 8; i++) {\n const sx = i & 1 ? hx : -hx\n const sy = i & 2 ? hy : -hy\n const sz = i & 4 ? hz : -hz\n const r: Vec3 = [e[0] * sx + e[4] * sy + e[8] * sz, e[1] * sx + e[5] * sy + e[9] * sz, e[2] * sx + e[6] * sy + e[10] * sz]\n const gy = this.o.groundAt(pos[0] + r[0], pos[2] + r[2])\n const pen = gy - (pos[1] + r[1])\n if (pen > -SLOP) {\n rs.push(r)\n if (pen > maxPen) maxPen = pen\n }\n }\n contactedLast = rs.length > 0\n if (contactedLast) touched = true\n if (!contactedLast) continue\n pos[1] += Math.max(0, maxPen - SLOP * 0.5)\n let impact = 0\n for (const r of rs) impact = Math.max(impact, -(v[1] + w[2] * r[0] - w[0] * r[2]))\n const restitution = impact > 2 ? 0.25 : 0\n if (impact > landing) {\n landing = impact\n let sx = 0\n let sz = 0\n for (const r of rs) {\n sx += r[0]\n sz += r[2]\n }\n const lx = pos[0] + sx / rs.length\n const lz = pos[2] + sz / rs.length\n landPoint = [lx, this.o.groundAt(lx, lz), lz]\n }\n for (let it = 0; it < 4; it++) {\n for (const r of rs) {\n // contact point velocity\n let vx = v[0] + (w[1] * r[2] - w[2] * r[1])\n let vy = v[1] + (w[2] * r[0] - w[0] * r[2])\n let vz = v[2] + (w[0] * r[1] - w[1] * r[0])\n const vn = vy\n if (vn >= 0) continue\n // normal impulse (n = +y): r x n = (-rz, 0, rx)\n const a = this.mulInvInertiaWith(b, e, -r[2], 0, r[0])\n const denom = invM + (a[2] * r[0] - a[0] * r[2])\n const j = (-(1 + (it === 0 ? restitution : 0)) * vn) / denom\n v[1] += j * invM\n const dw = this.mulInvInertiaWith(b, e, -r[2] * j, 0, r[0] * j)\n w[0] += dw[0]\n w[1] += dw[1]\n w[2] += dw[2]\n // friction in the contact plane\n vx = v[0] + (w[1] * r[2] - w[2] * r[1])\n vy = v[1] + (w[2] * r[0] - w[0] * r[2])\n vz = v[2] + (w[0] * r[1] - w[1] * r[0])\n const vt = Math.hypot(vx, vz)\n if (vt > 1e-5) {\n const tx = vx / vt\n const tz = vz / vt\n // r x t with t = (tx, 0, tz) = (0*tz - rz*0 ... ) -> (ry*tz, rz*tx - rx*tz, -ry*tx)\n const rx = r[1] * tz\n const ry = r[2] * tx - r[0] * tz\n const rz = -r[1] * tx\n const at = this.mulInvInertiaWith(b, e, rx, ry, rz)\n const cx = at[1] * r[2] - at[2] * r[1]\n const cz = at[0] * r[1] - at[1] * r[0]\n const denomT = invM + cx * tx + cz * tz\n const jt = Math.min(vt / denomT, MU * j)\n v[0] -= tx * jt * invM\n v[2] -= tz * jt * invM\n const dwt = this.mulInvInertiaWith(b, e, rx * jt, ry * jt, rz * jt)\n w[0] -= dwt[0]\n w[1] -= dwt[1]\n w[2] -= dwt[2]\n }\n }\n }\n // Support check. The corner contacts above are relative to the centre of mass, so they already give a torque when the centre of mass is\n // outside the support. What they cannot do is end a balancing act: a tall thin piece on its edge (or a single corner) is in equilibrium\n // with the centre of mass above a very small support, so it must not rest there. It gets a gentle topple push toward the side it leans\n // to (or toward the wider side when it leans nowhere), and it may not sleep.\n let x0 = Infinity, x1 = -Infinity, z0 = Infinity, z1 = -Infinity, low = 0\n for (const r of rs) {\n x0 = Math.min(x0, r[0]); x1 = Math.max(x1, r[0])\n z0 = Math.min(z0, r[2]); z1 = Math.max(z1, r[2])\n low = Math.min(low, r[1])\n }\n const height = -low\n const wx = x1 - x0\n const wz = z1 - z0\n unstable = Math.min(wx, wz) < NARROW * height || x0 > 0 || x1 < 0 || z0 > 0 || z1 < 0\n if (unstable) {\n // the support centre relative to the centre of mass: the piece falls away from it (toward +axis when it is centred)\n const dirX = x0 + x1 > 0 ? -1 : 1\n const dirZ = z0 + z1 > 0 ? -1 : 1\n const k = TOPPLE * Math.min(height, 1) * h\n // rotating about -z moves the top toward +x; rotating about +x moves it toward +z\n if (wx <= wz) w[2] -= dirX * k\n else w[0] += dirZ * k\n }\n // rolling / spinning resistance while touching the ground\n const rd = Math.exp((rs.length >= 3 ? -3 : -1.5) * h)\n w[0] *= rd\n w[1] *= rd\n w[2] *= rd\n const fd = Math.exp(-0.3 * h)\n v[0] *= fd\n v[2] *= fd\n }\n\n // write back\n b.root.quaternion.copy(q)\n const off = this.ax.copy(b.centerV).applyQuaternion(q)\n b.root.position.set(pos[0] - off.x, pos[1] - off.y, pos[2] - off.z)\n b.root.updateMatrixWorld(true)\n b.onGround = contactedLast\n\n if (landing > HARD_LANDING && this.time - b.lastHit > 0.15) {\n b.lastHit = this.time\n this.o.onHardLanding(b, landPoint, landing)\n }\n\n const still = touched && !unstable && Math.hypot(v[0], v[1], v[2]) < 0.12 && Math.hypot(w[0], w[1], w[2]) < 0.45\n if (still) {\n b.still += dt\n if (b.still >= SLEEP_AFTER) {\n b.sleeping = true\n v[0] = v[1] = v[2] = 0\n w[0] = w[1] = w[2] = 0\n }\n } else {\n b.still = 0\n }\n }\n\n /** Push overlapping pieces apart (horizontal bounding circles), gently, so they do not interpenetrate forever. */\n private separate(dt: number): void {\n const n = this.list.length\n if (n < 2) return\n const maxMove = 1.5 * dt\n const ca = new this.THREE.Vector3()\n const cb = new this.THREE.Vector3()\n for (let i = 0; i < n; i++) {\n const a = this.list[i]\n for (let j = i + 1; j < n; j++) {\n const b = this.list[j]\n if (a.held && b.held) continue\n if (a.sleeping && b.sleeping) continue\n const ra = Math.hypot(a.halfExtents[0], a.halfExtents[1], a.halfExtents[2])\n const rb = Math.hypot(b.halfExtents[0], b.halfExtents[1], b.halfExtents[2])\n this.centerOf(a, ca)\n this.centerOf(b, cb)\n if (Math.abs(ca.y - cb.y) > ra + rb) continue\n const rh = (Math.max(a.halfExtents[0], a.halfExtents[2]) + Math.max(b.halfExtents[0], b.halfExtents[2])) * 0.8\n let dx = cb.x - ca.x\n let dz = cb.z - ca.z\n let d = Math.hypot(dx, dz)\n if (d >= rh) continue\n if (d < 1e-5) {\n dx = 1\n dz = 0\n d = 1\n }\n const push = Math.min(maxMove, (rh - d) * 0.5)\n const wa = a.held ? 0 : b.held ? 1 : b.mass / (a.mass + b.mass)\n const wb = b.held ? 0 : a.held ? 1 : a.mass / (a.mass + b.mass)\n const ux = dx / (d || 1)\n const uz = dz / (d || 1)\n if (!a.held) {\n a.root.position.x -= ux * push * 2 * wa\n a.root.position.z -= uz * push * 2 * wa\n a.sleeping = false\n }\n if (!b.held) {\n b.root.position.x += ux * push * 2 * wb\n b.root.position.z += uz * push * 2 * wb\n b.sleeping = false\n }\n }\n }\n }\n}\n","import type * as THREE_NS from 'three'\nimport type { Vec3 } from '@adatechnology/game-destruction'\n\n/** Bare rebar of reinforced parts: one instanced cylinder mesh per part, replaced whenever the part exposes more (or less) of its cage. */\nexport class RebarCages {\n private readonly cages = new Map<string, THREE_NS.InstancedMesh>()\n private readonly geometry: THREE_NS.CylinderGeometry\n private readonly material: THREE_NS.MeshStandardMaterial\n private readonly up: THREE_NS.Vector3\n private readonly dir: THREE_NS.Vector3\n private readonly mid: THREE_NS.Vector3\n private readonly q: THREE_NS.Quaternion\n private readonly scale: THREE_NS.Vector3\n private readonly m: THREE_NS.Matrix4\n\n constructor(\n private readonly THREE: typeof THREE_NS,\n private readonly scene: THREE_NS.Scene,\n radius = 0.004,\n ) {\n this.geometry = new THREE.CylinderGeometry(radius, radius, 1, 6)\n this.material = new THREE.MeshStandardMaterial({ color: 0x74665c, roughness: 0.55, metalness: 0.6 })\n this.up = new THREE.Vector3(0, 1, 0)\n this.dir = new THREE.Vector3()\n this.mid = new THREE.Vector3()\n this.q = new THREE.Quaternion()\n this.scale = new THREE.Vector3()\n this.m = new THREE.Matrix4()\n }\n\n /** Bars drawn now, over every part. */\n get count(): number {\n let n = 0\n for (const mesh of this.cages.values()) n += mesh.count\n return n\n }\n\n /** Meshes of the live cages (tests and picking). */\n meshes(): THREE_NS.InstancedMesh[] {\n return [...this.cages.values()]\n }\n\n /** Draw `bars` (world space) as the cage of `key`; an empty list removes it. */\n set(key: string, bars: ReadonlyArray<readonly [Vec3, Vec3]>): void {\n this.remove(key)\n if (bars.length === 0) return\n const mesh = new this.THREE.InstancedMesh(this.geometry, this.material, bars.length)\n bars.forEach(([a, b], i) => {\n this.dir.set(b[0] - a[0], b[1] - a[1], b[2] - a[2])\n const length = this.dir.length()\n this.mid.set((a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2)\n this.q.setFromUnitVectors(this.up, length > 1e-9 ? this.dir.divideScalar(length) : this.up)\n this.m.compose(this.mid, this.q, this.scale.set(1, Math.max(length, 1e-4), 1))\n mesh.setMatrixAt(i, this.m)\n })\n mesh.instanceMatrix.needsUpdate = true\n mesh.castShadow = true\n this.scene.add(mesh)\n this.cages.set(key, mesh)\n }\n\n remove(key: string): void {\n const mesh = this.cages.get(key)\n if (!mesh) return\n this.scene.remove(mesh)\n mesh.dispose()\n this.cages.delete(key)\n }\n\n /** Remove the cages of every part of `object` (keys are `object|part`). */\n removeObject(object: string): void {\n for (const key of [...this.cages.keys()]) if (key.startsWith(`${object}|`)) this.remove(key)\n }\n\n clear(): void {\n for (const key of [...this.cages.keys()]) this.remove(key)\n }\n\n dispose(): void {\n this.clear()\n this.geometry.dispose()\n this.material.dispose()\n }\n}\n","import type * as THREE_NS from 'three'\nimport { guessMaterial, inferJoints } from '@adatechnology/game-destruction'\nimport type { JointKind, JointSpec, MaterialId, PartSpec } from '@adatechnology/game-destruction'\nimport type { Mesh, Object3D, SpecFromObjectOptions, SpecFromObjectResult, ThreeNamespace } from './types'\n\ninterface Entry {\n key: string\n meshes: Mesh[]\n box: THREE_NS.Box3\n material: MaterialId\n explicitId: string | null\n fill?: number\n hollow: boolean\n tags?: string[]\n /** Part id wished by the host (`userData.destructionPart`). */\n fixedId: boolean\n name: string\n /** `parent` / `kind` of an object-valued `destructionPart`: the part is attached to `parent` by a joint of that kind. */\n parent?: string\n jointKind?: JointKind\n}\n\n/** What `userData.destructionPart` says: a string (the part id) or an object `{ id, material?, parent?, kind? }`. */\nexport interface PartHint {\n id: string\n material?: string\n parent?: string\n kind?: string\n}\n\n/** Read `userData.destructionPart` (string or object with an `id`); null when it names no part. */\nexport function partHintOf(value: unknown): PartHint | null {\n if (typeof value === 'string') return value ? { id: value } : null\n if (!value || typeof value !== 'object') return null\n const v = value as Record<string, unknown>\n if (typeof v.id !== 'string' || !v.id) return null\n const str = (x: unknown): string | undefined => (typeof x === 'string' && x ? x : undefined)\n return { id: v.id, material: str(v.material), parent: str(v.parent), kind: str(v.kind) }\n}\n\nconst METAL = /steel|iron|metal|alumin|copper|brass|bronze|tin|titan|chrome|zinc|lead/i\n\nfunction sanitizeId(name: string): string {\n let id = name\n .trim()\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n if (id && /^[0-9]/.test(id)) id = `p_${id}`\n return id\n}\n\nfunction isMesh(o: Object3D): o is Mesh {\n return (o as Mesh).isMesh === true\n}\n\nfunction sizeOf(box: THREE_NS.Box3): [number, number, number] {\n return [box.max.x - box.min.x, box.max.y - box.min.y, box.max.z - box.min.z]\n}\n\n/**\n * Build a `DestructibleSpec` from a three.js object: one part per mesh (meshes sharing `userData.destructionPart` become one part), each an\n * axis-aligned box in the root's space (rotation omitted), with the material taken from `options.materialOf`, `userData.destructionMaterial`\n * or a guess from the names. Tiny meshes are merged into the part they overlap most; joints are inferred from touching parts.\n *\n * Meshes that are invisible or have `userData.destructionIgnore` (or sit under such an object) are skipped. The result also tells which meshes\n * became which part, ready to be passed to `bind`.\n */\nexport function specFromObject3D(THREE: ThreeNamespace, root: Object3D, options: SpecFromObjectOptions = {}): SpecFromObjectResult {\n const fallback = options.fallback ?? 'plastic'\n const minSize = options.minSize ?? 0.015\n root.updateMatrixWorld(true)\n const inv = root.matrixWorld.clone().invert()\n\n // 1. collect meshes -> entries (grouped by an explicit part name)\n const entries: Entry[] = []\n const byKey = new Map<string, Entry>()\n const visit = (o: Object3D): void => {\n if (!o.visible || o.userData?.destructionIgnore) return\n if (isMesh(o) && o.geometry) {\n const geom = o.geometry\n if (!geom.boundingBox) geom.computeBoundingBox()\n if (geom.boundingBox && !geom.boundingBox.isEmpty()) {\n const box = geom.boundingBox.clone().applyMatrix4(new THREE.Matrix4().multiplyMatrices(inv, o.matrixWorld))\n const mats = Array.isArray(o.material) ? o.material : [o.material]\n const matName = mats[0]?.name ?? ''\n const ud = o.userData ?? {}\n const hint = partHintOf(ud.destructionPart)\n const material =\n options.materialOf?.(o) ??\n (typeof ud.destructionMaterial === 'string' ? (ud.destructionMaterial as string) : undefined) ??\n hint?.material ??\n guessMaterial(`${o.name} ${matName} ${typeof ud.material === 'string' ? ud.material : ''}`) ??\n fallback\n const explicit = hint?.id ?? null\n const hollow = ud.hollow === true || /hollow/i.test(o.name)\n const fill = options.fillOf?.(o, material)\n const tags = Array.isArray(ud.destructionTags) ? (ud.destructionTags as string[]) : undefined\n const existing = explicit ? byKey.get(explicit) : undefined\n if (existing) {\n const before = sizeOf(existing.box)\n const bv = before[0] * before[1] * before[2]\n const ns = sizeOf(box)\n existing.box.union(box)\n existing.meshes.push(o)\n if (ns[0] * ns[1] * ns[2] > bv) existing.material = material\n existing.hollow = existing.hollow || hollow\n if (fill !== undefined) existing.fill = fill\n } else {\n const e: Entry = { key: explicit ?? `m${entries.length}`, meshes: [o], box, material, explicitId: explicit, fill, hollow, tags, fixedId: !!explicit, name: o.name, parent: hint?.parent, jointKind: hint?.kind as JointKind | undefined }\n entries.push(e)\n if (explicit) byKey.set(explicit, e)\n }\n }\n }\n for (const c of o.children) visit(c)\n }\n visit(root)\n\n // 2. merge tiny meshes into the touching part they overlap most\n const eps = 0.005\n const overlapVolume = (a: THREE_NS.Box3, b: THREE_NS.Box3): number => {\n const x = Math.min(a.max.x, b.max.x) - Math.max(a.min.x, b.min.x) + eps\n const y = Math.min(a.max.y, b.max.y) - Math.max(a.min.y, b.min.y) + eps\n const z = Math.min(a.max.z, b.max.z) - Math.max(a.min.z, b.min.z) + eps\n return x > 0 && y > 0 && z > 0 ? x * y * z : 0\n }\n const largest = (e: Entry) => Math.max(...sizeOf(e.box))\n const kept: Entry[] = []\n const tiny: Entry[] = []\n for (const e of entries) (!e.fixedId && largest(e) < minSize ? tiny : kept).push(e)\n for (const t of tiny) {\n let best: Entry | null = null\n let bestV = 0\n for (const k of kept) {\n const v = overlapVolume(t.box, k.box)\n if (v > bestV) {\n bestV = v\n best = k\n }\n }\n if (!best) {\n // not touching anything: join the nearest part within a small distance\n let bd = 0.05\n for (const k of kept) {\n const d = k.box.distanceToPoint(t.box.getCenter(new THREE.Vector3()))\n if (d < bd) {\n bd = d\n best = k\n }\n }\n }\n if (best) {\n best.meshes.push(...t.meshes) // the box stays: a tiny mesh sits inside or on the surface of its part\n } else {\n kept.push(t) // isolated crumb: keep it as its own part\n }\n }\n\n // 3. ids, parts\n const used = new Set<string>()\n const parts: PartSpec[] = []\n const meshesOf: Record<string, Object3D[]> = {}\n let counter = 0\n for (const e of kept) {\n counter++\n let base = (e.explicitId ? sanitizeId(e.explicitId) : '') || sanitizeId(e.name) || `part_${counter}`\n let id = base\n for (let n = 2; used.has(id); n++) id = `${base}_${n}`\n used.add(id)\n base = id\n const size = sizeOf(e.box)\n const center = e.box.getCenter(new THREE.Vector3())\n const part: PartSpec = {\n id,\n material: e.material,\n shape: { kind: 'box', size: [Math.max(size[0], 0.002), Math.max(size[1], 0.002), Math.max(size[2], 0.002)] },\n position: [center.x, center.y, center.z],\n }\n const minSide = Math.min(...size)\n if (e.fill !== undefined) part.fill = e.fill\n else if (e.hollow) part.fill = 0.05\n if (minSide < 0.01 && METAL.test(e.material)) {\n part.fill = e.fill ?? 1\n part.thickness = Math.max(minSide, 0.0005)\n }\n if (e.tags) part.tags = [...e.tags]\n const ao = options.anchorBelow ?? -1\n if (ao >= 0 && e.box.min.y <= ao) part.anchored = true\n parts.push(part)\n meshesOf[id] = e.meshes\n }\n\n const spec: SpecFromObjectResult['spec'] = { parts }\n if (options.name !== undefined) spec.name = options.name\n else if (root.name) spec.name = root.name\n if (options.tags) spec.tags = [...options.tags]\n spec.joints = options.joints === false ? [] : inferJoints(parts)\n // explicit attachments from `destructionPart: { parent, kind }` win over the inferred joint between the same two parts\n if (options.joints !== false) {\n const finalId = new Map<Entry, string>()\n kept.forEach((e, i) => finalId.set(e, parts[i].id))\n const idOf = new Map<string, string>()\n for (const e of kept) if (e.explicitId) idOf.set(e.explicitId, finalId.get(e)!)\n const joints: JointSpec[] = spec.joints\n for (const e of kept) {\n if (!e.parent) continue\n const id = finalId.get(e)!\n const parent = idOf.get(e.parent) ?? (used.has(sanitizeId(e.parent)) ? sanitizeId(e.parent) : null)\n if (!parent || parent === id) continue\n const at = joints.findIndex((j) => (j.a === parent && j.b === id) || (j.a === id && j.b === parent))\n const kind = e.jointKind ?? (at >= 0 ? joints[at].kind : 'resting')\n const joint: JointSpec = { id: `${parent}~${id}`, a: parent, b: id, kind }\n if (at >= 0) joints[at] = joint\n else joints.push(joint)\n }\n }\n return { spec, parts: meshesOf }\n}\n","import { mixHex } from './math'\n\n/** Blackbody-ish stops: [temperature °C, colour]. Luminance grows with the temperature. */\nconst STOPS: Array<[number, number]> = [\n [450, 0x000000],\n [500, 0x2a0400],\n [650, 0x8a1500],\n [800, 0xd84a08],\n [950, 0xff8c14],\n [1100, 0xffc23a],\n [1250, 0xffe8a0],\n [1400, 0xffffff],\n]\n\n/**\n * Glow colour of a hot surface as `0xRRGGBB`: black (no glow) below about 450 °C, dark red around 500, orange around 800, yellow around 1100 and\n * white from 1400 °C. Brightness never decreases as the temperature rises. Use it as an emissive colour.\n */\nexport function heatColor(temperatureC: number): number {\n if (!(temperatureC > STOPS[0][0])) return 0\n const last = STOPS[STOPS.length - 1]\n if (temperatureC >= last[0]) return last[1]\n for (let i = 1; i < STOPS.length; i++) {\n const [t1, c1] = STOPS[i]\n if (temperatureC <= t1) {\n const [t0, c0] = STOPS[i - 1]\n return mixHex(c0, c1, (temperatureC - t0) / (t1 - t0))\n }\n }\n return last[1]\n}\n","import type * as THREE_NS from 'three'\nimport type { Dent } from '@adatechnology/game-destruction'\nimport { heatColor } from './heat'\nimport type { Decal, HostVis, MeshVis, PartVis } from './internal'\nimport { clamp, createRng, lerp } from './math'\n\ntype Mesh = THREE_NS.Mesh\n\nconst POS_ATTR = 'position'\n\nfunction positionAttr(geo: THREE_NS.BufferGeometry): THREE_NS.BufferAttribute | null {\n const a = geo.getAttribute(POS_ATTR) as THREE_NS.BufferAttribute | THREE_NS.InterleavedBufferAttribute | undefined\n return a && !(a as THREE_NS.InterleavedBufferAttribute).isInterleavedBufferAttribute ? (a as THREE_NS.BufferAttribute) : null\n}\n\nfunction materialsOf(m: THREE_NS.Material | THREE_NS.Material[]): THREE_NS.Material[] {\n return Array.isArray(m) ? m : [m]\n}\n\nfunction colorOf(m: THREE_NS.Material): THREE_NS.Color | null {\n const c = (m as THREE_NS.MeshStandardMaterial).color\n return c && (c as THREE_NS.Color).isColor ? c : null\n}\n\n/** Shared resources for decals (one geometry, a few materials) created lazily and disposed together. */\nexport class DecalKit {\n private disc: THREE_NS.CircleGeometry | null = null\n private discMat: THREE_NS.MeshBasicMaterial | null = null\n private lineMats = new Map<number, THREE_NS.LineBasicMaterial>()\n private patchMats = new Map<number, THREE_NS.MeshBasicMaterial>()\n constructor(private readonly THREE: typeof THREE_NS) {}\n\n discGeometry(): THREE_NS.CircleGeometry {\n return (this.disc ??= new this.THREE.CircleGeometry(1, 14))\n }\n\n discMaterial(): THREE_NS.MeshBasicMaterial {\n return (this.discMat ??= new this.THREE.MeshBasicMaterial({\n color: 0x050505,\n transparent: true,\n opacity: 0.92,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -4,\n polygonOffsetUnits: -4,\n }))\n }\n\n /** Opaque patch in the colour of what shows under a spalled coat. */\n patchMaterial(color: number): THREE_NS.MeshBasicMaterial {\n let m = this.patchMats.get(color)\n if (!m) {\n m = new this.THREE.MeshBasicMaterial({ color, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -3, polygonOffsetUnits: -3 })\n this.patchMats.set(color, m)\n }\n return m\n }\n\n lineMaterial(color: number): THREE_NS.LineBasicMaterial {\n let m = this.lineMats.get(color)\n if (!m) {\n m = new this.THREE.LineBasicMaterial({ color, transparent: true, opacity: 0.9, depthWrite: false })\n this.lineMats.set(color, m)\n }\n return m\n }\n\n dispose(): void {\n this.disc?.dispose()\n this.discMat?.dispose()\n for (const m of this.lineMats.values()) m.dispose()\n for (const m of this.patchMats.values()) m.dispose()\n this.patchMats.clear()\n this.disc = null\n this.discMat = null\n this.lineMats.clear()\n }\n}\n\nconst tmpV = (THREE: typeof THREE_NS) => new THREE.Vector3()\n\n/** Mesh-level visual changes: copy-on-write geometry and materials, dents, decals, char, glow, melt, hiding, restoring. */\nexport class Visuals {\n readonly kit: DecalKit\n private readonly a: THREE_NS.Vector3\n private readonly b: THREE_NS.Vector3\n private readonly m4: THREE_NS.Matrix4\n private readonly box: THREE_NS.Box3\n private readonly t: THREE_NS.Vector3\n private readonly lbox: THREE_NS.Box3\n /** Total live decals across meshes (kept in sync by add/remove). */\n decalCount = 0\n\n constructor(\n private readonly THREE: typeof THREE_NS,\n private readonly lowQuality: boolean,\n private readonly decalCap: number,\n ) {\n this.kit = new DecalKit(THREE)\n this.a = tmpV(THREE)\n this.b = tmpV(THREE)\n this.m4 = new THREE.Matrix4()\n this.box = new THREE.Box3()\n this.t = tmpV(THREE)\n this.lbox = new THREE.Box3()\n }\n\n /**\n * @param range vertex range `[v0, v1)` of a merged mesh this part is drawn by (see `MeshRange`); `hosts` caches the shared state per mesh for one `bind`.\n */\n makeMeshVis(mesh: Mesh, home: string, range?: [number, number], hosts?: Map<Mesh, HostVis>): MeshVis {\n let host: HostVis | null = null\n if (range) {\n host = hosts?.get(mesh) ?? null\n if (!host) {\n host = { mesh, origGeometry: mesh.geometry, origMaterial: mesh.material, ownGeo: false, work: null, ownMat: false, sharers: [] }\n hosts?.set(mesh, host)\n }\n }\n const mv: MeshVis = {\n mesh,\n home,\n origGeometry: mesh.geometry,\n origMaterial: mesh.material,\n origVisible: mesh.visible,\n origParent: mesh.parent,\n origPosition: mesh.position.clone(),\n origQuaternion: mesh.quaternion.clone(),\n origScale: mesh.scale.clone(),\n ownMat: false,\n ownGeo: false,\n work: null,\n baseColors: null,\n decals: [],\n meltApplied: 0,\n bottomY: 0,\n moved: false,\n host,\n range: range ? [range[0], range[1]] : null,\n merged: host && range ? { host, range: [range[0], range[1]] } : null,\n loose: false,\n collapsed: false,\n hidden: false,\n touched: false,\n charK: 0,\n charHex: 0,\n glowHex: 0,\n glowK: 0,\n }\n host?.sharers.push(mv)\n return mv\n }\n\n vertexCount(mv: MeshVis): number {\n if (mv.range) return mv.range[1] - mv.range[0]\n return mv.mesh.geometry.getAttribute(POS_ATTR)?.count ?? 0\n }\n\n /** Is the part drawn? (A ranged part shares its mesh, so `mesh.visible` says nothing about it.) */\n shown(mv: MeshVis): boolean {\n return mv.host ? !mv.hidden : mv.mesh.visible\n }\n\n /** Box of the part's vertices in the space of its mesh (the whole geometry for a plain mesh). */\n localBox(mv: MeshVis, out: THREE_NS.Box3): THREE_NS.Box3 {\n out.makeEmpty()\n if (!mv.host || !mv.range) {\n const geo = mv.mesh.geometry\n if (!geo.boundingBox) geo.computeBoundingBox()\n return geo.boundingBox ? out.copy(geo.boundingBox) : out\n }\n const arr = mv.host.work ?? (positionAttr(mv.mesh.geometry)?.array as unknown as ArrayLike<number> | undefined)\n if (!arr) return out\n for (let i = mv.range[0] * 3; i < mv.range[1] * 3; i += 3) out.expandByPoint(this.t.set(arr[i], arr[i + 1], arr[i + 2]))\n return out\n }\n\n /** Box of the part in world space. */\n worldBox(mv: MeshVis, out: THREE_NS.Box3): THREE_NS.Box3 {\n if (!mv.host) return out.setFromObject(mv.mesh)\n this.localBox(mv, out)\n mv.mesh.updateWorldMatrix(true, false)\n return out.isEmpty() ? out : out.applyMatrix4(mv.mesh.matrixWorld)\n }\n\n private readonly tints = new WeakMap<MeshVis, THREE_NS.Color | null>()\n\n /**\n * Average vertex colour of a mesh whose material uses `vertexColors` (computed once per mesh, from its original geometry), else null. Fragments\n * and debris of such a mesh multiply it by `material.color`; without it they come out white.\n */\n vertexTint(mv: MeshVis): THREE_NS.Color | null {\n if (this.tints.has(mv)) return this.tints.get(mv) ?? null\n let tint: THREE_NS.Color | null = null\n const used = materialsOf(mv.origMaterial).some((m) => (m as THREE_NS.MeshStandardMaterial).vertexColors === true)\n const attr = used ? (mv.origGeometry.getAttribute('color') as THREE_NS.BufferAttribute | undefined) : undefined\n if (attr && attr.count > 0 && attr.itemSize >= 3) {\n // a ranged part averages its own vertices only\n const from = mv.merged ? mv.merged.range[0] : 0\n const to = mv.merged ? Math.min(attr.count, mv.merged.range[1]) : attr.count\n let r = 0, g = 0, b = 0\n for (let i = from; i < to; i++) {\n r += attr.getX(i)\n g += attr.getY(i)\n b += attr.getZ(i)\n }\n const n = Math.max(1, to - from)\n tint = new this.THREE.Color(r / n, g / n, b / n)\n }\n this.tints.set(mv, tint)\n return tint\n }\n\n /** Colour of the original material (before any char) times the vertex tint, `0xRRGGBB`, or -1. */\n baseColorHex(mv: MeshVis): number {\n const c = mv.baseColors?.[0] ?? colorOf(materialsOf(mv.origMaterial)[0])\n if (!c) return -1\n const tint = this.vertexTint(mv)\n return tint ? c.clone().multiply(tint).getHex() : c.getHex()\n }\n\n /** Is the original material transparent? */\n isTransparent(mv: MeshVis): boolean {\n return materialsOf(mv.origMaterial).some((m) => m.transparent && m.opacity < 1)\n }\n\n ownMaterial(mv: MeshVis): void {\n if (mv.ownMat) return\n mv.ownMat = true\n const src = materialsOf(mv.origMaterial)\n const cloned = src.map((m) => m.clone())\n mv.baseColors = src.map((m) => colorOf(m)?.clone() ?? new this.THREE.Color(0x888888))\n mv.mesh.material = Array.isArray(mv.origMaterial) ? cloned : cloned[0]\n }\n\n /** Clone the geometry (vertex edits); false when its positions cannot be edited. */\n ownGeometry(mv: MeshVis): boolean {\n if (mv.host) return this.ownHostGeometry(mv.host)\n if (mv.ownGeo) return true\n const pos = positionAttr(mv.mesh.geometry)\n if (!pos) return false\n mv.ownGeo = true\n const g = mv.mesh.geometry.clone()\n mv.mesh.geometry = g\n mv.work = new Float32Array((positionAttr(g) as THREE_NS.BufferAttribute).array as ArrayLike<number>)\n return true\n }\n\n private ownHostGeometry(host: HostVis): boolean {\n if (host.ownGeo) return true\n const pos = positionAttr(host.mesh.geometry)\n if (!pos) return false\n host.ownGeo = true\n const g = host.mesh.geometry.clone()\n host.mesh.geometry = g\n host.work = new Float32Array((positionAttr(g) as THREE_NS.BufferAttribute).array as ArrayLike<number>)\n return true\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Dents\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n /**\n * Push the vertices of the mesh within `dent.radius` of `worldPoint` inwards along `worldNormal` by `depth * (1 - (d/r)^2)^2`.\n * Returns false when nothing was changed (too far, low quality on a heavy mesh, or no editable positions).\n */\n applyDent(mv: MeshVis, worldPoint: THREE_NS.Vector3, worldNormal: THREE_NS.Vector3, dent: Dent): boolean {\n const mesh = mv.mesh\n if (this.lowQuality && this.vertexCount(mv) > 20000) return false\n mesh.updateWorldMatrix(true, false)\n const s = mesh.matrixWorld.getMaxScaleOnAxis() || 1\n const lp = mesh.worldToLocal(this.a.copy(worldPoint))\n const ln = this.b.copy(worldNormal).transformDirection(this.m4.copy(mesh.matrixWorld).invert()).normalize()\n const r = dent.radius / s\n const depth = dent.depth / s\n // quick reject: the point must be near the mesh bounds\n const geo = mesh.geometry\n let bb: THREE_NS.Box3 | null\n if (mv.host) bb = this.localBox(mv, this.lbox)\n else {\n if (!geo.boundingBox) geo.computeBoundingBox()\n bb = geo.boundingBox\n }\n if (bb && !bb.isEmpty() && bb.distanceToPoint(lp) > r) return false\n if (!this.ownGeometry(mv)) return false\n const work = (mv.host ? mv.host.work : mv.work) as Float32Array\n const pos = positionAttr(mesh.geometry) as THREE_NS.BufferAttribute\n const r2 = r * r\n let touched = false\n const px = lp.x\n const py = lp.y\n const pz = lp.z\n const nx = ln.x\n const ny = ln.y\n const nz = ln.z\n const from = mv.range ? mv.range[0] * 3 : 0\n const to = mv.range ? mv.range[1] * 3 : work.length\n for (let i = from; i < to; i += 3) {\n const dx = work[i] - px\n const dy = work[i + 1] - py\n const dz = work[i + 2] - pz\n const d2 = dx * dx + dy * dy + dz * dz\n if (d2 >= r2) continue\n const f = 1 - d2 / r2\n const k = depth * f * f\n work[i] -= nx * k\n work[i + 1] -= ny * k\n work[i + 2] -= nz * k\n touched = true\n }\n if (!touched) return false\n mv.touched = true\n this.writePositions(mv, pos)\n return true\n }\n\n /** Copy `work` (dents) into the geometry, adding the melt sag when the mesh is melting. */\n private writePositions(mv: MeshVis, pos: THREE_NS.BufferAttribute): void {\n if (mv.host) {\n this.rebuildHost(mv.host)\n return\n }\n const work = mv.work as Float32Array\n const arr = pos.array as unknown as Float32Array\n const melt = mv.meltApplied\n if (melt <= 0 || (this.lowQuality && work.length / 3 > 20000)) {\n arr.set(work)\n } else {\n const geo = mv.mesh.geometry\n if (!geo.boundingBox) geo.computeBoundingBox()\n const bb = geo.boundingBox as THREE_NS.Box3\n const h = Math.max(1e-4, bb.max.y - bb.min.y)\n const minY = bb.min.y\n for (let i = 0, v = 0; i < work.length; i += 3, v++) {\n const n = ((Math.imul(v + 1, 2654435761) >>> 0) % 1000) / 1000\n const n2 = ((Math.imul(v + 7, 40503) >>> 0) % 1000) / 1000\n const lowness = 1 - (work[i + 1] - minY) / h // 1 at the bottom, 0 at the top\n const spread = 1 + 0.12 * melt * (0.4 + n2) * (0.3 + lowness)\n arr[i] = work[i] * spread\n arr[i + 2] = work[i + 2] * spread\n arr[i + 1] = Math.max(minY, work[i + 1] - n * melt * h * 0.08)\n }\n }\n pos.needsUpdate = true\n const geo = mv.mesh.geometry\n geo.computeVertexNormals()\n geo.boundingBox = null\n geo.boundingSphere = null\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Decals\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n /** Decal pose in mesh space: position and a rotation taking +Z to the surface normal. */\n private decalPose(mesh: Mesh, worldPoint: THREE_NS.Vector3, worldNormal: THREE_NS.Vector3, lift: number): { s: number; pos: THREE_NS.Vector3; quat: THREE_NS.Quaternion } {\n mesh.updateWorldMatrix(true, false)\n const s = mesh.matrixWorld.getMaxScaleOnAxis() || 1\n const ln = worldNormal.clone().transformDirection(this.m4.copy(mesh.matrixWorld).invert()).normalize()\n const pos = mesh.worldToLocal(worldPoint.clone()).addScaledVector(ln, lift / s)\n const quat = new this.THREE.Quaternion().setFromUnitVectors(new this.THREE.Vector3(0, 0, 1), ln)\n return { s, pos, quat }\n }\n\n private addDecal(mv: MeshVis, decal: Decal): void {\n mv.mesh.add(decal.obj)\n mv.decals.push(decal)\n this.decalCount++\n while (mv.decals.length > 48 || this.decalCount > this.decalCap) {\n const old = mv.decals.shift()\n if (!old) break\n this.disposeDecal(old)\n }\n }\n\n private disposeDecal(d: Decal): void {\n d.obj.parent?.remove(d.obj)\n d.geometry?.dispose()\n this.decalCount = Math.max(0, this.decalCount - 1)\n }\n\n addHole(mv: MeshVis, worldPoint: THREE_NS.Vector3, worldNormal: THREE_NS.Vector3, diameter: number): void {\n const { s, pos, quat } = this.decalPose(mv.mesh, worldPoint, worldNormal, 0.0025)\n const disc = new this.THREE.Mesh(this.kit.discGeometry(), this.kit.discMaterial())\n disc.position.copy(pos)\n disc.quaternion.copy(quat)\n disc.scale.setScalar((Math.max(0.004, diameter) * 0.5 * 1.25) / s)\n disc.renderOrder = 2\n this.addDecal(mv, { obj: disc })\n }\n\n /** A patch where a surface coat came off, in the colour of the core under it; drawn under the bullet holes. */\n addSpall(mv: MeshVis, worldPoint: THREE_NS.Vector3, worldNormal: THREE_NS.Vector3, radius: number, color: number): void {\n const { s, pos, quat } = this.decalPose(mv.mesh, worldPoint, worldNormal, 0.0015)\n const disc = new this.THREE.Mesh(this.kit.discGeometry(), this.kit.patchMaterial(color))\n disc.position.copy(pos)\n disc.quaternion.copy(quat)\n disc.scale.setScalar(Math.max(0.01, radius) / s)\n disc.renderOrder = 1\n this.addDecal(mv, { obj: disc })\n }\n\n /** A star of jagged lines: `rays` rays up to `length` metres, seeded so the same event always draws the same star. */\n addCrack(mv: MeshVis, worldPoint: THREE_NS.Vector3, worldNormal: THREE_NS.Vector3, rays: number, length: number, color: number, seed: number): void {\n const { s, pos, quat } = this.decalPose(mv.mesh, worldPoint, worldNormal, 0.002)\n const rnd = createRng(seed)\n const verts: number[] = []\n const n = clamp(Math.round(rays), 3, 16)\n const L = Math.max(0.02, length) / s\n for (let r = 0; r < n; r++) {\n let ang = (r / n) * Math.PI * 2 + (rnd() - 0.5) * 0.5\n let x = 0\n let y = 0\n const segs = 3\n const total = L * (0.6 + 0.4 * rnd())\n for (let k = 0; k < segs; k++) {\n const step = (total / segs) * (0.7 + 0.6 * rnd())\n ang += (rnd() - 0.5) * 0.45\n const nx = x + Math.cos(ang) * step\n const ny = y + Math.sin(ang) * step\n verts.push(x, y, 0, nx, ny, 0)\n if (k > 0 && rnd() < 0.5) {\n const ba = ang + (rnd() < 0.5 ? -1 : 1) * (0.5 + rnd() * 0.5)\n const bl = step * (0.6 + 0.6 * rnd())\n verts.push(nx, ny, 0, nx + Math.cos(ba) * bl, ny + Math.sin(ba) * bl, 0)\n }\n x = nx\n y = ny\n }\n }\n // a faint ring around the impact\n const ringR = L * 0.12\n for (let k = 0; k < 8; k++) {\n const a0 = (k / 8) * Math.PI * 2\n const a1 = ((k + 1) / 8) * Math.PI * 2\n if (rnd() < 0.75) verts.push(Math.cos(a0) * ringR, Math.sin(a0) * ringR, 0, Math.cos(a1) * ringR, Math.sin(a1) * ringR, 0)\n }\n const geo = new this.THREE.BufferGeometry()\n geo.setAttribute('position', new this.THREE.Float32BufferAttribute(verts, 3))\n const lines = new this.THREE.LineSegments(geo, this.kit.lineMaterial(color))\n lines.position.copy(pos)\n lines.quaternion.copy(quat)\n lines.renderOrder = 2\n this.addDecal(mv, { obj: lines, geometry: geo })\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Char and heat glow\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n setChar(pv: PartVis, char: number, charColor: number): void {\n if (Math.abs(char - pv.charApplied) < 0.004) return\n pv.charApplied = char\n const target = new this.THREE.Color(charColor)\n for (const mv of pv.meshes) {\n if (mv.host) {\n mv.charK = clamp(char, 0, 1)\n mv.charHex = charColor\n this.paint(mv)\n continue\n }\n this.ownMaterial(mv)\n const mats = materialsOf(mv.mesh.material)\n mats.forEach((m, i) => {\n const c = colorOf(m)\n const base = mv.baseColors?.[i]\n if (c && base) c.copy(base).lerp(target, clamp(char, 0, 1))\n })\n }\n }\n\n /** Emissive glow of a hot part. `temperature` below the glow threshold switches it off. */\n setGlow(pv: PartVis, temperatureC: number): void {\n const hex = heatColor(temperatureC)\n const key = hex === 0 ? 0 : Math.round(temperatureC / 5) * 5\n if (key === pv.glowApplied) return\n pv.glowApplied = key\n const intensity = hex === 0 ? 0 : clamp(0.35 + (temperatureC - 450) / 900, 0, 1.4)\n for (const mv of pv.meshes) {\n if (mv.host) {\n mv.glowHex = hex\n mv.glowK = intensity\n this.paint(mv)\n continue\n }\n this.ownMaterial(mv)\n for (const m of materialsOf(mv.mesh.material)) {\n const e = (m as THREE_NS.MeshStandardMaterial).emissive\n if (e && (e as THREE_NS.Color).isColor) {\n e.setHex(hex)\n ;(m as THREE_NS.MeshStandardMaterial).emissiveIntensity = intensity\n }\n }\n }\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Melt\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n /** Sag the part: shorter in Y (down to 25 %), a bit wider, vertices pushed down with noise, the bottom stays put. */\n setMelt(pv: PartVis, melt: number): void {\n const m = clamp(melt, 0, 1)\n if (Math.abs(m - pv.meltApplied) < 0.01) return\n pv.meltApplied = m\n for (const mv of pv.meshes) {\n const mesh = mv.mesh\n if (mv.host) {\n // a range of a shared mesh cannot scale the mesh: squash and widen its own vertices\n mv.meltApplied = m\n mv.touched = true\n if (!(this.lowQuality && this.vertexCount(mv) > 20000) && this.ownGeometry(mv)) this.rebuildHost(mv.host)\n continue\n }\n if (mv.meltApplied === 0 && m > 0) {\n mesh.updateWorldMatrix(true, false)\n mv.bottomY = this.box.setFromObject(mesh).min.y\n }\n mv.meltApplied = m\n mv.moved = true\n const sy = lerp(1, 0.25, m)\n const sxz = 1 + 0.18 * m\n mesh.scale.set(mv.origScale.x * sxz, mv.origScale.y * sy, mv.origScale.z * sxz)\n mesh.position.copy(mv.origPosition)\n mesh.updateWorldMatrix(true, false)\n const bottom = this.box.setFromObject(mesh).min.y\n const dy = mv.bottomY - bottom\n if (Math.abs(dy) > 1e-6 && mesh.parent) {\n mesh.parent.updateWorldMatrix(true, false)\n const inv = this.m4.copy(mesh.parent.matrixWorld).invert()\n this.a.set(0, dy, 0).applyMatrix4(inv)\n this.b.set(0, 0, 0).applyMatrix4(inv)\n mesh.position.copy(mv.origPosition).add(this.a.sub(this.b))\n }\n if (!(this.lowQuality && this.vertexCount(mv) > 20000) && this.ownGeometry(mv)) {\n this.writePositions(mv, positionAttr(mesh.geometry) as THREE_NS.BufferAttribute)\n }\n }\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Visibility and restore\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n hide(pv: PartVis, reason: PartVis['gone']): void {\n pv.gone = reason\n for (const mv of pv.meshes) {\n if (!mv.host || mv.loose) {\n mv.mesh.visible = false\n mv.hidden = true\n continue\n }\n // a range of a shared mesh: collapse its vertices to a point and hide what was drawn on it\n mv.hidden = true\n for (const d of mv.decals) d.obj.visible = false\n this.collapse(mv)\n }\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Parts drawn by a vertex range of a merged mesh\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n /** Collapse the part's vertices in the merged mesh to one point (its triangles become degenerate and vanish). */\n private collapse(mv: MeshVis): void {\n if (!mv.merged || !this.ownHostGeometry(mv.merged.host)) return\n mv.collapsed = true\n mv.touched = true\n this.rebuildHost(mv.merged.host)\n }\n\n /** Write `work` into the geometry again with the melt of ranged parts and the collapsed ranges applied. */\n private rebuildHost(host: HostVis): void {\n const geo = host.mesh.geometry\n const pos = positionAttr(geo)\n const work = host.work\n if (!pos || !work) return\n const arr = pos.array as unknown as Float32Array\n arr.set(work)\n for (const s of host.sharers) {\n if (s.merged && s.merged.host === host) {\n if (s.collapsed) this.collapseRange(arr, s.merged.range)\n else if (s.meltApplied > 0 && !s.loose) this.meltRange(arr, work, s.merged.range, s.meltApplied)\n } else if (s.host === host && s.range && s.meltApplied > 0) this.meltRange(arr, work, s.range, s.meltApplied)\n }\n pos.needsUpdate = true\n geo.computeVertexNormals()\n geo.boundingBox = null\n geo.boundingSphere = null\n }\n\n private collapseRange(arr: Float32Array, range: [number, number]): void {\n const x = arr[range[0] * 3]\n const y = arr[range[0] * 3 + 1]\n const z = arr[range[0] * 3 + 2]\n for (let i = range[0] * 3; i < range[1] * 3; i += 3) {\n arr[i] = x\n arr[i + 1] = y\n arr[i + 2] = z\n }\n }\n\n /** Melt of one range: shorter in Y (down to 25 %) with the bottom fixed, a bit wider around its centre, with the same noise as a whole mesh. */\n private meltRange(arr: Float32Array, work: Float32Array, range: [number, number], melt: number): void {\n let minY = Infinity\n let maxY = -Infinity\n let cx = 0\n let cz = 0\n const n = Math.max(1, range[1] - range[0])\n for (let i = range[0] * 3; i < range[1] * 3; i += 3) {\n minY = Math.min(minY, work[i + 1])\n maxY = Math.max(maxY, work[i + 1])\n cx += work[i]\n cz += work[i + 2]\n }\n cx /= n\n cz /= n\n const h = Math.max(1e-4, maxY - minY)\n const sy = lerp(1, 0.25, melt)\n const sxz = 1 + 0.18 * melt\n for (let i = range[0] * 3, v = 0; i < range[1] * 3; i += 3, v++) {\n const noise = ((Math.imul(v + 1, 2654435761) >>> 0) % 1000) / 1000\n arr[i] = cx + (work[i] - cx) * sxz\n arr[i + 2] = cz + (work[i + 2] - cz) * sxz\n arr[i + 1] = Math.max(minY, minY + (work[i + 1] - minY) * sy - noise * melt * h * 0.04)\n }\n }\n\n /** The colour attribute of the host's current geometry (created white when there is none) with vertex colours switched on in its material. */\n private ensureColors(host: HostVis): THREE_NS.BufferAttribute | null {\n if (!this.ownHostGeometry(host)) return null\n const geo = host.mesh.geometry\n let attr = geo.getAttribute('color') as THREE_NS.BufferAttribute | undefined\n if (!attr) {\n const n = geo.getAttribute(POS_ATTR).count\n attr = new this.THREE.BufferAttribute(new Float32Array(n * 3).fill(1), 3)\n geo.setAttribute('color', attr)\n }\n if (!host.ownMat) {\n host.ownMat = true\n const src = materialsOf(host.mesh.material)\n const cloned = src.map((m) => m.clone())\n host.mesh.material = Array.isArray(host.mesh.material) ? cloned : cloned[0]\n }\n for (const m of materialsOf(host.mesh.material)) {\n if ((m as THREE_NS.MeshStandardMaterial).vertexColors !== true) {\n ;(m as THREE_NS.MeshStandardMaterial).vertexColors = true\n m.needsUpdate = true\n }\n }\n return attr\n }\n\n /** Colour of the part's vertices from the original colours, its char and its heat. Only the part's range is written. */\n private paint(mv: MeshVis): void {\n if (!mv.host || !mv.range || !mv.merged) return\n const idle = mv.charK <= 0 && mv.glowK <= 0\n if (idle && !mv.touched) return\n const attr = this.ensureColors(mv.host)\n if (!attr) return\n const size = attr.itemSize\n const arr = attr.array as unknown as Float32Array\n const orig = mv.merged.host.origGeometry.getAttribute('color') as THREE_NS.BufferAttribute | undefined\n const oSize = orig?.itemSize ?? 3\n const oArr = orig?.array as unknown as ArrayLike<number> | undefined\n const shift = mv.merged.range[0] - mv.range[0]\n const ch = new this.THREE.Color(mv.charHex)\n const heat = new this.THREE.Color(mv.glowHex)\n const k = clamp(mv.charK, 0, 1)\n const gk = clamp(mv.glowK, 0, 1)\n const boost = 1 + Math.max(0, mv.glowK - 1)\n for (let i = mv.range[0]; i < mv.range[1]; i++) {\n const o = (i + shift) * oSize\n let r = oArr ? oArr[o] : 1\n let g = oArr ? oArr[o + 1] : 1\n let b = oArr ? oArr[o + 2] : 1\n if (k > 0) {\n r = lerp(r, ch.r, k)\n g = lerp(g, ch.g, k)\n b = lerp(b, ch.b, k)\n }\n if (gk > 0) {\n r = lerp(r, heat.r * boost, gk)\n g = lerp(g, heat.g * boost, gk)\n b = lerp(b, heat.b * boost, gk)\n }\n arr[i * size] = r\n arr[i * size + 1] = g\n arr[i * size + 2] = b\n }\n mv.touched = true\n attr.needsUpdate = true\n }\n\n /**\n * Move a ranged part to a mesh of its own: the faces whose vertices all lie in its range are copied (with the current dents and colours) into a\n * new mesh that takes the merged mesh's transform and material, then attached to `group`; the range is collapsed in the merged mesh. Decals\n * go with it.\n */\n extract(mv: MeshVis, group: THREE_NS.Object3D): void {\n if (!mv.host || !mv.range || !mv.merged || mv.loose) return\n const host = mv.host\n const [v0, v1] = mv.range\n const src = host.mesh.geometry\n const geo = new this.THREE.BufferGeometry()\n const count = v1 - v0\n for (const name of Object.keys(src.attributes)) {\n const a = src.getAttribute(name) as THREE_NS.BufferAttribute\n if ((a as unknown as { isInterleavedBufferAttribute?: boolean }).isInterleavedBufferAttribute) continue\n const size = a.itemSize\n const from = (name === POS_ATTR ? host.work : null) ?? (a.array as unknown as Float32Array)\n const slice = (from as unknown as { slice(a: number, b: number): ArrayLike<number> }).slice(v0 * size, v1 * size)\n const Ctor = (a.array as unknown as { constructor: new (x: ArrayLike<number>) => ArrayLike<number> }).constructor\n geo.setAttribute(name, new this.THREE.BufferAttribute(new Ctor(slice) as never, size, a.normalized))\n }\n const index = src.getIndex()\n if (index) {\n const out: number[] = []\n for (let i = 0; i + 2 < index.count; i += 3) {\n const a = index.getX(i)\n const b = index.getX(i + 1)\n const c = index.getX(i + 2)\n if (a >= v0 && a < v1 && b >= v0 && b < v1 && c >= v0 && c < v1) out.push(a - v0, b - v0, c - v0)\n }\n geo.setIndex(count > 65535 ? new this.THREE.Uint32BufferAttribute(out, 1) : new this.THREE.Uint16BufferAttribute(out, 1))\n }\n const mats = materialsOf(host.mesh.material).map((m) => m.clone())\n const loose = new this.THREE.Mesh(geo, mats[0])\n loose.name = `${host.mesh.name || 'mesh'}:${v0}-${v1}`\n loose.castShadow = host.mesh.castShadow\n loose.receiveShadow = host.mesh.receiveShadow\n loose.renderOrder = host.mesh.renderOrder\n loose.frustumCulled = host.mesh.frustumCulled\n loose.layers.mask = host.mesh.layers.mask\n loose.position.copy(host.mesh.position)\n loose.quaternion.copy(host.mesh.quaternion)\n loose.scale.copy(host.mesh.scale)\n const parent = host.mesh.parent\n if (parent) parent.add(loose)\n loose.updateMatrixWorld(true)\n // the merged mesh loses the range; the decals and the part's state follow the new mesh\n this.collapse(mv)\n for (const d of mv.decals) {\n d.obj.visible = true\n loose.add(d.obj)\n }\n const lp = positionAttr(geo) as THREE_NS.BufferAttribute\n const lh: HostVis = {\n mesh: loose,\n origGeometry: geo,\n origMaterial: loose.material,\n ownGeo: true,\n work: new Float32Array(lp.array as ArrayLike<number>),\n ownMat: true,\n sharers: [mv],\n }\n mv.host = lh\n mv.range = [0, count]\n mv.mesh = loose\n mv.loose = true\n mv.moved = true\n group.attach(loose)\n for (const m of materialsOf(loose.material)) m.needsUpdate = true\n }\n\n private restoreRanged(mv: MeshVis): void {\n const merged = mv.merged as NonNullable<MeshVis['merged']>\n const host = merged.host\n for (const d of mv.decals) this.disposeDecal(d)\n mv.decals.length = 0\n if (mv.loose) {\n const loose = mv.mesh\n loose.parent?.remove(loose)\n loose.geometry.dispose()\n for (const m of materialsOf(loose.material)) m.dispose()\n mv.host = host\n mv.range = [merged.range[0], merged.range[1]]\n mv.mesh = host.mesh\n mv.loose = false\n mv.moved = false\n }\n mv.collapsed = false\n mv.hidden = false\n mv.meltApplied = 0\n mv.charK = 0\n mv.glowK = 0\n mv.touched = false\n if (!host.ownGeo) return\n // positions and colours of the range go back to the original ones\n const work = host.work as Float32Array\n const op = positionAttr(host.origGeometry)\n const [v0, v1] = merged.range\n if (op) work.set((op.array as unknown as Float32Array).subarray(v0 * 3, v1 * 3), v0 * 3)\n const attr = host.mesh.geometry.getAttribute('color') as THREE_NS.BufferAttribute | undefined\n if (attr) {\n const orig = host.origGeometry.getAttribute('color') as THREE_NS.BufferAttribute | undefined\n const size = attr.itemSize\n const a = attr.array as unknown as Float32Array\n for (let i = v0; i < v1; i++) {\n for (let c = 0; c < 3; c++) a[i * size + c] = orig ? orig.array[i * orig.itemSize + c] : 1\n }\n attr.needsUpdate = true\n }\n if (host.sharers.every((s) => !s.touched)) {\n host.mesh.geometry.dispose()\n host.mesh.geometry = host.origGeometry\n host.work = null\n host.ownGeo = false\n if (host.ownMat) {\n for (const m of materialsOf(host.mesh.material)) m.dispose()\n host.mesh.material = host.origMaterial\n host.ownMat = false\n }\n } else this.rebuildHost(host)\n }\n\n /** Bring one mesh back to how it was when it was bound. */\n restoreMesh(mv: MeshVis): void {\n if (mv.merged) {\n this.restoreRanged(mv)\n return\n }\n const mesh = mv.mesh\n for (const d of mv.decals) this.disposeDecal(d)\n mv.decals.length = 0\n if (mv.ownGeo) {\n mesh.geometry.dispose()\n mesh.geometry = mv.origGeometry\n mv.ownGeo = false\n mv.work = null\n }\n if (mv.ownMat) {\n for (const m of materialsOf(mesh.material)) m.dispose()\n mesh.material = mv.origMaterial\n mv.ownMat = false\n mv.baseColors = null\n }\n mesh.visible = mv.origVisible\n if (mv.origParent && mesh.parent !== mv.origParent) {\n mv.origParent.add(mesh)\n mv.moved = true\n }\n if (mv.moved) {\n mesh.position.copy(mv.origPosition)\n mesh.quaternion.copy(mv.origQuaternion)\n mesh.scale.copy(mv.origScale)\n mv.moved = false\n }\n mv.meltApplied = 0\n }\n\n restorePart(pv: PartVis): void {\n for (const mv of pv.meshes) this.restoreMesh(mv)\n pv.charApplied = 0\n pv.glowApplied = 0\n pv.meltApplied = 0\n pv.gone = 'none'\n }\n\n dispose(): void {\n this.kit.dispose()\n }\n}\n","// The sounds of materials breaking, as recipes of @adatechnology/game-audio. The art scene's `sfx.*` (cena L1354-L1367) are ported literally: the same\n// filters, frequencies, lengths, volumes and reverb sends, and the same random numbers drawn in the same order, so a recipe leaves the trace of the team\n// code. The game's `boom` (jogo L68278) is here too, as the game's explosion.\nimport { DISTANCE_CURVES, sceneMany as many, sceneNoise as noise, sceneRecipe, sceneTone as tone } from '@adatechnology/game-audio'\nimport type { Layer, LoopRecipe, SoundBank, SoundRecipe } from '@adatechnology/game-audio'\n\nconst scene = (id: string, layers: readonly Layer[], line: string, vars?: SoundRecipe['vars']): SoundRecipe => sceneRecipe(id, layers, line, vars ? { vars } : {})\n\nconst boomLayers = (big: boolean): Layer[] => [\n noise({ f: 1200, f2: 120, d: 1.8, vol: 2, wet: 1.2 }),\n tone({ f: 65, f2: 24, d: 1.0, vol: 1.8 }),\n noise({ type: 'highpass', f: 1500, d: 0.2, vol: 0.8 }),\n ...(big ? [noise({ f: 500, f2: 90, a: 0.2, d: 2.4, vol: 1.2, wet: 1, delay: 0.15 })] : []),\n ...many(8, () => tone({ f: [2600, 5600], d: 0.05, vol: 0.08, delay: [0.4, 1.6] })),\n]\n\n/** The art scene's destruction sounds, each with the team name in its `sources`. */\nexport const SCENE_SOUNDS: readonly SoundRecipe[] = [\n scene(\n 'glass_shatter',\n [noise({ type: 'highpass', f: 2800, d: 0.45, vol: 0.9, wet: 0.5 }), ...many(12, () => tone({ f: [3000, 7500], d: [0.06, 0.14], vol: 0.18, delay: [0, 0.55] }))],\n 'L1359 glass',\n ),\n scene(\n 'wood_hit',\n [noise({ type: 'bandpass', f: 850, q: 1, d: 0.25, vol: 0.9, wet: 0.3 }), tone({ f: 210, f2: 90, d: 0.1, vol: 0.6 }), noise({ type: 'highpass', f: 2000, d: 0.04, vol: 0.5 })],\n 'L1360 wood',\n ),\n scene('thunk', [noise({ type: 'bandpass', f: 700, q: 2, d: 0.07, vol: 0.4 })], 'L1361 thunk'),\n scene('ping', [tone({ f: [2600, 3500], f2: 1400, d: 0.14, vol: 0.18, wet: 0.3 })], 'L1362 ping'),\n scene('clang', [tone({ f: [520, 720], f2: 480, d: 0.5, vol: 0.35, wet: 0.4 }), tone({ f: 1370, f2: 1300, d: 0.3, vol: 0.15 }), noise({ type: 'highpass', f: 2000, d: 0.05, vol: 0.5 })], 'L1363 clang'),\n scene('chip', [noise({ type: 'bandpass', f: 1600, q: 1.2, d: 0.06, vol: 0.5 })], 'L1364 chip'),\n scene(\n 'crumble',\n [noise({ f: 900, f2: 200, d: 0.6, vol: 0.9, wet: 0.3 }), ...many(5, () => noise({ type: 'bandpass', f: [500, 1400], q: 2, d: 0.05, vol: 0.4, delay: [0.1, 0.5] }))],\n 'L1365 crumble',\n ),\n // `thud(x, z, v)`: `v` is the `scale` param (default 1)\n scene('thud', [tone({ f: 75, f2: 38, d: 0.22, vol: { param: 'scale', scale: 0.6 } }), noise({ f: 420, d: 0.16, vol: { param: 'scale', scale: 0.45 } })], 'L1358 thud', { scale: 1 }),\n // `hiss(x, z, d)`: `seconds` is the param `d` (default 1.2)\n scene('hiss', [noise({ type: 'highpass', f: 3500, a: 0.05, d: { param: 'seconds' }, vol: 0.35 })], 'L1366 hiss', { seconds: 1.2 }),\n scene('boom', boomLayers(false), 'L1367 boom'),\n scene('boom_big', boomLayers(true), 'L1367 boom (big)'),\n scene('burst', [noise({ f: 700, f2: 120, d: 0.7, vol: 1.4, wet: 0.5 }), noise({ type: 'highpass', f: 3000, a: 0.05, d: 1.2, vol: 0.4, delay: 0.1 })], 'L1357 burst'),\n scene('crack', [noise({ type: 'highpass', f: 1800, d: 0.05, vol: 0.8 }), tone({ f: 420, f2: 180, d: 0.06, vol: 0.4 })], 'L1354 crack'),\n]\n\n/** The game's explosion thump: a sine from 70 to 28 Hz over 1.2 s, `1.4 / (1 + d² × 0.002)` (jogo L68278). */\nexport const EXPLOSION_BOOM: SoundRecipe = {\n id: 'explosion_boom',\n bus: 'world',\n order: 'boom',\n duration: 1.6,\n tail: 0.1,\n layers: [\n {\n source: { kind: 'osc', wave: 'sine', frequency: { from: 70, to: 28, curve: 'exp', over: 1.2 } },\n envelope: [\n [0, 1, 'set'],\n ['1d', 0.001, 'exp', 'fixed'],\n ],\n },\n ],\n falloff: DISTANCE_CURVES.game_boom,\n sources: ['jogo:L68278-68285 boom'],\n}\n\n/**\n * The fire loop of the art scene (cena L1316): noise through a 1800 Hz bandpass (Q 0.6) into a gain that starts at 0. The page never raises it, so it is\n * silent there; here `createDestructionSound` raises it while something burns (the level is the kit's, in `fire`).\n */\nexport const BURN_LOOP: LoopRecipe = {\n id: 'burn_loop',\n bus: 'world',\n order: 'chain_loop',\n source: { kind: 'noise', loop: true },\n filters: { mode: 'serial', bank: [{ type: 'bandpass', frequency: { set: 1800 }, q: 0.6 }] },\n volume: 0,\n sources: ['cena:L1316 fire loop (silent in the page: its gain is never raised)', 'sdk: the level while burning'],\n}\n\nexport const DESTRUCTION_SOUND_BANK: SoundBank = { id: 'destruction_three', sounds: [...SCENE_SOUNDS, EXPLOSION_BOOM], loops: [BURN_LOOP] }\n","import type { Vec3 } from '@adatechnology/game-contracts'\nimport { GAME_SFX_BANK } from '@adatechnology/game-audio'\nimport type { AudioEngine, AudioLoopHandle } from '@adatechnology/game-audio'\n\nimport { DESTRUCTION_SOUND_BANK } from './recipes'\n\n/**\n * What a sound key plays: the recipe, its params, a scale on the volume the renderer gives, and (optionally) a louder recipe above a volume\n * (a big blast gets the long boom).\n */\nexport type SoundKeyRule = {\n readonly sound: string\n readonly params?: Readonly<Record<string, number>>\n readonly volumeScale?: number\n readonly above?: { readonly volume: number; readonly sound: string }\n}\n\nexport type DestructionSoundStyle = 'art_scene' | 'game'\n\n/**\n * The keys `createDestructionRenderer` sends to `onSound`, mapped to the sounds the teams delivered. The Cena de Arte has a sound for every material\n * (clang, wood, glass, crumble, thud...); the game has four classes (impact, glass, wood, explosion) and its own explosion thump. Which team sound answers\n * which key is the kit's choice (the teams call the sounds, not the renderer's keys), so it is data: `keys` replaces any entry.\n */\nexport const DESTRUCTION_SOUND_KEYS: Readonly<Record<DestructionSoundStyle, Readonly<Record<string, SoundKeyRule>>>> = {\n art_scene: {\n impact_metal: { sound: 'clang' },\n impact_wood: { sound: 'wood_hit' },\n impact_glass: { sound: 'ping' },\n impact_masonry: { sound: 'chip' },\n impact_soft: { sound: 'thud' },\n shatter_glass: { sound: 'glass_shatter' },\n crumble: { sound: 'crumble' },\n splinter: { sound: 'crack' },\n ricochet: { sound: 'ping' },\n unscrew: { sound: 'chip' },\n detach: { sound: 'thunk' },\n ignite: { sound: 'hiss', params: { seconds: 0.5 } },\n extinguish: { sound: 'hiss' },\n melt_sizzle: { sound: 'hiss', params: { seconds: 0.6 } },\n explode: { sound: 'boom', above: { volume: 0.9, sound: 'boom_big' } },\n },\n game: {\n impact_metal: { sound: 'sfx_impact' },\n impact_wood: { sound: 'sfx_wood' },\n impact_glass: { sound: 'sfx_glass' },\n impact_masonry: { sound: 'sfx_impact' },\n impact_soft: { sound: 'sfx_flesh' },\n shatter_glass: { sound: 'sfx_glass' },\n crumble: { sound: 'sfx_impact' },\n splinter: { sound: 'sfx_wood' },\n explode: { sound: 'explosion_boom' },\n },\n}\n\nexport type DestructionSoundOptions = {\n /** Which team answers the keys (default `art_scene`, the kit mix). `game` falls back to the art scene for the keys the game has no sound for. */\n readonly style?: DestructionSoundStyle\n /** Replaces or adds a key's rule; `null` silences it. */\n readonly keys?: Readonly<Record<string, SoundKeyRule | null>>\n /** The fire loop: the volume each burning part adds and the most it reaches (the page never raises it, so these are the kit's). */\n readonly fire?: { readonly perFire?: number; readonly max?: number }\n /** Burn loop on or off (default on). */\n readonly burnLoop?: boolean\n}\n\nexport type DestructionSound = {\n /** Pass to `createDestructionRenderer({ onSound })`. */\n readonly onSound: (key: string, point: Vec3, volume: number) => void\n /** The rule a key resolves to, if any. */\n rule(key: string): SoundKeyRule | undefined\n /** Parts burning now. */\n readonly burning: () => number\n dispose(): void\n}\n\nexport const DEFAULT_FIRE = { perFire: 0.05, max: 0.2 } as const\n\n/**\n * Plays the renderer's sound keys on a game-audio engine: the bank is registered in the engine, a key becomes a positional sound at the point, and\n * `burn_loop` / `burn_end` (a part starts to burn, a part burns out or is put out) drive one fire loop whose volume follows how many parts burn.\n */\nexport function createDestructionSound(engine: AudioEngine, options: DestructionSoundOptions = {}): DestructionSound {\n engine.register(DESTRUCTION_SOUND_BANK)\n engine.register(GAME_SFX_BANK)\n const fire = { ...DEFAULT_FIRE, ...options.fire }\n const rules: Record<string, SoundKeyRule | null | undefined> = { ...DESTRUCTION_SOUND_KEYS.art_scene, ...(options.style === 'game' ? DESTRUCTION_SOUND_KEYS.game : {}), ...options.keys }\n let loop: AudioLoopHandle | undefined\n let burning = 0\n\n const setFire = (): void => {\n if (options.burnLoop === false) return\n if (burning <= 0) {\n loop?.stop()\n loop = undefined\n return\n }\n loop ??= engine.loop('burn_loop')\n loop.set({ volume: Math.min(fire.max, fire.perFire * burning) })\n }\n\n return {\n onSound(key, point, volume) {\n if (key === 'burn_loop') {\n burning += 1\n setFire()\n return\n }\n if (key === 'burn_end') {\n if (burning > 0) burning -= 1\n setFire()\n return\n }\n const rule = rules[key]\n if (!rule) return\n const sound = rule.above && volume >= rule.above.volume ? rule.above.sound : rule.sound\n engine.play(sound, { position: point, volume: volume * (rule.volumeScale ?? 1), ...(rule.params ? { params: rule.params } : {}) })\n },\n rule: (key) => rules[key] ?? undefined,\n burning: () => burning,\n dispose() {\n loop?.stop()\n loop = undefined\n burning = 0\n },\n }\n}\n"],"mappings":"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","names":["scene","scene","geo","noise","materialsOf"]}
|
|
1
|
+
{"version":3,"sources":["../src/renderer.ts","../src/math.ts","../src/fragments.ts","../src/ground.ts","../src/pieces.ts","../src/rebar.ts","../src/spec.ts","../src/heat.ts","../src/skin-dent.ts","../src/visual.ts","../src/audio/recipes.ts","../src/audio/sound.ts"],"sourcesContent":["import type * as THREE_NS from 'three'\nimport type { DebrisKind, DestructionEvent, Fragment, MaterialDef, PartSpec, Vec3 } from '@adatechnology/game-destruction'\nimport { blastShove } from '@adatechnology/game-contracts'\nimport { createVfx, effectForEvent, EVENT_EFFECTS_MAP } from '@adatechnology/game-vfx'\nimport type { GameEvent } from '@adatechnology/game-vfx'\nimport type { VfxWorld } from '@adatechnology/game-vfx'\nimport { createVfxRenderer } from '@adatechnology/game-vfx-three'\nimport type { VfxRenderer } from '@adatechnology/game-vfx-three'\nimport { FragmentSystem } from './fragments'\nimport { GroundSpots } from './ground'\nimport type { Bound, HostVis, MeshVis, PartVis, PieceBody } from './internal'\nimport { clamp, createRng, hashNumbers, hashString, mixHex } from './math'\nimport { PieceSystem } from './pieces'\nimport { RebarCages } from './rebar'\nimport { partHintOf, specFrameInverse } from './spec'\nimport type { WarmUpProbes } from '@adatechnology/game-contracts'\nimport type { DestructionRenderer, BindOptions, ExplodeOptions, Mesh, MeshRange, Object3D, Piece, RendererOptions, ThreeNamespace } from './types'\nimport { Visuals } from './visual'\n\nlet rendererCount = 0\nconst IMPACT_TAGS = ['metal', 'glass', 'wood'] as const\n\ntype Ev<T extends DestructionEvent['type']> = Extract<DestructionEvent, { type: T }>\n\nconst GLOW_FROM_C = 430\nconst QUEUE_CAP = 4000\n/** A part's fire lasts until the part stops burning (`stopFire`); this is only the ceiling the effects world needs. */\nconst FIRE_CEILING_SECONDS = 3600\n/** The `generic` explosion is the M67's (15 m injury radius): a blast with no effect id of its own scales with its radius. */\nconst GENERIC_REFERENCE_RADIUS = 15\n/** The small flame of a part that a bullet or fire primed: it burns until the part goes off. */\nconst PRIMED_FIRE_RADIUS = 0.2\n\ninterface FireEmitter {\n object: string\n part: string\n point: Vec3\n /** The burning part's position, moved every frame; the effects world's fire follows it. */\n follow: { x: number; y: number; z: number }\n /** Handle of the fire in the effects world, once the part's box is known. */\n handle?: number\n}\n\ninterface Leak {\n object: string\n part: string\n fluid: string\n point: Vec3\n direction: Vec3\n rate: number\n pressurized: boolean\n acc: number\n /** The part had a through opening when the leak began: the leak ends when it has none (a valve shut with `seal`). */\n opened: boolean\n}\n\nconst FLUID_COLORS: Record<string, number> = {\n water: 0x8cc8ff,\n fuel: 0xd9a032,\n oil: 0x2a2018,\n gas: 0xf2f2f2,\n sap: 0xb89b3a,\n acid: 0x9bd23c,\n blood: 0x8a0a0a,\n}\nconst SMOKE_TONES: Record<string, number> = { white: 0xe6e6e6, grey: 0x8a8a8a, black: 0x2a2a2a }\n\nconst DEFAULT_SPEED: Record<string, number> = {\n sparks: 3,\n splinters: 2.5,\n dust: 1,\n shards: 2.5,\n fibers: 1.2,\n leaves: 1.2,\n drips: 0.5,\n ash: 0.8,\n chips: 2.5,\n smoke: 0.8,\n steam: 1,\n fire: 1.2,\n flash: 0,\n foam: 2.5,\n}\n\n/** Sound key for an impact on a material. */\nfunction impactKey(def: MaterialDef | undefined): string {\n if (!def) return 'impact_wood'\n const tags = def.tags ?? []\n if (tags.includes('metal')) return 'impact_metal'\n if (def.visual?.transparent || def.fracture === 'shatter') return 'impact_glass'\n if (def.fracture === 'crumble') return 'impact_masonry'\n if (def.fracture === 'tear') return 'impact_soft'\n return def.fracture === 'none' ? 'impact_metal' : 'impact_wood'\n}\n\nfunction fractureKey(def: MaterialDef | undefined, style: string): string {\n switch (style) {\n case 'shatter':\n return 'shatter_glass'\n case 'crumble':\n return 'crumble'\n case 'splinter':\n return 'splinter'\n default:\n return impactKey(def)\n }\n}\n\nfunction fallbackColor(id: string, def: MaterialDef | undefined): number {\n if (def?.tags?.includes('metal')) return 0x8a8f96\n if (def?.visual?.transparent) return 0x9fd0e0\n const h = hashString(id)\n return mixHex(0x6b5a48, 0x9a9488, (h % 100) / 100)\n}\n\nfunction materialsOf(m: THREE_NS.Material | THREE_NS.Material[]): THREE_NS.Material[] {\n return Array.isArray(m) ? m : [m]\n}\n\nfunction isMeshRange(v: Object3D | MeshRange): v is MeshRange {\n const r = v as Partial<MeshRange>\n return !!r.mesh && Array.isArray(r.range)\n}\n\n/** Create the renderer. See `DestructionRenderer`. */\nexport function createDestructionRenderer(THREE: ThreeNamespace, options: RendererOptions): DestructionRenderer {\n return new Renderer(THREE, options)\n}\n\nclass Renderer implements DestructionRenderer {\n private readonly world: RendererOptions['world']\n private readonly scene: THREE_NS.Scene\n private readonly quality: 'low' | 'medium' | 'high'\n private readonly low: boolean\n private readonly groundAt: (x: number, z: number) => number\n private readonly gravity: number\n private readonly autoSplit: boolean\n private readonly maxFragments: number\n private readonly bounds = new Map<string, Bound>()\n private readonly queue: DestructionEvent[] = []\n private readonly unsubscribe: () => void\n private readonly visuals: Visuals\n private readonly fragments: FragmentSystem\n private readonly ground: GroundSpots\n private readonly pieceSys: PieceSystem\n private readonly cages: RebarCages\n private readonly active = new Map<string, { object: string; part: string }>()\n private readonly fires = new Map<string, FireEmitter>()\n /** Primed parts burning in the effects world until they go off: their burn loop ends when they are put out. */\n private readonly primedBurning = new Set<string>()\n private readonly leaks: Leak[] = []\n private readonly homeTags: string[] = []\n private readonly throttles = new Map<string, number>()\n private readonly rng = createRng(0xc0ffee)\n private readonly vfx: VfxWorld\n /** Names this renderer to the world's drips, so a shared world tells each renderer where its own landed. */\n private readonly owner = `destruction-${++rendererCount}`\n private readonly stopLanding: () => void\n /** The effects renderer made here when the host gave no shared world; it is stepped in `update`. */\n private readonly ownVfx: VfxRenderer | undefined\n private time = 0\n private scanTimer = 0\n private disposed = false\n private readonly box: THREE_NS.Box3\n private readonly tmpQ: THREE_NS.Quaternion\n private readonly v1: THREE_NS.Vector3\n private readonly v2: THREE_NS.Vector3\n\n constructor(\n private readonly THREE: ThreeNamespace,\n private readonly o: RendererOptions,\n ) {\n this.world = o.world\n this.scene = o.scene\n this.quality = o.quality ?? 'medium'\n this.low = this.quality === 'low'\n this.groundAt = o.groundAt ?? (() => 0)\n this.gravity = o.gravity ?? 9.81\n this.autoSplit = o.autoSplit !== false\n this.maxFragments = o.maxFragments ?? 160\n this.box = new THREE.Box3()\n this.tmpQ = new THREE.Quaternion()\n this.v1 = new THREE.Vector3()\n this.v2 = new THREE.Vector3()\n const maxParticles = Math.max(8, Math.floor((o.maxParticles ?? 2500) * (this.low ? 0.5 : 1)))\n this.visuals = new Visuals(THREE, this.low, 600)\n this.ground = new GroundSpots(THREE, o.scene, this.groundAt, 48)\n this.vfx = o.vfx ?? createVfx({ profile: this.quality, gravity: this.gravity, groundAt: this.groundAt, sprites: { capacity: maxParticles, density: this.low ? 0.6 : 1 } })\n this.ownVfx = o.vfx ? undefined : createVfxRenderer(THREE, { scene: o.scene, camera: o.camera ?? new THREE.PerspectiveCamera(), vfx: this.vfx, pointScale: o.pointScale ?? 700 })\n this.stopLanding = this.vfx.onLand(this.owner, (x, _y, z, color, tag) => {\n const home = this.homeTags[tag - 1] ?? ''\n this.ground.add('puddle', x, z, 0.05 + this.rng() * 0.04, color, home)\n })\n this.fragments = new FragmentSystem(THREE, {\n scene: o.scene,\n groundAt: this.groundAt,\n gravity: this.gravity,\n max: this.maxFragments,\n life: o.fragmentLife ?? 12,\n })\n this.cages = new RebarCages(THREE, o.scene)\n this.pieceSys = new PieceSystem(THREE, {\n groundAt: this.groundAt,\n gravity: this.gravity,\n scene: o.scene,\n onHardLanding: (p, point, speed) => this.hardLanding(p, point, speed),\n })\n this.unsubscribe = this.world.on('*', (ev) => {\n if (this.queue.length < QUEUE_CAP) this.queue.push(ev)\n })\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Binding\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n bind(objectId: string, root: Object3D, options: BindOptions = {}): void {\n if (this.bounds.has(objectId)) this.unbind(objectId)\n const state = this.world.state(objectId)\n const partIds = new Set((state?.parts ?? []).map((p) => p.id))\n const byPart = new Map<string, Array<{ mesh: Mesh; range?: [number, number] }>>()\n const taken = new Set<Mesh>()\n const put = (pid: string, e: { mesh: Mesh; range?: [number, number] }): void => {\n const l = byPart.get(pid)\n if (l) l.push(e)\n else byPart.set(pid, [e])\n }\n const add = (pid: string, m: Mesh): void => {\n if (taken.has(m)) return\n taken.add(m)\n put(pid, { mesh: m })\n }\n const addRange = (pid: string, r: MeshRange): void => {\n const n = (r.mesh.geometry.getAttribute('position')?.count ?? 0) as number\n const [v0, v1] = r.range\n if (!Number.isInteger(v0) || !Number.isInteger(v1) || v0 < 0 || v1 <= v0 || v1 > n) {\n throw new Error(`game-destruction-three: invalid vertex range [${v0}, ${v1}) for part \"${pid}\" (the mesh has ${n} vertices)`)\n }\n put(pid, { mesh: r.mesh, range: [v0, v1] })\n }\n const meshesIn = (o: Object3D): Mesh[] => {\n const out: Mesh[] = []\n o.traverse((c) => {\n if ((c as Mesh).isMesh) out.push(c as Mesh)\n })\n return out\n }\n if (options.parts) {\n for (const [pid, v] of Object.entries(options.parts)) {\n for (const o of Array.isArray(v) ? v : [v]) {\n if (isMeshRange(o)) addRange(pid, o)\n else for (const m of meshesIn(o)) add(pid, m)\n }\n }\n } else {\n const leftovers: Mesh[] = []\n for (const m of meshesIn(root)) {\n const ud = partHintOf(m.userData?.destructionPart)?.id\n if (ud !== undefined && partIds.has(ud)) add(ud, m)\n else if (partIds.has(m.name)) add(m.name, m)\n else leftovers.push(m)\n }\n if (leftovers.length) this.matchByBox(objectId, root, leftovers, add)\n }\n const bound: Bound = { id: objectId, root, sync: options.syncTransform !== false, parts: new Map(), lastPos: null, lastQuat: null, piece: null, isSplit: false }\n const hosts = new Map<Mesh, HostVis>()\n for (const pid of partIds) bound.parts.set(pid, this.makePartVis(objectId, pid, state?.parts.find((p) => p.id === pid)?.material ?? '', byPart.get(pid) ?? [], hosts))\n for (const [pid, meshes] of byPart) {\n if (!bound.parts.has(pid)) bound.parts.set(pid, this.makePartVis(objectId, pid, this.world.part(objectId, pid)?.material ?? '', meshes, hosts))\n }\n this.bounds.set(objectId, bound)\n for (const pv of bound.parts.values()) this.tagPart(pv, objectId)\n }\n\n /**\n * Label the meshes of a part so a host can go from a raycast hit to the world: `userData.destructionPart` (the part id) and\n * `userData.destructionObject` (the id of the world object that part belongs to now; a loose piece has an id of its own). Parts drawn by a range\n * of a merged mesh share that mesh with others and are left alone until they get a mesh of their own. Decals are marked `destructionDebris`.\n */\n private tagPart(pv: PartVis, objectId: string): void {\n for (const mv of pv.meshes) {\n if (mv.merged && !mv.loose) continue\n mv.mesh.traverse((c) => {\n if (!(c as Mesh).isMesh) return\n const ud = c.userData as Record<string, unknown>\n if (ud.destructionDebris) return\n if (partHintOf(ud.destructionPart)?.id !== pv.id) ud.destructionPart = pv.id\n ud.destructionObject = objectId\n })\n }\n }\n\n private makePartVis(home: string, id: string, material: string, meshes: Array<{ mesh: Mesh; range?: [number, number] }>, hosts: Map<Mesh, HostVis>): PartVis {\n return { id, home, material, meshes: meshes.map((m) => this.visuals.makeMeshVis(m.mesh, home, m.range, hosts)), charApplied: 0, glowApplied: 0, meltApplied: 0, gone: 'none' }\n }\n\n /** Match unlabelled meshes to the part whose shape contains the centre of the mesh's bounding box. */\n private matchByBox(objectId: string, root: Object3D, meshes: Mesh[], add: (pid: string, m: Mesh) => void): void {\n let specParts: PartSpec[] | undefined\n try {\n specParts = this.world.serialize?.().objects.find((o) => o.id === objectId)?.spec.parts\n } catch {\n specParts = undefined\n }\n if (!specParts) return\n const frame = specFrameInverse(this.THREE, root)\n const e = new this.THREE.Euler()\n const q = new this.THREE.Quaternion()\n for (const m of meshes) {\n this.box.setFromObject(m)\n if (this.box.isEmpty()) continue\n const c = this.box.getCenter(this.v1).applyMatrix4(frame)\n let best: PartSpec | null = null\n let bestVol = Infinity\n for (const p of specParts) {\n const l = this.v2.set(c.x - p.position[0], c.y - p.position[1], c.z - p.position[2])\n if (p.rotation) l.applyQuaternion(q.setFromEuler(e.set(p.rotation[0], p.rotation[1], p.rotation[2], 'XYZ')).invert())\n let inside = false\n let vol = 0\n const s = p.shape\n if (s.kind === 'box') {\n inside = Math.abs(l.x) <= s.size[0] / 2 && Math.abs(l.y) <= s.size[1] / 2 && Math.abs(l.z) <= s.size[2] / 2\n vol = s.size[0] * s.size[1] * s.size[2]\n } else if (s.kind === 'cylinder') {\n inside = Math.hypot(l.x, l.z) <= s.radius && Math.abs(l.y) <= s.height / 2\n vol = Math.PI * s.radius * s.radius * s.height\n } else {\n inside = l.length() <= s.radius\n vol = (4 / 3) * Math.PI * s.radius ** 3\n }\n if (inside && vol < bestVol) {\n best = p\n bestVol = vol\n }\n }\n if (best) add(best.id, m)\n }\n }\n\n unbind(objectId: string): void {\n const b = this.bounds.get(objectId)\n if (!b) return\n this.restore(objectId)\n this.pieceSys.remove(objectId)\n this.bounds.delete(objectId)\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Pieces\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n /** Half extents and centre of the box around some meshes, in the metric frame of `root` (its pose removed, its scale kept). */\n private measure(root: Object3D, meshes: MeshVis[]): { half: Vec3; center: THREE_NS.Vector3 } {\n const inv = specFrameInverse(this.THREE, root)\n const total = new this.THREE.Box3()\n const m4 = new this.THREE.Matrix4()\n const lb = new this.THREE.Box3()\n for (const mv of meshes) {\n const m = mv.mesh\n m.updateWorldMatrix(true, false)\n this.visuals.localBox(mv, lb)\n if (lb.isEmpty()) continue\n total.union(lb.clone().applyMatrix4(m4.multiplyMatrices(inv, m.matrixWorld)))\n }\n if (total.isEmpty()) return { half: [0.25, 0.25, 0.25], center: new this.THREE.Vector3() }\n const size = total.getSize(new this.THREE.Vector3())\n return { half: [Math.max(0.02, size.x / 2), Math.max(0.02, size.y / 2), Math.max(0.02, size.z / 2)], center: total.getCenter(new this.THREE.Vector3()) }\n }\n\n private meshesOf(b: Bound): MeshVis[] {\n const out: MeshVis[] = []\n for (const pv of b.parts.values()) if (pv.gone === 'none') for (const mv of pv.meshes) out.push(mv)\n return out\n }\n\n private massOf(objectId: string): number {\n const st = this.world.state(objectId)\n if (!st) return 5\n let m = 0\n for (const p of st.parts) if (p.status !== 'broken' && p.status !== 'melted' && p.status !== 'ashes') m += p.mass\n return m > 0 ? m : 5\n }\n\n makePiece(objectId: string, options: { mass?: number; velocity?: Vec3 } = {}): Piece {\n const b = this.bounds.get(objectId)\n if (!b) throw new Error(`game-destruction-three: object \"${objectId}\" is not bound`)\n if (b.root.parent && b.root.parent !== this.scene) this.scene.attach(b.root)\n const { half, center } = this.measure(b.root, this.meshesOf(b))\n const piece = this.pieceSys.create(objectId, b.root, half, center, options.mass ?? this.massOf(objectId), options.velocity)\n b.piece = piece\n return piece\n }\n\n pieces(): Piece[] {\n return [...this.pieceSys.list]\n }\n\n piece(objectId: string): Piece | null {\n return this.pieceSys.get(objectId)\n }\n\n impulse(objectId: string, impulse: Vec3, point?: Vec3): void {\n const p = this.pieceSys.get(objectId)\n if (p) this.pieceSys.impulse(p, impulse, point)\n }\n\n private hardLanding(p: PieceBody, point: Vec3, speed: number): void {\n const key = this.impactSoundOf(p.objectId)\n this.sound(key, point, clamp(speed / 10, 0.2, 1))\n // the piece just moved this frame: the world must know where it is before the hit is resolved against its parts\n this.syncBound(p.objectId)\n try {\n this.world.hit(p.objectId, { type: 'blunt', point, energy: 0.5 * p.mass * speed * speed, radius: 0.08, direction: [0, -1, 0], source: 'fall' })\n } catch {\n // the object may have been removed from the world\n }\n }\n\n private impactSoundOf(objectId: string): string {\n const st = this.world.state(objectId)\n let best: MaterialDef | undefined\n let mass = -1\n for (const p of st?.parts ?? []) {\n if (p.mass > mass) {\n mass = p.mass\n best = this.world.materials.get(p.material)\n }\n }\n return impactKey(best)\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Update\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n update(dt: number): void {\n if (this.disposed) return\n dt = clamp(dt, 0, 0.1)\n this.time += dt\n this.drainQueue()\n // a settling object keeps moving between its (throttled) `settle` events\n for (const b of this.bounds.values()) if (b.soilNode && this.world.state(b.id)?.soil?.status === 'yielding') this.onSettle(b.id)\n this.updateActive(dt)\n this.updateLeaks(dt)\n this.pieceSys.update(dt)\n this.fragments.update(dt)\n this.ground.update(dt)\n this.ownVfx?.update(dt)\n this.syncTransforms()\n }\n\n private drainQueue(): void {\n // events produced while applying (a hard landing calls `hit`) wait for the next frame\n const batch = this.queue.splice(0, this.queue.length)\n for (const ev of batch) {\n try {\n this.apply(ev)\n } catch (err) {\n if (typeof console !== 'undefined') console.error('game-destruction-three: failed to apply', ev.type, err)\n }\n }\n }\n\n /**\n * The ground under an object settled or tilted: its parts are drawn under a node with the soil's offset (`ObjectState.soil.offset`), so the host's\n * root keeps the pose the host gave and the world keeps getting it from `syncTransform`.\n */\n private onSettle(objectId: string): void {\n const b = this.bounds.get(objectId)\n const soil = this.world.state(objectId)?.soil\n if (!b || !soil) return\n let node = b.soilNode\n if (!node) {\n node = new this.THREE.Group()\n node.name = 'destruction-soil'\n for (const c of [...b.root.children]) node.add(c)\n b.root.add(node)\n b.soilNode = node\n }\n const { position: p, rotation: q } = soil.offset\n node.position.set(p[0], p[1], p[2])\n node.quaternion.set(q[0], q[1], q[2], q[3])\n node.updateMatrixWorld(true)\n }\n\n private syncTransforms(): void {\n for (const b of this.bounds.values()) this.syncOne(b)\n }\n\n /** Push the current transform of one bound object to the world right now (used before a landing hit). */\n private syncBound(objectId: string): void {\n const b = this.bounds.get(objectId)\n if (b) this.syncOne(b)\n }\n\n private syncOne(b: Bound): void {\n if (!b.sync) return\n const p = this.v1\n const q = this.tmpQ\n b.root.updateWorldMatrix(true, false)\n b.root.matrixWorld.decompose(p, q, this.v2)\n const last = b.lastPos\n const lq = b.lastQuat\n const moved = !last || !lq || Math.abs(p.x - last[0]) + Math.abs(p.y - last[1]) + Math.abs(p.z - last[2]) > 1e-5 || Math.abs(q.x - lq[0]) + Math.abs(q.y - lq[1]) + Math.abs(q.z - lq[2]) + Math.abs(q.w - lq[3]) > 1e-6\n if (!moved) return\n b.lastPos = [p.x, p.y, p.z]\n b.lastQuat = [q.x, q.y, q.z, q.w]\n if (this.world.has(b.id)) this.world.setTransform(b.id, [p.x, p.y, p.z], [q.x, q.y, q.z, q.w])\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Events\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n private apply(ev: DestructionEvent): void {\n switch (ev.type) {\n case 'damage':\n if (ev.damageType === 'heat' || ev.damageType === 'fire' || ev.damageType === 'explosive') this.activate(ev.object, ev.part)\n break\n case 'dent':\n this.onDent(ev)\n break\n case 'hole':\n this.onHole(ev)\n break\n case 'crack':\n this.onCrack(ev)\n break\n case 'ricochet': {\n const d = ev.direction\n this.vfx.burst('sparks', ev.point, d, 4 + Math.min(10, ev.energy / 150), 4)\n this.sound('ricochet', ev.point, 0.7)\n break\n }\n case 'debris':\n this.vfx.burst(ev.kind, ev.point, ev.normal, ev.count, ev.speed > 0 ? ev.speed : DEFAULT_SPEED[ev.kind] ?? 1, this.debrisOptions(ev.kind, ev.object, ev.part))\n break\n case 'fracture':\n this.onFracture(ev)\n break\n case 'detach':\n this.onDetach(ev)\n break\n case 'settle':\n this.onSettle(ev.object)\n break\n case 'collapse':\n this.splitLoose(ev.object)\n this.playEvent({ kind: 'collapse' }, this.rootPoint(ev.object))\n break\n case 'disassemble_progress': {\n const k = `unscrew:${ev.joint}`\n if (this.time - (this.throttles.get(k) ?? -1) > 0.25) {\n this.throttles.set(k, this.time)\n this.sound('unscrew', this.rootPoint(ev.object), clamp(0.3 + ev.progress * 0.5, 0, 1))\n }\n break\n }\n case 'ignite':\n this.startFire(ev)\n this.activate(ev.object, ev.part)\n this.sound('ignite', ev.point, 0.7)\n this.sound('burn_loop', ev.point, 0.5)\n break\n case 'primed':\n // a bullet or fire sets the part burning until its delay runs out; a blast nearby only waits for the explosion\n if (ev.trigger !== 'explosion') {\n this.vfx.fire({ point: ev.point, radius: PRIMED_FIRE_RADIUS, life: ev.delay })\n this.primedBurning.add(`${ev.object}|${ev.part}`)\n this.activate(ev.object, ev.part)\n this.sound('ignite', ev.point, 0.7)\n this.sound('burn_loop', ev.point, 0.5)\n }\n break\n case 'spall':\n this.onSpall(ev)\n break\n case 'stage':\n this.onStage(ev)\n break\n case 'expose':\n this.cages.set(`${ev.object}|${ev.part}`, ev.bars)\n if (ev.bars.length > 0) {\n const [a, b] = ev.bars[0] as [Vec3, Vec3]\n this.playEvent({ kind: 'expose' }, [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2])\n }\n break\n case 'extinguish': {\n const f = this.fires.get(`${ev.object}|${ev.part}`)\n const primed = this.primedBurning.delete(`${ev.object}|${ev.part}`)\n if (f) {\n this.stopFire(`${ev.object}|${ev.part}`)\n this.vfx.burst('steam', f.point, [0, 1, 0], 14, 1.2)\n }\n if (f || primed) this.sound('burn_end', f?.point ?? this.rootPoint(ev.object), 0.5)\n this.activate(ev.object, ev.part)\n this.sound('extinguish', f?.point ?? this.rootPoint(ev.object), 0.6)\n break\n }\n case 'burnout': {\n this.stopFire(`${ev.object}|${ev.part}`)\n this.primedBurning.delete(`${ev.object}|${ev.part}`)\n this.sound('burn_end', ev.point, 0.5)\n this.vfx.burst('ash', ev.point, [0, 1, 0], 16, 1)\n this.vfx.burst('smoke', ev.point, [0, 1, 0], 6, 0.8, { color: SMOKE_TONES.grey })\n const pv = this.partVis(ev.object, ev.part)\n if (pv) {\n const def = this.world.materials.get(pv.material)\n this.visuals.setChar(pv, 1, def?.visual?.charColor ?? 0x1a1410)\n }\n this.activate(ev.object, ev.part)\n break\n }\n case 'melt':\n this.activate(ev.object, ev.part)\n if (this.time - (this.throttles.get(`melt:${ev.object}|${ev.part}`) ?? -9) > 1.5) {\n this.throttles.set(`melt:${ev.object}|${ev.part}`, this.time)\n this.sound('melt_sizzle', this.rootPoint(ev.object), 0.4)\n }\n break\n case 'drip': {\n const b = this.bounds.get(ev.object)\n const pv = b?.parts.get(ev.part)\n const def = this.world.materials.get(ev.material)\n const color = (pv && this.partColor(pv, def)) ?? fallbackColor(ev.material, def)\n let tag = this.homeTags.indexOf(ev.object) + 1\n if (tag === 0) tag = this.homeTags.push(ev.object)\n this.vfx.spawn('drips', ev.point, [(this.rng() - 0.5) * 0.1, -0.1, (this.rng() - 0.5) * 0.1], { color, tag, owner: this.owner })\n break\n }\n case 'leak': {\n const key = `${ev.object}|${ev.part}`\n const same = this.leaks.find((l) => l.object === ev.object && l.part === ev.part && Math.hypot(l.point[0] - ev.point[0], l.point[1] - ev.point[1], l.point[2] - ev.point[2]) < 0.03)\n if (same) {\n same.rate = ev.rate\n same.direction = ev.direction\n } else {\n if (this.leaks.length >= 24) this.leaks.shift()\n this.leaks.push({ object: ev.object, part: ev.part, fluid: ev.fluid, point: ev.point, direction: ev.direction, rate: ev.rate, pressurized: ev.pressurized, acc: 0, opened: this.world.part(ev.object, ev.part)?.holes.some((h) => h.through) ?? false })\n }\n void key\n break\n }\n case 'explode':\n this.primedBurning.delete(`${ev.object}|${ev.part}`)\n this.onExplode(ev)\n break\n case 'destroyed':\n break\n }\n }\n\n private rootPoint(objectId: string): Vec3 {\n const b = this.bounds.get(objectId)\n return b ? [b.root.position.x, b.root.position.y, b.root.position.z] : [0, 0, 0]\n }\n\n private sound(key: string, point: Vec3, volume: number): void {\n this.o.onSound?.(key, point, volume)\n }\n\n private partVis(objectId: string, partId: string): PartVis | null {\n return this.bounds.get(objectId)?.parts.get(partId) ?? null\n }\n\n private activate(objectId: string, partId: string): void {\n this.active.set(`${objectId}|${partId}`, { object: objectId, part: partId })\n }\n\n /** Current colour of the part's first mesh (char included), or null. */\n private partColor(pv: PartVis, def: MaterialDef | undefined): number | null {\n const mv = pv.meshes[0]\n if (!mv) return null\n const mat = materialsOf(mv.mesh.material)[0] as THREE_NS.MeshStandardMaterial | undefined\n const c = mat?.color\n if (c && (c as THREE_NS.Color).isColor) {\n const tint = this.visuals.vertexTint(mv)\n return tint ? c.clone().multiply(tint).getHex() : c.getHex()\n }\n return def ? fallbackColor(def.id, def) : null\n }\n\n private debrisOptions(kind: DebrisKind, objectId: string, partId: string): { color?: number } | undefined {\n const pv = this.partVis(objectId, partId)\n const def = pv ? this.world.materials.get(pv.material) : undefined\n if (kind === 'smoke') return { color: SMOKE_TONES[def?.thermal.smoke ?? 'grey'] }\n if (kind === 'fibers' || kind === 'leaves') {\n const c = pv ? this.visuals.baseColorHex(pv.meshes[0] ?? ({} as never)) : -1\n return c >= 0 ? { color: c } : undefined\n }\n if (kind === 'dust' || kind === 'chips') {\n const c = pv && pv.meshes[0] ? this.visuals.baseColorHex(pv.meshes[0]) : -1\n return c >= 0 && kind === 'chips' ? { color: c } : undefined\n }\n return undefined\n }\n\n /** Mesh of the part closest to a world point. */\n private nearestMesh(pv: PartVis, p: THREE_NS.Vector3): PartVis['meshes'][number] | null {\n let best: PartVis['meshes'][number] | null = null\n let bd = Infinity\n for (const mv of pv.meshes) {\n if (!this.visuals.shown(mv)) continue\n const d = this.visuals.worldBox(mv, this.box).distanceToPoint(p)\n if (d < bd) {\n bd = d\n best = mv\n }\n }\n return best\n }\n\n private worldDir(b: Bound, v: Vec3): THREE_NS.Vector3 {\n b.root.updateWorldMatrix(true, false)\n return new this.THREE.Vector3(v[0], v[1], v[2]).applyQuaternion(b.root.getWorldQuaternion(this.tmpQ)).normalize()\n }\n\n private onDent(ev: Ev<'dent'>): void {\n const b = this.bounds.get(ev.object)\n const pv = b?.parts.get(ev.part)\n if (!b || !pv) return\n const def = this.world.materials.get(pv.material)\n const wp = new this.THREE.Vector3(ev.worldPoint[0], ev.worldPoint[1], ev.worldPoint[2])\n const wn = this.worldDir(b, ev.dent.normal)\n const shown = pv.meshes.filter((mv) => this.visuals.shown(mv))\n const reach = shown.reduce((widest, mv) => Math.max(widest, this.visuals.dentReach(mv, wp, ev.dent)), ev.dent.radius)\n this.visuals.applyPartDent(shown, wp, wn, ev.dent, reach)\n if (def?.tags?.includes('metal')) this.vfx.burst('sparks', ev.worldPoint, [wn.x, wn.y, wn.z], 4 + Math.min(8, ev.dent.depth * 150), 3.2)\n this.sound(impactKey(def), ev.worldPoint, clamp(0.3 + ev.dent.depth * 12, 0.3, 1))\n }\n\n private onHole(ev: Ev<'hole'>): void {\n const b = this.bounds.get(ev.object)\n const pv = b?.parts.get(ev.part)\n if (!b || !pv) return\n const def = this.world.materials.get(pv.material)\n const n = this.worldDir(b, ev.hole.normal)\n const draw = (point: Vec3, normal: THREE_NS.Vector3): void => {\n const wp = new this.THREE.Vector3(point[0], point[1], point[2])\n const mv = this.nearestMesh(pv, wp)\n if (!mv) return\n if (def?.visual?.transparent) {\n const seed = hashNumbers(ev.time, point[0], point[1], point[2])\n this.visuals.addCrack(mv, wp, normal, 7, Math.max(0.05, ev.hole.diameter * 5), 0xe8f4ff, seed)\n } else {\n this.visuals.addHole(mv, wp, normal, ev.hole.diameter)\n }\n }\n draw(ev.worldPoint, n)\n if (ev.hole.through && ev.exitPoint) draw(ev.exitPoint, n.clone().negate())\n if (def?.tags?.includes('metal')) this.vfx.burst('sparks', ev.worldPoint, [n.x, n.y, n.z], 6, 3.5)\n this.sound(impactKey(def), ev.worldPoint, 0.6)\n }\n\n private onCrack(ev: Ev<'crack'>): void {\n const b = this.bounds.get(ev.object)\n const pv = b?.parts.get(ev.part)\n if (!b || !pv) return\n const def = this.world.materials.get(pv.material)\n const wp = new this.THREE.Vector3(ev.worldPoint[0], ev.worldPoint[1], ev.worldPoint[2])\n const mv = this.nearestMesh(pv, wp)\n if (mv) {\n const color = def?.visual?.transparent ? 0xe8f4ff : 0x2a2724\n this.visuals.addCrack(mv, wp, this.worldDir(b, ev.crack.normal), ev.crack.rays, ev.crack.length, color, hashNumbers(ev.time, ev.worldPoint[0], ev.worldPoint[1], ev.worldPoint[2]))\n }\n this.sound(impactKey(def), ev.worldPoint, 0.5)\n }\n\n /** Outward normal of the face of `mv` nearest to a world point: the thin axis of its world box (right for a wall; a sloped face is left to the vertex-range binding). */\n private faceNormal(mv: PartVis['meshes'][number], point: THREE_NS.Vector3): THREE_NS.Vector3 {\n const box = this.visuals.worldBox(mv, this.box)\n const size = box.getSize(this.v1)\n const axis = size.x <= size.y && size.x <= size.z ? 'x' : size.y <= size.z ? 'y' : 'z'\n const side = point[axis] >= (box.min[axis] + box.max[axis]) / 2 ? 1 : -1\n return new this.THREE.Vector3(axis === 'x' ? side : 0, axis === 'y' ? side : 0, axis === 'z' ? side : 0)\n }\n\n /** The material an impact effect is chosen by: the tags of the material (`metal`, `glass`, `wood`), else stone and the like are `concrete`. */\n private impactMaterial(def: MaterialDef | undefined): string {\n for (const tag of IMPACT_TAGS) if (def?.tags?.includes(tag)) return tag\n return 'concrete'\n }\n\n /**\n * Plays the effect the event map names for a destruction event (`data/event-effects.json` of `game-vfx`, or `RendererOptions.eventEffects`) at a point.\n * Answers whether one played, so the caller can leave out the burst it replaces.\n */\n private playEvent(event: GameEvent, point: Vec3): boolean {\n const id = effectForEvent(event, this.o.eventEffects ?? EVENT_EFFECTS_MAP)\n if (!id) return false\n return this.vfx.play(id, point, { seed: hashNumbers(point[0], point[1], point[2], this.time) }) !== null\n }\n\n /** A coat came off: a patch in the colour of the core under it, below the bullet holes and cracks. */\n private onSpall(ev: Ev<'spall'>): void {\n const pv = this.partVis(ev.object, ev.part)\n if (!pv) return\n const wp = new this.THREE.Vector3(ev.point[0], ev.point[1], ev.point[2])\n const mv = this.nearestMesh(pv, wp)\n if (!mv) return\n const def = this.world.materials.get(pv.material)\n this.playEvent({ kind: 'spall', material: this.impactMaterial(def) }, ev.point)\n this.visuals.addSpall(mv, wp, this.faceNormal(mv, wp), Math.sqrt(ev.area / Math.PI), fallbackColor(pv.material, def))\n }\n\n /**\n * Stage 2 of a staged part: the unit-sized fragments come out and the part stays drawn (hiding it is what `fracture` does). The opening itself\n * (cutting the wall's faces) is not drawn yet: it needs the per-vertex binding of the house renderer.\n */\n private onStage(ev: Ev<'stage'>): void {\n const played = this.playEvent({ kind: 'stage', stage: ev.stage }, ev.opening?.center ?? this.rootPoint(ev.object))\n if (!ev.fragments || !ev.opening) return\n const pv = this.partVis(ev.object, ev.part)\n const def = pv ? this.world.materials.get(pv.material) : undefined\n const color = (pv ? this.partColor(pv, def) : null) ?? fallbackColor(pv?.material ?? '', def)\n const maxAlive = this.low ? Math.floor(this.maxFragments / 2) : this.maxFragments\n const step = this.low ? 2 : 1\n for (let i = 0; i < ev.fragments.length; i += step) {\n const fr = ev.fragments[i] as Fragment\n const fdef = this.world.materials.get(fr.material)\n this.fragments.spawn(fr, this.fragments.materialFor(fr.material, fdef === def || !fdef ? color : fallbackColor(fr.material, fdef), false), ev.object, maxAlive)\n }\n if (!played) this.vfx.burst('dust', ev.opening.center, [0, 1, 0], 14, 1.2, { color })\n this.sound(impactKey(def), ev.opening.center, 0.8)\n }\n\n private onFracture(ev: Ev<'fracture'>): void {\n const b = this.bounds.get(ev.object)\n const pv = b?.parts.get(ev.part)\n const matId = pv?.material || (ev.fragments[0]?.material ?? '')\n const def = this.world.materials.get(matId)\n let color = fallbackColor(matId, def)\n let opacity = 0.5\n const transparent = def?.visual?.transparent === true\n if (pv) {\n const c = this.partColor(pv, def)\n if (c !== null) color = c\n const m = pv.meshes[0] ? (materialsOf(pv.meshes[0].origMaterial)[0] as THREE_NS.Material | undefined) : undefined\n if (m && m.transparent) opacity = clamp(m.opacity, 0.2, 0.8)\n this.visuals.hide(pv, 'broken')\n }\n const maxAlive = this.low ? Math.floor(this.maxFragments / 2) : this.maxFragments\n const step = this.low ? 2 : 1\n for (let i = 0; i < ev.fragments.length; i += step) {\n const fr = ev.fragments[i]\n const fdef = this.world.materials.get(fr.material)\n const mat = this.fragments.materialFor(fr.material, fdef === def || !fdef ? color : fallbackColor(fr.material, fdef), transparent || fdef?.visual?.transparent === true, opacity)\n this.fragments.spawn(fr, mat, ev.object, maxAlive)\n }\n const up: Vec3 = [0, 1, 0]\n const sizeK = clamp(ev.fragments.length / 10, 0.5, 2)\n switch (ev.style) {\n case 'shatter':\n this.vfx.burst('shards', ev.point, up, 18 * sizeK, 3)\n break\n case 'crumble':\n this.vfx.burst('dust', ev.point, up, 16 * sizeK, 1.2, { color: pv ? (this.partColor(pv, def) ?? undefined) : undefined })\n this.vfx.burst('chips', ev.point, up, 6, 3)\n break\n case 'splinter':\n this.vfx.burst('splinters', ev.point, up, 14 * sizeK, 3)\n this.vfx.burst('dust', ev.point, up, 5, 0.8, { color: 0xb59a74 })\n break\n case 'tear':\n this.vfx.burst('fibers', ev.point, up, 12 * sizeK, 1.6, { color: color })\n break\n case 'snap':\n this.vfx.burst('chips', ev.point, up, 8 * sizeK, 3)\n break\n default:\n this.vfx.burst('sparks', ev.point, up, 10, 4)\n }\n this.sound(fractureKey(def, ev.style), ev.point, clamp(0.4 + ev.fragments.length * 0.03, 0.4, 1))\n }\n\n private onDetach(ev: Ev<'detach'>): void {\n this.sound('detach', this.rootPoint(ev.object), 0.5)\n this.splitLoose(ev.object)\n }\n\n /** Turn every loose group of the object (a detach, a collapse) into a piece of its own. */\n private splitLoose(objectId: string): void {\n if (!this.autoSplit) return\n const b = this.bounds.get(objectId)\n if (!b) return\n const st = this.world.state(objectId)\n if (!st || st.groups.length < 2) return\n const loose = st.groups.length - 1\n for (let i = 0; i < loose; i++) {\n // the loose groups are always read from index 1: each split renumbers the rest\n let newId: string\n try {\n newId = this.world.splitGroup(objectId, 1)\n } catch {\n break\n }\n this.adoptSplit(b, newId)\n }\n const old = b.piece\n if (old) {\n const { half, center } = this.measure(b.root, this.meshesOf(b))\n old.halfExtents = half\n this.pieceSys.setCenter(old, center)\n old.mass = Math.max(0.05, this.massOf(objectId))\n old.sleeping = false\n }\n }\n\n /** The renderer side of `splitGroup`: a new group holding the meshes of the new object, made a piece. */\n private adoptSplit(from: Bound, newId: string): void {\n const state = this.world.state(newId)\n const root = from.root\n root.updateWorldMatrix(true, false)\n const group = new this.THREE.Group()\n group.name = `destruction-piece-${newId}`\n root.getWorldPosition(group.position)\n root.getWorldQuaternion(group.quaternion)\n this.scene.add(group)\n group.updateMatrixWorld(true)\n const nb: Bound = { id: newId, root: group, sync: true, parts: new Map(), lastPos: null, lastQuat: null, piece: null, isSplit: true }\n for (const p of state?.parts ?? []) {\n const pv = from.parts.get(p.id)\n if (!pv) continue\n from.parts.delete(p.id)\n nb.parts.set(p.id, pv)\n for (const mv of pv.meshes) {\n // a part drawn by a range of a merged mesh leaves its faces behind: it gets a mesh of its own\n if (mv.host && !mv.loose) this.visuals.extract(mv, group)\n else {\n group.attach(mv.mesh)\n mv.moved = true\n }\n }\n }\n this.bounds.set(newId, nb)\n for (const pv of nb.parts.values()) this.tagPart(pv, newId)\n const meshes = this.meshesOf(nb)\n if (meshes.length === 0) return\n const { half, center } = this.measure(group, meshes)\n let vel: Vec3 = [0, 0, 0]\n let ang: Vec3 = [0, 0, 0]\n const op = from.piece\n if (op) {\n vel = [...op.velocity]\n ang = [...op.angularVelocity]\n // linear velocity at the loose piece's centre\n const c = this.pieceSys.centerOf(op, new this.THREE.Vector3())\n const nc = center.clone().applyQuaternion(group.quaternion).add(group.position)\n vel[0] += ang[1] * (nc.z - c.z) - ang[2] * (nc.y - c.y)\n vel[1] += ang[2] * (nc.x - c.x) - ang[0] * (nc.z - c.z)\n vel[2] += ang[0] * (nc.y - c.y) - ang[1] * (nc.x - c.x)\n }\n const piece = this.pieceSys.create(newId, group, half, center, this.massOf(newId), vel, ang)\n nb.piece = piece\n this.o.onPiece?.(piece)\n }\n\n private onExplode(ev: Ev<'explode'>, options: ExplodeOptions = {}): void {\n const p = ev.point\n if (options.visual !== false) this.playExplosion(ev, options)\n this.vfx.push(p, ev.radius, 4)\n // shove pieces and fragments\n const c = this.v1\n const report = options.report\n const confinement = report?.find((r) => r.blast !== undefined)?.blast?.confinement ?? 1\n const energy = ev.energy * confinement\n // the energy that got to an object after what stood in the way (`blast.shelter`); the whole of it when the blast carries no report\n const reachOf = (objectId: string): number => report?.find((r) => r.object === objectId)?.blast?.shelter ?? 1\n const shove = (pc: PieceBody): void => {\n this.pieceSys.centerOf(pc, c)\n const hit = blastShove({ point: p, energy, radius: ev.radius, reach: reachOf(pc.objectId) }, { position: [c.x, c.y, c.z], mass: pc.mass }, this.o.blastShove)\n if (!hit) return\n const spread = pc.halfExtents[0]\n const momentum = hit.speed * pc.mass\n this.pieceSys.impulse(pc, [hit.direction[0] * momentum, hit.direction[1] * momentum, hit.direction[2] * momentum], [c.x + (this.rng() - 0.5) * spread, c.y + spread * 0.5, c.z + (this.rng() - 0.5) * spread])\n }\n for (const pc of [...this.pieceSys.list]) shove(pc)\n if (this.o.shoveable) this.loosen(p, ev.radius, energy, reachOf)\n this.fragments.blast(p, ev.radius, Math.min(20, Math.sqrt(energy) * 0.08))\n this.sound('explode', p, clamp(0.5 + ev.radius / 10, 0.5, 1))\n }\n\n /** The bound objects without a piece that the host lets a blast move (`shoveable`): the ones it reaches with enough speed become pieces and get the shove. */\n private loosen(point: Vec3, radius: number, energy: number, reachOf: (objectId: string) => number): void {\n const shoveable = this.o.shoveable\n if (!shoveable) return\n for (const b of [...this.bounds.values()]) {\n if (b.piece || this.pieceSys.get(b.id) || !shoveable(b.id) || !this.world.has(b.id)) continue\n const { half, center } = this.measure(b.root, this.meshesOf(b))\n const world = center.clone().applyQuaternion(b.root.quaternion).add(b.root.position)\n const mass = this.massOf(b.id)\n const hit = blastShove({ point, energy, radius, reach: reachOf(b.id) }, { position: [world.x, world.y, world.z], mass }, this.o.blastShove)\n if (!hit) continue\n const piece = this.makePiece(b.id, { mass })\n const body = this.pieceSys.get(b.id)\n if (!body) continue\n this.o.onLoosened?.(b.id, piece)\n const spread = half[0]\n const momentum = hit.speed * mass\n this.pieceSys.impulse(body, [hit.direction[0] * momentum, hit.direction[1] * momentum, hit.direction[2] * momentum], [world.x + (this.rng() - 0.5) * spread, world.y + spread * 0.5, world.z + (this.rng() - 0.5) * spread])\n }\n }\n\n private playExplosion(ev: Ev<'explode'>, options: ExplodeOptions): void {\n const named = options.effect ?? ev.effect\n const direction = options.direction\n const scale = clamp(ev.radius / GENERIC_REFERENCE_RADIUS, 0.2, 3)\n if (named !== undefined && this.vfx.explosion(named, ev.point, direction ? { direction } : {}) !== null) return\n this.vfx.explosion('generic', ev.point, { scale, ...(direction ? { direction } : {}) })\n }\n\n private startFire(ev: { object: string; part: string; point: Vec3 }): void {\n const key = `${ev.object}|${ev.part}`\n this.stopFire(key)\n this.fires.set(key, { object: ev.object, part: ev.part, point: ev.point, follow: { x: ev.point[0], y: ev.point[1], z: ev.point[2] } })\n }\n\n private stopFire(key: string): void {\n const fire = this.fires.get(key)\n if (!fire) return\n if (fire.handle !== undefined) this.vfx.stop(fire.handle)\n this.fires.delete(key)\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Fire, heat, char, melt, leaks\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n private updateActive(dt: number): void {\n this.scanTimer += dt\n if (this.scanTimer >= 0.4) {\n this.scanTimer = 0\n for (const b of this.bounds.values()) {\n for (const pv of b.parts.values()) {\n if (pv.gone !== 'none' && pv.gone !== 'broken') continue\n const ps = this.world.part(b.id, pv.id)\n if (!ps) continue\n const def = this.world.materials.get(pv.material)\n if (\n ps.burning ||\n (def?.visual?.glows && ps.temperature > GLOW_FROM_C) ||\n Math.abs(ps.char - pv.charApplied) > 0.01 ||\n Math.abs(ps.melt - pv.meltApplied) > 0.01 ||\n (pv.gone === 'none' && (ps.status === 'melted' || ps.status === 'ashes'))\n ) {\n this.activate(b.id, pv.id)\n }\n }\n }\n }\n for (const [key, a] of this.active) {\n const pv = this.partVis(a.object, a.part)\n const ps = pv ? this.world.part(a.object, a.part) : null\n if (!pv || !ps) {\n this.active.delete(key)\n continue\n }\n const def = this.world.materials.get(pv.material)\n if (pv.gone === 'none') {\n this.visuals.setChar(pv, ps.char, def?.visual?.charColor ?? 0x1a1410)\n if (def?.visual?.glows) this.visuals.setGlow(pv, ps.temperature)\n this.visuals.setMelt(pv, ps.melt)\n if (ps.status === 'melted') this.onGone(a.object, pv, 'melted', def)\n else if (ps.status === 'ashes') this.onGone(a.object, pv, 'ashes', def)\n }\n const fire = this.fires.get(key)\n if (fire) {\n if (ps.burning && ps.status !== 'broken' && ps.status !== 'ashes' && ps.status !== 'melted') this.emitFire(fire, pv, def)\n else this.stopFire(key)\n }\n const hot = def?.visual?.glows === true && ps.temperature > GLOW_FROM_C\n if (!ps.burning && !hot && Math.abs(ps.char - pv.charApplied) < 0.01 && Math.abs(ps.melt - pv.meltApplied) < 0.01) {\n if (def?.visual?.glows && pv.gone === 'none') this.visuals.setGlow(pv, 0)\n this.active.delete(key)\n }\n }\n }\n\n private onGone(objectId: string, pv: PartVis, reason: 'melted' | 'ashes', def: MaterialDef | undefined): void {\n const bb = new this.THREE.Box3()\n for (const mv of pv.meshes) bb.union(this.visuals.worldBox(mv, this.box))\n this.visuals.hide(pv, reason)\n if (bb.isEmpty()) return\n const c = bb.getCenter(new this.THREE.Vector3())\n const s = bb.getSize(new this.THREE.Vector3())\n const footprint = Math.sqrt(Math.max(s.x * s.z, 1e-4))\n if (reason === 'melted') {\n this.ground.add('puddle', c.x, c.z, clamp(footprint * 0.55, 0.05, 1), this.partColor(pv, def) ?? fallbackColor(pv.material, def), objectId)\n } else {\n this.ground.add('ash', c.x, c.z, clamp(footprint * 0.35, 0.04, 0.5), 0x1d1a18, objectId)\n this.vfx.burst('ash', [c.x, bb.max.y, c.z], [0, 1, 0], 10, 0.8)\n }\n }\n\n private emitFire(f: FireEmitter, pv: PartVis, def: MaterialDef | undefined): void {\n const bb = this.box\n bb.makeEmpty()\n const tmp = new this.THREE.Box3()\n for (const mv of pv.meshes) if (this.visuals.shown(mv)) bb.union(this.visuals.worldBox(mv, tmp))\n if (!bb.isEmpty()) {\n const c = bb.getCenter(this.v1)\n f.follow.x = c.x\n f.follow.y = bb.min.y\n f.follow.z = c.z\n }\n if (f.handle !== undefined) return\n const size = bb.isEmpty() ? this.v2.set(0.2, 0.2, 0.2) : bb.getSize(this.v2)\n const radius = clamp(Math.max(size.x, size.z) * 0.5, 0.12, 1.2)\n const smokeColor = SMOKE_TONES[def?.thermal.smoke ?? 'grey']\n f.handle = this.vfx.fire({ point: [f.follow.x, f.follow.y, f.follow.z], radius, life: FIRE_CEILING_SECONDS, follow: f.follow, ...(smokeColor !== undefined ? { smokeColor } : {}) })\n }\n\n private updateLeaks(dt: number): void {\n for (let i = this.leaks.length - 1; i >= 0; i--) {\n const l = this.leaks[i]\n const ps = this.world.part(l.object, l.part)\n // a leak ends when the container is empty or the opening is closed (a valve shut, `seal`)\n if (!ps || ps.liters === undefined || ps.liters <= 0 || (l.opened && !ps.holes.some((h) => h.through))) {\n this.leaks.splice(i, 1)\n continue\n }\n l.acc += clamp(20 + l.rate * 400, 15, 120) * dt\n const color = FLUID_COLORS[l.fluid] ?? 0xaaaaaa\n const d = l.direction\n const dl = Math.hypot(d[0], d[1], d[2]) || 1\n const sp = l.pressurized ? 2.5 + this.rng() * 1.5 : 0.3 + this.rng() * 0.3\n while (l.acc >= 1) {\n l.acc -= 1\n const vel: Vec3 = [(d[0] / dl) * sp + (this.rng() - 0.5) * 0.25, (d[1] / dl) * sp + (this.rng() - 0.5) * 0.25, (d[2] / dl) * sp + (this.rng() - 0.5) * 0.25]\n if (l.fluid === 'gas') this.vfx.spawn('steam', l.point, vel, { color, size: 0.5, alpha: 0.5 })\n else this.vfx.spawn('drips', l.point, vel, { color, tag: this.rng() < 0.03 ? this.tagOf(l.object) : 0, owner: this.owner })\n }\n }\n }\n\n private tagOf(object: string): number {\n let tag = this.homeTags.indexOf(object) + 1\n if (tag === 0) tag = this.homeTags.push(object)\n return tag\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Emit, clear, restore, stats, dispose\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n emit(kind: DebrisKind | 'fire' | 'flash' | 'foam', point: Vec3, normal: Vec3, count: number, speed?: number): void {\n this.vfx.burst(kind, point, normal, count, speed ?? DEFAULT_SPEED[kind] ?? 1, kind === 'smoke' ? { color: SMOKE_TONES.grey } : undefined)\n }\n\n explode(point: Vec3, energy: number, radius: number, options?: ExplodeOptions): void {\n this.onExplode({ type: 'explode', object: '', part: '', time: this.time, point, energy, radius }, options)\n }\n\n restore(objectId: string): void {\n const homes = new Set<string>([objectId])\n const self = this.bounds.get(objectId)\n if (self?.isSplit) for (const pv of self.parts.values()) homes.add(pv.home)\n for (const home of homes) this.restoreHome(home)\n for (const [key, a] of [...this.active]) if (homes.has(a.object)) this.active.delete(key)\n for (const [key, f] of [...this.fires]) if (homes.has(f.object)) this.stopFire(key)\n for (let i = this.leaks.length - 1; i >= 0; i--) if (homes.has(this.leaks[i].object)) this.leaks.splice(i, 1)\n for (const home of homes) {\n this.fragments.removeHome(home)\n this.ground.removeHome(home)\n this.cages.removeObject(home)\n }\n }\n\n private restoreHome(home: string): void {\n const homeBound = this.bounds.get(home)\n for (const b of [...this.bounds.values()]) {\n for (const [pid, pv] of [...b.parts]) {\n if (pv.home !== home) continue\n this.visuals.restorePart(pv)\n this.tagPart(pv, home)\n if (b !== homeBound && homeBound) {\n b.parts.delete(pid)\n homeBound.parts.set(pid, pv)\n }\n }\n if (b.isSplit && b.parts.size === 0) {\n this.scene.remove(b.root)\n this.pieceSys.remove(b.id)\n this.bounds.delete(b.id)\n }\n }\n }\n\n clear(): void {\n this.queue.length = 0\n this.active.clear()\n for (const key of [...this.fires.keys()]) this.stopFire(key)\n this.leaks.length = 0\n for (const id of [...this.bounds.keys()]) if (this.bounds.has(id)) this.restore(id)\n // anything left of a split object whose home is gone\n for (const b of [...this.bounds.values()]) {\n if (b.isSplit) {\n for (const pv of b.parts.values()) this.visuals.restorePart(pv)\n this.scene.remove(b.root)\n this.pieceSys.remove(b.id)\n this.bounds.delete(b.id)\n }\n }\n this.fragments.clear()\n this.ground.clear()\n this.cages.clear()\n this.primedBurning.clear()\n this.vfx.sprites().clear()\n this.ownVfx?.world.clear()\n }\n\n stats(): { fragments: number; particles: number; pieces: number; decals: number } {\n return { fragments: this.fragments.count, particles: this.vfx.sprites().live + this.ownedVfxParticles(), pieces: this.pieceSys.list.length, decals: this.visuals.decalCount + this.ground.count }\n }\n\n private ownedVfxParticles(): number {\n if (!this.ownVfx) return 0\n const { puffs, sparks, glows, chunks } = this.vfx.stats()\n return puffs + sparks + glows + chunks\n }\n\n // The last warm-up keeps its materials until the next one: a material that does not use lights keeps the program of the lights it was first drawn with, so each warm-up needs materials of its own.\n private warmProbes: { readonly group: THREE_NS.Group; readonly geometry: THREE_NS.BufferGeometry; readonly materials: THREE_NS.Material[] } | undefined\n\n warmUpProbes(): WarmUpProbes {\n this.releaseWarmProbes()\n const { kit } = this.visuals\n const T = this.THREE\n const geometry = new T.BufferGeometry()\n geometry.setAttribute('position', new T.BufferAttribute(new Float32Array(6), 3))\n const materials = [kit.discMaterial().clone(), kit.patchMaterial(0x808080).clone(), kit.lineMaterial(0x000000).clone()]\n const group = new T.Group()\n group.add(new T.Mesh(kit.discGeometry(), materials[0]), new T.Mesh(kit.discGeometry(), materials[1]), new T.LineSegments(geometry, materials[2] as THREE_NS.LineBasicMaterial))\n for (const probe of group.children) probe.frustumCulled = false\n this.warmProbes = { group, geometry, materials }\n return { group, dispose: () => {} }\n }\n\n private releaseWarmProbes(): void {\n if (!this.warmProbes) return\n this.warmProbes.geometry.dispose()\n for (const material of this.warmProbes.materials) material.dispose()\n this.warmProbes = undefined\n }\n\n rebarCount(): number {\n return this.cages.count\n }\n\n dispose(): void {\n this.releaseWarmProbes()\n if (this.disposed) return\n this.unsubscribe()\n this.clear()\n for (const id of [...this.bounds.keys()]) this.unbind(id)\n this.fragments.dispose()\n this.ground.dispose()\n this.cages.dispose()\n this.stopLanding()\n this.visuals.dispose()\n this.ownVfx?.dispose()\n this.disposed = true\n }\n}\n","import type { Vec3 } from '@adatechnology/game-destruction'\n\n/** Small deterministic PRNG (mulberry32): returns a function giving numbers in [0, 1). */\nexport function createRng(seed: number): () => number {\n let a = seed >>> 0\n return () => {\n a = (a + 0x6d2b79f5) >>> 0\n let t = a\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\n/** Hash of a few numbers into an unsigned 32-bit seed. */\nexport function hashNumbers(...values: number[]): number {\n let h = 2166136261\n for (const v of values) {\n const n = Math.round(v * 1000) | 0\n h = Math.imul(h ^ n, 16777619)\n h ^= h >>> 13\n }\n return h >>> 0\n}\n\nexport function hashString(s: string): number {\n let h = 2166136261\n for (let i = 0; i < s.length; i++) h = Math.imul(h ^ s.charCodeAt(i), 16777619)\n return h >>> 0\n}\n\nexport const clamp = (v: number, lo: number, hi: number): number => (v < lo ? lo : v > hi ? hi : v)\nexport const lerp = (a: number, b: number, t: number): number => a + (b - a) * t\n\nexport function vec3Length(v: Vec3): number {\n return Math.hypot(v[0], v[1], v[2])\n}\n\nexport function normalize3(v: Vec3): Vec3 {\n const l = Math.hypot(v[0], v[1], v[2])\n return l > 1e-9 ? [v[0] / l, v[1] / l, v[2] / l] : [0, 1, 0]\n}\n\n/** `0xRRGGBB` -> `[r, g, b]` in 0..1. */\nexport function hexToRgb(hex: number): [number, number, number] {\n return [((hex >> 16) & 255) / 255, ((hex >> 8) & 255) / 255, (hex & 255) / 255]\n}\n\nexport function mixHex(a: number, b: number, t: number): number {\n const ar = (a >> 16) & 255\n const ag = (a >> 8) & 255\n const ab = a & 255\n const r = Math.round(ar + (((b >> 16) & 255) - ar) * t)\n const g = Math.round(ag + (((b >> 8) & 255) - ag) * t)\n const bl = Math.round(ab + ((b & 255) - ab) * t)\n return (r << 16) | (g << 8) | bl\n}\n","import type * as THREE_NS from 'three'\nimport type { Fragment } from '@adatechnology/game-destruction'\nimport { clamp, createRng, hashString } from './math'\n\ninterface Live {\n mesh: THREE_NS.Mesh\n home: string\n vel: THREE_NS.Vector3\n ang: THREE_NS.Vector3\n half: THREE_NS.Vector3\n baseScale: THREE_NS.Vector3\n still: number\n asleep: boolean\n /** Seconds at rest. */\n rest: number\n /** 1 while alive; counts down to 0 while shrinking away. */\n fade: number\n dying: boolean\n}\n\nexport interface FragmentSystemOptions {\n scene: THREE_NS.Scene\n groundAt: (x: number, z: number) => number\n gravity: number\n max: number\n life: number\n}\n\n/** Light physics for fracture debris: gravity, ground bounce and friction, spin damping, settling flat, sleep, shrink-away and removal. */\nexport class FragmentSystem {\n private readonly list: Live[] = []\n private readonly box: THREE_NS.BoxGeometry\n private shardGeos: THREE_NS.BufferGeometry[] = []\n private readonly materials = new Map<string, THREE_NS.Material>()\n private readonly q: THREE_NS.Quaternion\n private readonly dq: THREE_NS.Quaternion\n private readonly m: THREE_NS.Matrix4\n private readonly v: THREE_NS.Vector3\n private readonly w: THREE_NS.Vector3\n private readonly rng = createRng(0x51ed270b)\n\n constructor(\n private readonly THREE: typeof THREE_NS,\n private readonly o: FragmentSystemOptions,\n ) {\n this.box = new THREE.BoxGeometry(1, 1, 1)\n this.q = new THREE.Quaternion()\n this.dq = new THREE.Quaternion()\n this.m = new THREE.Matrix4()\n this.v = new THREE.Vector3()\n this.w = new THREE.Vector3()\n }\n\n get count(): number {\n return this.list.length\n }\n\n /** Meshes of every live fragment (tests and picking). */\n meshes(): THREE_NS.Mesh[] {\n return this.list.map((f) => f.mesh)\n }\n\n /** One shared material per source material id + colour (+ transparency). */\n materialFor(materialId: string, color: number, transparent: boolean, opacity = 0.5): THREE_NS.Material {\n const key = `${materialId}:${color}:${transparent ? 1 : 0}`\n let m = this.materials.get(key)\n if (!m) {\n m = transparent\n ? new this.THREE.MeshStandardMaterial({ color, roughness: 0.15, metalness: 0.1, transparent: true, opacity, side: this.THREE.DoubleSide, depthWrite: false })\n : new this.THREE.MeshLambertMaterial({ color })\n this.materials.set(key, m)\n }\n return m\n }\n\n private shardGeometry(seed: number): THREE_NS.BufferGeometry {\n const idx = seed % 6\n let g = this.shardGeos[idx]\n if (!g) {\n const r = createRng(1000 + idx)\n const n = 3 + Math.floor(r() * 3) // triangle, quad or pentagon, irregular\n const shape = new this.THREE.Shape()\n const pts: Array<[number, number]> = []\n for (let i = 0; i < n; i++) {\n const a = (i / n) * Math.PI * 2 + (r() - 0.5) * 0.7\n const rad = 0.35 + r() * 0.15\n pts.push([Math.cos(a) * rad, Math.sin(a) * rad])\n }\n shape.moveTo(pts[0][0], pts[0][1])\n for (let i = 1; i < n; i++) shape.lineTo(pts[i][0], pts[i][1])\n shape.closePath()\n g = new this.THREE.ExtrudeGeometry(shape, { depth: 1, bevelEnabled: false })\n g.translate(0, 0, -0.5)\n this.shardGeos[idx] = g\n }\n return g\n }\n\n private markGeometry: THREE_NS.CircleGeometry | null = null\n private markMaterial: THREE_NS.MeshBasicMaterial | null = null\n\n /**\n * Bullet holes that stay on a fragment (`Fragment.marks`): dark discs that are children of its mesh, so they fall, spin and settle with it. The mesh is\n * a unit box scaled to the fragment, so each disc is scaled back; exact for a mark on a face, which is where a bullet hole is.\n */\n addMarks(mesh: THREE_NS.Mesh, f: Fragment): void {\n if (!f.marks?.length) return\n this.markGeometry ??= new this.THREE.CircleGeometry(1, 10)\n this.markMaterial ??= new this.THREE.MeshBasicMaterial({ color: 0x0b0a09, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -4, polygonOffsetUnits: -4 })\n const sc = mesh.scale\n for (const mark of f.marks) {\n const disc = new this.THREE.Mesh(this.markGeometry, this.markMaterial)\n const radius = Math.max(0.004, mark.diameter) * 0.6\n const n = this.v.set(mark.normal[0], mark.normal[1], mark.normal[2]).normalize()\n disc.position.set(mark.point[0] / sc.x + (n.x * 0.002) / sc.x, mark.point[1] / sc.y + (n.y * 0.002) / sc.y, mark.point[2] / sc.z + (n.z * 0.002) / sc.z)\n disc.quaternion.setFromUnitVectors(this.w.set(0, 0, 1), n)\n disc.scale.set(radius / sc.x, radius / sc.y, radius / sc.z)\n mesh.add(disc)\n }\n }\n\n /** Create the mesh of a fragment and start its motion. `maxAllowed` is the live budget. */\n spawn(f: Fragment, material: THREE_NS.Material, home: string, maxAllowed: number): THREE_NS.Mesh {\n const geo = f.shape === 'shard' ? this.shardGeometry(hashString(f.id)) : this.box\n const mesh = new this.THREE.Mesh(geo, material)\n mesh.position.set(f.center[0], f.center[1], f.center[2])\n mesh.quaternion.set(f.rotation[0], f.rotation[1], f.rotation[2], f.rotation[3]).normalize()\n const sz = f.size\n const sc = new this.THREE.Vector3(Math.max(0.005, sz[0]), Math.max(0.005, sz[1]), Math.max(0.003, sz[2]))\n mesh.scale.copy(sc)\n mesh.castShadow = true\n // pure visual debris: a host that picks with a raycast can skip it\n mesh.userData.destructionDebris = true\n this.o.scene.add(mesh)\n const live: Live = {\n mesh,\n home,\n vel: new this.THREE.Vector3(f.velocity[0], f.velocity[1], f.velocity[2]),\n ang: new this.THREE.Vector3(f.angularVelocity[0], f.angularVelocity[1], f.angularVelocity[2]),\n // shards are thin: the contact extent uses the real (small) thickness, the chunk uses half of each side\n half: sc.clone().multiplyScalar(0.5),\n baseScale: sc,\n still: 0,\n asleep: false,\n rest: 0,\n fade: 1,\n dying: false,\n }\n this.list.push(live)\n let alive = this.list.reduce((n, l) => n + (l.dying ? 0 : 1), 0)\n for (let i = 0; i < this.list.length && alive > maxAllowed; i++) {\n if (!this.list[i].dying) {\n this.list[i].dying = true\n alive--\n }\n }\n this.addMarks(mesh, f)\n return mesh\n }\n\n /** Add velocity to every fragment within `radius` of a point (blasts). */\n blast(point: [number, number, number], radius: number, speed: number): void {\n for (const f of this.list) {\n const d = this.v.copy(f.mesh.position).sub(this.w.set(point[0], point[1], point[2]))\n const dist = d.length()\n if (dist > radius || f.dying) continue\n const k = (1 - dist / radius) ** 2 * speed\n d.normalize().multiplyScalar(k)\n d.y += k * 0.4\n f.vel.add(d)\n f.ang.add(this.w.set(this.rng() - 0.5, this.rng() - 0.5, this.rng() - 0.5).multiplyScalar(k))\n f.asleep = false\n f.rest = 0\n }\n }\n\n update(dt: number): void {\n const g = this.o.gravity\n for (let i = this.list.length - 1; i >= 0; i--) {\n const f = this.list[i]\n if (f.dying) {\n f.fade -= dt / 0.6\n if (f.fade <= 0) {\n this.o.scene.remove(f.mesh)\n this.list.splice(i, 1)\n continue\n }\n f.mesh.scale.copy(f.baseScale).multiplyScalar(f.fade)\n }\n if (f.asleep) {\n f.rest += dt\n if (this.o.life > 0 && f.rest > this.o.life) f.dying = true\n continue\n }\n this.step(f, dt, g)\n }\n }\n\n private step(f: Live, dt: number, g: number): void {\n const mesh = f.mesh\n f.vel.y -= g * dt\n mesh.position.addScaledVector(f.vel, dt)\n const w = f.ang.length()\n if (w > 1e-5) {\n this.dq.setFromAxisAngle(this.v.copy(f.ang).multiplyScalar(1 / w), w * dt)\n mesh.quaternion.premultiply(this.dq).normalize()\n }\n // ground contact: lowest point of the oriented box\n this.m.makeRotationFromQuaternion(mesh.quaternion)\n const e = this.m.elements\n const h = f.half\n const sc = f.dying ? f.fade : 1\n const ext = (Math.abs(e[1]) * h.x + Math.abs(e[5]) * h.y + Math.abs(e[9]) * h.z) * sc\n const gy = this.o.groundAt(mesh.position.x, mesh.position.z)\n let contact = false\n if (mesh.position.y - ext < gy) {\n contact = true\n mesh.position.y = gy + ext\n if (f.vel.y < -0.6) {\n f.vel.y = -f.vel.y * 0.25\n f.vel.x *= 0.7\n f.vel.z *= 0.7\n f.ang.multiplyScalar(0.55)\n // a hit on a corner makes it tumble a little\n f.ang.x += (this.rng() - 0.5) * 2\n f.ang.z += (this.rng() - 0.5) * 2\n } else {\n f.vel.y = 0\n const fr = Math.exp(-7 * dt)\n f.vel.x *= fr\n f.vel.z *= fr\n f.ang.multiplyScalar(Math.exp(-6 * dt))\n }\n } else {\n f.ang.multiplyScalar(Math.exp(-0.15 * dt))\n }\n if (contact && f.vel.lengthSq() < 4) this.settle(f, dt)\n const slow = f.vel.lengthSq() < 0.012 && f.ang.lengthSq() < 0.2\n if (contact && slow) {\n f.still += dt\n if (f.still > 0.4) {\n f.asleep = true\n f.vel.set(0, 0, 0)\n f.ang.set(0, 0, 0)\n }\n } else {\n f.still = 0\n }\n }\n\n /** Tip the fragment towards lying on its flattest face. */\n private settle(f: Live, dt: number): void {\n const mesh = f.mesh\n this.m.makeRotationFromQuaternion(mesh.quaternion)\n const e = this.m.elements\n const up = [e[1], e[5], e[9]] // world-y component of each local axis\n const half = [f.half.x, f.half.y, f.half.z]\n let small = 0\n for (let i = 1; i < 3; i++) if (half[i] < half[small]) small = i\n let axis = small\n if (Math.abs(up[small]) < 0.35) {\n axis = 0\n for (let i = 1; i < 3; i++) if (Math.abs(up[i]) > Math.abs(up[axis])) axis = i\n }\n const sign = up[axis] >= 0 ? 1 : -1\n this.v.set(e[axis * 4], e[axis * 4 + 1], e[axis * 4 + 2]).multiplyScalar(sign)\n this.w.set(0, 1, 0)\n this.dq.setFromUnitVectors(this.v, this.w)\n this.q.copy(this.dq).multiply(mesh.quaternion)\n mesh.quaternion.slerp(this.q, clamp(dt * 7, 0, 1))\n }\n\n /** Remove the fragments of one object (after `restore`). */\n removeHome(home: string): void {\n for (let i = this.list.length - 1; i >= 0; i--) {\n if (this.list[i].home === home) {\n this.o.scene.remove(this.list[i].mesh)\n this.list.splice(i, 1)\n }\n }\n }\n\n clear(): void {\n for (const f of this.list) this.o.scene.remove(f.mesh)\n this.list.length = 0\n }\n\n dispose(): void {\n this.clear()\n this.box.dispose()\n this.markGeometry?.dispose()\n this.markMaterial?.dispose()\n for (const g of this.shardGeos) g?.dispose()\n this.shardGeos = []\n for (const m of this.materials.values()) m.dispose()\n this.materials.clear()\n }\n}\n","import type * as THREE_NS from 'three'\nimport { lerp } from './math'\n\ninterface Spot {\n mesh: THREE_NS.Mesh\n kind: 'puddle' | 'ash'\n home: string\n x: number\n z: number\n radius: number\n target: number\n}\n\nconst MAX_RADIUS = 1.2\n\n/** Flat discs on the ground: puddles of melted material and piles of ash. Nearby ones merge; the oldest go when the cap is reached. */\nexport class GroundSpots {\n private readonly spots: Spot[] = []\n private readonly geometry: THREE_NS.CircleGeometry\n private readonly materials = new Map<string, THREE_NS.MeshBasicMaterial>()\n\n constructor(\n private readonly THREE: typeof THREE_NS,\n private readonly scene: THREE_NS.Scene,\n private readonly groundAt: (x: number, z: number) => number,\n private readonly cap: number,\n ) {\n this.geometry = new THREE.CircleGeometry(1, 20)\n this.geometry.rotateX(-Math.PI / 2)\n }\n\n get count(): number {\n return this.spots.length\n }\n\n private material(kind: 'puddle' | 'ash', color: number): THREE_NS.MeshBasicMaterial {\n const key = `${kind}:${color}`\n let m = this.materials.get(key)\n if (!m) {\n m = new this.THREE.MeshBasicMaterial({\n color,\n transparent: true,\n opacity: kind === 'puddle' ? 0.88 : 0.95,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -2,\n polygonOffsetUnits: -2,\n })\n this.materials.set(key, m)\n }\n return m\n }\n\n /** Add (or grow) a spot at (x, z). `radius` is the radius this addition contributes. */\n add(kind: 'puddle' | 'ash', x: number, z: number, radius: number, color: number, home: string): void {\n for (const s of this.spots) {\n if (s.kind !== kind) continue\n const d = Math.hypot(s.x - x, s.z - z)\n if (d < Math.max(s.target, radius) * 0.9) {\n s.target = Math.min(MAX_RADIUS, Math.sqrt(s.target * s.target + radius * radius * 0.5))\n return\n }\n }\n while (this.spots.length >= this.cap) this.remove(this.spots[0])\n const mesh = new this.THREE.Mesh(this.geometry, this.material(kind, color))\n const y = this.groundAt(x, z) + 0.004 + (this.spots.length % 8) * 0.0004\n mesh.position.set(x, y, z)\n mesh.scale.setScalar(0.001)\n mesh.renderOrder = 1\n mesh.userData.destructionDebris = true\n this.scene.add(mesh)\n this.spots.push({ mesh, kind, home, x, z, radius: 0.001, target: Math.min(MAX_RADIUS, radius) })\n }\n\n private remove(s: Spot): void {\n const i = this.spots.indexOf(s)\n if (i >= 0) this.spots.splice(i, 1)\n this.scene.remove(s.mesh)\n }\n\n update(dt: number): void {\n const k = Math.min(1, dt * 3)\n for (const s of this.spots) {\n if (Math.abs(s.radius - s.target) < 1e-4) continue\n s.radius = lerp(s.radius, s.target, k)\n s.mesh.scale.setScalar(s.radius)\n }\n }\n\n /** Remove the spots made for one object (after its `restore`). */\n removeHome(home: string): void {\n for (const s of [...this.spots]) if (s.home === home) this.remove(s)\n }\n\n clear(): void {\n for (const s of [...this.spots]) this.remove(s)\n }\n\n dispose(): void {\n this.clear()\n this.geometry.dispose()\n for (const m of this.materials.values()) m.dispose()\n this.materials.clear()\n }\n}\n","import type * as THREE_NS from 'three'\nimport type { Vec3 } from '@adatechnology/game-destruction'\nimport type { PieceBody } from './internal'\nimport { clamp } from './math'\n\nexport interface PieceSystemOptions {\n groundAt: (x: number, z: number) => number\n gravity: number\n /** A piece hit the ground faster than 3 m/s (throttled per piece). */\n onHardLanding: (piece: PieceBody, point: Vec3, speed: number) => void\n /** Notified when a piece is about to be removed. */\n scene: THREE_NS.Scene\n}\n\nconst SUB_DT = 1 / 120\nconst MU = 0.7\nconst SLEEP_AFTER = 0.5\nconst HARD_LANDING = 3\n/** Contact tolerance in metres: corners this close to the ground count as touching, which keeps the contact set (and a resting box) stable. */\nconst SLOP = 0.002\n/** A resting support narrower than this fraction of the centre-of-mass height is a balancing act, not a rest: the piece topples. */\nconst NARROW = 0.3\n/** Angular acceleration (rad/s^2 per metre of height) that pushes a balancing piece off its edge, toward the side its centre of mass leans to. */\nconst TOPPLE = 3\n\n/**\n * Light rigid-body physics for loose pieces: gravity, the 8 corners of the local box against the ground with an impulse (restitution, friction,\n * angular response), damping, sleeping, and a gentle horizontal separation between pieces. Not a general solver: no piece-vs-scenery contact.\n */\nexport class PieceSystem {\n readonly list: PieceBody[] = []\n private time = 0\n private readonly p: THREE_NS.Vector3\n private readonly q: THREE_NS.Quaternion\n private readonly dq: THREE_NS.Quaternion\n private readonly m: THREE_NS.Matrix4\n private readonly ax: THREE_NS.Vector3\n\n constructor(\n private readonly THREE: typeof THREE_NS,\n private readonly o: PieceSystemOptions,\n ) {\n this.p = new THREE.Vector3()\n this.q = new THREE.Quaternion()\n this.dq = new THREE.Quaternion()\n this.m = new THREE.Matrix4()\n this.ax = new THREE.Vector3()\n }\n\n get(objectId: string): PieceBody | null {\n return this.list.find((b) => b.objectId === objectId) ?? null\n }\n\n create(objectId: string, root: THREE_NS.Object3D, halfExtents: Vec3, localCenter: THREE_NS.Vector3, mass: number, velocity?: Vec3, angular?: Vec3): PieceBody {\n const existing = this.get(objectId)\n if (existing) {\n existing.root = root\n existing.halfExtents = halfExtents\n existing.mass = mass\n this.setCenter(existing, localCenter)\n if (velocity) existing.velocity = [...velocity]\n existing.sleeping = false\n return existing\n }\n const body: PieceBody = {\n objectId,\n root,\n velocity: velocity ? [...velocity] : [0, 0, 0],\n angularVelocity: angular ? [...angular] : [0, 0, 0],\n halfExtents: [Math.max(0.01, halfExtents[0]), Math.max(0.01, halfExtents[1]), Math.max(0.01, halfExtents[2])],\n mass: Math.max(0.05, mass),\n sleeping: false,\n held: false,\n localCenter: [localCenter.x, localCenter.y, localCenter.z],\n centerV: localCenter.clone(),\n still: 0,\n lastHit: -1,\n onGround: false,\n }\n this.list.push(body)\n return body\n }\n\n /** Move the centre of mass (after a part broke off). */\n setCenter(b: PieceBody, c: THREE_NS.Vector3): void {\n b.centerV.copy(c)\n b.localCenter = [c.x, c.y, c.z]\n }\n\n remove(objectId: string): void {\n const i = this.list.findIndex((b) => b.objectId === objectId)\n if (i >= 0) this.list.splice(i, 1)\n }\n\n clear(): void {\n this.list.length = 0\n }\n\n /** World position of the centre of mass. */\n centerOf(b: PieceBody, out: THREE_NS.Vector3): THREE_NS.Vector3 {\n return out.copy(b.centerV).applyQuaternion(b.root.quaternion).add(b.root.position)\n }\n\n impulse(b: PieceBody, impulse: Vec3, point?: Vec3): void {\n const inv = 1 / b.mass\n b.velocity[0] += impulse[0] * inv\n b.velocity[1] += impulse[1] * inv\n b.velocity[2] += impulse[2] * inv\n if (point) {\n const c = this.centerOf(b, this.p)\n const rx = point[0] - c.x\n const ry = point[1] - c.y\n const rz = point[2] - c.z\n // torque = r x J, angular velocity change = I^-1 torque\n const tx = ry * impulse[2] - rz * impulse[1]\n const ty = rz * impulse[0] - rx * impulse[2]\n const tz = rx * impulse[1] - ry * impulse[0]\n const w = this.mulInvInertia(b, tx, ty, tz)\n b.angularVelocity[0] += w[0]\n b.angularVelocity[1] += w[1]\n b.angularVelocity[2] += w[2]\n }\n b.sleeping = false\n b.still = 0\n }\n\n /** I^-1 * (x, y, z) in world space for a box with the body's half extents and mass (needs `this.m` to hold the body's rotation). */\n private mulInvInertia(b: PieceBody, x: number, y: number, z: number): Vec3 {\n this.m.makeRotationFromQuaternion(b.root.quaternion)\n return this.mulInvInertiaWith(b, this.m.elements, x, y, z)\n }\n\n private mulInvInertiaWith(b: PieceBody, e: ArrayLike<number>, x: number, y: number, z: number): Vec3 {\n const [hx, hy, hz] = b.halfExtents\n const k = 3 / b.mass\n const ix = k / (hy * hy + hz * hz)\n const iy = k / (hx * hx + hz * hz)\n const iz = k / (hx * hx + hy * hy)\n // local = R^T v (columns of R are the local axes in world space)\n const lx = (e[0] * x + e[1] * y + e[2] * z) * ix\n const ly = (e[4] * x + e[5] * y + e[6] * z) * iy\n const lz = (e[8] * x + e[9] * y + e[10] * z) * iz\n return [e[0] * lx + e[4] * ly + e[8] * lz, e[1] * lx + e[5] * ly + e[9] * lz, e[2] * lx + e[6] * ly + e[10] * lz]\n }\n\n update(dt: number): void {\n this.time += dt\n for (const b of this.list) {\n if (b.held) {\n b.velocity = [0, 0, 0]\n b.angularVelocity = [0, 0, 0]\n b.sleeping = false\n b.still = 0\n continue\n }\n if (b.sleeping) continue\n this.integrate(b, dt)\n }\n this.separate(dt)\n }\n\n private integrate(b: PieceBody, dt: number): void {\n const c = this.centerOf(b, this.p)\n const pos: Vec3 = [c.x, c.y, c.z]\n const q = this.q.copy(b.root.quaternion)\n const v = b.velocity\n const w = b.angularVelocity\n const [hx, hy, hz] = b.halfExtents\n const invM = 1 / b.mass\n const steps = clamp(Math.ceil(dt / SUB_DT), 1, 8)\n const h = dt / steps\n let landing = 0\n let landPoint: Vec3 = [pos[0], pos[1], pos[2]]\n let contactedLast = false\n let touched = false\n let unstable = false\n\n for (let s = 0; s < steps; s++) {\n v[1] -= this.o.gravity * h\n pos[0] += v[0] * h\n pos[1] += v[1] * h\n pos[2] += v[2] * h\n const wl = Math.hypot(w[0], w[1], w[2])\n if (wl > 1e-6) {\n this.dq.setFromAxisAngle(this.ax.set(w[0] / wl, w[1] / wl, w[2] / wl), wl * h)\n q.premultiply(this.dq).normalize()\n }\n const damp = Math.exp(-0.15 * h)\n w[0] *= damp\n w[1] *= damp\n w[2] *= damp\n\n this.m.makeRotationFromQuaternion(q)\n const e = this.m.elements\n const rs: Vec3[] = []\n let maxPen = 0\n for (let i = 0; i < 8; i++) {\n const sx = i & 1 ? hx : -hx\n const sy = i & 2 ? hy : -hy\n const sz = i & 4 ? hz : -hz\n const r: Vec3 = [e[0] * sx + e[4] * sy + e[8] * sz, e[1] * sx + e[5] * sy + e[9] * sz, e[2] * sx + e[6] * sy + e[10] * sz]\n const gy = this.o.groundAt(pos[0] + r[0], pos[2] + r[2])\n const pen = gy - (pos[1] + r[1])\n if (pen > -SLOP) {\n rs.push(r)\n if (pen > maxPen) maxPen = pen\n }\n }\n contactedLast = rs.length > 0\n if (contactedLast) touched = true\n if (!contactedLast) continue\n pos[1] += Math.max(0, maxPen - SLOP * 0.5)\n let impact = 0\n for (const r of rs) impact = Math.max(impact, -(v[1] + w[2] * r[0] - w[0] * r[2]))\n const restitution = impact > 2 ? 0.25 : 0\n if (impact > landing) {\n landing = impact\n let sx = 0\n let sz = 0\n for (const r of rs) {\n sx += r[0]\n sz += r[2]\n }\n const lx = pos[0] + sx / rs.length\n const lz = pos[2] + sz / rs.length\n landPoint = [lx, this.o.groundAt(lx, lz), lz]\n }\n for (let it = 0; it < 4; it++) {\n for (const r of rs) {\n // contact point velocity\n let vx = v[0] + (w[1] * r[2] - w[2] * r[1])\n let vy = v[1] + (w[2] * r[0] - w[0] * r[2])\n let vz = v[2] + (w[0] * r[1] - w[1] * r[0])\n const vn = vy\n if (vn >= 0) continue\n // normal impulse (n = +y): r x n = (-rz, 0, rx)\n const a = this.mulInvInertiaWith(b, e, -r[2], 0, r[0])\n const denom = invM + (a[2] * r[0] - a[0] * r[2])\n const j = (-(1 + (it === 0 ? restitution : 0)) * vn) / denom\n v[1] += j * invM\n const dw = this.mulInvInertiaWith(b, e, -r[2] * j, 0, r[0] * j)\n w[0] += dw[0]\n w[1] += dw[1]\n w[2] += dw[2]\n // friction in the contact plane\n vx = v[0] + (w[1] * r[2] - w[2] * r[1])\n vy = v[1] + (w[2] * r[0] - w[0] * r[2])\n vz = v[2] + (w[0] * r[1] - w[1] * r[0])\n const vt = Math.hypot(vx, vz)\n if (vt > 1e-5) {\n const tx = vx / vt\n const tz = vz / vt\n // r x t with t = (tx, 0, tz) = (0*tz - rz*0 ... ) -> (ry*tz, rz*tx - rx*tz, -ry*tx)\n const rx = r[1] * tz\n const ry = r[2] * tx - r[0] * tz\n const rz = -r[1] * tx\n const at = this.mulInvInertiaWith(b, e, rx, ry, rz)\n const cx = at[1] * r[2] - at[2] * r[1]\n const cz = at[0] * r[1] - at[1] * r[0]\n const denomT = invM + cx * tx + cz * tz\n const jt = Math.min(vt / denomT, MU * j)\n v[0] -= tx * jt * invM\n v[2] -= tz * jt * invM\n const dwt = this.mulInvInertiaWith(b, e, rx * jt, ry * jt, rz * jt)\n w[0] -= dwt[0]\n w[1] -= dwt[1]\n w[2] -= dwt[2]\n }\n }\n }\n // Support check. The corner contacts above are relative to the centre of mass, so they already give a torque when the centre of mass is\n // outside the support. What they cannot do is end a balancing act: a tall thin piece on its edge (or a single corner) is in equilibrium\n // with the centre of mass above a very small support, so it must not rest there. It gets a gentle topple push toward the side it leans\n // to (or toward the wider side when it leans nowhere), and it may not sleep.\n let x0 = Infinity, x1 = -Infinity, z0 = Infinity, z1 = -Infinity, low = 0\n for (const r of rs) {\n x0 = Math.min(x0, r[0]); x1 = Math.max(x1, r[0])\n z0 = Math.min(z0, r[2]); z1 = Math.max(z1, r[2])\n low = Math.min(low, r[1])\n }\n const height = -low\n const wx = x1 - x0\n const wz = z1 - z0\n unstable = Math.min(wx, wz) < NARROW * height || x0 > 0 || x1 < 0 || z0 > 0 || z1 < 0\n if (unstable) {\n // the support centre relative to the centre of mass: the piece falls away from it (toward +axis when it is centred)\n const dirX = x0 + x1 > 0 ? -1 : 1\n const dirZ = z0 + z1 > 0 ? -1 : 1\n const k = TOPPLE * Math.min(height, 1) * h\n // rotating about -z moves the top toward +x; rotating about +x moves it toward +z\n if (wx <= wz) w[2] -= dirX * k\n else w[0] += dirZ * k\n }\n // rolling / spinning resistance while touching the ground\n const rd = Math.exp((rs.length >= 3 ? -3 : -1.5) * h)\n w[0] *= rd\n w[1] *= rd\n w[2] *= rd\n const fd = Math.exp(-0.3 * h)\n v[0] *= fd\n v[2] *= fd\n }\n\n // write back\n b.root.quaternion.copy(q)\n const off = this.ax.copy(b.centerV).applyQuaternion(q)\n b.root.position.set(pos[0] - off.x, pos[1] - off.y, pos[2] - off.z)\n b.root.updateMatrixWorld(true)\n b.onGround = contactedLast\n\n if (landing > HARD_LANDING && this.time - b.lastHit > 0.15) {\n b.lastHit = this.time\n this.o.onHardLanding(b, landPoint, landing)\n }\n\n const still = touched && !unstable && Math.hypot(v[0], v[1], v[2]) < 0.12 && Math.hypot(w[0], w[1], w[2]) < 0.45\n if (still) {\n b.still += dt\n if (b.still >= SLEEP_AFTER) {\n b.sleeping = true\n v[0] = v[1] = v[2] = 0\n w[0] = w[1] = w[2] = 0\n }\n } else {\n b.still = 0\n }\n }\n\n /** Push overlapping pieces apart (horizontal bounding circles), gently, so they do not interpenetrate forever. */\n private separate(dt: number): void {\n const n = this.list.length\n if (n < 2) return\n const maxMove = 1.5 * dt\n const ca = new this.THREE.Vector3()\n const cb = new this.THREE.Vector3()\n for (let i = 0; i < n; i++) {\n const a = this.list[i]\n for (let j = i + 1; j < n; j++) {\n const b = this.list[j]\n if (a.held && b.held) continue\n if (a.sleeping && b.sleeping) continue\n const ra = Math.hypot(a.halfExtents[0], a.halfExtents[1], a.halfExtents[2])\n const rb = Math.hypot(b.halfExtents[0], b.halfExtents[1], b.halfExtents[2])\n this.centerOf(a, ca)\n this.centerOf(b, cb)\n if (Math.abs(ca.y - cb.y) > ra + rb) continue\n const rh = (Math.max(a.halfExtents[0], a.halfExtents[2]) + Math.max(b.halfExtents[0], b.halfExtents[2])) * 0.8\n let dx = cb.x - ca.x\n let dz = cb.z - ca.z\n let d = Math.hypot(dx, dz)\n if (d >= rh) continue\n if (d < 1e-5) {\n dx = 1\n dz = 0\n d = 1\n }\n const push = Math.min(maxMove, (rh - d) * 0.5)\n const wa = a.held ? 0 : b.held ? 1 : b.mass / (a.mass + b.mass)\n const wb = b.held ? 0 : a.held ? 1 : a.mass / (a.mass + b.mass)\n const ux = dx / (d || 1)\n const uz = dz / (d || 1)\n if (!a.held) {\n a.root.position.x -= ux * push * 2 * wa\n a.root.position.z -= uz * push * 2 * wa\n a.sleeping = false\n }\n if (!b.held) {\n b.root.position.x += ux * push * 2 * wb\n b.root.position.z += uz * push * 2 * wb\n b.sleeping = false\n }\n }\n }\n }\n}\n","import type * as THREE_NS from 'three'\nimport type { Vec3 } from '@adatechnology/game-destruction'\n\n/** Bare rebar of reinforced parts: one instanced cylinder mesh per part, replaced whenever the part exposes more (or less) of its cage. */\nexport class RebarCages {\n private readonly cages = new Map<string, THREE_NS.InstancedMesh>()\n private readonly geometry: THREE_NS.CylinderGeometry\n private readonly material: THREE_NS.MeshStandardMaterial\n private readonly up: THREE_NS.Vector3\n private readonly dir: THREE_NS.Vector3\n private readonly mid: THREE_NS.Vector3\n private readonly q: THREE_NS.Quaternion\n private readonly scale: THREE_NS.Vector3\n private readonly m: THREE_NS.Matrix4\n\n constructor(\n private readonly THREE: typeof THREE_NS,\n private readonly scene: THREE_NS.Scene,\n radius = 0.004,\n ) {\n this.geometry = new THREE.CylinderGeometry(radius, radius, 1, 6)\n this.material = new THREE.MeshStandardMaterial({ color: 0x74665c, roughness: 0.55, metalness: 0.6 })\n this.up = new THREE.Vector3(0, 1, 0)\n this.dir = new THREE.Vector3()\n this.mid = new THREE.Vector3()\n this.q = new THREE.Quaternion()\n this.scale = new THREE.Vector3()\n this.m = new THREE.Matrix4()\n }\n\n /** Bars drawn now, over every part. */\n get count(): number {\n let n = 0\n for (const mesh of this.cages.values()) n += mesh.count\n return n\n }\n\n /** Meshes of the live cages (tests and picking). */\n meshes(): THREE_NS.InstancedMesh[] {\n return [...this.cages.values()]\n }\n\n /** Draw `bars` (world space) as the cage of `key`; an empty list removes it. */\n set(key: string, bars: ReadonlyArray<readonly [Vec3, Vec3]>): void {\n this.remove(key)\n if (bars.length === 0) return\n const mesh = new this.THREE.InstancedMesh(this.geometry, this.material, bars.length)\n bars.forEach(([a, b], i) => {\n this.dir.set(b[0] - a[0], b[1] - a[1], b[2] - a[2])\n const length = this.dir.length()\n this.mid.set((a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2)\n this.q.setFromUnitVectors(this.up, length > 1e-9 ? this.dir.divideScalar(length) : this.up)\n this.m.compose(this.mid, this.q, this.scale.set(1, Math.max(length, 1e-4), 1))\n mesh.setMatrixAt(i, this.m)\n })\n mesh.instanceMatrix.needsUpdate = true\n mesh.castShadow = true\n this.scene.add(mesh)\n this.cages.set(key, mesh)\n }\n\n remove(key: string): void {\n const mesh = this.cages.get(key)\n if (!mesh) return\n this.scene.remove(mesh)\n mesh.dispose()\n this.cages.delete(key)\n }\n\n /** Remove the cages of every part of `object` (keys are `object|part`). */\n removeObject(object: string): void {\n for (const key of [...this.cages.keys()]) if (key.startsWith(`${object}|`)) this.remove(key)\n }\n\n clear(): void {\n for (const key of [...this.cages.keys()]) this.remove(key)\n }\n\n dispose(): void {\n this.clear()\n this.geometry.dispose()\n this.material.dispose()\n }\n}\n","import type * as THREE_NS from 'three'\nimport { guessMaterial, inferJoints, MATERIALS, partMass } from '@adatechnology/game-destruction'\nimport type { JointKind, JointSpec, MaterialId, PartSpec } from '@adatechnology/game-destruction'\nimport type { Mesh, Object3D, SpecFromObjectOptions, SpecFromObjectResult, ThreeNamespace } from './types'\n\ninterface Entry {\n key: string\n meshes: Mesh[]\n box: THREE_NS.Box3\n material: MaterialId\n explicitId: string | null\n fill?: number\n hollow: boolean\n /** `userData.destructionSkin`: a layer drawn on a part (a label, a coat), never a part of its own. */\n skin: boolean\n tags?: string[]\n /** `userData.destructionContains`: the fluid the part holds (a hole in it makes it leak). */\n contains?: { fluid: string; liters: number }\n /** Part id wished by the host (`userData.destructionPart`). */\n fixedId: boolean\n name: string\n /** `parent` / `kind` of an object-valued `destructionPart`: the part is attached to `parent` by a joint of that kind. */\n parent?: string\n jointKind?: JointKind\n}\n\n/** What `userData.destructionPart` says: a string (the part id) or an object `{ id, material?, parent?, kind? }`. */\nexport interface PartHint {\n id: string\n material?: string\n parent?: string\n kind?: string\n}\n\n/** Read `userData.destructionContains` (`{ fluid, liters }`); undefined when it holds nothing. */\nfunction containsOf(value: unknown): { fluid: string; liters: number } | undefined {\n if (!value || typeof value !== 'object') return undefined\n const v = value as Record<string, unknown>\n return typeof v.fluid === 'string' && typeof v.liters === 'number' && v.liters > 0 ? { fluid: v.fluid, liters: v.liters } : undefined\n}\n\n/** Read `userData.destructionPart` (string or object with an `id`); null when it names no part. */\nexport function partHintOf(value: unknown): PartHint | null {\n if (typeof value === 'string') return value ? { id: value } : null\n if (!value || typeof value !== 'object') return null\n const v = value as Record<string, unknown>\n if (typeof v.id !== 'string' || !v.id) return null\n const str = (x: unknown): string | undefined => (typeof x === 'string' && x ? x : undefined)\n return { id: v.id, material: str(v.material), parent: str(v.parent), kind: str(v.kind) }\n}\n\nconst METAL = /steel|iron|metal|alumin|copper|brass|bronze|tin|titan|chrome|zinc|lead/i\n\nfunction sanitizeId(name: string): string {\n let id = name\n .trim()\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n if (id && /^[0-9]/.test(id)) id = `p_${id}`\n return id\n}\n\nfunction isMesh(o: Object3D): o is Mesh {\n return (o as Mesh).isMesh === true\n}\n\nfunction sizeOf(box: THREE_NS.Box3): [number, number, number] {\n return [box.max.x - box.min.x, box.max.y - box.min.y, box.max.z - box.min.z]\n}\n\n/** Inverse of the root's world pose without its scale: world space to the metric frame the spec and the world's `setTransform` use. */\nexport function specFrameInverse(THREE: ThreeNamespace, root: Object3D): THREE_NS.Matrix4 {\n root.updateMatrixWorld(true)\n const position = new THREE.Vector3()\n const quaternion = new THREE.Quaternion()\n root.matrixWorld.decompose(position, quaternion, new THREE.Vector3())\n return new THREE.Matrix4().compose(position, quaternion, new THREE.Vector3(1, 1, 1)).invert()\n}\n\n/**\n * Build a `DestructibleSpec` from a three.js object: one part per mesh (meshes sharing `userData.destructionPart` become one part), each an\n * axis-aligned box in metres in the root's frame (its position and rotation removed, its world scale kept; rotation omitted), with the material taken from `options.materialOf`, `userData.destructionMaterial`\n * or a guess from the names. Tiny meshes are merged into the part they overlap most; joints are inferred from touching parts.\n *\n * `userData.destructionContains` (`{ fluid, liters }`) makes the part a container: a hole through it leaks. `root.userData.destructionMass` (kg) fixes the total mass, split between the parts in proportion to their volume, density and fill.\n * A mesh with `userData.destructionSkin` (a label, a coat) joins the part it overlaps most instead of becoming a part: it stays drawn and bound to that part (decals, dents) but never breaks off.\n * Meshes that are invisible or have `userData.destructionIgnore` (or sit under such an object) are skipped. The result also tells which meshes\n * became which part, ready to be passed to `bind`.\n */\nexport function specFromObject3D(THREE: ThreeNamespace, root: Object3D, options: SpecFromObjectOptions = {}): SpecFromObjectResult {\n const fallback = options.fallback ?? 'plastic'\n const minSize = options.minSize ?? 0.015\n const inv = specFrameInverse(THREE, root)\n\n // 1. collect meshes -> entries (grouped by an explicit part name)\n const entries: Entry[] = []\n const byKey = new Map<string, Entry>()\n const visit = (o: Object3D): void => {\n if (!o.visible || o.userData?.destructionIgnore) return\n if (isMesh(o) && o.geometry) {\n const geom = o.geometry\n if (!geom.boundingBox) geom.computeBoundingBox()\n if (geom.boundingBox && !geom.boundingBox.isEmpty()) {\n const box = geom.boundingBox.clone().applyMatrix4(new THREE.Matrix4().multiplyMatrices(inv, o.matrixWorld))\n const mats = Array.isArray(o.material) ? o.material : [o.material]\n const matName = mats[0]?.name ?? ''\n const ud = o.userData ?? {}\n const hint = partHintOf(ud.destructionPart)\n const material =\n options.materialOf?.(o) ??\n (typeof ud.destructionMaterial === 'string' ? (ud.destructionMaterial as string) : undefined) ??\n hint?.material ??\n guessMaterial(`${o.name} ${matName} ${typeof ud.material === 'string' ? ud.material : ''}`) ??\n fallback\n const explicit = hint?.id ?? null\n const hollow = ud.hollow === true || /hollow/i.test(o.name)\n const skin = ud.destructionSkin === true\n const fill = options.fillOf?.(o, material)\n const tags = Array.isArray(ud.destructionTags) ? (ud.destructionTags as string[]) : undefined\n const contains = containsOf(ud.destructionContains)\n const existing = explicit ? byKey.get(explicit) : undefined\n if (existing) {\n const before = sizeOf(existing.box)\n const bv = before[0] * before[1] * before[2]\n const ns = sizeOf(box)\n existing.box.union(box)\n existing.meshes.push(o)\n if (ns[0] * ns[1] * ns[2] > bv) existing.material = material\n existing.hollow = existing.hollow || hollow\n existing.skin = existing.skin && skin\n if (fill !== undefined) existing.fill = fill\n if (contains) existing.contains = contains\n } else {\n const e: Entry = { key: explicit ?? `m${entries.length}`, meshes: [o], box, material, explicitId: explicit, fill, hollow, skin, tags, fixedId: !!explicit, ...(contains ? { contains } : {}), name: o.name, parent: hint?.parent, jointKind: hint?.kind as JointKind | undefined }\n entries.push(e)\n if (explicit) byKey.set(explicit, e)\n }\n }\n }\n for (const c of o.children) visit(c)\n }\n visit(root)\n\n // 2. merge tiny meshes and skins into the touching part they overlap most\n const eps = 0.005\n const overlapVolume = (a: THREE_NS.Box3, b: THREE_NS.Box3): number => {\n const x = Math.min(a.max.x, b.max.x) - Math.max(a.min.x, b.min.x) + eps\n const y = Math.min(a.max.y, b.max.y) - Math.max(a.min.y, b.min.y) + eps\n const z = Math.min(a.max.z, b.max.z) - Math.max(a.min.z, b.min.z) + eps\n return x > 0 && y > 0 && z > 0 ? x * y * z : 0\n }\n const largest = (e: Entry) => Math.max(...sizeOf(e.box))\n const kept: Entry[] = []\n const tiny: Entry[] = []\n for (const e of entries) (e.skin || (!e.fixedId && largest(e) < minSize) ? tiny : kept).push(e)\n for (const t of tiny) {\n let best: Entry | null = null\n let bestV = 0\n for (const k of kept) {\n const v = overlapVolume(t.box, k.box)\n if (v > bestV) {\n bestV = v\n best = k\n }\n }\n if (!best) {\n // not touching anything: join the nearest part within a small distance\n let bd = 0.05\n for (const k of kept) {\n const d = k.box.distanceToPoint(t.box.getCenter(new THREE.Vector3()))\n if (d < bd) {\n bd = d\n best = k\n }\n }\n }\n if (best) {\n best.meshes.push(...t.meshes) // the box stays: a tiny mesh sits inside or on the surface of its part\n } else {\n kept.push(t) // isolated crumb: keep it as its own part\n }\n }\n\n // 3. ids, parts\n const used = new Set<string>()\n const parts: PartSpec[] = []\n const meshesOf: Record<string, Object3D[]> = {}\n let counter = 0\n for (const e of kept) {\n counter++\n let base = (e.explicitId ? sanitizeId(e.explicitId) : '') || sanitizeId(e.name) || `part_${counter}`\n let id = base\n for (let n = 2; used.has(id); n++) id = `${base}_${n}`\n used.add(id)\n base = id\n const size = sizeOf(e.box)\n const center = e.box.getCenter(new THREE.Vector3())\n const part: PartSpec = {\n id,\n material: e.material,\n shape: { kind: 'box', size: [Math.max(size[0], 0.002), Math.max(size[1], 0.002), Math.max(size[2], 0.002)] },\n position: [center.x, center.y, center.z],\n }\n const minSide = Math.min(...size)\n if (e.fill !== undefined) part.fill = e.fill\n else if (e.hollow) part.fill = 0.05\n if (minSide < 0.01 && METAL.test(e.material)) {\n part.fill = e.fill ?? 1\n part.thickness = Math.max(minSide, 0.0005)\n }\n if (e.tags) part.tags = [...e.tags]\n if (e.contains) part.contains = { ...e.contains }\n const ao = options.anchorBelow ?? -1\n if (ao >= 0 && e.box.min.y <= ao) part.anchored = true\n parts.push(part)\n meshesOf[id] = e.meshes\n }\n\n const knownMass = root.userData?.destructionMass\n if (typeof knownMass === 'number' && knownMass > 0) {\n const shares = parts.map((p) => {\n const material = MATERIALS.find((m) => m.id === p.material)\n return material ? partMass(p, material) : 0\n })\n const total = shares.reduce((a, b) => a + b, 0)\n if (total > 0) parts.forEach((p, i) => (p.mass = (knownMass * shares[i]) / total))\n }\n\n const spec: SpecFromObjectResult['spec'] = { parts }\n if (options.name !== undefined) spec.name = options.name\n else if (root.name) spec.name = root.name\n if (options.tags) spec.tags = [...options.tags]\n spec.joints = options.joints === false ? [] : inferJoints(parts)\n // explicit attachments from `destructionPart: { parent, kind }` win over the inferred joint between the same two parts\n if (options.joints !== false) {\n const finalId = new Map<Entry, string>()\n kept.forEach((e, i) => finalId.set(e, parts[i].id))\n const idOf = new Map<string, string>()\n for (const e of kept) if (e.explicitId) idOf.set(e.explicitId, finalId.get(e)!)\n const joints: JointSpec[] = spec.joints\n for (const e of kept) {\n if (!e.parent) continue\n const id = finalId.get(e)!\n const parent = idOf.get(e.parent) ?? (used.has(sanitizeId(e.parent)) ? sanitizeId(e.parent) : null)\n if (!parent || parent === id) continue\n const at = joints.findIndex((j) => (j.a === parent && j.b === id) || (j.a === id && j.b === parent))\n const kind = e.jointKind ?? (at >= 0 ? joints[at].kind : 'resting')\n const joint: JointSpec = { id: `${parent}~${id}`, a: parent, b: id, kind }\n if (at >= 0) joints[at] = joint\n else joints.push(joint)\n }\n }\n return { spec, parts: meshesOf }\n}\n","import { mixHex } from './math'\n\n/** Blackbody-ish stops: [temperature °C, colour]. Luminance grows with the temperature. */\nconst STOPS: Array<[number, number]> = [\n [450, 0x000000],\n [500, 0x2a0400],\n [650, 0x8a1500],\n [800, 0xd84a08],\n [950, 0xff8c14],\n [1100, 0xffc23a],\n [1250, 0xffe8a0],\n [1400, 0xffffff],\n]\n\n/**\n * Glow colour of a hot surface as `0xRRGGBB`: black (no glow) below about 450 °C, dark red around 500, orange around 800, yellow around 1100 and\n * white from 1400 °C. Brightness never decreases as the temperature rises. Use it as an emissive colour.\n */\nexport function heatColor(temperatureC: number): number {\n if (!(temperatureC > STOPS[0][0])) return 0\n const last = STOPS[STOPS.length - 1]\n if (temperatureC >= last[0]) return last[1]\n for (let i = 1; i < STOPS.length; i++) {\n const [t1, c1] = STOPS[i]\n if (temperatureC <= t1) {\n const [t0, c0] = STOPS[i - 1]\n return mixHex(c0, c1, (temperatureC - t0) / (t1 - t0))\n }\n }\n return last[1]\n}\n","import type * as THREE_NS from 'three'\n\n/** A shell mesh with its vertex positions before and after a dent, both in its own local space. */\nexport type ShellSnapshot = {\n readonly mesh: THREE_NS.Mesh\n readonly before: ArrayLike<number>\n readonly after: ArrayLike<number>\n}\n\n/**\n * How far the surface of the shells moved where `worldPoint` (a vertex of a skin: a label, a coat) lies on it, as a world vector: the displacement of the\n * nearest shell triangle, interpolated by barycentric weights. A skin that takes it moves with the shell, whatever the two meshes' vertex grids are.\n * Returns the distance (world metres) from the point to that triangle, how high above the shell the skin lies.\n */\nexport function shellDisplacementAt(THREE: typeof THREE_NS, worldPoint: THREE_NS.Vector3, shells: readonly ShellSnapshot[], out: THREE_NS.Vector3): number {\n const triangle = new THREE.Triangle()\n const corners = [new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3()] as const\n const local = new THREE.Vector3()\n const closest = new THREE.Vector3()\n const weights = new THREE.Vector3()\n const moved = new THREE.Vector3()\n let nearest = Infinity\n out.set(0, 0, 0)\n let nearestScale = 1\n for (const shell of shells) {\n shell.mesh.updateWorldMatrix(true, false)\n shell.mesh.worldToLocal(local.copy(worldPoint))\n const index = shell.mesh.geometry.index\n const triangles = index ? index.count / 3 : shell.before.length / 9\n for (let t = 0; t < triangles; t++) {\n const ids = [0, 1, 2].map((corner) => (index ? index.getX(t * 3 + corner) : t * 3 + corner))\n ids.forEach((id, corner) => corners[corner]!.set(shell.before[id * 3]!, shell.before[id * 3 + 1]!, shell.before[id * 3 + 2]!))\n triangle.set(corners[0], corners[1], corners[2])\n triangle.closestPointToPoint(local, closest)\n const distance = closest.distanceToSquared(local)\n if (distance >= nearest) continue\n nearest = distance\n nearestScale = shell.mesh.matrixWorld.getMaxScaleOnAxis() || 1\n triangle.getBarycoord(closest, weights)\n moved.set(0, 0, 0)\n ids.forEach((id, corner) => {\n const weight = corner === 0 ? weights.x : corner === 1 ? weights.y : weights.z\n moved.x += weight * (shell.after[id * 3]! - shell.before[id * 3]!)\n moved.y += weight * (shell.after[id * 3 + 1]! - shell.before[id * 3 + 1]!)\n moved.z += weight * (shell.after[id * 3 + 2]! - shell.before[id * 3 + 2]!)\n })\n out.copy(moved).transformDirection(shell.mesh.matrixWorld)\n out.multiplyScalar(moved.length() * (shell.mesh.matrixWorld.getMaxScaleOnAxis() || 1))\n }\n }\n return Math.sqrt(nearest) * nearestScale\n}\n","import type * as THREE_NS from 'three'\nimport type { Dent } from '@adatechnology/game-destruction'\nimport { heatColor } from './heat'\nimport type { Decal, HostVis, MeshVis, PartVis } from './internal'\nimport { clamp, createRng, lerp } from './math'\nimport { shellDisplacementAt, type ShellSnapshot } from './skin-dent'\n\ntype Mesh = THREE_NS.Mesh\n\nconst POS_ATTR = 'position'\n\nfunction positionAttr(geo: THREE_NS.BufferGeometry): THREE_NS.BufferAttribute | null {\n const a = geo.getAttribute(POS_ATTR) as THREE_NS.BufferAttribute | THREE_NS.InterleavedBufferAttribute | undefined\n return a && !(a as THREE_NS.InterleavedBufferAttribute).isInterleavedBufferAttribute ? (a as THREE_NS.BufferAttribute) : null\n}\n\nfunction materialsOf(m: THREE_NS.Material | THREE_NS.Material[]): THREE_NS.Material[] {\n return Array.isArray(m) ? m : [m]\n}\n\nfunction colorOf(m: THREE_NS.Material): THREE_NS.Color | null {\n const c = (m as THREE_NS.MeshStandardMaterial).color\n return c && (c as THREE_NS.Color).isColor ? c : null\n}\n\n/** Shared resources for decals (one geometry, a few materials) created lazily and disposed together. */\nexport class DecalKit {\n private disc: THREE_NS.CircleGeometry | null = null\n private discMat: THREE_NS.MeshBasicMaterial | null = null\n private lineMats = new Map<number, THREE_NS.LineBasicMaterial>()\n private patchMats = new Map<number, THREE_NS.MeshBasicMaterial>()\n constructor(private readonly THREE: typeof THREE_NS) {}\n\n discGeometry(): THREE_NS.CircleGeometry {\n return (this.disc ??= new this.THREE.CircleGeometry(1, 14))\n }\n\n discMaterial(): THREE_NS.MeshBasicMaterial {\n return (this.discMat ??= new this.THREE.MeshBasicMaterial({\n color: 0x050505,\n transparent: true,\n opacity: 0.92,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -4,\n polygonOffsetUnits: -4,\n }))\n }\n\n /** Opaque patch in the colour of what shows under a spalled coat. */\n patchMaterial(color: number): THREE_NS.MeshBasicMaterial {\n let m = this.patchMats.get(color)\n if (!m) {\n m = new this.THREE.MeshBasicMaterial({ color, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -3, polygonOffsetUnits: -3 })\n this.patchMats.set(color, m)\n }\n return m\n }\n\n lineMaterial(color: number): THREE_NS.LineBasicMaterial {\n let m = this.lineMats.get(color)\n if (!m) {\n m = new this.THREE.LineBasicMaterial({ color, transparent: true, opacity: 0.9, depthWrite: false })\n this.lineMats.set(color, m)\n }\n return m\n }\n\n dispose(): void {\n this.disc?.dispose()\n this.discMat?.dispose()\n for (const m of this.lineMats.values()) m.dispose()\n for (const m of this.patchMats.values()) m.dispose()\n this.patchMats.clear()\n this.disc = null\n this.discMat = null\n this.lineMats.clear()\n }\n}\n\nconst tmpV = (THREE: typeof THREE_NS) => new THREE.Vector3()\n\n/** Mesh-level visual changes: copy-on-write geometry and materials, dents, decals, char, glow, melt, hiding, restoring. */\n/** A dent reaches at least this many vertices of a mesh: fewer and the mesh cannot show its curve (it would be invisible or a sharp spike). */\nconst MIN_DENT_VERTICES = 10\n/** The reach of a dent that had to widen is this many times the distance to the farthest of those vertices, so they all get a falloff above zero. */\nconst WIDEN_MARGIN = 1.1\n/** A skin follows its shell this share of the way in: the two meshes triangulate the dent differently, and a skin left a bit outside never lets the shell through. */\nconst SKIN_FOLLOW = 0.85\n/** And stays this many metres outside, so the thin gap of a label (a millimetre) survives the two meshes triangulating the rim differently. */\nconst SKIN_SLACK = 0.0005\n/** Extra slack per metre a skin lies above its shell: skins stacked on one another (a label and its band) keep their order while the dent bends them. */\nconst SKIN_LAYER_SLACK = 4\n/** And at least this many times the distance to the nearest vertex, so even the nearest one is pushed visibly. */\nconst NEAREST_MARGIN = 1.5\n\nexport class Visuals {\n readonly kit: DecalKit\n private readonly a: THREE_NS.Vector3\n private readonly b: THREE_NS.Vector3\n private readonly m4: THREE_NS.Matrix4\n private readonly box: THREE_NS.Box3\n private readonly t: THREE_NS.Vector3\n private readonly lbox: THREE_NS.Box3\n /** Total live decals across meshes (kept in sync by add/remove). */\n decalCount = 0\n\n constructor(\n private readonly THREE: typeof THREE_NS,\n private readonly lowQuality: boolean,\n private readonly decalCap: number,\n ) {\n this.kit = new DecalKit(THREE)\n this.a = tmpV(THREE)\n this.b = tmpV(THREE)\n this.m4 = new THREE.Matrix4()\n this.box = new THREE.Box3()\n this.t = tmpV(THREE)\n this.lbox = new THREE.Box3()\n }\n\n /**\n * @param range vertex range `[v0, v1)` of a merged mesh this part is drawn by (see `MeshRange`); `hosts` caches the shared state per mesh for one `bind`.\n */\n makeMeshVis(mesh: Mesh, home: string, range?: [number, number], hosts?: Map<Mesh, HostVis>): MeshVis {\n let host: HostVis | null = null\n if (range) {\n host = hosts?.get(mesh) ?? null\n if (!host) {\n host = { mesh, origGeometry: mesh.geometry, origMaterial: mesh.material, ownGeo: false, work: null, ownMat: false, sharers: [] }\n hosts?.set(mesh, host)\n }\n }\n const mv: MeshVis = {\n mesh,\n home,\n origGeometry: mesh.geometry,\n origMaterial: mesh.material,\n origVisible: mesh.visible,\n origParent: mesh.parent,\n origPosition: mesh.position.clone(),\n origQuaternion: mesh.quaternion.clone(),\n origScale: mesh.scale.clone(),\n ownMat: false,\n ownGeo: false,\n work: null,\n baseColors: null,\n decals: [],\n meltApplied: 0,\n bottomY: 0,\n moved: false,\n host,\n range: range ? [range[0], range[1]] : null,\n merged: host && range ? { host, range: [range[0], range[1]] } : null,\n loose: false,\n collapsed: false,\n hidden: false,\n touched: false,\n charK: 0,\n charHex: 0,\n glowHex: 0,\n glowK: 0,\n }\n host?.sharers.push(mv)\n return mv\n }\n\n vertexCount(mv: MeshVis): number {\n if (mv.range) return mv.range[1] - mv.range[0]\n return mv.mesh.geometry.getAttribute(POS_ATTR)?.count ?? 0\n }\n\n /** Is the part drawn? (A ranged part shares its mesh, so `mesh.visible` says nothing about it.) */\n shown(mv: MeshVis): boolean {\n return mv.host ? !mv.hidden : mv.mesh.visible\n }\n\n /** Box of the part's vertices in the space of its mesh (the whole geometry for a plain mesh). */\n localBox(mv: MeshVis, out: THREE_NS.Box3): THREE_NS.Box3 {\n out.makeEmpty()\n if (!mv.host || !mv.range) {\n const geo = mv.mesh.geometry\n if (!geo.boundingBox) geo.computeBoundingBox()\n return geo.boundingBox ? out.copy(geo.boundingBox) : out\n }\n const arr = mv.host.work ?? (positionAttr(mv.mesh.geometry)?.array as unknown as ArrayLike<number> | undefined)\n if (!arr) return out\n for (let i = mv.range[0] * 3; i < mv.range[1] * 3; i += 3) out.expandByPoint(this.t.set(arr[i], arr[i + 1], arr[i + 2]))\n return out\n }\n\n /** Box of the part in world space. */\n worldBox(mv: MeshVis, out: THREE_NS.Box3): THREE_NS.Box3 {\n if (!mv.host) return out.setFromObject(mv.mesh)\n this.localBox(mv, out)\n mv.mesh.updateWorldMatrix(true, false)\n return out.isEmpty() ? out : out.applyMatrix4(mv.mesh.matrixWorld)\n }\n\n private readonly tints = new WeakMap<MeshVis, THREE_NS.Color | null>()\n\n /**\n * Average vertex colour of a mesh whose material uses `vertexColors` (computed once per mesh, from its original geometry), else null. Fragments\n * and debris of such a mesh multiply it by `material.color`; without it they come out white.\n */\n vertexTint(mv: MeshVis): THREE_NS.Color | null {\n if (this.tints.has(mv)) return this.tints.get(mv) ?? null\n let tint: THREE_NS.Color | null = null\n const used = materialsOf(mv.origMaterial).some((m) => (m as THREE_NS.MeshStandardMaterial).vertexColors === true)\n const attr = used ? (mv.origGeometry.getAttribute('color') as THREE_NS.BufferAttribute | undefined) : undefined\n if (attr && attr.count > 0 && attr.itemSize >= 3) {\n // a ranged part averages its own vertices only\n const from = mv.merged ? mv.merged.range[0] : 0\n const to = mv.merged ? Math.min(attr.count, mv.merged.range[1]) : attr.count\n let r = 0, g = 0, b = 0\n for (let i = from; i < to; i++) {\n r += attr.getX(i)\n g += attr.getY(i)\n b += attr.getZ(i)\n }\n const n = Math.max(1, to - from)\n tint = new this.THREE.Color(r / n, g / n, b / n)\n }\n this.tints.set(mv, tint)\n return tint\n }\n\n /** Colour of the original material (before any char) times the vertex tint, `0xRRGGBB`, or -1. */\n baseColorHex(mv: MeshVis): number {\n const c = mv.baseColors?.[0] ?? colorOf(materialsOf(mv.origMaterial)[0])\n if (!c) return -1\n const tint = this.vertexTint(mv)\n return tint ? c.clone().multiply(tint).getHex() : c.getHex()\n }\n\n /** Is the original material transparent? */\n isTransparent(mv: MeshVis): boolean {\n return materialsOf(mv.origMaterial).some((m) => m.transparent && m.opacity < 1)\n }\n\n ownMaterial(mv: MeshVis): void {\n if (mv.ownMat) return\n mv.ownMat = true\n const src = materialsOf(mv.origMaterial)\n const cloned = src.map((m) => m.clone())\n mv.baseColors = src.map((m) => colorOf(m)?.clone() ?? new this.THREE.Color(0x888888))\n mv.mesh.material = Array.isArray(mv.origMaterial) ? cloned : cloned[0]\n }\n\n /** Clone the geometry (vertex edits); false when its positions cannot be edited. */\n ownGeometry(mv: MeshVis): boolean {\n if (mv.host) return this.ownHostGeometry(mv.host)\n if (mv.ownGeo) return true\n const pos = positionAttr(mv.mesh.geometry)\n if (!pos) return false\n mv.ownGeo = true\n const g = mv.mesh.geometry.clone()\n mv.mesh.geometry = g\n mv.work = new Float32Array((positionAttr(g) as THREE_NS.BufferAttribute).array as ArrayLike<number>)\n return true\n }\n\n private ownHostGeometry(host: HostVis): boolean {\n if (host.ownGeo) return true\n const pos = positionAttr(host.mesh.geometry)\n if (!pos) return false\n host.ownGeo = true\n const g = host.mesh.geometry.clone()\n host.mesh.geometry = g\n host.work = new Float32Array((positionAttr(g) as THREE_NS.BufferAttribute).array as ArrayLike<number>)\n return true\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Dents\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n /**\n * Push the vertices of the mesh within `dent.radius` of `worldPoint` inwards along `worldNormal` by `depth * (1 - (d/r)^2)^2`.\n * Returns false when nothing was changed (too far, low quality on a heavy mesh, or no editable positions).\n */\n applyDent(mv: MeshVis, worldPoint: THREE_NS.Vector3, worldNormal: THREE_NS.Vector3, dent: Dent, reachWorld = 0): boolean {\n const mesh = mv.mesh\n if (this.lowQuality && this.vertexCount(mv) > 20000) return false\n mesh.updateWorldMatrix(true, false)\n const s = mesh.matrixWorld.getMaxScaleOnAxis() || 1\n const lp = mesh.worldToLocal(this.a.copy(worldPoint))\n const ln = this.b.copy(worldNormal).transformDirection(this.m4.copy(mesh.matrixWorld).invert()).normalize()\n const r = Math.max(dent.radius, reachWorld) / s\n const depth = dent.depth / s\n // quick reject: the point must be near the mesh bounds\n const geo = mesh.geometry\n let bb: THREE_NS.Box3 | null\n if (mv.host) bb = this.localBox(mv, this.lbox)\n else {\n if (!geo.boundingBox) geo.computeBoundingBox()\n bb = geo.boundingBox\n }\n if (bb && !bb.isEmpty() && bb.distanceToPoint(lp) > r) return false\n if (!this.ownGeometry(mv)) return false\n const work = (mv.host ? mv.host.work : mv.work) as Float32Array\n const pos = positionAttr(mesh.geometry) as THREE_NS.BufferAttribute\n const from = mv.range ? mv.range[0] * 3 : 0\n const to = mv.range ? mv.range[1] * 3 : work.length\n const reach = r\n const reach2 = reach * reach\n for (let i = from; i < to; i += 3) {\n const dx = work[i] - lp.x\n const dy = work[i + 1] - lp.y\n const dz = work[i + 2] - lp.z\n const d2 = dx * dx + dy * dy + dz * dz\n if (d2 >= reach2) continue\n const f = 1 - d2 / reach2\n const k = depth * f * f\n work[i] -= ln.x * k\n work[i + 1] -= ln.y * k\n work[i + 2] -= ln.z * k\n }\n mv.touched = true\n this.writePositions(mv, pos)\n return true\n }\n\n /**\n * World radius a dent needs on this mesh to reach `MIN_DENT_VERTICES` vertices (the dent's own radius when the mesh is fine enough). A part with several meshes\n * (a shell and its label) must dent them all with the largest of these, so the skin and the shell follow the same smooth surface and never cross.\n */\n dentReach(mv: MeshVis, worldPoint: THREE_NS.Vector3, dent: Dent): number {\n const mesh = mv.mesh\n mesh.updateWorldMatrix(true, false)\n const s = mesh.matrixWorld.getMaxScaleOnAxis() || 1\n const lp = mesh.worldToLocal(this.a.copy(worldPoint))\n const source = (mv.host ? mv.host.work : mv.work) ?? ((positionAttr(mesh.geometry) as THREE_NS.BufferAttribute | undefined)?.array as ArrayLike<number> | undefined)\n if (!source) return dent.radius\n // a mesh the dent does not touch (the far cap of a can) must not widen it\n let bounds: THREE_NS.Box3 | null\n if (mv.host) bounds = this.localBox(mv, this.lbox)\n else {\n if (!mesh.geometry.boundingBox) mesh.geometry.computeBoundingBox()\n bounds = mesh.geometry.boundingBox\n }\n if (bounds && !bounds.isEmpty() && bounds.distanceToPoint(lp) > dent.radius / s) return dent.radius\n const from = mv.range ? mv.range[0] * 3 : 0\n const to = mv.range ? mv.range[1] * 3 : source.length\n const r2 = (dent.radius / s) ** 2\n const distances: number[] = []\n let inside = 0\n for (let i = from; i < to; i += 3) {\n const dx = source[i]! - lp.x\n const dy = source[i + 1]! - lp.y\n const dz = source[i + 2]! - lp.z\n const d2 = dx * dx + dy * dy + dz * dz\n if (d2 < r2) inside++\n distances.push(d2)\n }\n if (inside >= MIN_DENT_VERTICES || distances.length < MIN_DENT_VERTICES) return dent.radius\n distances.sort((x, y) => x - y)\n const nearest = Math.sqrt(distances[0]!)\n return Math.max(dent.radius, Math.sqrt(distances[MIN_DENT_VERTICES - 1]!) * s * WIDEN_MARGIN, nearest * s * NEAREST_MARGIN)\n }\n\n /**\n * Dent all the meshes of a part. The shells take the dent as `applyDent` gives it; a skin (label, coat: `userData.destructionSkin`) sits a hair above its shell\n * and moves with the shell's surface instead (see `shellDisplacementAt`), so the shell never shows through it whatever the two meshes' vertex grids are.\n */\n applyPartDent(meshes: readonly MeshVis[], worldPoint: THREE_NS.Vector3, worldNormal: THREE_NS.Vector3, dent: Dent, reachWorld: number): void {\n const isSkin = (mv: MeshVis): boolean => mv.mesh.userData.destructionSkin === true && !mv.host\n const shells = meshes.filter((mv) => !isSkin(mv))\n const snapshots: ShellSnapshot[] = []\n for (const mv of shells) {\n const heavy = this.lowQuality && this.vertexCount(mv) > 20000\n const plain = !mv.host && !heavy && this.ownGeometry(mv) && mv.work\n const before = plain ? new Float32Array(mv.work as Float32Array) : null\n this.applyDent(mv, worldPoint, worldNormal, dent, reachWorld)\n if (before) snapshots.push({ mesh: mv.mesh, before, after: mv.work as Float32Array })\n }\n const displacement = this.t\n const vertex = this.a\n for (const mv of meshes) {\n if (!isSkin(mv)) continue\n if (snapshots.length === 0) {\n this.applyDent(mv, worldPoint, worldNormal, dent, reachWorld)\n continue\n }\n if (!this.ownGeometry(mv)) continue\n const work = mv.work as Float32Array\n const mesh = mv.mesh\n mesh.updateWorldMatrix(true, false)\n const toLocal = this.m4.copy(mesh.matrixWorld).invert()\n const scale = mesh.matrixWorld.getMaxScaleOnAxis() || 1\n let touched = false\n for (let i = 0; i < work.length; i += 3) {\n vertex.set(work[i]!, work[i + 1]!, work[i + 2]!).applyMatrix4(mesh.matrixWorld)\n if (vertex.distanceTo(worldPoint) > reachWorld) continue\n const height = shellDisplacementAt(this.THREE, vertex, snapshots, displacement)\n const length = displacement.length()\n if (length === 0) continue\n // the shell's facets lie outside a dip (deeper than the shell, the skin would sink under it) and inside a rim (the smooth dent is shallower there): take the shallower of the two\n const falloff = 1 - (vertex.distanceTo(worldPoint) / reachWorld) ** 2\n const smooth = dent.depth * falloff * falloff\n const pull = Math.max(0, Math.min(length, smooth) * SKIN_FOLLOW - SKIN_SLACK - height * SKIN_LAYER_SLACK)\n displacement.transformDirection(toLocal).multiplyScalar(pull / scale)\n work[i] += displacement.x\n work[i + 1] += displacement.y\n work[i + 2] += displacement.z\n touched = true\n }\n if (touched) this.writePositions(mv, positionAttr(mesh.geometry) as THREE_NS.BufferAttribute)\n }\n }\n\n /** Copy `work` (dents) into the geometry, adding the melt sag when the mesh is melting. */\n private writePositions(mv: MeshVis, pos: THREE_NS.BufferAttribute): void {\n if (mv.host) {\n this.rebuildHost(mv.host)\n return\n }\n const work = mv.work as Float32Array\n const arr = pos.array as unknown as Float32Array\n const melt = mv.meltApplied\n if (melt <= 0 || (this.lowQuality && work.length / 3 > 20000)) {\n arr.set(work)\n } else {\n const geo = mv.mesh.geometry\n if (!geo.boundingBox) geo.computeBoundingBox()\n const bb = geo.boundingBox as THREE_NS.Box3\n const h = Math.max(1e-4, bb.max.y - bb.min.y)\n const minY = bb.min.y\n for (let i = 0, v = 0; i < work.length; i += 3, v++) {\n const n = ((Math.imul(v + 1, 2654435761) >>> 0) % 1000) / 1000\n const n2 = ((Math.imul(v + 7, 40503) >>> 0) % 1000) / 1000\n const lowness = 1 - (work[i + 1] - minY) / h // 1 at the bottom, 0 at the top\n const spread = 1 + 0.12 * melt * (0.4 + n2) * (0.3 + lowness)\n arr[i] = work[i] * spread\n arr[i + 2] = work[i + 2] * spread\n arr[i + 1] = Math.max(minY, work[i + 1] - n * melt * h * 0.08)\n }\n }\n pos.needsUpdate = true\n const geo = mv.mesh.geometry\n geo.computeVertexNormals()\n geo.boundingBox = null\n geo.boundingSphere = null\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Decals\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n /** Decal pose in mesh space: position and a rotation taking +Z to the surface normal. */\n private decalPose(mesh: Mesh, worldPoint: THREE_NS.Vector3, worldNormal: THREE_NS.Vector3, lift: number): { s: number; pos: THREE_NS.Vector3; quat: THREE_NS.Quaternion } {\n mesh.updateWorldMatrix(true, false)\n const s = mesh.matrixWorld.getMaxScaleOnAxis() || 1\n const ln = worldNormal.clone().transformDirection(this.m4.copy(mesh.matrixWorld).invert()).normalize()\n const pos = mesh.worldToLocal(worldPoint.clone()).addScaledVector(ln, lift / s)\n const quat = new this.THREE.Quaternion().setFromUnitVectors(new this.THREE.Vector3(0, 0, 1), ln)\n return { s, pos, quat }\n }\n\n private addDecal(mv: MeshVis, decal: Decal): void {\n decal.obj.userData.destructionDebris = true\n mv.mesh.add(decal.obj)\n mv.decals.push(decal)\n this.decalCount++\n while (mv.decals.length > 48 || this.decalCount > this.decalCap) {\n const old = mv.decals.shift()\n if (!old) break\n this.disposeDecal(old)\n }\n }\n\n private disposeDecal(d: Decal): void {\n d.obj.parent?.remove(d.obj)\n d.geometry?.dispose()\n this.decalCount = Math.max(0, this.decalCount - 1)\n }\n\n addHole(mv: MeshVis, worldPoint: THREE_NS.Vector3, worldNormal: THREE_NS.Vector3, diameter: number): void {\n const { s, pos, quat } = this.decalPose(mv.mesh, worldPoint, worldNormal, 0.0025)\n const disc = new this.THREE.Mesh(this.kit.discGeometry(), this.kit.discMaterial())\n disc.position.copy(pos)\n disc.quaternion.copy(quat)\n disc.scale.setScalar((Math.max(0.004, diameter) * 0.5 * 1.25) / s)\n disc.renderOrder = 2\n this.addDecal(mv, { obj: disc })\n }\n\n /** A patch where a surface coat came off, in the colour of the core under it; drawn under the bullet holes. */\n addSpall(mv: MeshVis, worldPoint: THREE_NS.Vector3, worldNormal: THREE_NS.Vector3, radius: number, color: number): void {\n const { s, pos, quat } = this.decalPose(mv.mesh, worldPoint, worldNormal, 0.0015)\n const disc = new this.THREE.Mesh(this.kit.discGeometry(), this.kit.patchMaterial(color))\n disc.position.copy(pos)\n disc.quaternion.copy(quat)\n disc.scale.setScalar(Math.max(0.01, radius) / s)\n disc.renderOrder = 1\n this.addDecal(mv, { obj: disc })\n }\n\n /** A star of jagged lines: `rays` rays up to `length` metres, seeded so the same event always draws the same star. */\n addCrack(mv: MeshVis, worldPoint: THREE_NS.Vector3, worldNormal: THREE_NS.Vector3, rays: number, length: number, color: number, seed: number): void {\n const { s, pos, quat } = this.decalPose(mv.mesh, worldPoint, worldNormal, 0.002)\n const rnd = createRng(seed)\n const verts: number[] = []\n const n = clamp(Math.round(rays), 3, 16)\n const L = Math.max(0.02, length) / s\n for (let r = 0; r < n; r++) {\n let ang = (r / n) * Math.PI * 2 + (rnd() - 0.5) * 0.5\n let x = 0\n let y = 0\n const segs = 3\n const total = L * (0.6 + 0.4 * rnd())\n for (let k = 0; k < segs; k++) {\n const step = (total / segs) * (0.7 + 0.6 * rnd())\n ang += (rnd() - 0.5) * 0.45\n const nx = x + Math.cos(ang) * step\n const ny = y + Math.sin(ang) * step\n verts.push(x, y, 0, nx, ny, 0)\n if (k > 0 && rnd() < 0.5) {\n const ba = ang + (rnd() < 0.5 ? -1 : 1) * (0.5 + rnd() * 0.5)\n const bl = step * (0.6 + 0.6 * rnd())\n verts.push(nx, ny, 0, nx + Math.cos(ba) * bl, ny + Math.sin(ba) * bl, 0)\n }\n x = nx\n y = ny\n }\n }\n // a faint ring around the impact\n const ringR = L * 0.12\n for (let k = 0; k < 8; k++) {\n const a0 = (k / 8) * Math.PI * 2\n const a1 = ((k + 1) / 8) * Math.PI * 2\n if (rnd() < 0.75) verts.push(Math.cos(a0) * ringR, Math.sin(a0) * ringR, 0, Math.cos(a1) * ringR, Math.sin(a1) * ringR, 0)\n }\n const geo = new this.THREE.BufferGeometry()\n geo.setAttribute('position', new this.THREE.Float32BufferAttribute(verts, 3))\n const lines = new this.THREE.LineSegments(geo, this.kit.lineMaterial(color))\n lines.position.copy(pos)\n lines.quaternion.copy(quat)\n lines.renderOrder = 2\n this.addDecal(mv, { obj: lines, geometry: geo })\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Char and heat glow\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n setChar(pv: PartVis, char: number, charColor: number): void {\n if (Math.abs(char - pv.charApplied) < 0.004) return\n pv.charApplied = char\n const target = new this.THREE.Color(charColor)\n for (const mv of pv.meshes) {\n if (mv.host) {\n mv.charK = clamp(char, 0, 1)\n mv.charHex = charColor\n this.paint(mv)\n continue\n }\n this.ownMaterial(mv)\n const mats = materialsOf(mv.mesh.material)\n mats.forEach((m, i) => {\n const c = colorOf(m)\n const base = mv.baseColors?.[i]\n if (c && base) c.copy(base).lerp(target, clamp(char, 0, 1))\n })\n }\n }\n\n /** Emissive glow of a hot part. `temperature` below the glow threshold switches it off. */\n setGlow(pv: PartVis, temperatureC: number): void {\n const hex = heatColor(temperatureC)\n const key = hex === 0 ? 0 : Math.round(temperatureC / 5) * 5\n if (key === pv.glowApplied) return\n pv.glowApplied = key\n const intensity = hex === 0 ? 0 : clamp(0.35 + (temperatureC - 450) / 900, 0, 1.4)\n for (const mv of pv.meshes) {\n if (mv.host) {\n mv.glowHex = hex\n mv.glowK = intensity\n this.paint(mv)\n continue\n }\n this.ownMaterial(mv)\n for (const m of materialsOf(mv.mesh.material)) {\n const e = (m as THREE_NS.MeshStandardMaterial).emissive\n if (e && (e as THREE_NS.Color).isColor) {\n e.setHex(hex)\n ;(m as THREE_NS.MeshStandardMaterial).emissiveIntensity = intensity\n }\n }\n }\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Melt\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n /** Sag the part: shorter in Y (down to 25 %), a bit wider, vertices pushed down with noise, the bottom stays put. */\n setMelt(pv: PartVis, melt: number): void {\n const m = clamp(melt, 0, 1)\n if (Math.abs(m - pv.meltApplied) < 0.01) return\n pv.meltApplied = m\n for (const mv of pv.meshes) {\n const mesh = mv.mesh\n if (mv.host) {\n // a range of a shared mesh cannot scale the mesh: squash and widen its own vertices\n mv.meltApplied = m\n mv.touched = true\n if (!(this.lowQuality && this.vertexCount(mv) > 20000) && this.ownGeometry(mv)) this.rebuildHost(mv.host)\n continue\n }\n if (mv.meltApplied === 0 && m > 0) {\n mesh.updateWorldMatrix(true, false)\n mv.bottomY = this.box.setFromObject(mesh).min.y\n }\n mv.meltApplied = m\n mv.moved = true\n const sy = lerp(1, 0.25, m)\n const sxz = 1 + 0.18 * m\n mesh.scale.set(mv.origScale.x * sxz, mv.origScale.y * sy, mv.origScale.z * sxz)\n mesh.position.copy(mv.origPosition)\n mesh.updateWorldMatrix(true, false)\n const bottom = this.box.setFromObject(mesh).min.y\n const dy = mv.bottomY - bottom\n if (Math.abs(dy) > 1e-6 && mesh.parent) {\n mesh.parent.updateWorldMatrix(true, false)\n const inv = this.m4.copy(mesh.parent.matrixWorld).invert()\n this.a.set(0, dy, 0).applyMatrix4(inv)\n this.b.set(0, 0, 0).applyMatrix4(inv)\n mesh.position.copy(mv.origPosition).add(this.a.sub(this.b))\n }\n if (!(this.lowQuality && this.vertexCount(mv) > 20000) && this.ownGeometry(mv)) {\n this.writePositions(mv, positionAttr(mesh.geometry) as THREE_NS.BufferAttribute)\n }\n }\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Visibility and restore\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n hide(pv: PartVis, reason: PartVis['gone']): void {\n pv.gone = reason\n for (const mv of pv.meshes) {\n if (!mv.host || mv.loose) {\n mv.mesh.visible = false\n mv.hidden = true\n continue\n }\n // a range of a shared mesh: collapse its vertices to a point and hide what was drawn on it\n mv.hidden = true\n for (const d of mv.decals) d.obj.visible = false\n this.collapse(mv)\n }\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Parts drawn by a vertex range of a merged mesh\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n /** Collapse the part's vertices in the merged mesh to one point (its triangles become degenerate and vanish). */\n private collapse(mv: MeshVis): void {\n if (!mv.merged || !this.ownHostGeometry(mv.merged.host)) return\n mv.collapsed = true\n mv.touched = true\n this.rebuildHost(mv.merged.host)\n }\n\n /** Write `work` into the geometry again with the melt of ranged parts and the collapsed ranges applied. */\n private rebuildHost(host: HostVis): void {\n const geo = host.mesh.geometry\n const pos = positionAttr(geo)\n const work = host.work\n if (!pos || !work) return\n const arr = pos.array as unknown as Float32Array\n arr.set(work)\n for (const s of host.sharers) {\n if (s.merged && s.merged.host === host) {\n if (s.collapsed) this.collapseRange(arr, s.merged.range)\n else if (s.meltApplied > 0 && !s.loose) this.meltRange(arr, work, s.merged.range, s.meltApplied)\n } else if (s.host === host && s.range && s.meltApplied > 0) this.meltRange(arr, work, s.range, s.meltApplied)\n }\n pos.needsUpdate = true\n geo.computeVertexNormals()\n geo.boundingBox = null\n geo.boundingSphere = null\n }\n\n private collapseRange(arr: Float32Array, range: [number, number]): void {\n const x = arr[range[0] * 3]\n const y = arr[range[0] * 3 + 1]\n const z = arr[range[0] * 3 + 2]\n for (let i = range[0] * 3; i < range[1] * 3; i += 3) {\n arr[i] = x\n arr[i + 1] = y\n arr[i + 2] = z\n }\n }\n\n /** Melt of one range: shorter in Y (down to 25 %) with the bottom fixed, a bit wider around its centre, with the same noise as a whole mesh. */\n private meltRange(arr: Float32Array, work: Float32Array, range: [number, number], melt: number): void {\n let minY = Infinity\n let maxY = -Infinity\n let cx = 0\n let cz = 0\n const n = Math.max(1, range[1] - range[0])\n for (let i = range[0] * 3; i < range[1] * 3; i += 3) {\n minY = Math.min(minY, work[i + 1])\n maxY = Math.max(maxY, work[i + 1])\n cx += work[i]\n cz += work[i + 2]\n }\n cx /= n\n cz /= n\n const h = Math.max(1e-4, maxY - minY)\n const sy = lerp(1, 0.25, melt)\n const sxz = 1 + 0.18 * melt\n for (let i = range[0] * 3, v = 0; i < range[1] * 3; i += 3, v++) {\n const noise = ((Math.imul(v + 1, 2654435761) >>> 0) % 1000) / 1000\n arr[i] = cx + (work[i] - cx) * sxz\n arr[i + 2] = cz + (work[i + 2] - cz) * sxz\n arr[i + 1] = Math.max(minY, minY + (work[i + 1] - minY) * sy - noise * melt * h * 0.04)\n }\n }\n\n /** The colour attribute of the host's current geometry (created white when there is none) with vertex colours switched on in its material. */\n private ensureColors(host: HostVis): THREE_NS.BufferAttribute | null {\n if (!this.ownHostGeometry(host)) return null\n const geo = host.mesh.geometry\n let attr = geo.getAttribute('color') as THREE_NS.BufferAttribute | undefined\n if (!attr) {\n const n = geo.getAttribute(POS_ATTR).count\n attr = new this.THREE.BufferAttribute(new Float32Array(n * 3).fill(1), 3)\n geo.setAttribute('color', attr)\n }\n if (!host.ownMat) {\n host.ownMat = true\n const src = materialsOf(host.mesh.material)\n const cloned = src.map((m) => m.clone())\n host.mesh.material = Array.isArray(host.mesh.material) ? cloned : cloned[0]\n }\n for (const m of materialsOf(host.mesh.material)) {\n if ((m as THREE_NS.MeshStandardMaterial).vertexColors !== true) {\n ;(m as THREE_NS.MeshStandardMaterial).vertexColors = true\n m.needsUpdate = true\n }\n }\n return attr\n }\n\n /** Colour of the part's vertices from the original colours, its char and its heat. Only the part's range is written. */\n private paint(mv: MeshVis): void {\n if (!mv.host || !mv.range || !mv.merged) return\n const idle = mv.charK <= 0 && mv.glowK <= 0\n if (idle && !mv.touched) return\n const attr = this.ensureColors(mv.host)\n if (!attr) return\n const size = attr.itemSize\n const arr = attr.array as unknown as Float32Array\n const orig = mv.merged.host.origGeometry.getAttribute('color') as THREE_NS.BufferAttribute | undefined\n const oSize = orig?.itemSize ?? 3\n const oArr = orig?.array as unknown as ArrayLike<number> | undefined\n const shift = mv.merged.range[0] - mv.range[0]\n const ch = new this.THREE.Color(mv.charHex)\n const heat = new this.THREE.Color(mv.glowHex)\n const k = clamp(mv.charK, 0, 1)\n const gk = clamp(mv.glowK, 0, 1)\n const boost = 1 + Math.max(0, mv.glowK - 1)\n for (let i = mv.range[0]; i < mv.range[1]; i++) {\n const o = (i + shift) * oSize\n let r = oArr ? oArr[o] : 1\n let g = oArr ? oArr[o + 1] : 1\n let b = oArr ? oArr[o + 2] : 1\n if (k > 0) {\n r = lerp(r, ch.r, k)\n g = lerp(g, ch.g, k)\n b = lerp(b, ch.b, k)\n }\n if (gk > 0) {\n r = lerp(r, heat.r * boost, gk)\n g = lerp(g, heat.g * boost, gk)\n b = lerp(b, heat.b * boost, gk)\n }\n arr[i * size] = r\n arr[i * size + 1] = g\n arr[i * size + 2] = b\n }\n mv.touched = true\n attr.needsUpdate = true\n }\n\n /**\n * Move a ranged part to a mesh of its own: the faces whose vertices all lie in its range are copied (with the current dents and colours) into a\n * new mesh that takes the merged mesh's transform and material, then attached to `group`; the range is collapsed in the merged mesh. Decals\n * go with it.\n */\n extract(mv: MeshVis, group: THREE_NS.Object3D): void {\n if (!mv.host || !mv.range || !mv.merged || mv.loose) return\n const host = mv.host\n const [v0, v1] = mv.range\n const src = host.mesh.geometry\n const geo = new this.THREE.BufferGeometry()\n const count = v1 - v0\n for (const name of Object.keys(src.attributes)) {\n const a = src.getAttribute(name) as THREE_NS.BufferAttribute\n if ((a as unknown as { isInterleavedBufferAttribute?: boolean }).isInterleavedBufferAttribute) continue\n const size = a.itemSize\n const from = (name === POS_ATTR ? host.work : null) ?? (a.array as unknown as Float32Array)\n const slice = (from as unknown as { slice(a: number, b: number): ArrayLike<number> }).slice(v0 * size, v1 * size)\n const Ctor = (a.array as unknown as { constructor: new (x: ArrayLike<number>) => ArrayLike<number> }).constructor\n geo.setAttribute(name, new this.THREE.BufferAttribute(new Ctor(slice) as never, size, a.normalized))\n }\n const index = src.getIndex()\n if (index) {\n const out: number[] = []\n for (let i = 0; i + 2 < index.count; i += 3) {\n const a = index.getX(i)\n const b = index.getX(i + 1)\n const c = index.getX(i + 2)\n if (a >= v0 && a < v1 && b >= v0 && b < v1 && c >= v0 && c < v1) out.push(a - v0, b - v0, c - v0)\n }\n geo.setIndex(count > 65535 ? new this.THREE.Uint32BufferAttribute(out, 1) : new this.THREE.Uint16BufferAttribute(out, 1))\n }\n const mats = materialsOf(host.mesh.material).map((m) => m.clone())\n const loose = new this.THREE.Mesh(geo, mats[0])\n loose.name = `${host.mesh.name || 'mesh'}:${v0}-${v1}`\n loose.castShadow = host.mesh.castShadow\n loose.receiveShadow = host.mesh.receiveShadow\n loose.renderOrder = host.mesh.renderOrder\n loose.frustumCulled = host.mesh.frustumCulled\n loose.layers.mask = host.mesh.layers.mask\n loose.position.copy(host.mesh.position)\n loose.quaternion.copy(host.mesh.quaternion)\n loose.scale.copy(host.mesh.scale)\n const parent = host.mesh.parent\n if (parent) parent.add(loose)\n loose.updateMatrixWorld(true)\n // the merged mesh loses the range; the decals and the part's state follow the new mesh\n this.collapse(mv)\n for (const d of mv.decals) {\n d.obj.visible = true\n loose.add(d.obj)\n }\n const lp = positionAttr(geo) as THREE_NS.BufferAttribute\n const lh: HostVis = {\n mesh: loose,\n origGeometry: geo,\n origMaterial: loose.material,\n ownGeo: true,\n work: new Float32Array(lp.array as ArrayLike<number>),\n ownMat: true,\n sharers: [mv],\n }\n mv.host = lh\n mv.range = [0, count]\n mv.mesh = loose\n mv.loose = true\n mv.moved = true\n group.attach(loose)\n for (const m of materialsOf(loose.material)) m.needsUpdate = true\n }\n\n private restoreRanged(mv: MeshVis): void {\n const merged = mv.merged as NonNullable<MeshVis['merged']>\n const host = merged.host\n for (const d of mv.decals) this.disposeDecal(d)\n mv.decals.length = 0\n if (mv.loose) {\n const loose = mv.mesh\n loose.parent?.remove(loose)\n loose.geometry.dispose()\n for (const m of materialsOf(loose.material)) m.dispose()\n mv.host = host\n mv.range = [merged.range[0], merged.range[1]]\n mv.mesh = host.mesh\n mv.loose = false\n mv.moved = false\n }\n mv.collapsed = false\n mv.hidden = false\n mv.meltApplied = 0\n mv.charK = 0\n mv.glowK = 0\n mv.touched = false\n if (!host.ownGeo) return\n // positions and colours of the range go back to the original ones\n const work = host.work as Float32Array\n const op = positionAttr(host.origGeometry)\n const [v0, v1] = merged.range\n if (op) work.set((op.array as unknown as Float32Array).subarray(v0 * 3, v1 * 3), v0 * 3)\n const attr = host.mesh.geometry.getAttribute('color') as THREE_NS.BufferAttribute | undefined\n if (attr) {\n const orig = host.origGeometry.getAttribute('color') as THREE_NS.BufferAttribute | undefined\n const size = attr.itemSize\n const a = attr.array as unknown as Float32Array\n for (let i = v0; i < v1; i++) {\n for (let c = 0; c < 3; c++) a[i * size + c] = orig ? orig.array[i * orig.itemSize + c] : 1\n }\n attr.needsUpdate = true\n }\n if (host.sharers.every((s) => !s.touched)) {\n host.mesh.geometry.dispose()\n host.mesh.geometry = host.origGeometry\n host.work = null\n host.ownGeo = false\n if (host.ownMat) {\n for (const m of materialsOf(host.mesh.material)) m.dispose()\n host.mesh.material = host.origMaterial\n host.ownMat = false\n }\n } else this.rebuildHost(host)\n }\n\n /** Bring one mesh back to how it was when it was bound. */\n restoreMesh(mv: MeshVis): void {\n if (mv.merged) {\n this.restoreRanged(mv)\n return\n }\n const mesh = mv.mesh\n for (const d of mv.decals) this.disposeDecal(d)\n mv.decals.length = 0\n if (mv.ownGeo) {\n mesh.geometry.dispose()\n mesh.geometry = mv.origGeometry\n mv.ownGeo = false\n mv.work = null\n }\n if (mv.ownMat) {\n for (const m of materialsOf(mesh.material)) m.dispose()\n mesh.material = mv.origMaterial\n mv.ownMat = false\n mv.baseColors = null\n }\n mesh.visible = mv.origVisible\n if (mv.origParent && mesh.parent !== mv.origParent) {\n mv.origParent.add(mesh)\n mv.moved = true\n }\n if (mv.moved) {\n mesh.position.copy(mv.origPosition)\n mesh.quaternion.copy(mv.origQuaternion)\n mesh.scale.copy(mv.origScale)\n mv.moved = false\n }\n mv.meltApplied = 0\n }\n\n restorePart(pv: PartVis): void {\n for (const mv of pv.meshes) this.restoreMesh(mv)\n pv.charApplied = 0\n pv.glowApplied = 0\n pv.meltApplied = 0\n pv.gone = 'none'\n }\n\n dispose(): void {\n this.kit.dispose()\n }\n}\n","// The sounds of materials breaking, as recipes of @adatechnology/game-audio. The art scene's `sfx.*` (cena L1354-L1367) are ported literally: the same\n// filters, frequencies, lengths, volumes and reverb sends, and the same random numbers drawn in the same order, so a recipe leaves the trace of the team\n// code. The game's `boom` (jogo L68278) is here too, as the game's explosion.\nimport { DISTANCE_CURVES, sceneMany as many, sceneNoise as noise, sceneRecipe, sceneTone as tone } from '@adatechnology/game-audio'\nimport type { Layer, LoopRecipe, SoundBank, SoundRecipe } from '@adatechnology/game-audio'\n\nconst scene = (id: string, layers: readonly Layer[], line: string, vars?: SoundRecipe['vars']): SoundRecipe => sceneRecipe(id, layers, line, vars ? { vars } : {})\n\nconst boomLayers = (big: boolean): Layer[] => [\n noise({ f: 1200, f2: 120, d: 1.8, vol: 2, wet: 1.2 }),\n tone({ f: 65, f2: 24, d: 1.0, vol: 1.8 }),\n noise({ type: 'highpass', f: 1500, d: 0.2, vol: 0.8 }),\n ...(big ? [noise({ f: 500, f2: 90, a: 0.2, d: 2.4, vol: 1.2, wet: 1, delay: 0.15 })] : []),\n ...many(8, () => tone({ f: [2600, 5600], d: 0.05, vol: 0.08, delay: [0.4, 1.6] })),\n]\n\n/** The art scene's destruction sounds, each with the team name in its `sources`. */\nexport const SCENE_SOUNDS: readonly SoundRecipe[] = [\n scene(\n 'glass_shatter',\n [noise({ type: 'highpass', f: 2800, d: 0.45, vol: 0.9, wet: 0.5 }), ...many(12, () => tone({ f: [3000, 7500], d: [0.06, 0.14], vol: 0.18, delay: [0, 0.55] }))],\n 'L1359 glass',\n ),\n scene(\n 'wood_hit',\n [noise({ type: 'bandpass', f: 850, q: 1, d: 0.25, vol: 0.9, wet: 0.3 }), tone({ f: 210, f2: 90, d: 0.1, vol: 0.6 }), noise({ type: 'highpass', f: 2000, d: 0.04, vol: 0.5 })],\n 'L1360 wood',\n ),\n scene('thunk', [noise({ type: 'bandpass', f: 700, q: 2, d: 0.07, vol: 0.4 })], 'L1361 thunk'),\n scene('ping', [tone({ f: [2600, 3500], f2: 1400, d: 0.14, vol: 0.18, wet: 0.3 })], 'L1362 ping'),\n scene('clang', [tone({ f: [520, 720], f2: 480, d: 0.5, vol: 0.35, wet: 0.4 }), tone({ f: 1370, f2: 1300, d: 0.3, vol: 0.15 }), noise({ type: 'highpass', f: 2000, d: 0.05, vol: 0.5 })], 'L1363 clang'),\n scene('chip', [noise({ type: 'bandpass', f: 1600, q: 1.2, d: 0.06, vol: 0.5 })], 'L1364 chip'),\n scene(\n 'crumble',\n [noise({ f: 900, f2: 200, d: 0.6, vol: 0.9, wet: 0.3 }), ...many(5, () => noise({ type: 'bandpass', f: [500, 1400], q: 2, d: 0.05, vol: 0.4, delay: [0.1, 0.5] }))],\n 'L1365 crumble',\n ),\n // `thud(x, z, v)`: `v` is the `scale` param (default 1)\n scene('thud', [tone({ f: 75, f2: 38, d: 0.22, vol: { param: 'scale', scale: 0.6 } }), noise({ f: 420, d: 0.16, vol: { param: 'scale', scale: 0.45 } })], 'L1358 thud', { scale: 1 }),\n // `hiss(x, z, d)`: `seconds` is the param `d` (default 1.2)\n scene('hiss', [noise({ type: 'highpass', f: 3500, a: 0.05, d: { param: 'seconds' }, vol: 0.35 })], 'L1366 hiss', { seconds: 1.2 }),\n scene('boom', boomLayers(false), 'L1367 boom'),\n scene('boom_big', boomLayers(true), 'L1367 boom (big)'),\n scene('burst', [noise({ f: 700, f2: 120, d: 0.7, vol: 1.4, wet: 0.5 }), noise({ type: 'highpass', f: 3000, a: 0.05, d: 1.2, vol: 0.4, delay: 0.1 })], 'L1357 burst'),\n scene('crack', [noise({ type: 'highpass', f: 1800, d: 0.05, vol: 0.8 }), tone({ f: 420, f2: 180, d: 0.06, vol: 0.4 })], 'L1354 crack'),\n]\n\n/** The game's explosion thump: a sine from 70 to 28 Hz over 1.2 s, `1.4 / (1 + d² × 0.002)` (jogo L68278). */\nexport const EXPLOSION_BOOM: SoundRecipe = {\n id: 'explosion_boom',\n bus: 'world',\n order: 'boom',\n duration: 1.6,\n tail: 0.1,\n layers: [\n {\n source: { kind: 'osc', wave: 'sine', frequency: { from: 70, to: 28, curve: 'exp', over: 1.2 } },\n envelope: [\n [0, 1, 'set'],\n ['1d', 0.001, 'exp', 'fixed'],\n ],\n },\n ],\n falloff: DISTANCE_CURVES.game_boom,\n sources: ['jogo:L68278-68285 boom'],\n}\n\n/**\n * The fire loop of the art scene (cena L1316): noise through a 1800 Hz bandpass (Q 0.6) into a gain that starts at 0. The page never raises it, so it is\n * silent there; here `createDestructionSound` raises it while something burns (the level is the kit's, in `fire`).\n */\nexport const BURN_LOOP: LoopRecipe = {\n id: 'burn_loop',\n bus: 'world',\n order: 'chain_loop',\n source: { kind: 'noise', loop: true },\n filters: { mode: 'serial', bank: [{ type: 'bandpass', frequency: { set: 1800 }, q: 0.6 }] },\n volume: 0,\n sources: ['cena:L1316 fire loop (silent in the page: its gain is never raised)', 'sdk: the level while burning'],\n}\n\nexport const DESTRUCTION_SOUND_BANK: SoundBank = { id: 'destruction_three', sounds: [...SCENE_SOUNDS, EXPLOSION_BOOM], loops: [BURN_LOOP] }\n","import type { Vec3 } from '@adatechnology/game-contracts'\nimport { GAME_SFX_BANK } from '@adatechnology/game-audio'\nimport type { AudioEngine, AudioLoopHandle } from '@adatechnology/game-audio'\n\nimport { DESTRUCTION_SOUND_BANK } from './recipes'\n\n/**\n * What a sound key plays: the recipe, its params, a scale on the volume the renderer gives, and (optionally) a louder recipe above a volume\n * (a big blast gets the long boom).\n */\nexport type SoundKeyRule = {\n readonly sound: string\n readonly params?: Readonly<Record<string, number>>\n readonly volumeScale?: number\n readonly above?: { readonly volume: number; readonly sound: string }\n}\n\nexport type DestructionSoundStyle = 'art_scene' | 'game'\n\n/**\n * The keys `createDestructionRenderer` sends to `onSound`, mapped to the sounds the teams delivered. The Cena de Arte has a sound for every material\n * (clang, wood, glass, crumble, thud...); the game has four classes (impact, glass, wood, explosion) and its own explosion thump. Which team sound answers\n * which key is the kit's choice (the teams call the sounds, not the renderer's keys), so it is data: `keys` replaces any entry.\n */\nexport const DESTRUCTION_SOUND_KEYS: Readonly<Record<DestructionSoundStyle, Readonly<Record<string, SoundKeyRule>>>> = {\n art_scene: {\n impact_metal: { sound: 'clang' },\n impact_wood: { sound: 'wood_hit' },\n impact_glass: { sound: 'ping' },\n impact_masonry: { sound: 'chip' },\n impact_soft: { sound: 'thud' },\n shatter_glass: { sound: 'glass_shatter' },\n crumble: { sound: 'crumble' },\n splinter: { sound: 'crack' },\n ricochet: { sound: 'ping' },\n unscrew: { sound: 'chip' },\n detach: { sound: 'thunk' },\n ignite: { sound: 'hiss', params: { seconds: 0.5 } },\n extinguish: { sound: 'hiss' },\n melt_sizzle: { sound: 'hiss', params: { seconds: 0.6 } },\n explode: { sound: 'boom', above: { volume: 0.9, sound: 'boom_big' } },\n },\n game: {\n impact_metal: { sound: 'sfx_impact' },\n impact_wood: { sound: 'sfx_wood' },\n impact_glass: { sound: 'sfx_glass' },\n impact_masonry: { sound: 'sfx_impact' },\n impact_soft: { sound: 'sfx_flesh' },\n shatter_glass: { sound: 'sfx_glass' },\n crumble: { sound: 'sfx_impact' },\n splinter: { sound: 'sfx_wood' },\n explode: { sound: 'explosion_boom' },\n },\n}\n\nexport type DestructionSoundOptions = {\n /** Which team answers the keys (default `art_scene`, the kit mix). `game` falls back to the art scene for the keys the game has no sound for. */\n readonly style?: DestructionSoundStyle\n /** Replaces or adds a key's rule; `null` silences it. */\n readonly keys?: Readonly<Record<string, SoundKeyRule | null>>\n /** The fire loop: the volume each burning part adds and the most it reaches (the page never raises it, so these are the kit's). */\n readonly fire?: { readonly perFire?: number; readonly max?: number }\n /** Burn loop on or off (default on). */\n readonly burnLoop?: boolean\n}\n\nexport type DestructionSound = {\n /** Pass to `createDestructionRenderer({ onSound })`. */\n readonly onSound: (key: string, point: Vec3, volume: number) => void\n /** The rule a key resolves to, if any. */\n rule(key: string): SoundKeyRule | undefined\n /** Parts burning now. */\n readonly burning: () => number\n dispose(): void\n}\n\nexport const DEFAULT_FIRE = { perFire: 0.05, max: 0.2 } as const\n\n/**\n * Plays the renderer's sound keys on a game-audio engine: the bank is registered in the engine, a key becomes a positional sound at the point, and\n * `burn_loop` / `burn_end` (a part starts to burn, a part burns out or is put out) drive one fire loop whose volume follows how many parts burn.\n */\nexport function createDestructionSound(engine: AudioEngine, options: DestructionSoundOptions = {}): DestructionSound {\n engine.register(DESTRUCTION_SOUND_BANK)\n engine.register(GAME_SFX_BANK)\n const fire = { ...DEFAULT_FIRE, ...options.fire }\n const rules: Record<string, SoundKeyRule | null | undefined> = { ...DESTRUCTION_SOUND_KEYS.art_scene, ...(options.style === 'game' ? DESTRUCTION_SOUND_KEYS.game : {}), ...options.keys }\n let loop: AudioLoopHandle | undefined\n let burning = 0\n\n const setFire = (): void => {\n if (options.burnLoop === false) return\n if (burning <= 0) {\n loop?.stop()\n loop = undefined\n return\n }\n loop ??= engine.loop('burn_loop')\n loop.set({ volume: Math.min(fire.max, fire.perFire * burning) })\n }\n\n return {\n onSound(key, point, volume) {\n if (key === 'burn_loop') {\n burning += 1\n setFire()\n return\n }\n if (key === 'burn_end') {\n if (burning > 0) burning -= 1\n setFire()\n return\n }\n const rule = rules[key]\n if (!rule) return\n const sound = rule.above && volume >= rule.above.volume ? rule.above.sound : rule.sound\n engine.play(sound, { position: point, volume: volume * (rule.volumeScale ?? 1), ...(rule.params ? { params: rule.params } : {}) })\n },\n rule: (key) => rules[key] ?? undefined,\n burning: () => burning,\n dispose() {\n loop?.stop()\n loop = undefined\n burning = 0\n },\n }\n}\n"],"mappings":"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","names":["scene","scene","geo","noise","materialsOf"]}
|