@adatechnology/game-destruction-three 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +135 -2
- package/dist/index.d.ts +145 -0
- package/dist/index.global.js +3545 -0
- package/dist/index.global.js.map +1 -0
- package/dist/index.js +2475 -0
- package/dist/index.js.map +1 -0
- package/package.json +58 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/math.ts","../src/fragments.ts","../src/ground.ts","../src/particles.ts","../src/pieces.ts","../src/heat.ts","../src/visual.ts","../src/renderer.ts","../src/spec.ts"],"sourcesContent":["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 /** 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): void {\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 }\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 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 { DebrisKind, Vec3 } from '@adatechnology/game-destruction'\nimport { clamp, createRng, hexToRgb, lerp } from './math'\n\n/** Every particle kind the renderer can emit. */\nexport type ParticleKind = DebrisKind | 'fire' | 'flash' | 'foam'\n\ninterface KindDef {\n additive: boolean\n /** Life range in seconds. */\n life: [number, number]\n /** Start size range in metres (billboard diameter). */\n size: [number, number]\n /** Size multiplier reached at the end of the life. */\n grow: number\n /** Gravity multiplier (1 = full gravity). */\n gravity: number\n /** Constant upward acceleration in m/s² (heat, steam). */\n rise: number\n /** Velocity damping per second. */\n drag: number\n c0: number\n c1: number\n alpha: number\n /** Fraction of the life spent fading in. */\n fadeIn: number\n /** How much of the emission direction follows the surface normal (1) versus a random direction (0). */\n cone: number\n /** What happens at ground height. */\n ground: 'none' | 'bounce' | 'stop' | 'land'\n flutter?: number\n flicker?: number\n}\n\nconst KINDS: Record<ParticleKind, KindDef> = {\n fire: { additive: true, life: [0.45, 0.9], size: [0.1, 0.2], grow: 0.3, gravity: 0, rise: 2.4, drag: 1.2, c0: 0xffc040, c1: 0xc02000, alpha: 0.9, fadeIn: 0.12, cone: 0.7, ground: 'none', flicker: 0.35 },\n smoke: { additive: false, life: [1.8, 3.2], size: [0.14, 0.24], grow: 3.2, gravity: 0, rise: 0.7, drag: 0.8, c0: 0x666666, c1: 0x9a9a9a, alpha: 0.35, fadeIn: 0.15, cone: 0.6, ground: 'none' },\n sparks: { additive: true, life: [0.25, 0.6], size: [0.018, 0.03], grow: 0.5, gravity: 1, rise: 0, drag: 0.3, c0: 0xfff2a0, c1: 0xff6a10, alpha: 1, fadeIn: 0.02, cone: 0.55, ground: 'bounce' },\n dust: { additive: false, life: [1, 2], size: [0.08, 0.14], grow: 2.5, gravity: 0.05, rise: 0, drag: 2.5, c0: 0x8d8579, c1: 0x8d8579, alpha: 0.4, fadeIn: 0.1, cone: 0.4, ground: 'none' },\n shards: { additive: true, life: [0.8, 1.4], size: [0.02, 0.035], grow: 0.8, gravity: 1, rise: 0, drag: 0.2, c0: 0xdff4ff, c1: 0x9fd0ff, alpha: 0.9, fadeIn: 0.03, cone: 0.5, ground: 'bounce', flicker: 0.5 },\n splinters: { additive: false, life: [0.8, 1.5], size: [0.02, 0.035], grow: 1, gravity: 1, rise: 0, drag: 0.3, c0: 0xa0764a, c1: 0x7a5530, alpha: 1, fadeIn: 0.02, cone: 0.5, ground: 'bounce' },\n chips: { additive: false, life: [0.8, 1.5], size: [0.025, 0.04], grow: 1, gravity: 1, rise: 0, drag: 0.3, c0: 0x8a8378, c1: 0x6e685f, alpha: 1, fadeIn: 0.02, cone: 0.5, ground: 'bounce' },\n fibers: { additive: false, life: [1.5, 2.5], size: [0.02, 0.03], grow: 1, gravity: 0.15, rise: 0, drag: 2, c0: 0xb8a888, c1: 0xb8a888, alpha: 0.9, fadeIn: 0.05, cone: 0.4, ground: 'stop', flutter: 2.5 },\n leaves: { additive: false, life: [1.5, 2.8], size: [0.03, 0.05], grow: 1, gravity: 0.15, rise: 0, drag: 2, c0: 0x5b9a3c, c1: 0x4a7f30, alpha: 0.95, fadeIn: 0.05, cone: 0.4, ground: 'stop', flutter: 2.8 },\n drips: { additive: false, life: [2, 3], size: [0.025, 0.035], grow: 1, gravity: 1, rise: 0, drag: 0, c0: 0x6a6a6a, c1: 0x6a6a6a, alpha: 1, fadeIn: 0.01, cone: 0.2, ground: 'land' },\n ash: { additive: false, life: [2, 4], size: [0.02, 0.04], grow: 1.2, gravity: 0.08, rise: 0, drag: 1.5, c0: 0x2a2623, c1: 0x1a1816, alpha: 0.8, fadeIn: 0.1, cone: 0.5, ground: 'stop', flutter: 0.6 },\n steam: { additive: false, life: [1, 2], size: [0.12, 0.2], grow: 3, gravity: 0, rise: 0.9, drag: 1, c0: 0xffffff, c1: 0xe0e8ee, alpha: 0.35, fadeIn: 0.15, cone: 0.6, ground: 'none' },\n flash: { additive: true, life: [0.12, 0.2], size: [1.2, 1.8], grow: 1.6, gravity: 0, rise: 0, drag: 0, c0: 0xfff3c0, c1: 0xff9030, alpha: 1, fadeIn: 0.1, cone: 0, ground: 'none' },\n foam: { additive: false, life: [1, 1.8], size: [0.06, 0.1], grow: 1.5, gravity: 0.6, rise: 0, drag: 1.5, c0: 0xf4f8ff, c1: 0xdde6f0, alpha: 0.8, fadeIn: 0.05, cone: 0.5, ground: 'stop' },\n}\n\nconst KIND_IDS = Object.keys(KINDS) as ParticleKind[]\nconst KIND_INDEX: Record<string, number> = {}\nKIND_IDS.forEach((k, i) => (KIND_INDEX[k] = i))\nconst KIND_LIST: KindDef[] = KIND_IDS.map((k) => KINDS[k])\n\n/** Per-spawn overrides. */\nexport interface SpawnOptions {\n /** `0xRRGGBB`: replaces the kind's colour ramp. */\n color?: number\n /** Multiplier on the start size. */\n size?: number\n /** Multiplier on the life. */\n life?: number\n /** Multiplier on the peak alpha. */\n alpha?: number\n /** Non-zero: a `drips` particle that reaches the ground calls `onLand` with this tag. */\n tag?: number\n}\n\nconst VERT = `\nuniform float uScale;\nattribute float size;\nattribute float alpha;\nattribute vec3 pcolor;\nvarying float vAlpha;\nvarying vec3 vColor;\nvoid main() {\n vAlpha = alpha;\n vColor = pcolor;\n vec4 mv = modelViewMatrix * vec4(position, 1.0);\n gl_PointSize = min(size * uScale / max(0.1, -mv.z), 256.0);\n gl_Position = projectionMatrix * mv;\n}`\n\nconst FRAG = `\nvarying float vAlpha;\nvarying vec3 vColor;\nvoid main() {\n float d = length(gl_PointCoord - vec2(0.5)) * 2.0;\n float a = (1.0 - smoothstep(0.35, 1.0, d)) * vAlpha;\n if (a < 0.004) discard;\n gl_FragColor = vec4(vColor, a);\n}`\n\ninterface PoolHost {\n groundAt: (x: number, z: number) => number\n gravity: number\n onLand: (x: number, y: number, z: number, color: number, tag: number) => void\n}\n\n/** One fixed-size ring buffer of particles drawn as a single `THREE.Points` with a soft round sprite computed in the shader. */\nclass Pool {\n readonly points: THREE_NS.Points\n readonly geometry: THREE_NS.BufferGeometry\n readonly material: THREE_NS.ShaderMaterial\n live = 0\n private next = 0\n private high = 0\n private readonly pos: Float32Array\n private readonly col: Float32Array\n private readonly alp: Float32Array\n private readonly siz: Float32Array\n private readonly vel: Float32Array\n private readonly age: Float32Array\n private readonly life: Float32Array\n private readonly size0: Float32Array\n private readonly alive: Uint8Array\n private readonly kind: Uint8Array\n private readonly seed: Float32Array\n private readonly alphaMul: Float32Array\n private readonly tag: Int32Array\n private readonly colorHex: Int32Array\n private readonly bounced: Uint8Array\n\n constructor(\n THREE: typeof THREE_NS,\n readonly capacity: number,\n additive: boolean,\n pointScale: number,\n ) {\n const n = Math.max(1, capacity)\n this.pos = new Float32Array(n * 3)\n this.col = new Float32Array(n * 3)\n this.alp = new Float32Array(n)\n this.siz = new Float32Array(n)\n this.vel = new Float32Array(n * 3)\n this.age = new Float32Array(n)\n this.life = new Float32Array(n)\n this.size0 = new Float32Array(n)\n this.alive = new Uint8Array(n)\n this.kind = new Uint8Array(n)\n this.seed = new Float32Array(n)\n this.alphaMul = new Float32Array(n)\n this.tag = new Int32Array(n)\n this.colorHex = new Int32Array(n)\n this.bounced = new Uint8Array(n)\n this.geometry = new THREE.BufferGeometry()\n const attr = (a: Float32Array, size: number) => {\n const at = new THREE.BufferAttribute(a, size)\n at.setUsage(THREE.DynamicDrawUsage)\n return at\n }\n this.geometry.setAttribute('position', attr(this.pos, 3))\n this.geometry.setAttribute('pcolor', attr(this.col, 3))\n this.geometry.setAttribute('alpha', attr(this.alp, 1))\n this.geometry.setAttribute('size', attr(this.siz, 1))\n this.geometry.setDrawRange(0, 0)\n this.material = new THREE.ShaderMaterial({\n uniforms: { uScale: { value: pointScale } },\n vertexShader: VERT,\n fragmentShader: FRAG,\n transparent: true,\n depthWrite: false,\n blending: additive ? THREE.AdditiveBlending : THREE.NormalBlending,\n })\n this.points = new THREE.Points(this.geometry, this.material)\n this.points.frustumCulled = false\n this.points.name = additive ? 'destruction-particles-additive' : 'destruction-particles'\n this.points.renderOrder = additive ? 11 : 10\n }\n\n spawn(kind: number, x: number, y: number, z: number, vx: number, vy: number, vz: number, def: KindDef, rnd: () => number, o?: SpawnOptions): void {\n if (this.capacity <= 0) return\n const i = this.next\n this.next = (this.next + 1) % this.capacity\n if (this.alive[i]) this.live--\n this.alive[i] = 1\n this.live++\n if (i + 1 > this.high) this.high = i + 1\n this.kind[i] = kind\n this.pos[i * 3] = x\n this.pos[i * 3 + 1] = y\n this.pos[i * 3 + 2] = z\n this.vel[i * 3] = vx\n this.vel[i * 3 + 1] = vy\n this.vel[i * 3 + 2] = vz\n this.age[i] = 0\n this.life[i] = lerp(def.life[0], def.life[1], rnd()) * (o?.life ?? 1)\n this.size0[i] = lerp(def.size[0], def.size[1], rnd()) * (o?.size ?? 1)\n this.seed[i] = rnd()\n this.alphaMul[i] = o?.alpha ?? 1\n this.tag[i] = o?.tag ?? 0\n this.colorHex[i] = o?.color ?? -1\n this.bounced[i] = 0\n this.siz[i] = this.size0[i]\n this.alp[i] = 0\n }\n\n private kill(i: number): void {\n if (!this.alive[i]) return\n this.alive[i] = 0\n this.live--\n this.alp[i] = 0\n this.siz[i] = 0\n }\n\n clear(): void {\n this.alive.fill(0)\n this.alp.fill(0)\n this.siz.fill(0)\n this.live = 0\n this.high = 0\n this.next = 0\n this.geometry.setDrawRange(0, 0)\n }\n\n /** Move a live particle (used by external pushes such as blasts). */\n push(cx: number, cy: number, cz: number, radius: number, speed: number): void {\n for (let i = 0; i < this.high; i++) {\n if (!this.alive[i]) continue\n const dx = this.pos[i * 3] - cx\n const dy = this.pos[i * 3 + 1] - cy\n const dz = this.pos[i * 3 + 2] - cz\n const d = Math.hypot(dx, dy, dz)\n if (d > radius || d < 1e-4) continue\n const f = (1 - d / radius) * speed\n this.vel[i * 3] += (dx / d) * f\n this.vel[i * 3 + 1] += (dy / d) * f\n this.vel[i * 3 + 2] += (dz / d) * f\n }\n }\n\n update(dt: number, host: PoolHost): void {\n let top = 0\n for (let i = 0; i < this.high; i++) {\n if (!this.alive[i]) continue\n const def = KIND_LIST[this.kind[i]]\n const age = (this.age[i] += dt)\n const life = this.life[i]\n if (age >= life) {\n this.kill(i)\n continue\n }\n const t = age / life\n const i3 = i * 3\n let vx = this.vel[i3]\n let vy = this.vel[i3 + 1]\n let vz = this.vel[i3 + 2]\n vy += (def.rise - def.gravity * host.gravity) * dt\n if (def.flutter) {\n const ph = age * 7 + this.seed[i] * 40\n vx += Math.sin(ph) * def.flutter * dt\n vz += Math.cos(ph * 1.3) * def.flutter * dt\n }\n if (def.drag > 0) {\n const k = Math.exp(-def.drag * dt)\n vx *= k\n vy *= k\n vz *= k\n }\n const x = this.pos[i3] + vx * dt\n let y = this.pos[i3 + 1] + vy * dt\n const z = this.pos[i3 + 2] + vz * dt\n if (def.ground !== 'none') {\n const gy = host.groundAt(x, z) + 0.005\n if (y < gy) {\n if (def.ground === 'land') {\n const tag = this.tag[i]\n if (tag !== 0) host.onLand(x, gy, z, this.colorHex[i] >= 0 ? this.colorHex[i] : def.c0, tag)\n this.kill(i)\n continue\n }\n y = gy\n if (def.ground === 'bounce' && !this.bounced[i]) {\n this.bounced[i] = 1\n vy = Math.abs(vy) * 0.35\n vx *= 0.6\n vz *= 0.6\n } else {\n vx = vy = vz = 0\n }\n }\n }\n this.vel[i3] = vx\n this.vel[i3 + 1] = vy\n this.vel[i3 + 2] = vz\n this.pos[i3] = x\n this.pos[i3 + 1] = y\n this.pos[i3 + 2] = z\n this.siz[i] = this.size0[i] * lerp(1, def.grow, t)\n const c0 = this.colorHex[i] >= 0 ? this.colorHex[i] : def.c0\n const c1 = this.colorHex[i] >= 0 ? this.colorHex[i] : def.c1\n const a = hexToRgb(c0)\n const b = hexToRgb(c1)\n this.col[i3] = lerp(a[0], b[0], t)\n this.col[i3 + 1] = lerp(a[1], b[1], t)\n this.col[i3 + 2] = lerp(a[2], b[2], t)\n let env = t < def.fadeIn ? t / def.fadeIn : 1 - (t - def.fadeIn) / (1 - def.fadeIn)\n if (def.flicker) env *= 1 - def.flicker * (0.5 + 0.5 * Math.sin(age * 38 + this.seed[i] * 50))\n this.alp[i] = clamp(env, 0, 1) * def.alpha * this.alphaMul[i]\n top = i + 1\n }\n this.high = top\n this.geometry.setDrawRange(0, top)\n for (const name of ['position', 'pcolor', 'alpha', 'size']) {\n ;(this.geometry.getAttribute(name) as THREE_NS.BufferAttribute).needsUpdate = true\n }\n }\n\n dispose(): void {\n this.geometry.dispose()\n this.material.dispose()\n }\n}\n\nexport interface ParticleSystemOptions {\n capacity: number\n scene: THREE_NS.Scene\n /** Count multiplier for bursts (0.6 on low quality). */\n density: number\n /** Pixels of point size per metre at a distance of one metre; roughly `viewportHeight / (2 * tan(fov / 2))`. */\n pointScale: number\n groundAt: (x: number, z: number) => number\n gravity: number\n onLand: (x: number, y: number, z: number, color: number, tag: number) => void\n}\n\n/**\n * Two pooled particle systems (additive and normal blending), each a single `THREE.Points` with fixed-size buffers used as a ring. The Points are\n * added to the scene on first use and removed again by `detach`, so an idle renderer leaves nothing in the scene.\n */\nexport class ParticleSystem {\n private readonly add: Pool\n private readonly normal: Pool\n private readonly rng = createRng(0x9e3779b1)\n private attached = false\n private readonly host: PoolHost\n\n constructor(\n THREE: typeof THREE_NS,\n private readonly o: ParticleSystemOptions,\n ) {\n const addCap = Math.floor(o.capacity * 0.4)\n this.add = new Pool(THREE, addCap, true, o.pointScale)\n this.normal = new Pool(THREE, o.capacity - addCap, false, o.pointScale)\n this.host = { groundAt: o.groundAt, gravity: o.gravity, onLand: o.onLand }\n }\n\n get capacity(): number {\n return this.add.capacity + this.normal.capacity\n }\n\n get live(): number {\n return this.add.live + this.normal.live\n }\n\n private ensureAttached(): void {\n if (this.attached) return\n this.attached = true\n this.o.scene.add(this.add.points, this.normal.points)\n }\n\n /** Remove the Points from the scene (they come back on the next emit). */\n detach(): void {\n if (!this.attached) return\n this.attached = false\n this.o.scene.remove(this.add.points, this.normal.points)\n }\n\n /** Spawn one particle with an explicit velocity. */\n spawn(kind: ParticleKind, p: Vec3, v: Vec3, opts?: SpawnOptions): void {\n const def = KINDS[kind]\n this.ensureAttached()\n ;(def.additive ? this.add : this.normal).spawn(KIND_INDEX[kind], p[0], p[1], p[2], v[0], v[1], v[2], def, this.rng, opts)\n }\n\n /** Spawn `count` particles leaving `point` around `normal` at about `speed` m/s. */\n burst(kind: ParticleKind, point: Vec3, normal: Vec3, count: number, speed = 1, opts?: SpawnOptions): void {\n const def = KINDS[kind]\n const n = Math.max(0, Math.round(count * this.o.density))\n const rnd = this.rng\n const nl = Math.hypot(normal[0], normal[1], normal[2]) || 1\n const nx = normal[0] / nl\n const ny = normal[1] / nl\n const nz = normal[2] / nl\n for (let k = 0; k < n; k++) {\n // random unit vector\n const u = rnd() * 2 - 1\n const ph = rnd() * Math.PI * 2\n const s = Math.sqrt(1 - u * u)\n const rx = s * Math.cos(ph)\n const ry = u\n const rz = s * Math.sin(ph)\n let dx = nx * def.cone + rx * (1 - def.cone)\n let dy = ny * def.cone + ry * (1 - def.cone)\n let dz = nz * def.cone + rz * (1 - def.cone)\n // a little scatter even for a pure cone, and never push into the surface for debris\n dx += rx * 0.35\n dy += ry * 0.35\n dz += rz * 0.35\n const l = Math.hypot(dx, dy, dz) || 1\n const sp = speed * (0.35 + 0.65 * rnd())\n const jitter = 0.01 + (def.size[1] > 0.5 ? 0.15 : 0.02)\n this.spawn(\n kind,\n [point[0] + (rnd() - 0.5) * jitter, point[1] + (rnd() - 0.5) * jitter, point[2] + (rnd() - 0.5) * jitter],\n [(dx / l) * sp, (dy / l) * sp, (dz / l) * sp],\n opts,\n )\n }\n }\n\n /** Blast wave: shove live particles away from a point. */\n push(point: Vec3, radius: number, speed: number): void {\n this.add.push(point[0], point[1], point[2], radius, speed)\n this.normal.push(point[0], point[1], point[2], radius, speed)\n }\n\n update(dt: number): void {\n if (this.add.live > 0 || this.add.points.geometry.drawRange.count > 0) this.add.update(dt, this.host)\n if (this.normal.live > 0 || this.normal.points.geometry.drawRange.count > 0) this.normal.update(dt, this.host)\n }\n\n clear(): void {\n this.add.clear()\n this.normal.clear()\n this.detach()\n }\n\n dispose(): void {\n this.detach()\n this.add.dispose()\n this.normal.dispose()\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\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\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 // 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 && 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 { 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, 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 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 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 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 /** 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 }\n\n makeMeshVis(mesh: Mesh, home: string): MeshVis {\n return {\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 }\n }\n\n vertexCount(mv: MeshVis): number {\n return mv.mesh.geometry.getAttribute(POS_ATTR)?.count ?? 0\n }\n\n /** Colour of the original material (before any char), `0xRRGGBB`, or -1. */\n baseColorHex(mv: MeshVis): number {\n const c = mv.baseColors?.[0] ?? colorOf(materialsOf(mv.origMaterial)[0])\n return c ? c.getHex() : -1\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.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 // ------------------------------------------------------------------------------------------------------------------------------------\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 if (!geo.boundingBox) geo.computeBoundingBox()\n if (geo.boundingBox && geo.boundingBox.distanceToPoint(lp) > r) return false\n if (!this.ownGeometry(mv)) return false\n const 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 for (let i = 0; i < work.length; 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 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 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 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 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 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.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) mv.mesh.visible = false\n }\n\n /** Bring one mesh back to how it was when it was bound. */\n restoreMesh(mv: MeshVis): void {\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","import type * as THREE_NS from 'three'\nimport type { DebrisKind, DestructionEvent, MaterialDef, PartSpec, Vec3 } from '@adatechnology/game-destruction'\nimport { FragmentSystem } from './fragments'\nimport { GroundSpots } from './ground'\nimport type { Bound, PartVis, PieceBody } from './internal'\nimport { clamp, createRng, hashNumbers, hashString, mixHex } from './math'\nimport { ParticleSystem } from './particles'\nimport type { ParticleKind } from './particles'\nimport { PieceSystem } from './pieces'\nimport type { DestructionRenderer, BindOptions, Mesh, Object3D, Piece, RendererOptions, ThreeNamespace } from './types'\nimport { Visuals } from './visual'\n\ntype Ev<T extends DestructionEvent['type']> = Extract<DestructionEvent, { type: T }>\n\nconst GLOW_FROM_C = 430\nconst QUEUE_CAP = 4000\n\ninterface FireEmitter {\n object: string\n part: string\n point: Vec3\n accFire: number\n accSmoke: 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\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 particles: ParticleSystem\n private readonly fragments: FragmentSystem\n private readonly ground: GroundSpots\n private readonly pieceSys: PieceSystem\n private readonly active = new Map<string, { object: string; part: string }>()\n private readonly fires = new Map<string, FireEmitter>()\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 light: THREE_NS.PointLight | null = null\n private lightT = 0\n private lightDur = 0.3\n private lightPeak = 0\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.particles = new ParticleSystem(THREE, {\n capacity: maxParticles,\n scene: o.scene,\n density: this.low ? 0.6 : 1,\n pointScale: o.pointScale ?? 700,\n groundAt: this.groundAt,\n gravity: this.gravity,\n onLand: (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 })\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.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, Mesh[]>()\n const taken = new Set<Mesh>()\n const add = (pid: string, m: Mesh): void => {\n if (taken.has(m)) return\n taken.add(m)\n const l = byPart.get(pid)\n if (l) l.push(m)\n else byPart.set(pid, [m])\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]) for (const m of meshesIn(o)) add(pid, m)\n }\n } else {\n const leftovers: Mesh[] = []\n for (const m of meshesIn(root)) {\n const ud = m.userData?.destructionPart\n if (typeof ud === 'string' && 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 for (const pid of partIds) bound.parts.set(pid, this.makePartVis(objectId, pid, state?.parts.find((p) => p.id === pid)?.material ?? '', byPart.get(pid) ?? []))\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))\n }\n this.bounds.set(objectId, bound)\n }\n\n private makePartVis(home: string, id: string, material: string, meshes: Mesh[]): PartVis {\n return { id, home, material, meshes: meshes.map((m) => this.visuals.makeMeshVis(m, home)), 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: Mesh[]): { 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 for (const m of meshes) {\n const g = m.geometry\n if (!g.boundingBox) g.computeBoundingBox()\n if (!g.boundingBox || g.boundingBox.isEmpty()) continue\n total.union(g.boundingBox.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): Mesh[] {\n const out: Mesh[] = []\n for (const pv of b.parts.values()) if (pv.gone === 'none') for (const mv of pv.meshes) out.push(mv.mesh)\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.updateLight(dt)\n this.particles.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.particles.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.particles.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 '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.fires.set(`${ev.object}|${ev.part}`, { object: ev.object, part: ev.part, point: ev.point, accFire: 0, accSmoke: 0 })\n this.activate(ev.object, ev.part)\n this.particles.burst('fire', ev.point, [0, 1, 0], 6, 1)\n this.sound('ignite', ev.point, 0.7)\n this.sound('burn_loop', ev.point, 0.5)\n break\n case 'extinguish': {\n const f = this.fires.get(`${ev.object}|${ev.part}`)\n if (f) {\n this.fires.delete(`${ev.object}|${ev.part}`)\n this.particles.burst('steam', f.point, [0, 1, 0], 14, 1.2)\n }\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.fires.delete(`${ev.object}|${ev.part}`)\n this.particles.burst('ash', ev.point, [0, 1, 0], 16, 1)\n this.particles.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.particles.spawn('drips', ev.point, [(this.rng() - 0.5) * 0.1, -0.1, (this.rng() - 0.5) * 0.1], { color, tag })\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.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) return c.getHex()\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 (!mv.mesh.visible) continue\n const d = this.box.setFromObject(mv.mesh).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 (!mv.mesh.visible) continue\n this.visuals.applyDent(mv, wp, wn, ev.dent)\n }\n if (def?.tags?.includes('metal')) this.particles.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.particles.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 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.particles.burst('shards', ev.point, up, 18 * sizeK, 3)\n break\n case 'crumble':\n this.particles.burst('dust', ev.point, up, 16 * sizeK, 1.2, { color: pv ? (this.partColor(pv, def) ?? undefined) : undefined })\n this.particles.burst('chips', ev.point, up, 6, 3)\n break\n case 'splinter':\n this.particles.burst('splinters', ev.point, up, 14 * sizeK, 3)\n this.particles.burst('dust', ev.point, up, 5, 0.8, { color: 0xb59a74 })\n break\n case 'tear':\n this.particles.burst('fibers', ev.point, up, 12 * sizeK, 1.6, { color: color })\n break\n case 'snap':\n this.particles.burst('chips', ev.point, up, 8 * sizeK, 3)\n break\n default:\n this.particles.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 if (!this.autoSplit) return\n const b = this.bounds.get(ev.object)\n if (!b) return\n const st = this.world.state(ev.object)\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(ev.object, 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(ev.object))\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 group.attach(mv.mesh)\n mv.moved = true\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'>): void {\n const p = ev.point\n const k = clamp(ev.radius / 3, 0.4, 2.5)\n this.particles.burst('flash', p, [0, 1, 0], 1, 0, { size: k })\n this.particles.burst('fire', p, [0, 1, 0], 34 * k, 4 * k, { size: 1 + k * 0.5 })\n this.particles.burst('smoke', p, [0, 1, 0], 24 * k, 2.2, { color: SMOKE_TONES.black, size: 1 + k * 0.6 })\n this.particles.burst('dust', p, [0, 1, 0], 22 * k, 3.5 * k)\n this.particles.burst('sparks', p, [0, 1, 0], 16 * k, 8)\n this.particles.push(p, ev.radius, 4)\n if (this.o.explosionLight !== false) {\n if (!this.light) {\n this.light = new this.THREE.PointLight(0xffa860, 0, 10, 2)\n this.light.name = 'destruction-explosion-light'\n }\n if (!this.light.parent) this.scene.add(this.light)\n this.light.position.set(p[0], p[1] + 0.5, p[2])\n this.light.distance = Math.max(6, ev.radius * 3)\n this.lightPeak = clamp(Math.sqrt(Math.max(1, ev.energy)) * 0.6, 10, 400)\n this.lightDur = 0.35\n this.lightT = this.lightDur\n }\n // shove pieces and fragments\n const c = this.v1\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 const speed = Math.min(30, Math.sqrt((2 * ev.energy * 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(ev.energy) * 0.08))\n this.sound('explode', p, clamp(0.5 + ev.radius / 10, 0.5, 1))\n }\n\n private updateLight(dt: number): void {\n if (!this.light || this.lightT <= 0) return\n this.lightT = Math.max(0, this.lightT - dt)\n const t = this.lightT / this.lightDur\n this.light.intensity = this.lightPeak * t * t\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, dt)\n else this.fires.delete(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.box.setFromObject(mv.mesh))\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.particles.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, dt: number): void {\n const bb = this.box\n bb.makeEmpty()\n const tmp = new this.THREE.Box3()\n for (const mv of pv.meshes) if (mv.mesh.visible) bb.union(tmp.setFromObject(mv.mesh))\n let cx = f.point[0]\n let cy = f.point[1]\n let cz = f.point[2]\n let sx = 0.2\n let sy = 0.2\n let sz = 0.2\n if (!bb.isEmpty()) {\n const c = bb.getCenter(this.v1)\n const s = bb.getSize(this.v2)\n cx = c.x\n cy = bb.min.y\n cz = c.z\n sx = s.x\n sy = s.y\n sz = s.z\n }\n const vol = clamp(Math.cbrt(Math.max(sx * sy * sz, 1e-5)), 0.05, 1.5)\n f.accFire += (18 + 70 * vol) * dt\n f.accSmoke += (6 + 24 * vol) * dt\n const tone = SMOKE_TONES[def?.thermal.smoke ?? 'grey']\n const rnd = this.rng\n while (f.accFire >= 1) {\n f.accFire -= 1\n this.particles.spawn('fire', [cx + (rnd() - 0.5) * sx, cy + sy * (0.3 + 0.7 * rnd()), cz + (rnd() - 0.5) * sz], [(rnd() - 0.5) * 0.4, 0.5 + rnd() * 0.9, (rnd() - 0.5) * 0.4], { size: 0.6 + vol * 0.8 })\n }\n while (f.accSmoke >= 1) {\n f.accSmoke -= 1\n this.particles.spawn('smoke', [cx + (rnd() - 0.5) * sx, cy + sy * (0.8 + 0.4 * rnd()), cz + (rnd() - 0.5) * sz], [(rnd() - 0.5) * 0.3 + 0.1, 0.4 + rnd() * 0.5, (rnd() - 0.5) * 0.3], { color: tone, size: 0.6 + vol })\n }\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.particles.spawn('steam', l.point, vel, { color, size: 0.5, alpha: 0.5 })\n else this.particles.spawn('drips', l.point, vel, { color, tag: this.rng() < 0.03 ? this.tagOf(l.object) : 0 })\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.particles.burst(kind as ParticleKind, point, normal, count, speed ?? DEFAULT_SPEED[kind] ?? 1, kind === 'smoke' ? { color: SMOKE_TONES.grey } : undefined)\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.fires.delete(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 }\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 this.fires.clear()\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.particles.clear()\n if (this.light) {\n this.light.intensity = 0\n this.lightT = 0\n this.scene.remove(this.light)\n }\n }\n\n stats(): { fragments: number; particles: number; pieces: number; decals: number } {\n return { fragments: this.fragments.count, particles: this.particles.live, pieces: this.pieceSys.list.length, decals: this.visuals.decalCount + this.ground.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.particles.dispose()\n this.visuals.dispose()\n this.light?.dispose?.()\n this.light = null\n this.disposed = true\n }\n}\n","import type * as THREE_NS from 'three'\nimport { guessMaterial, inferJoints } from '@adatechnology/game-destruction'\nimport type { 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}\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 material =\n options.materialOf?.(o) ??\n (typeof ud.destructionMaterial === 'string' ? (ud.destructionMaterial as string) : undefined) ??\n guessMaterial(`${o.name} ${matName} ${typeof ud.material === 'string' ? ud.material : ''}`) ??\n fallback\n const explicit = typeof ud.destructionPart === 'string' && ud.destructionPart ? (ud.destructionPart as string) : 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 }\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 return { spec, parts: meshesOf }\n}\n"],"mappings":"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","names":["geo","materialsOf"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,61 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adatechnology/game-destruction-three",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"description": "three.js renderer for @adatechnology/game-destruction: dents, holes, char, heat glow, melting, fragments, loose pieces and pooled particles (fire, smoke, sparks, dust, shards, splinters).",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"game",
|
|
8
|
+
"destruction",
|
|
9
|
+
"damage",
|
|
10
|
+
"materials",
|
|
11
|
+
"fracture",
|
|
12
|
+
"fire",
|
|
13
|
+
"three",
|
|
14
|
+
"threejs"
|
|
15
|
+
],
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/Andersonfrfilho/adatechnology-game-kit.git",
|
|
19
|
+
"directory": "packages/game-destruction-three"
|
|
20
|
+
},
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"type": "module",
|
|
25
|
+
"main": "dist/index.js",
|
|
26
|
+
"module": "dist/index.js",
|
|
27
|
+
"types": "dist/index.d.ts",
|
|
28
|
+
"unpkg": "dist/index.global.js",
|
|
29
|
+
"jsdelivr": "dist/index.global.js",
|
|
30
|
+
"sideEffects": false,
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"import": "./dist/index.js"
|
|
35
|
+
},
|
|
36
|
+
"./global": "./dist/index.global.js"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist"
|
|
40
|
+
],
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@adatechnology/game-contracts": "0.1.0",
|
|
43
|
+
"@adatechnology/game-destruction": "0.1.0"
|
|
44
|
+
},
|
|
45
|
+
"peerDependencies": {
|
|
46
|
+
"three": "^0.160.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "^22.10.7",
|
|
50
|
+
"@types/three": "^0.160.0",
|
|
51
|
+
"three": "^0.160.1",
|
|
52
|
+
"tsup": "^8.5.1",
|
|
53
|
+
"typescript": "^5.7.3",
|
|
54
|
+
"vitest": "^3.2.4"
|
|
55
|
+
},
|
|
56
|
+
"scripts": {
|
|
57
|
+
"build": "tsup",
|
|
58
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
59
|
+
"test": "vitest run"
|
|
60
|
+
}
|
|
6
61
|
}
|