@adatechnology/game-floorplan-three 0.8.2 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/chunk-QUVGWVEC.js +8882 -0
- package/dist/chunk-QUVGWVEC.js.map +1 -0
- package/dist/index.d.ts +6 -349
- package/dist/index.global.js +418 -96
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +23 -8627
- package/dist/index.js.map +1 -1
- package/dist/testing-ikPy2Nxl.d.ts +379 -0
- package/dist/testing.d.ts +3 -0
- package/dist/testing.js +19 -0
- package/dist/testing.js.map +1 -0
- package/package.json +20 -14
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/create.ts","../src/locale.ts","../src/statics.ts","../src/kernel/geometry.ts","../src/kernel/noise.ts","../src/materials/textures.ts","../src/materials/materials.ts","../src/kernel/close-scene.ts","../src/house/helpers.ts","../src/house/walls.ts","../src/house/doors.ts","../src/house/windows.ts","../src/house/floors.ts","../src/house/stairs.ts","../src/lights/fixtures.ts","../src/lights/decor.ts","../src/lot/terrain.ts","../src/lot/perimeter.ts","../src/lot/gates.ts","../src/roof/roofs.ts","../src/roof/gutters.ts","../src/roof/slabs.ts","../src/roof/tiles.ts","../src/roof/rect.ts","../src/mirrors.ts","../src/cars.ts","../src/house/building.ts","../src/utilities/water.ts","../src/utilities/electrical.ts","../src/house/baseboard.ts","../src/utilities/solar.ts","../src/house/outbuildings.ts","../src/furniture/api.ts","../src/furniture/builders.ts","../src/furniture/type-table.ts","../src/furniture/taps.ts","../src/furniture/fixtures.ts","../src/furniture/plants.ts","../src/furniture/yard.ts","../src/furniture/extra-types.ts","../src/furniture/place-items.ts","../src/vegetation/bridge.ts","../src/interaction/state.ts","../src/interaction/collision.ts","../src/interaction/items.ts","../src/interaction/fittings.ts","../src/interaction/doors.ts","../src/interaction/target.ts","../src/interactables/bridge.ts","../src/animation/clotheslines.ts","../src/build/instance.ts","../src/interactables/kit.ts","../src/lights/room-light.ts","../src/destruction/pieces.ts","../src/destruction/panels.ts","../src/destruction/breach.ts","../src/destruction/world.ts","../src/build/build.ts","../src/build/api.ts","../src/navigation/floor-navigator.ts","../src/navigation/from-house.ts","../src/navigation/bind.ts","../src/test-area/text.ts","../src/test-area/scenarios.ts","../src/test-area/specimens.ts","../src/test-area/module.ts","../src/furniture/spec.ts","../src/wall.ts"],"sourcesContent":["import * as props3d from '@adatechnology/game-props3d'\nimport { shapeGeometries } from '@adatechnology/game-shapes-three'\n\nimport type { Kernel, Shared } from './kernel-types.js'\nimport { createTranslator } from './locale.js'\nimport * as statics from './statics.js'\nimport { installKernelGeometry } from './kernel/geometry.js'\nimport { installKernelNoise } from './kernel/noise.js'\nimport { installMaterialsTextures } from './materials/textures.js'\nimport { installMaterialsMaterials } from './materials/materials.js'\nimport { installKernelCloseScene } from './kernel/close-scene.js'\nimport { installHouseHelpers } from './house/helpers.js'\nimport { installHouseWalls } from './house/walls.js'\nimport { installHouseDoors } from './house/doors.js'\nimport { installHouseWindows } from './house/windows.js'\nimport { installHouseFloors } from './house/floors.js'\nimport { installHouseStairs } from './house/stairs.js'\nimport { installLightsFixtures } from './lights/fixtures.js'\nimport { installLightsDecor } from './lights/decor.js'\nimport { installLotTerrain } from './lot/terrain.js'\nimport { installLotPerimeter } from './lot/perimeter.js'\nimport { installLotGates } from './lot/gates.js'\nimport { installRoofRoofs } from './roof/roofs.js'\nimport { installRoofGutters } from './roof/gutters.js'\nimport { installRoofSlabs } from './roof/slabs.js'\nimport { installRoofTiles } from './roof/tiles.js'\nimport { installRoofRect } from './roof/rect.js'\nimport { installMirrors } from './mirrors.js'\nimport { installCars } from './cars.js'\nimport { installHouseBuilding } from './house/building.js'\nimport { installUtilitiesWater } from './utilities/water.js'\nimport { installUtilitiesElectrical } from './utilities/electrical.js'\nimport { installHouseBaseboard } from './house/baseboard.js'\nimport { installUtilitiesSolar } from './utilities/solar.js'\nimport { installHouseOutbuildings } from './house/outbuildings.js'\nimport { installFurnitureApi } from './furniture/api.js'\nimport { installFurnitureBuilders } from './furniture/builders.js'\nimport { installFurnitureTypeTable } from './furniture/type-table.js'\nimport { installFurnitureTaps } from './furniture/taps.js'\nimport { installFurnitureFixtures } from './furniture/fixtures.js'\nimport { installFurniturePlants } from './furniture/plants.js'\nimport { installFurnitureYard } from './furniture/yard.js'\nimport { installFurnitureExtraTypes } from './furniture/extra-types.js'\nimport { installFurniturePlaceItems } from './furniture/place-items.js'\nimport { installVegetationBridge } from './vegetation/bridge.js'\nimport { installInteractionState } from './interaction/state.js'\nimport { installInteractionCollision } from './interaction/collision.js'\nimport { installInteractionItems } from './interaction/items.js'\nimport { installInteractionFittings } from './interaction/fittings.js'\nimport { installInteractionDoors } from './interaction/doors.js'\nimport { installInteractionTarget } from './interaction/target.js'\nimport { installInteractablesBridge } from './interactables/bridge.js'\nimport { installAnimationClotheslines } from './animation/clotheslines.js'\nimport { installBuildInstance } from './build/instance.js'\nimport { installInteractablesKit } from './interactables/kit.js'\nimport { installLightsRoomLight } from './lights/room-light.js'\nimport { installDestructionPieces } from './destruction/pieces.js'\nimport { installDestructionBreach } from './destruction/breach.js'\nimport { installDestructionWorld } from './destruction/world.js'\nimport { installBuildBuild } from './build/build.js'\nimport { buildApi } from './build/api.js'\n\nimport type { HouseRenderer, HouseRendererOptions } from './types.js'\n\nexport const VERSION = '1.0.0'\n/** Same as `create`: the house renderer of the SDK. */\nexport { create as createHouseRenderer }\nexport { planLod, rectsOf, isOpenArea, OPEN_ROOM_TYPES } from './statics.js'\n\n/**\n * Creates a house renderer: `create(THREE, options).build(result, { quality, night })` turns the result of `@adatechnology/game-floorplan`\n * (plus the structure of `@adatechnology/game-floorplan-structure`) into a three.js group. Port of the team's Casa3DSDK.\n */\nexport function create(THREE: any, options: HouseRendererOptions = {}): HouseRenderer {\n const cfg = Object.assign({}, options || {})\n const DOC = cfg.document || (typeof document !== 'undefined' ? document : null)\n const PROPS = cfg.props || props3d\n const Reflector = cfg.reflector || null // THREE.Reflector (three/examples/jsm/objects/Reflector.js); without it the mirrors use only the environment map\n const FLEET = cfg.fleet || null // fleet of cars: build(kind, { quality, seed }) -> { group, damageable, release() }; without it there are no cars\n const HP = Object.assign({ glass: 20, wood: 60, water: 80, metal: 200, masonry: 500, rubber: 40, fuel: 60, gas: 40 }, cfg.hp)\n const invalidate = () => { if (cfg.onChange) cfg.onChange({ shadow: false }) }\n const invalidateShadow = () => { if (cfg.onChange) cfg.onChange({ shadow: true }) }\n const colliderChanged = (c: any) => { if (c && cfg.onCollider) cfg.onCollider(c) }\n const shared: Shared = { mats: null, quality: cfg.quality === 'game' ? 'game' : 'high' }\n const seedKey = (id: any) => { if (cfg.seedKey && id != null) { const k = cfg.seedKey(String(id)); return k == null ? id : k } return id }\n // the kernel's three: its primitive geometries (the GEO templates, breach units, fragments, mirrors) are made by game-shapes, bit-identical and cached by parameters\n const K: Kernel = { t: createTranslator(cfg.locale), seedKey, THREE: shapeGeometries(THREE), cfg, DOC, PROPS, Reflector, FLEET, HP, invalidate, invalidateShadow, colliderChanged, VERSION, rectsOf: statics.rectsOf, isOpenArea: statics.isOpenArea, OPEN_ROOM_TYPES: statics.OPEN_ROOM_TYPES }\n installKernelGeometry(K, shared)\n installKernelNoise(K, shared)\n installMaterialsTextures(K, shared)\n installMaterialsMaterials(K, shared)\n installKernelCloseScene(K, shared)\n installHouseHelpers(K, shared)\n installHouseWalls(K, shared)\n installHouseDoors(K, shared)\n installHouseWindows(K, shared)\n installHouseFloors(K, shared)\n installHouseStairs(K, shared)\n installLightsFixtures(K, shared)\n installLightsDecor(K, shared)\n installLotTerrain(K, shared)\n installLotPerimeter(K, shared)\n installLotGates(K, shared)\n installRoofRoofs(K, shared)\n installRoofGutters(K, shared)\n installRoofSlabs(K, shared)\n installRoofTiles(K, shared)\n installRoofRect(K, shared)\n installMirrors(K, shared)\n installCars(K, shared)\n installHouseBuilding(K, shared)\n installUtilitiesWater(K, shared)\n installUtilitiesElectrical(K, shared)\n installHouseBaseboard(K, shared)\n installUtilitiesSolar(K, shared)\n installHouseOutbuildings(K, shared)\n installFurnitureApi(K, shared)\n installFurnitureBuilders(K, shared)\n installFurnitureTypeTable(K, shared)\n installFurnitureTaps(K, shared)\n installFurnitureFixtures(K, shared)\n installFurniturePlants(K, shared)\n installFurnitureYard(K, shared)\n installFurnitureExtraTypes(K, shared)\n installFurniturePlaceItems(K, shared)\n installVegetationBridge(K, shared)\n installInteractionState(K, shared)\n installInteractionCollision(K, shared)\n installInteractionItems(K, shared)\n installInteractionFittings(K, shared)\n installInteractionDoors(K, shared)\n installInteractionTarget(K, shared)\n installInteractablesBridge(K, shared)\n installAnimationClotheslines(K, shared)\n installBuildInstance(K, shared)\n installInteractablesKit(K, shared)\n installLightsRoomLight(K, shared)\n installDestructionPieces(K, shared)\n installDestructionBreach(K, shared)\n installDestructionWorld(K, shared)\n installBuildBuild(K, shared)\n return buildApi(K, shared) as HouseRenderer\n}\n","/** Texts the house shows to the player (interaction prompts, messages, outbuilding labels), by locale. */\nexport type Messages = Record<string, string>\n\nexport const en: Messages = {\n 'prompt.open': 'E: open {what}',\n 'prompt.close': 'E: close {what}',\n 'prompt.lockedDoor': 'E: locked door',\n 'prompt.lightOn': 'E: turn on the light',\n 'prompt.lightOff': 'E: turn off the light',\n 'what.door': 'the door',\n 'what.curtain': 'the curtain',\n 'what.mailbox': 'the mailbox',\n 'what.pedestrianGate': 'the small gate',\n 'what.garageGate': 'the garage gate',\n 'what.drawer': 'drawer',\n 'what.wardrobe': 'wardrobe',\n 'what.fridge': 'fridge',\n 'what.pantry': 'pantry',\n 'what.cabinet': 'cabinet',\n 'warn.interactablesIncomplete': 'floorplan-three: cfg.interactives is incomplete (GameInteractables, GameInteractablesHousehold, GameInteractablesThree)',\n 'message.locked': 'Locked.',\n 'message.boarded': 'Locked: the door is boarded up.',\n 'message.pickedUp': 'Picked up: {name}{qty}',\n 'outbuilding.guest_room': 'Outbuilding (guest room)',\n 'outbuilding.office': 'Outbuilding (office)',\n 'outbuilding.storage': 'Outbuilding (storage)',\n 'outbuilding.gourmet': 'Outbuilding (gourmet space)',\n}\n\nexport const ptBR: Messages = {\n 'prompt.open': 'E: abrir {what}',\n 'prompt.close': 'E: fechar {what}',\n 'prompt.lockedDoor': 'E: porta trancada',\n 'prompt.lightOn': 'E: acender a luz',\n 'prompt.lightOff': 'E: apagar a luz',\n 'what.door': 'a porta',\n 'what.curtain': 'a cortina',\n 'what.mailbox': 'a caixa de correio',\n 'what.pedestrianGate': 'o portãozinho',\n 'what.garageGate': 'o portão da garagem',\n 'what.drawer': 'gaveta',\n 'what.wardrobe': 'guarda-roupa',\n 'what.fridge': 'geladeira',\n 'what.pantry': 'despensa',\n 'what.cabinet': 'armário',\n 'warn.interactablesIncomplete': 'floorplan-three: cfg.interactives incompleto (GameInteractables, GameInteractablesHousehold, GameInteractablesThree)',\n 'message.locked': 'Trancada.',\n 'message.boarded': 'Trancada: a porta está bloqueada com tábuas.',\n 'message.pickedUp': 'Pegou: {name}{qty}',\n 'outbuilding.guest_room': 'Edícula (quarto de visita)',\n 'outbuilding.office': 'Edícula (escritório)',\n 'outbuilding.storage': 'Edícula (depósito)',\n 'outbuilding.gourmet': 'Edícula (espaço gourmet)',\n}\n\nexport const locales: Record<string, Messages> = { en, 'pt-BR': ptBR }\n\nexport type Translate = (key: string, params?: Record<string, string | number>) => string\n\n/**\n * Translator for a locale id ('en', 'pt-BR'), or for a partial table that overrides the English one.\n * A missing key falls back to English and then to the key itself.\n */\nexport function createTranslator(locale?: string | Partial<Messages>): Translate {\n const table: Messages = typeof locale === 'string' ? (locales[locale] ?? en) : { ...en, ...(locale ?? {}) }\n return (key, params) => {\n const text = table[key] ?? en[key] ?? key\n return params ? text.replace(/\\{(\\w+)\\}/g, (_, name: string) => (params[name] != null ? String(params[name]) : '')) : text\n }\n}\n","// Literal port of the team's Casa3DSDK static utilities (outside the instance). See MIGRATION.md.\n// create\n\n// ---- static utilities (they do not depend on an instance) ----\nexport const OPEN_ROOM_TYPES = new Set(['balcony', 'terrace', 'veranda', 'balcony_gourmet']);\nexport const rectsOf = c => (c.parts && c.parts.length ? c.parts : [[c.u0, c.v0, c.u1, c.v1]]);\nexport const isOpenArea = c => OPEN_ROOM_TYPES.has(c.type) || c.outdoor === true;\n// open area: no roof or ceiling\n// spreads the draw-call budget among several houses: the ones closest to the focus stay complete; the farther ones lose the small pieces (LOD 1) and finally vanish (LOD 2).\nexport function planLod(houses, focus, budget) {\n const l = houses.map(c => ({ c, d: c.distance(focus), n0: c.stats.drawCalls, n1: c.stats.drawCallsLOD1, level: 0 })).sort((a, b) => a.d - b.d);\n let total = l.reduce((s, x) => s + x.n0, 0);\n for (let i = l.length - 1; i >= 0 && total > budget; i--) { total -= l[i].n0 - l[i].n1; l[i].level = 1; }\n for (let i = l.length - 1; i >= 0 && total > budget; i--) { total -= l[i].n1; l[i].level = 2; }\n for (const x of l) x.c.setLod(x.level);\n return { total, levels: l.map(x => x.level), houses: l.map(x => x.c) };\n }\n// ---- supporting structure (res.structure of the plan + tagged pieces) -> DestructibleSpec of @adatechnology/game-contracts ----\n// plan roles -> StructureRole of the core; support types -> JointKind. water_tank is 'none' (carries nothing).\n","/* eslint-disable prefer-const -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module kernel/geometry). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installKernelGeometry(K: Kernel, shared: Shared): void {\n const { THREE } = K;\n // build quality in progress (build(res, {quality}) overrides)\n\n // ---------------- 10 geometry, accumulators, materials ----------------\n // ===== geometry core: accumulators per group and material (one mesh per pair) =====\n const GEO: Record<string, any> = {};\n {\n const read = g => ({ p: g.attributes.position.array, n: g.attributes.normal.array, u: g.attributes.uv.array, i: g.index ? g.index.array : null, nv: g.attributes.position.count });\n GEO.box = read(new THREE.BoxGeometry(1, 1, 1));\n GEO.cyl = read(new THREE.CylinderGeometry(0.5, 0.5, 1, 12));\n GEO.cyl6 = read(new THREE.CylinderGeometry(0.5, 0.5, 1, 6));\n GEO.cone = read(new THREE.CylinderGeometry(0.3, 0.5, 1, 12, 1, true));\n GEO.sphere = read(new THREE.SphereGeometry(0.5, 10, 8));\n GEO.plane = read(new THREE.PlaneGeometry(1, 1));\n const f = new THREE.BufferGeometry();\n f.setAttribute('position', new THREE.Float32BufferAttribute([0, 0, 0, 0.5, 0.4, 0, 0, 1, 0, -0.5, 0.4, 0], 3));\n f.setAttribute('normal', new THREE.Float32BufferAttribute([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1], 3));\n f.setAttribute('uv', new THREE.Float32BufferAttribute([0.5, 0, 1, 0.4, 0.5, 1, 0, 0.4], 2)); f.setIndex([0, 1, 2, 0, 2, 3]);\n GEO.leaf = read(f);\n }\n // metres per texture repeat, per material (only materials with a map)\n const UV_SCALE = { dirt: 2.0, roughcast: 1.0, block: 1.2, tile: 1.0, fiber_cement: 1.0, grass: 2.5, asphalt: 3.0, sidewalk: 1.0 };\n const WITH_MAP = { roughcast: 1, block: 1 };\n class Accumulator {\n [key: string]: any\n constructor() { this.cv = 2048; this.ci = 3072; this.p = new Float32Array(this.cv * 3); this.n = new Float32Array(this.cv * 3); this.c = new Float32Array(this.cv * 3); this.u = new Float32Array(this.cv * 2); this.i = new Uint32Array(this.ci); this.nv = 0; this.ni = 0; this.lim = []; this.cur = null; this.piece0 = null; }\n ensure(nv, ni) {\n if (this.nv + nv > this.cv) { while (this.nv + nv > this.cv) this.cv *= 2; const cp = (A, k) => { const B = new Float32Array(this.cv * k); B.set(A); return B; }; this.p = cp(this.p, 3); this.n = cp(this.n, 3); this.c = cp(this.c, 3); this.u = cp(this.u, 2); }\n if (this.ni + ni > this.ci) { while (this.ni + ni > this.ci) this.ci *= 2; const B = new Uint32Array(this.ci); B.set(this.i); this.i = B; }\n }\n }\n const cursor: any = { group: 'lot', accs: new Map(), rot: [], org: [0, 0, 0], ry: 0 };\n // ---- moving parts: loose groups with the origin at the pivot (hinge, tap axis, rail). They become THREE.Group children of the parent group, with userData.part ----\n const PARTS = [];\n // {name, parent, pos, type, meta}\n const MIRRORS = [];\n // real mirrors: {x,y,z,ry,w,h,room,floor,parent}\n shared.partCount = 0;\n // draws fn() inside a part: everything fn emits (bx, boxC, put, poly, api.*) is in coordinates relative to the pivot `pos` (the house's world)\n // ry rotates the part's frame about Y (opens axes stay in the part's local frame; use g.translateOnAxis / rotateOnAxis)\n function part(type, pos, fn, meta: any = {}, parent, ry = 0) {\n const gA = cursor.group, oA = cursor.org, rA = cursor.ry, pieceA = cursor.pc, name = 'part:' + (meta.id || type) + ':' + (shared.partCount++);\n PARTS.push({ name, parent: parent || gA, pos: pos.slice(), type, meta, ry });\n cursor.group = name; cursor.org = pos; cursor.ry = ry; cursor.pc = null; try { fn(); } finally { cursor.group = gA; cursor.org = oA; cursor.ry = rA; cursor.pc = pieceA; }\n return name;\n }\n // pose of a part by userData.opens: t=0 closed, t=1 open. types: swing (axis, ang), slide (axis, dist), scale (axis, k), toggle (rocker: axis, ang)\n function applyPart(g, t) {\n const u = g.userData, a = u.opens; if (!a) return; if (!u.pose0) u.pose0 = { p: g.position.clone(), q: g.quaternion.clone(), s: g.scale.clone() };\n g.position.copy(u.pose0.p); g.quaternion.copy(u.pose0.q); g.scale.copy(u.pose0.s);\n const e = new THREE.Vector3(...(a.axis || [0, 1, 0]));\n if (a.type === 'swing' || a.type === 'toggle') g.rotateOnAxis(e, (a.angle || 0) * t);\n else if (a.type === 'slide') g.translateOnAxis(e, (a.dist || 0) * t);\n else if (a.type === 'scale') { const k = 1 + ((a.k != null ? a.k : 0.3) - 1) * t; g.scale.set(e.x ? k : 1, e.y ? k : 1, e.z ? k : 1); }\n g.updateMatrix(); u.t = t;\n }\n const _Y = new THREE.Vector3(0, 1, 0), _qa = new THREE.Quaternion(), _qb = new THREE.Quaternion();\n // ---- destruction: SCENE.pc is the piece being drawn ({id, mat, role}); the accumulator notes where each piece starts (lim) and, with opts.pieces:'meshes', creates a mesh per piece ----\n function pieceRecord(id, mat, role, extra) { const M = shared.ctx.pieces; let p: any = M.get(id); if (!p) { p = Object.assign({ id, mat, role: role || null }, extra); M.set(id, p); } return p; }\n const structurePiece = id => { const e = shared.ctx.structureIndex && shared.ctx.structureIndex[id]; return e ? pieceRecord(id, e.material, e.role, { floor: e.floor }) : null; };\n // plan structure piece (res.structure) by id\n function accFor(mat) {\n const pc = cursor.pc || null, k = cursor.group + '|' + mat + (cursor.separate && pc ? '|' + pc.id : ''); let a = cursor.accs.get(k);\n if (!a) { a = new Accumulator(); a.mat = mat; a.group = cursor.group; a.piece0 = cursor.separate ? pc : null; cursor.accs.set(k, a); }\n if (a.cur !== pc) { a.cur = pc; a.lim.push({ pc, v: a.nv, i: a.ni }); }\n return a;\n }\n const _q = new THREE.Quaternion(), _e = new THREE.Euler(), _col = new THREE.Color();\n const rgbOf = h => { _col.setHex(h); return [_col.r, _col.g, _col.b]; };\n // puts a geometry (box, cyl...) with position, quaternion, scale, colour; uvr = atlas cell\n function put(mat, geo, px, py, pz, q, sx, sy, sz, color?, uvr?) {\n { const O = cursor.org, RY = cursor.ry; if (RY) { const c = Math.cos(RY), s = Math.sin(RY), dx = px - O[0], dz = pz - O[2]; px = dx * c - dz * s; pz = dx * s + dz * c; py -= O[1]; _qa.setFromAxisAngle(_Y, -RY); _qb.copy(_qa).multiply(q); q = _qb; } else { px -= O[0]; py -= O[1]; pz -= O[2]; } }\n const A = accFor(mat), G = GEO[geo]; A.ensure(G.nv, G.i ? G.i.length : G.nv);\n const x = q.x, y = q.y, z = q.z, w = q.w, x2 = x + x, y2 = y + y, z2 = z + z;\n const xx = x * x2, xy = x * y2, xz = x * z2, yy = y * y2, yz = y * z2, zz = z * z2, wx = w * x2, wy = w * y2, wz = w * z2;\n const m00 = 1 - (yy + zz), m01 = xy - wz, m02 = xz + wy, m10 = xy + wz, m11 = 1 - (xx + zz), m12 = yz - wx, m20 = xz - wy, m21 = yz + wx, m22 = 1 - (xx + yy);\n const [cr, cg, cb] = rgbOf(color), scale = UV_SCALE[mat], b = A.nv;\n for (let k = 0; k < G.nv; k++) {\n const lx = G.p[k * 3] * sx, ly = G.p[k * 3 + 1] * sy, lz = G.p[k * 3 + 2] * sz;\n const wx_ = m00 * lx + m01 * ly + m02 * lz + px, wy_ = m10 * lx + m11 * ly + m12 * lz + py, wz_ = m20 * lx + m21 * ly + m22 * lz + pz;\n let nx = G.n[k * 3] / sx, ny = G.n[k * 3 + 1] / sy, nz = G.n[k * 3 + 2] / sz; const nl = Math.hypot(nx, ny, nz) || 1; nx /= nl; ny /= nl; nz /= nl;\n const wnx = m00 * nx + m01 * ny + m02 * nz, wny = m10 * nx + m11 * ny + m12 * nz, wnz = m20 * nx + m21 * ny + m22 * nz, o = b + k;\n A.p[o * 3] = wx_; A.p[o * 3 + 1] = wy_; A.p[o * 3 + 2] = wz_; A.n[o * 3] = wnx; A.n[o * 3 + 1] = wny; A.n[o * 3 + 2] = wnz;\n if (uvr && uvr.vc) { const m = uvr.vc(wx_, wz_); A.c[o * 3] = cr * m[0]; A.c[o * 3 + 1] = cg * m[1]; A.c[o * 3 + 2] = cb * m[2]; } else { A.c[o * 3] = cr; A.c[o * 3 + 1] = cg; A.c[o * 3 + 2] = cb; }\n if (uvr) { let gu = G.u[k * 2], gv = G.u[k * 2 + 1]; for (let r = uvr.rot | 0; r > 0; r--) { const t = gu; gu = gv; gv = 1 - t; } if (uvr.fx) gu = 1 - gu; A.u[o * 2] = uvr.u0 + gu * (uvr.u1 - uvr.u0); A.u[o * 2 + 1] = uvr.v0 + gv * (uvr.v1 - uvr.v0); }\n else if (scale) { const ax = Math.abs(wnx), ay = Math.abs(wny), az = Math.abs(wnz); if (ax >= ay && ax >= az) { A.u[o * 2] = wz_ / scale; A.u[o * 2 + 1] = wy_ / scale; } else if (ay >= az) { A.u[o * 2] = wx_ / scale; A.u[o * 2 + 1] = wz_ / scale; } else { A.u[o * 2] = wx_ / scale; A.u[o * 2 + 1] = wy_ / scale; } }\n }\n if (G.i) for (let k = 0; k < G.i.length; k++) A.i[A.ni + k] = b + G.i[k]; else for (let k = 0; k < G.nv; k++) A.i[A.ni + k] = b + k;\n A.nv += G.nv; A.ni += G.i ? G.i.length : G.nv;\n }\n // box by its centre, with YXZ Euler rotation\n function boxC(mat, cx, cy, cz, sx, sy, sz, color, rx = 0, ry = 0, rz = 0, uvr) {\n if (rx || ry || rz) _q.setFromEuler(_e.set(rx, ry, rz, 'YXZ')); else _q.identity();\n put(mat, 'box', cx, cy, cz, _q, sx, sy, sz, color, uvr);\n }\n // axis-aligned box by minimum and maximum corners\n function bxBase(mat, x0, y0, z0, x1, y1, z1, color) { if (x1 - x0 < 1e-4 || y1 - y0 < 1e-4 || z1 - z0 < 1e-4) return; _q.identity(); put(mat, 'box', (x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2, _q, x1 - x0, y1 - y0, z1 - z0, color); }\n // vertical cylinder with the base at y\n function cylBase(mat, x, y, z, r, h, color, seg = 'cyl') { _q.identity(); put(mat, seg, x, y + h / 2, z, _q, r * 2, h, r * 2, color); }\n // arbitrary quad/triangle (roofs). pts in [x,y,z]; hint = direction the normal should point to\n function polyFace(mat, pts, color, hint) {\n const A = accFor(mat), n = pts.length, O = cursor.org, RY = cursor.ry; A.ensure(n, (n - 2) * 3);\n if (RY) { const c = Math.cos(RY), s = Math.sin(RY); pts = pts.map(p => { const dx = p[0] - O[0], dz = p[2] - O[2]; return [dx * c - dz * s + O[0], p[1], dx * s + dz * c + O[2]]; }); if (hint) { const dx = hint[0], dz = hint[2]; hint = [dx * c - dz * s, hint[1], dx * s + dz * c]; } }\n let [a, b, c] = pts, ux = b[0] - a[0], uy = b[1] - a[1], uz = b[2] - a[2], vx = c[0] - a[0], vy = c[1] - a[1], vz = c[2] - a[2];\n let nx = uy * vz - uz * vy, ny = uz * vx - ux * vz, nz = ux * vy - uy * vx; const nl = Math.hypot(nx, ny, nz) || 1; nx /= nl; ny /= nl; nz /= nl;\n if (hint && nx * hint[0] + ny * hint[1] + nz * hint[2] < 0) { pts = pts.slice().reverse(); nx = -nx; ny = -ny; nz = -nz; [a, b] = [pts[0], pts[1]]; }\n const [cr, cg, cb] = rgbOf(color), scale = UV_SCALE[mat] || 1, base = A.nv;\n let e1x = b[0] - a[0], e1y = b[1] - a[1], e1z = b[2] - a[2]; const l1 = Math.hypot(e1x, e1y, e1z) || 1; e1x /= l1; e1y /= l1; e1z /= l1;\n const e2x = ny * e1z - nz * e1y, e2y = nz * e1x - nx * e1z, e2z = nx * e1y - ny * e1x;\n pts.forEach((p, k) => {\n const o = base + k; A.p[o * 3] = p[0] - O[0]; A.p[o * 3 + 1] = p[1] - O[1]; A.p[o * 3 + 2] = p[2] - O[2]; A.n[o * 3] = nx; A.n[o * 3 + 1] = ny; A.n[o * 3 + 2] = nz; A.c[o * 3] = cr; A.c[o * 3 + 1] = cg; A.c[o * 3 + 2] = cb;\n const dx = p[0] - a[0], dy = p[1] - a[1], dz = p[2] - a[2];\n A.u[o * 2] = (dx * e1x + dy * e1y + dz * e1z) / scale; A.u[o * 2 + 1] = (dx * e2x + dy * e2y + dz * e2z) / scale;\n });\n for (let k = 1; k < n - 1; k++) { A.i[A.ni++] = base; A.i[A.ni++] = base + k; A.i[A.ni++] = base + k + 1; }\n A.nv += n;\n }\n // the gate hook (gatesInteractive) swaps the implementation of bx for a while, as the team's closure reassigned the function\n let bxImpl: any = bxBase;\n function bx(...a: any[]) { return (bxImpl as any)(...a); }\n K.getBx = () => bxImpl;\n K.setBx = (f) => { bxImpl = f; };\n Object.assign(K, { GEO, UV_SCALE, WITH_MAP, Accumulator, cursor, PARTS, MIRRORS, part, applyPart, _Y, _qa, _qb, pieceRecord, structurePiece, accFor, _q, _e, _col, rgbOf, put, boxC, bx, cylBase, polyFace });\n}\n","// Literal port of the team's Casa3DSDK (module kernel/noise). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installKernelNoise(K: Kernel, _shared: Shared): void {\n // smooth value noise (macro variation of the floor with no visible repetition)\n const _h2 = (x, z) => { let h = Math.imul((x * 374761393) ^ (z * 668265263), 1274126177); h = Math.imul(h ^ (h >>> 13), 1103515245); return ((h ^ (h >>> 16)) >>> 0) / 4294967296; };\n function vnoise(x, z) { const xi = Math.floor(x), zi = Math.floor(z), fx = x - xi, fz = z - zi, u = fx * fx * (3 - 2 * fx), v = fz * fz * (3 - 2 * fz), a = _h2(xi, zi), b = _h2(xi + 1, zi), c = _h2(xi, zi + 1), d = _h2(xi + 1, zi + 1); return a + (b - a) * u + (c - a) * v + (a - b - c + d) * u * v; }\n function macroGround(x, z, type) { // per-vertex RGB multiplier: 3 octaves of noise + colour patch\n const n = 0.5 * vnoise(x / 5.5, z / 5.5) + 0.32 * vnoise(x / 1.9 + 31, z / 1.9) + 0.18 * vnoise(x / 0.8 + 7, z / 0.8), m = vnoise(x / 9 + 100, z / 9 + 50) - 0.5, f = 0.76 + 0.5 * n;\n return type === 'dirt' ? [f * (1 + 0.14 * m), f * (1 + 0.03 * m), f * (1 - 0.18 * m)] : [f * (1 + 0.1 * m), f * (1 + 0.05 * m), f * (1 - 0.1 * m)];\n }\n Object.assign(K, { _h2, vnoise, macroGround });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module materials/textures). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installMaterialsTextures(K: Kernel, _shared: Shared): void {\n const { DOC, THREE, cfg } = K;\n // ---- materials ----\n function texture(n, f, rep = true, rx = 1, ry = 1) { const c = DOC.createElement('canvas'); c.width = n; c.height = n; const g = c.getContext('2d'); f(g, n); const t = new THREE.CanvasTexture(c); t.colorSpace = THREE.SRGBColorSpace; if (rep) t.wrapS = t.wrapT = THREE.RepeatWrapping; t.anisotropy = 4; return t; }\n const rngTexture = (s => () => (s = (s * 16807) % 2147483647) / 2147483647)(1234);\n const TEXGEN = {\n roughcast: () => texture(256, (g, n) => { g.fillStyle = '#e6e6e6'; g.fillRect(0, 0, n, n); for (let i = 0; i < 5000; i++) { const v = 150 + rngTexture() * 100 | 0; g.fillStyle = `rgb(${v},${v},${v})`; g.fillRect(rngTexture() * n, rngTexture() * n, 1 + rngTexture() * 2, 1 + rngTexture() * 2); } }),\n block: () => texture(256, (g, n) => { g.fillStyle = '#8c8c88'; g.fillRect(0, 0, n, n); const bw = n / 3, bh = n / 6; for (let j = 0; j < 6; j++) for (let i = -1; i < 4; i++) { const v = 205 + (rngTexture() - 0.5) * 36 | 0; g.fillStyle = `rgb(${v},${v},${v - 4})`; g.fillRect(i * bw + (j % 2) * bw / 2 + 3, j * bh + 3, bw - 6, bh - 6); } }),\n tile: () => texture(128, (g, n) => { g.fillStyle = '#d8d8d8'; g.fillRect(0, 0, n, n); for (let j = 0; j < 8; j++) { g.fillStyle = 'rgba(0,0,0,0.30)'; g.fillRect(0, j * n / 8, n, 3); for (let i = 0; i < 6; i++) { g.fillStyle = 'rgba(0,0,0,0.16)'; g.fillRect(i * n / 6 + (j % 2) * n / 12, j * n / 8, 2, n / 8); } } }),\n dirt: () => texture(256, (g, n) => { g.fillStyle = '#86694a'; g.fillRect(0, 0, n, n); const r = rngTexture; for (let i = 0; i < 260; i++) { const v = 105 + r() * 60 | 0, x = r() * n, y = r() * n, q = 2 + r() * 9; g.fillStyle = `rgba(${v + 20},${v * 0.78 | 0},${v * 0.55 | 0},${0.10 + r() * 0.16})`; for (const dx of [-n, 0, n]) for (const dy of [-n, 0, n]) { g.beginPath(); g.arc(x + dx, y + dy, q, 0, 6.3); g.fill(); } } for (let i = 0; i < 2400; i++) { const v = 70 + r() * 120 | 0; g.fillStyle = `rgba(${v},${v * 0.8 | 0},${v * 0.6 | 0},0.5)`; const x = r() * n, y = r() * n; g.fillRect(x, y, 1 + r() * 2, 1 + r() * 2); if (x > n - 3) g.fillRect(x - n, y, 2, 2); if (y > n - 3) g.fillRect(x, y - n, 2, 2); } }),\n grass: () => texture(256, (g, n) => { g.fillStyle = '#9ccb62'; g.fillRect(0, 0, n, n); const r = rngTexture; for (let i = 0; i < 70; i++) { g.fillStyle = `rgba(${r() < 0.5 ? '200,225,110' : '90,150,60'},${0.10 + r() * 0.12})`; const x = r() * n, y = r() * n, q = 8 + r() * 24; for (const dx of [-n, 0, n]) for (const dy of [-n, 0, n]) { g.beginPath(); g.arc(x + dx, y + dy, q, 0, 6.3); g.fill(); } } for (let i = 0; i < 1400; i++) { g.strokeStyle = `hsl(${78 + r() * 30},${45 + r() * 25}%,${42 + r() * 24}%)`; g.lineWidth = 1; const x = r() * n, y = r() * n; g.beginPath(); g.moveTo(x, y); g.lineTo(x + (r() - 0.5) * 5, y - 3 - r() * 6); g.stroke(); } }),\n asphalt: () => texture(256, (g, n) => { g.fillStyle = '#9a9ea4'; g.fillRect(0, 0, n, n); for (let i = 0; i < 3500; i++) { const v = 110 + rngTexture() * 90 | 0; g.fillStyle = `rgb(${v},${v},${v + 4})`; g.fillRect(rngTexture() * n, rngTexture() * n, 1 + rngTexture() * 2, 1 + rngTexture() * 2); } }),\n sidewalk: () => texture(256, (g, n) => { g.fillStyle = '#9d9a92'; g.fillRect(0, 0, n, n); const q = n / 4; for (let j = 0; j < 4; j++) for (let i = 0; i < 4; i++) { const v = 214 + (rngTexture() - 0.5) * 20 | 0; g.fillStyle = `rgb(${v},${v - 3},${v - 10})`; g.fillRect(i * q + 2, j * q + 2, q - 4, q - 4); } }),\n fiber_cement: () => texture(128, (g, n) => { for (let i = 0; i < 8; i++) { const gr = g.createLinearGradient(i * n / 8, 0, (i + 1) * n / 8, 0); gr.addColorStop(0, '#f2f2f2'); gr.addColorStop(0.5, '#cfcfcf'); gr.addColorStop(1, '#f2f2f2'); g.fillStyle = gr; g.fillRect(i * n / 8, 0, n / 8, n); } }),\n };\n const TEX = {};\n for (const k of Object.keys(TEXGEN)) TEX[k] = (cfg.textures && cfg.textures[k]) || TEXGEN[k]();\n // app textures (cfg.textures) replace the procedural ones\n const ATLAS = {};\n Object.assign(K, { texture, rngTexture, TEXGEN, TEX, ATLAS });\n}\n","// Literal port of the team's Casa3DSDK (module materials/materials). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installMaterialsMaterials(K: Kernel, _shared: Shared): void {\n const { THREE, cfg, ATLAS, TEX, rngTexture } = K;\n function createMaterials(props) {\n const makeAtlas = (c, rep?) => { const t = new THREE.CanvasTexture(c); t.colorSpace = THREE.SRGBColorSpace; t.anisotropy = 4; if (rep) t.wrapS = t.wrapT = THREE.RepeatWrapping; return t; };\n if (!(cfg.atlas && cfg.atlas.floorKind)) { const pc = props.atlas('floor').canvas, g = pc.getContext('2d'); // lighter, livelier lawn (atlas cells 0 and 1)\n for (const c of [0, 1]) { g.save(); g.globalCompositeOperation = 'screen'; g.fillStyle = 'rgba(70,95,25,0.55)'; g.fillRect(c * 256, 0, 256, 256); g.restore(); }\n g.save(); g.globalCompositeOperation = 'screen'; g.fillStyle = 'rgba(30,30,28,0.35)'; g.fillRect(3 * 256, 0, 256, 256); g.restore(); } // cemented floor also comes out lighter\n if (!(cfg.atlas && cfg.atlas.floorKind)) { const pc = props.atlas('floor').canvas, g = pc.getContext('2d'); // packed earth: the dark smudges repeated every 2 m; softens the contrast and leaves the variation to the per-vertex colour (macro)\n g.save(); g.fillStyle = 'rgba(128,92,62,0.52)'; g.fillRect(256, 256, 256, 256); g.restore();\n const r = rngTexture; for (let i = 0; i < 700; i++) { const v = 95 + r() * 85 | 0; g.fillStyle = `rgba(${v},${v * 0.8 | 0},${v * 0.62 | 0},0.55)`; g.fillRect(256 + r() * 256, 256 + r() * 256, 1 + r() * 2, 1 + r() * 2); } }\n const A = cfg.atlas || {}; ATLAS.picture = A.picture || makeAtlas(props.atlas('picture').canvas); ATLAS.floorKind = A.floorKind || makeAtlas(props.atlas('floor').canvas); ATLAS.water = A.water || makeAtlas(props.atlas('water').canvas, true); // cfg.atlas: ready-made textures from the app\n const L = o => new THREE.MeshLambertMaterial(Object.assign({ vertexColors: true }, o));\n const P = o => new THREE.MeshPhongMaterial(Object.assign({ vertexColors: true }, o));\n const M: any = {\n plain: P({ shininess: 30, specular: 0x222222 }), plaster: L({}), fabric: L({}), wood: L({}),\n metal: P({ shininess: 80, specular: 0x777777 }),\n glass: P({ color: 0xdbe6ee, transparent: true, opacity: 0.24, shininess: 120, specular: 0xffffff, depthWrite: false, emissive: 0x000000 }),\n plant: L({ side: THREE.DoubleSide, emissive: 0x16280f }),\n water: P({ map: ATLAS.water, transparent: true, opacity: 0.78, shininess: 110, specular: 0xffffff, depthWrite: false }),\n emissive: new THREE.MeshBasicMaterial({ vertexColors: true }),\n picture: L({ map: ATLAS.picture }), floor: L({ map: ATLAS.floorKind }),\n dirt: L({ map: TEX.dirt }), roughcast: L({ map: TEX.roughcast }), block: L({ map: TEX.block }), grass: L({ map: TEX.grass }), asphalt: L({ map: TEX.asphalt }), sidewalk: L({ map: TEX.sidewalk }),\n tile: L({ map: TEX.tile, side: THREE.DoubleSide }), fiber_cement: L({ map: TEX.fiber_cement, side: THREE.DoubleSide }),\n screen: new THREE.MeshBasicMaterial({ vertexColors: true, transparent: true, opacity: 0.35, depthWrite: false, side: THREE.DoubleSide }),\n building: L({ transparent: true, opacity: 0.2, depthWrite: false }),\n };\n M.clothes = clothesMaterial();\n antiTile(M.grass, 0.31, 0.045); antiTile(M.asphalt, 0.37, 0.06); dirtMaterial(M.dirt);\n M.glass.userData.without = true; M.water.userData.without = true; M.screen.userData.without = true; M.building.userData.without = true;\n return M;\n }\n // texture with no visible repetition: two samples at different scales/rotations, blended by low-frequency noise + macro brightness variation\n function antiTile(mat, scale2, fn) {\n mat.onBeforeCompile = sh => {\n sh.fragmentShader = sh.fragmentShader.replace('void main() {', `float h21(vec2 p){ p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); }\n float vn(vec2 p){ vec2 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f); return mix(mix(h21(i), h21(i + vec2(1.0, 0.0)), f.x), mix(h21(i + vec2(0.0, 1.0)), h21(i + vec2(1.0, 1.0)), f.x), f.y); }\n void main() {`).replace('#include <map_fragment>', `\n vec2 uvB = mat2(0.82, 0.57, -0.57, 0.82) * vMapUv * ${scale2.toFixed(3)} + vec2(0.37, 0.11);\n vec4 sampledDiffuseColor = mix(texture2D(map, vMapUv), texture2D(map, uvB), smoothstep(0.30, 0.70, vn(vMapUv * ${fn.toFixed(3)} * 4.0)));\n sampledDiffuseColor.rgb *= 0.86 + 0.28 * vn(vMapUv * ${fn.toFixed(3)} * 0.9 + 17.0);\n diffuseColor *= sampledDiffuseColor;`);\n };\n mat.customProgramCacheKey = () => 'antitile' + scale2;\n }\n // R46: packed earth with no visible 2 to 30 m grid: the UV is the world (no atlas cell per square), three samples of the texture at different scales and rotations\n // blended by world-space noise, plus macro brightness and colour variation at 4 scales (0.7 m to 40 m) and damp stains\n function dirtMaterial(mat) {\n mat.onBeforeCompile = sh => {\n sh.fragmentShader = sh.fragmentShader.replace('void main() {', `float h21(vec2 p){ p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); }\n float vn(vec2 p){ vec2 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f); return mix(mix(h21(i), h21(i + vec2(1.0, 0.0)), f.x), mix(h21(i + vec2(0.0, 1.0)), h21(i + vec2(1.0, 1.0)), f.x), f.y); }\n void main() {`).replace('#include <map_fragment>', `\n vec2 wp = vMapUv * 2.0;\n vec2 uvB = mat2(0.82, 0.57, -0.57, 0.82) * vMapUv * 0.37 + vec2(0.37, 0.11);\n vec2 uvC = mat2(0.60, -0.80, 0.80, 0.60) * vMapUv * 0.173 + vec2(0.71, 0.29);\n vec4 sA = texture2D(map, vMapUv), sB = texture2D(map, uvB), sC = texture2D(map, uvC);\n vec4 sampledDiffuseColor = mix(mix(sA, sB, smoothstep(0.25, 0.75, vn(wp / 3.1 + 5.0))), sC, 0.25 + 0.5 * smoothstep(0.3, 0.7, vn(wp / 11.0 + 40.0)));\n float m1 = vn(wp / 0.7), m2 = vn(wp / 2.3 + 11.0), m3 = vn(wp / 7.0 + 23.0), m4 = vn(wp / 38.0 + 3.0);\n float br = 0.70 + 0.62 * (0.12 * m1 + 0.25 * m2 + 0.33 * m3 + 0.30 * m4);\n sampledDiffuseColor.rgb *= br * vec3(1.0 + 0.10 * (m4 - 0.5), 1.0, 1.0 - 0.16 * (m3 - 0.5));\n sampledDiffuseColor.rgb *= 1.0 - 0.22 * smoothstep(0.62, 0.9, vn(wp / 4.4 + 90.0));\n diffuseColor *= sampledDiffuseColor;`);\n };\n mat.customProgramCacheKey = () => 'terra46';\n }\n // clothes on the line: per-vertex sway (no per-frame allocation); uTime/uWind are updated in animateClotheslines()\n const CLOTHES_UNIFORMS = { uTime: { value: 0 }, uVento: { value: 0.6 } };\n function clothesMaterial() {\n const m = new THREE.MeshLambertMaterial({ vertexColors: true, side: THREE.DoubleSide });\n m.onBeforeCompile = sh => {\n sh.uniforms.uTime = CLOTHES_UNIFORMS.uTime; sh.uniforms.uVento = CLOTHES_UNIFORMS.uVento;\n sh.vertexShader = sh.vertexShader.replace('void main() {', 'uniform float uTempo; uniform float uVento;\\nvoid main() {').replace('#include <begin_vertex>', `#include <begin_vertex>\n float pend = clamp(-position.y / 0.7, 0.0, 1.0); float fase = position.x * 2.6 + position.z * 1.7;\n float on = sin(uTempo * 2.1 + fase) * 0.6 + sin(uTempo * 3.7 + fase * 1.9) * 0.25;\n transformed.z += on * pend * 0.07 * uVento; transformed.x += cos(uTempo * 1.6 + fase) * pend * 0.025 * uVento; transformed.y += abs(on) * pend * pend * 0.012 * uVento;`);\n };\n m.customProgramCacheKey = () => 'clothes';\n return m;\n }\n const ORDER = { glass: 3, water: 2, screen: 3, building: 4 };\n const NO_SHADOW = new Set(['dirt', 'glass', 'water', 'screen', 'building', 'picture', 'floor', 'emissive']);\n Object.assign(K, { createMaterials, antiTile, dirtMaterial, CLOTHES_UNIFORMS, clothesMaterial, ORDER, NO_SHADOW });\n}\n","// Literal port of the team's Casa3DSDK (module kernel/close-scene). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installKernelCloseScene(K: Kernel, shared: Shared): void {\n const { THREE, NO_SHADOW, ORDER, PARTS, applyPart, cursor } = K;\n const assembleCars = (...a: any[]): any => K.assembleCars(...a);\n const assembleMirrors = (...a: any[]): any => K.assembleMirrors(...a);\n const assembleVegetation = (...a: any[]): any => K.assembleVegetation(...a);\n // builds the meshes per group (THREE.Group) from the accumulators and resets\n // userData of the merged mesh: destructionMaterial (predominant material), destructionPart + structuralRole (when the mesh is a single piece),\n // destructionParts (ids) and ranges [{id, v0, v1, i0, i1}] = where each piece sits in the vertices and indices (hit -> piece: house.structure.pieceId(mesh, faceIndex))\n function markMesh(m, A) {\n const L = A.lim, fx = [];\n for (let k = 0; k < L.length; k++) { if (!L[k].pc) continue; const v1 = k + 1 < L.length ? L[k + 1].v : A.nv, i1 = k + 1 < L.length ? L[k + 1].i : A.ni; if (v1 > L[k].v) fx.push({ id: L[k].pc.id, v0: L[k].v, v1, i0: L[k].i, i1 }); }\n if (!fx.length) return;\n const u = m.userData, ids = [...new Set(fx.map(f => f.id))], weight = {};\n for (const f of fx) { const mt = shared.ctx.pieces.get(f.id).mat; weight[mt] = (weight[mt] || 0) + f.v1 - f.v0; }\n u.ranges = fx; u.destructionParts = ids; u.destructionMaterial = Object.keys(weight).sort((a, b) => weight[b] - weight[a])[0];\n if (ids.length === 1) { u.destructionPart = ids[0]; const pc = shared.ctx.pieces.get(ids[0]); if (pc.role) u.structuralRole = pc.role; }\n }\n function closeScene(mats) {\n const groups = {};\n for (const A of cursor.accs.values()) {\n if (!A.nv) continue;\n const g = new THREE.BufferGeometry();\n g.setAttribute('position', new THREE.BufferAttribute(A.p.slice(0, A.nv * 3), 3)); g.setAttribute('normal', new THREE.BufferAttribute(A.n.slice(0, A.nv * 3), 3));\n g.setAttribute('color', new THREE.BufferAttribute(A.c.slice(0, A.nv * 3), 3)); g.setAttribute('uv', new THREE.BufferAttribute(A.u.slice(0, A.nv * 2), 2));\n g.setIndex(new THREE.BufferAttribute(A.i.slice(0, A.ni), 1)); g.computeBoundingSphere(); g.computeBoundingBox();\n const m = new THREE.Mesh(g, mats[A.mat]); m.castShadow = !NO_SHADOW.has(A.mat); m.receiveShadow = A.mat !== 'emissive'; m.renderOrder = ORDER[A.mat] || 0; m.name = A.group + '/' + A.mat + (A.piece0 ? '/' + A.piece0.id : ''); markMesh(m, A);\n (groups[A.group] || (groups[A.group] = new THREE.Group())).add(m);\n }\n cursor.accs.clear();\n // moving parts: group with the origin at the pivot, inside the parent group; the meshes inherit userData.part so the ray finds the piece\n for (const P of PARTS) {\n const g = groups[P.name] || new THREE.Group(); delete groups[P.name];\n g.name = P.name; g.position.set(P.pos[0], P.pos[1], P.pos[2]); g.rotation.y = P.ry || 0; g.updateMatrix();\n Object.assign(g.userData, P.meta, { part: P.type, pivot: true });\n g.traverse(o => { if (o !== g) o.userData.part = P.type; });\n if (P.meta.hidden) g.visible = false;\n if (g.userData.opens) { g.userData.pose0 = null; applyPart(g, 0); if (P.meta.t0) applyPart(g, P.meta.t0); }\n (groups[P.parent] || (groups[P.parent] = new THREE.Group())).add(g);\n if (P.meta.id) (shared.ctx.parts || (shared.ctx.parts = {}))[P.meta.id] = g;\n }\n PARTS.length = 0;\n assembleMirrors(groups); assembleCars(groups); assembleVegetation(groups);\n return groups;\n }\n Object.assign(K, { markMesh, closeScene });\n}\n","// Literal port of the team's Casa3DSDK (module house/helpers). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installHouseHelpers(K: Kernel, shared: Shared): void {\n // ---------------- 30 house ----------------\n // ===== house: walls with gaps, doors, windows, floors, slabs, ceilings, stairs, elevator, furniture =====\n shared.ctx = {};\n // context of the house being built/used (enter(h) switches between houses)\n const OPEN_ROOM_TYPES = new Set(['balcony', 'terrace', 'veranda', 'balcony_gourmet']);\n const NO_CEILING = OPEN_ROOM_TYPES;\n const OPEN_AREA = c => OPEN_ROOM_TYPES.has(c.type) || c.outdoor === true;\n // open area: no roof or ceiling\n const EPS = 1e-3;\n const Y0 = f => { const A = shared.ctx.r.floors; return A[Math.max(0, Math.min(A.length - 1, f))].y0; };\n const colorOf = v => (typeof v === 'number' ? v : (typeof v === 'string' && shared.ctx.colors[v] != null ? shared.ctx.colors[v] : null));\n const rectsOf = c => (c.parts && c.parts.length ? c.parts : [[c.u0, c.v0, c.u1, c.v1]]);\n function roomAt(f, u, v) { for (const c of shared.ctx.r.rooms) if (c.floor === f) for (const [a, b, c2, d] of rectsOf(c)) if (u > a + EPS && u < c2 - EPS && v > b + EPS && v < d - EPS) return c; return null; }\n function subRect(a, b) { // a minus b (rectangles [u0,v0,u1,v1])\n const [ax0, az0, ax1, az1] = a, [bx0, bz0, bx1, bz1] = b;\n if (bx0 >= ax1 - EPS || bx1 <= ax0 + EPS || bz0 >= az1 - EPS || bz1 <= az0 + EPS) return [a];\n const o = [];\n if (bz0 > az0 + EPS) o.push([ax0, az0, ax1, bz0]); if (bz1 < az1 - EPS) o.push([ax0, bz1, ax1, az1]);\n const z0 = Math.max(az0, bz0), z1 = Math.min(az1, bz1);\n if (bx0 > ax0 + EPS) o.push([ax0, z0, bx0, z1]); if (bx1 < ax1 - EPS) o.push([bx1, z0, ax1, z1]);\n return o;\n }\n function subRects(rs, holes) { let L = rs; for (const h of holes) L = L.flatMap(r => subRect(r, h)); return L; }\n const wallColor = c => (c && c.color && colorOf(c.color.wall) != null ? colorOf(c.color.wall) : 0xe4e0d8);\n const floorColor = c => (c && c.color && colorOf(c.color.floor) != null ? colorOf(c.color.floor) : 0xb0a898);\n function stairFootprint(m) { // stair rectangle [u0,v0,u1,v1] (front = local +z)\n const c = Math.cos(m.ry), s = Math.sin(m.ry), pts = [[-m.w / 2, -m.d / 2], [m.w / 2, -m.d / 2], [m.w / 2, m.d / 2], [-m.w / 2, m.d / 2]].map(([a, b]) => [m.x + a * c + b * s, m.z - a * s + b * c]);\n return [Math.min(...pts.map(p => p[0])), Math.min(...pts.map(p => p[1])), Math.max(...pts.map(p => p[0])), Math.max(...pts.map(p => p[1]))];\n }\n function effectiveHeight(f, h) { const A = shared.ctx.r.floors; if (f + 1 >= A.length) return h; const pitch = A[f + 1].y0 - A[f].y0; return h > pitch && h - pitch <= 0.45 ? pitch : h; }\n Object.assign(K, { OPEN_ROOM_TYPES, NO_CEILING, OPEN_AREA, EPS, Y0, colorOf, rectsOf, roomAt, subRect, subRects, wallColor, floorColor, stairFootprint, effectiveHeight });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module house/walls). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installHouseWalls(K: Kernel, shared: Shared): void {\n const { EPS, Y0, boxC, bx, cursor, effectiveHeight, pieceRecord, structurePiece, wallColor } = K;\n function wallBox(alongU, L, a, b, ya, yb, th, cL, cH, mL, mH) {\n if (yb - ya < 1e-4 || b - a < 1e-4) return;\n if (alongU) { bx(mL, a, ya, L - th / 2, b, yb, L, cL); bx(mH, a, ya, L, b, yb, L + th / 2, cH); }\n else { bx(mL, L - th / 2, ya, a, L, yb, b, cL); bx(mH, L, ya, a, L + th / 2, yb, b, cH); }\n }\n // colour and material of each side of a wall: sides = [lower-coordinate side, higher side]\n function sideOf(id, frontLine) {\n const R = shared.ctx.r, F = R.facade;\n if (id === 'outside' || !shared.ctx.roomById[id]) {\n const ac = F.finish; let mat = 'plaster', color = shared.ctx.colors.facade;\n if (ac === 'roughcast') mat = 'roughcast'; else if (ac === 'exposed_block') { mat = 'block'; color = 0xc4c0b8; } else if (ac === 'partial_plaster' && !frontLine) { mat = 'block'; color = 0xc4c0b8; }\n return { color, mat, exterior: true };\n }\n return { color: wallColor(shared.ctx.roomById[id]), mat: 'plaster', exterior: false };\n }\n const pieceOf = w => !w.id ? null : structurePiece(w.id) || pieceRecord(w.id, w.material || 'brick', w.role || 'partition', { floor: w.floor });\n function nearestWall(f, axis, L, c) { // wall segment of the axis/line closest to c (door lintels belong to it)\n let m = null, md = 1e9;\n for (const w of shared.ctx.r.walls) { if (w.floor !== f || w.axis !== axis || w.type !== 'wall' || Math.abs((axis === 'u' ? w.v0 : w.u0) - L) > EPS) continue; const a = Math.min(axis === 'u' ? w.u0 : w.v0, axis === 'u' ? w.u1 : w.v1), b = Math.max(axis === 'u' ? w.u0 : w.v0, axis === 'u' ? w.u1 : w.v1), d = c < a ? a - c : c > b ? c - b : 0; if (d < md) { md = d; m = w; } }\n return m;\n }\n function walls() {\n const R = shared.ctx.r, cut = shared.ctx.cut, nA = R.floors.length, vMin = Math.min(...R.walls.map(w => (w.axis === 'u' ? w.v0 : Math.min(w.v0, w.v1))));\n const corners = new Map();\n // (CTX.colliders is zeroed on rebuild: here only the walls are added, after the lot wall and gates)\n for (const w of R.walls) {\n const f = w.floor; cursor.group = 'f' + f; cursor.pc = pieceOf(w);\n const y0 = Y0(f), pitch = f + 1 < nA ? Y0(f + 1) - y0 : Infinity, th = w.thickness || 0.15, alongU = w.axis === 'u';\n const h = effectiveHeight(f, w.h);\n const hh = cut ? Math.min(h, 1.2) : h, L = alongU ? w.v0 : w.u0, s0 = Math.min(alongU ? w.u0 : w.v0, alongU ? w.u1 : w.v1), s1 = Math.max(alongU ? w.u0 : w.v0, alongU ? w.u1 : w.v1);\n const front = alongU && Math.abs(L - vMin) < 0.05;\n const sideL = sideOf(w.sides[0], front), sideH = sideOf(w.sides[1], front);\n shared.ctx.colliders.push({ type: 'wall', piece: w.id, f, x0: alongU ? s0 : L - th / 2, z0: alongU ? L - th / 2 : s0, x1: alongU ? s1 : L + th / 2, z1: alongU ? L + th / 2 : s1 });\n if (w.type === 'railing') { // guardrail: glass between two rails and posts\n const c0 = shared.ctx.colors.metal != null ? shared.ctx.colors.metal : 0x8a8e92;\n const sx = alongU ? 1 : 0, sz = alongU ? 0 : 1, len = s1 - s0, n = Math.max(1, Math.round(len / 1.4));\n const cx_ = alongU ? (s0 + s1) / 2 : L, cz_ = alongU ? L : (s0 + s1) / 2;\n boxC('glass', cx_, y0 + 0.55, cz_, alongU ? len : 0.02, 0.85, alongU ? 0.02 : len, 0xffffff);\n boxC('metal', cx_, y0 + 1.08, cz_, alongU ? len : 0.05, 0.05, alongU ? 0.05 : len, c0); boxC('metal', cx_, y0 + 0.1, cz_, alongU ? len : 0.05, 0.04, alongU ? 0.05 : len, c0);\n for (let k = 0; k <= n; k++) { const t = s0 + len * k / n; boxC('metal', alongU ? t : L, y0 + 0.55, alongU ? L : t, 0.05, 1.1, 0.05, c0); }\n continue;\n }\n const seg = (a, b, ya, yb) => {\n wallBox(alongU, L, a, b, y0 + ya, y0 + yb, th, sideL.color, sideH.color, sideL.mat, sideH.mat);\n // (R46: the external baseboard and protective sidewalk are drawn by baseboardAndSidewalk(), which closes the corners)\n };\n const win = R.windows.filter(j => j.floor === f && j.axis === w.axis && Math.abs(j.pos - L) < EPS && j.at + j.width / 2 > s0 + EPS && j.at - j.width / 2 < s1 - EPS).sort((p, q) => p.at - q.at);\n let cur = s0;\n for (const j of win) { const a = Math.max(s0, j.at - j.width / 2), b = Math.min(s1, j.at + j.width / 2); seg(cur, a, 0, hh); seg(a, b, 0, Math.min(j.y0, hh)); if (j.y1 < hh) seg(a, b, j.y1, hh); cur = b; }\n seg(cur, s1, 0, hh);\n if (cut) { // thin cover to see the plan\n const t = 0.03; if (alongU) bx('plaster', s0, y0 + hh, L - th / 2, s1, y0 + hh + t, L + th / 2, 0xeeeae2); else bx('plaster', L - th / 2, y0 + hh, s0, L + th / 2, y0 + hh + t, s1, 0xeeeae2);\n }\n if (w.exterior) for (const [pu, pv] of alongU ? [[s0, L], [s1, L]] : [[L, s0], [L, s1]]) { const k = f + ':' + pu.toFixed(2) + ':' + pv.toFixed(2); const e = corners.get(k) || { n: 0, axes: new Set(), f, pu, pv, th, hh, y0, color: sideL.exterior ? sideL : sideH }; e.n++; e.axes.add(w.axis); e.hh = Math.min(e.hh, hh); corners.set(k, e); }\n }\n cursor.pc = null;\n for (const e of corners.values()) if (e.axes.size === 2 && e.n === 2) { cursor.group = 'f' + e.f; bx(e.color.mat, e.pu - e.th / 2, e.y0, e.pv - e.th / 2, e.pu + e.th / 2, e.y0 + e.hh, e.pv + e.th / 2, e.color.color); }\n }\n Object.assign(K, { wallBox, sideOf, pieceOf, nearestWall, walls });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module house/doors). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installHouseDoors(K: Kernel, shared: Shared): void {\n const seedKey = (id: any): any => K.seedKey(id);\n const { EPS, Y0, boxC, bx, cursor, effectiveHeight, nearestWall, part, pieceOf, pieceRecord, roomAt, sideOf, wallBox } = K;\n const SEED = (...a: any[]): any => K.SEED(...a);\n const definePiece = (...a: any[]): any => K.definePiece(...a);\n const rngString = (...a: any[]): any => K.rngString(...a);\n const sh = (...a: any[]): any => K.sh(...a);\n function doorLineSides(p) { // colours of both sides in the door gap, from the neighbouring wall\n const R = shared.ctx.r, alongU = p.axis === 'u', a = p.at - p.width / 2, b = p.at + p.width / 2;\n const w = R.walls.find(w => w.floor === p.floor && w.axis === p.axis && Math.abs((alongU ? w.v0 : w.u0) - p.pos) < EPS && w.type === 'wall' && (Math.abs((alongU ? w.u1 : w.v1) - a) < 0.02 || Math.abs((alongU ? w.u0 : w.v0) - b) < 0.02));\n const sides = w ? w.sides : [p.a, p.b];\n return [sideOf(sides[0], false), sideOf(sides[1], false)];\n }\n shared.doorState = new Map();\n // door id -> open (survives the night/cut swap; reset when the house changes)\n function doors() {\n shared.ctx.leaves = [];\n const R = shared.ctx.r, cut = shared.ctx.cut, C = shared.ctx.colors, wood = C.wood != null ? C.wood : 0x7a5434, frame = sh(wood, 0.55);\n for (const p of R.doors) {\n const f = p.floor; cursor.group = 'f' + f; const y0 = Y0(f), alongU = p.axis === 'u', L = p.pos, a = p.at - p.width / 2, b = p.at + p.width / 2;\n const wref = R.walls.find(w => w.floor === f && w.axis === p.axis && Math.abs((alongU ? w.v0 : w.u0) - L) < EPS), th = wref ? wref.thickness || 0.15 : 0.15, wallHeight = wref ? wref.h : 3;\n const PMAT = (R.style === 'budget' || R.style === 'commercial') ? 'doorPaint' : 'doorWood'; // leaf texture: painted or wood grain, by style\n const dH = Math.min(p.model === 'steel' ? 2.3 : 2.1, wallHeight - 0.15), visH = cut ? Math.min(dH, 1.2) : dH, [lL, lH] = doorLineSides(p);\n if (!cut && wallHeight > dH + 1e-3) { const wv = nearestWall(f, p.axis, L, p.at); cursor.pc = wv ? pieceOf(wv) : null; wallBox(alongU, L, a, b, y0 + dH, y0 + effectiveHeight(f, wallHeight), th, lL.color, lH.color, lL.mat, lH.mat); cursor.pc = null; }\n const fb = (u0, y_0, u1, y_1, tt = th + 0.02, color = frame) => alongU ? bx('wood', u0, y0 + y_0, L - tt / 2, u1, y0 + y_1, L + tt / 2, color) : bx('wood', L - tt / 2, y0 + y_0, u0, L + tt / 2, y0 + y_1, u1, color);\n const jw = 0.05; cursor.pc = pieceRecord('jamb:' + p.id, 'wood_hard', null, { floor: f }); fb(a, 0, a + jw, visH); fb(b - jw, 0, b, visH); if (!cut) fb(a, dH - jw, b, dH); cursor.pc = null;\n // opening direction: room side p.opensTo\n const sample = (sd) => roomAt(f, alongU ? p.at : L + sd * 0.5, alongU ? L + sd * 0.5 : p.at);\n let sw = 1; { const cH = sample(1), cL = sample(-1); if (cL && cL.id === p.opensTo) sw = -1; else if (cH && cH.id === p.opensTo) sw = 1; }\n const leaf = (u0, u1, y_0, y_1, tt, color, mat = 'wood') => alongU ? bx(mat, u0, y0 + y_0, L - tt / 2, u1, y0 + y_1, L + tt / 2, color) : bx(mat, L - tt / 2, y0 + y_0, u0, L + tt / 2, y0 + y_1, u1, color);\n const extC = wood; // the entrance door uses the house's wood material/colour (the lot gate colour may be almost black and left the leaf black)\n // moving leaves: each in its own group with the origin at the hinge (E opens and closes in first person)\n const open0 = p.blocked ? false : (shared.doorState.has(p.id) ? shared.doorState.get(p.id) : !!p.open); shared.doorState.set(p.id, open0);\n const dc = alongU ? [p.at, L] : [L, p.at];\n const fo: any = { id: p.id, floor: f, type: p.model === 'steel' ? 'steel' : 'swing', open: open0, t: open0 ? 1 : 0, blockedFlag: !!p.blocked, locked: R.state === 'fortified' && !!p.exterior, handleNames: [], hT: 0, cx: dc[0], cz: dc[1], visH, groups: [], col: null };\n const colR = { type: 'door', f, x0: alongU ? a : L - th / 2, z0: alongU ? L - th / 2 : a, x1: alongU ? b : L + th / 2, z1: alongU ? L + th / 2 : b, off: open0 };\n shared.ctx.colliders.push(colR); fo.col = colR;\n const leafBox = (hu, d0, d1, y_0, y_1, tt, color, mat) => alongU ? bx(mat, d0, y_0, -tt / 2, d1, y_1, tt / 2, color) : bx(mat, -tt / 2, y_0, d0, tt / 2, y_1, d1, color); // coordinates relative to the hinge\n const newGroup = (k, hu, topY?) => { cursor.group = 'dyn:' + p.id + ':' + k; fo.groups.push({ name: cursor.group, pos: alongU ? [hu, topY != null ? y0 + topY : y0, L] : [L, topY != null ? y0 + topY : y0, hu] }); };\n if (p.model === 'steel') {\n // sectional garage door: light neutral colour or wood (never the dark lot gate colour), panels with grooves and viewer\n const light = [0xd9d5cc, 0xc9c6bf, 0xe4e0d6], pal = ((R.seed | 0) + (p.id.length * 7)) % 4, color = pal === 3 ? wood : light[pal], mid = (a + b) / 2; newGroup(0, mid, visH);\n const la = a + jw - mid, lb = b - jw - mid, nSec = Math.max(4, Math.round(visH / 0.5)), hs = visH / nSec, grv = sh(color, 0.55);\n leafBox(0, la, lb, -visH, 0, 0.05, color, 'metal');\n for (let k = 1; k < nSec; k++) leafBox(0, la, lb, -k * hs - 0.012, -k * hs + 0.012, 0.07, grv, 'metal'); // joints between sections\n const np = Math.max(2, Math.round((lb - la) / 0.8)), pw = (lb - la) / np;\n for (let k = 0; k < nSec; k++) for (let i = 0; i < np; i++) leafBox(0, la + i * pw + 0.07, la + (i + 1) * pw - 0.07, -(k + 1) * hs + 0.07, -k * hs - 0.07, 0.062, sh(color, k % 2 ? 0.93 : 1.06), 'metal'); // raised panels\n for (let i = 0; i < np; i++) leafBox(0, la + i * pw + 0.14, la + (i + 1) * pw - 0.14, -hs + 0.12, -0.12, 0.072, 0x5a6670, 'glass'); // viewers in the top section\n leafBox(0, -0.1, 0.1, -visH + 0.5, -visH + 0.55, 0.085, 0x3a3a3e, 'metal'); // pull\n fo.minScale = Math.min(1, 0.28 / visH); fo.rot = 0;\n } else {\n const nf = p.model === 'double' ? 2 : 1, aa = a + jw, bb = b - jw;\n for (let k = 0; k < nf; k++) {\n const u0 = nf === 2 ? (k ? (aa + bb) / 2 : aa) : aa, u1 = nf === 2 ? (k ? bb : (aa + bb) / 2) : bb, color = p.exterior ? extC : wood;\n const hingeAt = nf === 2 ? (k ? u1 : u0) : (p.hinge === 'end' ? u1 : u0), dir = hingeAt === u0 ? 1 : -1, len = u1 - u0; newGroup(k, hingeAt);\n const d0 = dir > 0 ? 0.005 : -len + 0.005, d1 = dir > 0 ? len - 0.005 : -0.005;\n leafBox(hingeAt, d0, d1, 0, visH, 0.04, color, PMAT);\n { const e0 = Math.min(d0, d1) + 0.1, e1 = Math.max(d0, d1) - 0.1, pc = sh(color, 0.82); // leaf panels\n if (e1 - e0 > 0.2 && visH > 1.2) { leafBox(hingeAt, e0, e1, 0.15, visH * 0.45, 0.055, pc, PMAT); leafBox(hingeAt, e0, e1, visH * 0.5, visH - 0.15, 0.055, pc, PMAT); } }\n { // lock plate, keyhole and handle (own group, turns when opening)\n const hxp = dir * (len - 0.07), yh = 1.0, gn = cursor.group;\n const bk = (da, db, ya, yb, sa, sb, cr, mt) => { const dl = Math.min(da, db), dh = Math.max(da, db), sl = Math.min(sa, sb), sH = Math.max(sa, sb); if (alongU) bx(mt, dl, ya, sl, dh, yb, sH, cr); else bx(mt, sl, ya, dl, sH, yb, dh, cr); };\n for (const sd of [-1, 1]) { bk(hxp - 0.028, hxp + 0.028, yh - 0.13, yh + 0.1, sd * 0.02, sd * 0.026, 0xb8a66e, 'metal'); bk(hxp - 0.008, hxp + 0.008, yh - 0.1, yh - 0.07, sd * 0.026, sd * 0.029, 0x1e1e1e, 'metal'); }\n const nm = 'ix:mac:' + p.id + ':' + k; cursor.group = nm;\n for (const sd of [-1, 1]) { bk(hxp - 0.022, hxp + 0.022, yh - 0.022, yh + 0.022, sd * 0.026, sd * 0.036, 0xcdbb80, 'metal'); bk(hxp, hxp - dir * 0.12, yh - 0.011, yh + 0.011, sd * 0.036, sd * 0.05, 0xcdbb80, 'metal'); bk(hxp - dir * 0.10, hxp - dir * 0.12, yh - 0.02, yh + 0.011, sd * 0.036, sd * 0.052, 0xcdbb80, 'metal'); }\n cursor.group = gn;\n definePiece(nm, { kind: 'handle', pivot: alongU ? [hxp, yh, 0] : [0, yh, hxp], ry: 0, leaf: fo, k, axis: alongU ? 'z' : 'x', angle: (alongU ? dir : -dir) * 0.62 }); fo.handleNames.push(nm);\n }\n const A = alongU ? [dir, 0] : [0, dir], n = alongU ? [0, sw] : [sw, 0];\n fo.rot = Math.atan2(n[0] * A[1] - n[1] * A[0], A[0] * n[0] + A[1] * n[1]);\n }\n }\n shared.ctx.leaves.push(fo); cursor.group = 'f' + f;\n if (p.blocked) { // wooden boards nailed horizontally, with two diagonals behind, on both sides (weathered wood; no flat colour)\n part('window_boards', [0, 0, 0], () => { // GAME HOOK (stage 2): the boards are a part ('boards:<door>') so the game can hide them when the barricade falls\n const rb = rngString(SEED() + '|' + seedKey(p.id) + '|tabua'), cx0 = alongU ? p.at : L, cz0 = alongU ? L : p.at, nT = Math.max(4, Math.round((visH - 0.3) / 0.3)), Lg = p.width + 0.34, WOODS = [0x7a5634, 0x6b4a2a, 0x8a6a44, 0x5e4228, 0x735a42];\n const puts = (along, y, off, comp, alt, thickness, color, tilt) => { // board: along = position along the wall, off = offset from the wall\n const x = alongU ? along : L + off, z = alongU ? L + off : along; boxC('wood', x, y0 + y, z, comp, alt, thickness, color, 0, alongU ? 0 : K.PE, tilt);\n };\n const nailColor = (along, y, off) => { const x = alongU ? along : L + off, z = alongU ? L + off : along; boxC('metal', x, y0 + y, z, alongU ? 0.022 : 0.016, 0.022, alongU ? 0.016 : 0.022, 0x3a3836); };\n for (const sd of [-1, 1]) {\n const o1 = sd * (th / 2 + 0.017), o2 = sd * (th / 2 + 0.047), angle = Math.atan2(visH - 0.4, p.width + 0.2) * (rb() < 0.5 ? 1 : -1);\n for (let k = 0; k < 2; k++) { const a2 = k ? -angle : angle; puts(alongU ? cx0 : cz0, visH / 2, o1, Math.hypot(p.width + 0.2, visH - 0.4) + 0.1, 0.12, 0.028, sh(WOODS[(rb() * 5) | 0], 0.85), a2); }\n for (let k = 0; k < nT; k++) {\n const y = 0.18 + k * (visH - 0.4) / (nT - 1) + (rb() - 0.5) * 0.04, comp = Lg + (rb() - 0.5) * 0.12, tilt = (rb() - 0.5) * 0.05, alt = 0.13 + rb() * 0.03, c0 = alongU ? cx0 : cz0, color = WOODS[(rb() * WOODS.length) | 0];\n puts(c0 + (rb() - 0.5) * 0.06, y, o2, comp, alt, 0.03, color, tilt);\n for (const e of [-1, 1]) { nailColor(c0 + e * (comp / 2 - 0.07), y + Math.sin(tilt) * e * comp / 2, o2 + sd * 0.019); }\n }\n }\n }, { id: 'boards:' + p.id }, 'f' + f);\n shared.ctx.colliders.push({ type: 'board', f, x0: alongU ? a : L - th / 2, z0: alongU ? L - th / 2 : a, x1: alongU ? b : L + th / 2, z1: alongU ? L + th / 2 : b });\n }\n }\n }\n Object.assign(K, { doorLineSides, doors });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars, prefer-const -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module house/windows). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installHouseWindows(K: Kernel, shared: Shared): void {\n const { EPS, Y0, boxC, bx, cursor, pieceRecord, roomAt } = K;\n const FRAME_COLORS = { budget: 0xf1f1ee, mid: 0xc3c8cc, high: 0x2b2e33, commercial: 0xb4babf };\n // white, aluminium, black\n const SILL_COLORS = { budget: 0xe6e4de, mid: 0xd9d9d4, high: 0x3a3d42, commercial: 0xc9ccce };\n function windows() {\n const R = shared.ctx.r, cut = shared.ctx.cut, C = shared.ctx.colors, structure = R.style, fr = FRAME_COLORS[structure] || FRAME_COLORS.budget, pe_ = SILL_COLORS[structure] || SILL_COLORS.budget; // frame and sill: fixed neutral colours (facadeDetail is an accent colour)\n const boardItems = new Set(R.stateItems.filter(e => e.type === 'window_boards' && e.window).map(e => e.window));\n for (const j of R.windows) {\n const f = j.floor; cursor.group = 'f' + f; const y0 = Y0(f), alongU = j.axis === 'u', L = j.pos, a = j.at - j.width / 2, b = j.at + j.width / 2;\n let ya = j.y0, yb = j.y1; if (cut) { if (ya >= 1.2) continue; yb = Math.min(yb, 1.2); }\n const wref = R.walls.find(w => w.floor === f && w.axis === j.axis && Math.abs((alongU ? w.v0 : w.u0) - L) < EPS), th = wref ? wref.thickness || 0.15 : 0.15, t = 0.05, tt = th + 0.02;\n const bar = (u0, y_0, u1, y_1, mat, color, tw = tt) => alongU ? bx(mat, u0, y0 + y_0, L - tw / 2, u1, y0 + y_1, L + tw / 2, color) : bx(mat, L - tw / 2, y0 + y_0, u0, L + tw / 2, y0 + y_1, u1, color);\n cursor.pc = pieceRecord('window_frame:' + j.id, 'aluminium', null, { floor: f });\n bar(a, ya, a + t, yb, 'metal', fr); bar(b - t, ya, b, yb, 'metal', fr); bar(a, ya, b, ya + t, 'metal', fr); bar(a, yb - t, b, yb, 'metal', fr);\n if (j.width > 0.9) bar((a + b) / 2 - 0.015, ya, (a + b) / 2 + 0.015, yb, 'metal', fr, 0.04);\n bar(a + t, ya + (yb - ya) * 0.58, b - t, ya + (yb - ya) * 0.58 + 0.025, 'metal', fr, 0.04);\n cursor.pc = pieceRecord('window:' + j.id, 'glass', null, { floor: f }); bar(a + t, ya + t, b - t, yb - t, 'glass', 0xffffff, 0.012); cursor.pc = null;\n // outside: the side without a room\n const am = sd => roomAt(f, alongU ? j.at : L + sd * 0.4, alongU ? L + sd * 0.4 : j.at);\n const outside = !am(1) ? 1 : !am(-1) ? -1 : 0;\n if (outside) {\n const off = outside * (th / 2 + 0.03); // sill\n if (alongU) bx('plaster', a - 0.05, y0 + ya - 0.04, L + (outside > 0 ? th / 2 : -th / 2 - 0.08), b + 0.05, y0 + ya, L + (outside > 0 ? th / 2 + 0.08 : -th / 2), pe_); else bx('plaster', L + (outside > 0 ? th / 2 : -th / 2 - 0.08), y0 + ya - 0.04, a - 0.05, L + (outside > 0 ? th / 2 + 0.08 : -th / 2), y0 + ya, b + 0.05, pe_);\n if (R.facade.grilles && !cut) { const g = C.gate != null ? C.gate : 0x2a2a2e, go = outside * (th / 2 + 0.07), n = Math.max(3, Math.round(j.width / 0.12));\n for (let k = 0; k <= n; k++) { const u = a + 0.03 + k * (j.width - 0.06) / n; if (alongU) bx('metal', u - 0.008, y0 + ya - 0.03, L + go - 0.008, u + 0.008, y0 + yb + 0.03, L + go + 0.008, g); else bx('metal', L + go - 0.008, y0 + ya - 0.03, u - 0.008, L + go + 0.008, y0 + yb + 0.03, u + 0.008, g); }\n for (const y of [ya - 0.03, (ya + yb) / 2, yb + 0.02]) { if (alongU) bx('metal', a, y0 + y, L + go - 0.012, b, y0 + y + 0.025, L + go + 0.012, g); else bx('metal', L + go - 0.012, y0 + y, a, L + go + 0.012, y0 + y + 0.025, b, g); } }\n }\n if (j.boards && !boardItems.has(j.id) && !cut) { // fallback: the viewer's own boards\n const inside = -(outside || -1), off = inside * (th / 2 + 0.04), n = Math.max(3, Math.round((yb - ya) / 0.16));\n for (let k = 0; k < n; k++) { const y = ya + k * (yb - ya - 0.14) / (n - 1); boxC('wood', alongU ? j.at : L + off, y0 + y + 0.07, alongU ? L + off : j.at, j.width + 0.2, 0.14, 0.03, [0x7a5634, 0x6b4a2a, 0x8a6a44][k % 3], 0, alongU ? 0 : K.PE, ((k * 37) % 7 - 3) * 0.012); }\n }\n }\n }\n Object.assign(K, { FRAME_COLORS, SILL_COLORS, windows });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module house/floors). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installHouseFloors(K: Kernel, shared: Shared): void {\n const { rectsOf, EPS, OPEN_AREA, Y0, bx, cursor, floorColor, stairFootprint, structurePiece, subRects } = K;\n function flights() { // each flight between floors only once (the SDK repeats the item at departure and arrival)\n if (shared.ctx._flights && shared.ctx._flights.r === shared.ctx.r) return shared.ctx._flights.l;\n const R = shared.ctx.r, mp = new Map();\n for (const m of R.items) { if (m.type !== 'stairs' || !m.link) continue; const k = [m.link.from, m.link.to, m.x.toFixed(2), m.z.toFixed(2), (m.ry || 0).toFixed(2)].join('|'); if (!mp.has(k)) mp.set(k, { m, from: m.link.from, to: m.link.to, rect: stairFootprint(m) }); }\n const l = [...mp.values()], inter = (a, b) => a[0] < b[2] - EPS && a[2] > b[0] + EPS && a[1] < b[3] - EPS && a[3] > b[1] + EPS;\n for (const v of l) if (l.some(o => o !== v && o.to === v.from && inter(o.rect, v.rect))) { // stacked flight: landing under the first steps (headroom for the flight below)\n const m = v.m, H = Y0(v.to) - Y0(v.from), len = Math.min(m.d * 0.5, Math.max(0.7, m.d * (H - 0.24 - 1.95) / H)), c = Math.cos(m.ry), s_ = Math.sin(m.ry), lz = m.d / 2 - len / 2;\n v.landing = stairFootprint({ x: m.x + lz * s_, z: m.z + lz * c, ry: m.ry, w: m.w, d: len });\n }\n for (const v of l) if (!l.some(o => o !== v && o.from === v.to && inter(o.rect, v.rect))) { // top of a flight with no other flight above: landing (flat floor of the arrival floor) in the last 0.9 m\n const m = v.m, LP = Math.min(0.9, m.d * 0.28), lz = -m.d / 2 + LP / 2; v.LP = LP;\n v.top = stairFootprint({ x: m.x + lz * Math.sin(m.ry), z: m.z + lz * Math.cos(m.ry), ry: m.ry, w: m.w, d: LP });\n }\n shared.ctx._flights = { r: R, l }; return l;\n }\n // The slab pieces of the plan are cut into panels by the structure (`slabPanelView`): a tile of a floor, an underside or a ceiling is split at the borders of\n // the panels and each part is tagged with its own panel, so the panel that fails drops alone. A slab with no panels (a plan with plain slabs) stays one piece.\n const panelRects = p => (p.footprint && p.footprint.length ? p.footprint : [p.aabb]);\n function tilesOf(parent, rc) {\n const ps = parent && shared.ctx.panelsOf && shared.ctx.panelsOf.get(parent);\n if (!ps) return [[parent ? structurePiece(parent) : null, rc]];\n const out = [], taken = [];\n for (const p of ps) for (const q of panelRects(p)) {\n const r = [Math.max(rc[0], q[0]), Math.max(rc[1], q[1]), Math.min(rc[2], q[2]), Math.min(rc[3], q[3])];\n if (r[2] - r[0] > EPS && r[3] - r[1] > EPS) { out.push([structurePiece(p.id), r]); taken.push(r); }\n }\n for (const r of subRects([rc], taken)) out.push([null, r]);\n return out;\n }\n function panelAt(parent, x, z) {\n const ps = shared.ctx.panelsOf && shared.ctx.panelsOf.get(parent);\n if (!ps) return structurePiece(parent);\n for (const p of ps) for (const q of panelRects(p)) if (x >= q[0] - EPS && x <= q[2] + EPS && z >= q[1] - EPS && z <= q[3] + EPS) return structurePiece(p.id);\n return null;\n }\n const hasSlab = id => !!(shared.ctx.structureIndex[id] || (shared.ctx.panelsOf && shared.ctx.panelsOf.has(id)));\n function floorsAndSlabs() {\n const R = shared.ctx.r, nA = R.floors.length, C = shared.ctx.colors;\n const V = flights(), holes = f => V.filter(v => v.to === f).flatMap(v => { let rs = [v.rect]; if (v.top) rs = subRects(rs, [v.top]); for (const o of V) if (o.from === f && o.landing) rs = subRects(rs, [o.landing]); return rs; }), landings = f => V.filter(v => v.from === f && v.landing).map(v => v.landing);\n for (let f = 0; f < nA; f++) {\n cursor.group = 'f' + f; const y0 = Y0(f), bur = holes(f);\n for (const c of R.rooms.filter(c => c.floor === f)) {\n if (c.type === 'void' || c.outbuilding || (c.type === 'elevator' && f > 0)) continue;\n const col = floorColor(c), parent = f > 0 ? ['slab_' + f + '_' + c.type, 'slab_' + f + '_' + c.id, 'slab_' + f].find(hasSlab) : null;\n for (const rc of subRects(rectsOf(c), bur)) for (const [pc, r] of tilesOf(parent, rc)) { cursor.pc = pc; bx('plaster', r[0], y0 - 0.04, r[1], r[2], y0, r[3], col); }\n }\n if (f > 0) { // slab under the floor\n const rs = R.rooms.filter(c => c.floor === f && c.type !== 'void' && c.type !== 'elevator').flatMap(rectsOf); \n for (const rc of subRects(rs, bur)) for (const [pc, r] of tilesOf('slab_' + f, rc)) { cursor.pc = pc; bx('plaster', r[0], y0 - 0.24, r[1], r[2], y0 - 0.04, r[3], C.ceiling != null ? C.ceiling : 0xeeeae2); }\n }\n // ceiling of the rooms with nothing above\n cursor.group = 't' + f; const ceilingOf = hasSlab('slab_' + (f + 1)) ? 'slab_' + (f + 1) : (f === nA - 1 ? ['slab_ceiling', 'slab_top'].find(hasSlab) : null);\n const above = R.rooms.filter(c => c.floor === f + 1).flatMap(rectsOf);\n for (const c of R.rooms.filter(c => c.floor === f && !OPEN_AREA(c))) for (const rc of subRects(rectsOf(c), above)) for (const [pc, r] of tilesOf(ceilingOf, rc)) { cursor.pc = pc; bx('plaster', r[0], y0 + c.ceiling, r[1], r[2], y0 + c.ceiling + 0.2, r[3], C.ceiling != null ? C.ceiling : 0xeeeae2); }\n cursor.pc = null;\n }\n }\n Object.assign(K, { flights, floorsAndSlabs, tilesOf, panelAt });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module house/stairs). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installHouseStairs(K: Kernel, shared: Shared): void {\n const { rectsOf, Y0, boxC, bx, cursor, flights, stairFootprint, structurePiece } = K;\n const sh = (...a: any[]): any => K.sh(...a);\n function buildStairs() {\n const R = shared.ctx.r; shared.ctx.stairs = [];\n for (const vo of flights()) {\n const m = vo.m, f = vo.from, Dr = m.d - (vo.LP || 0); cursor.group = 'f' + f; cursor.pc = structurePiece('stairs_' + vo.from + '_' + vo.to); const y0 = Y0(f), H = Y0(m.link.to) - y0, n = Math.max(8, Math.round(H / 0.18)), c = Math.cos(m.ry), s = Math.sin(m.ry);\n const wood = shared.ctx.colors.wood != null ? shared.ctx.colors.wood : 0x8a6a48, under = sh(wood, 0.7);\n const P = (lx, lz) => [m.x + lx * c + lz * s, m.z - lx * s + lz * c];\n const boxL = (mat, lx, y, lz, w, h, d, color, rx = 0) => { const [px, pz] = P(lx, lz); boxC(mat, px, y, pz, w, h, d, color, rx, m.ry, 0); };\n for (let i = 0; i < n; i++) {\n const top = (i + 1) * H / n, lz = m.d / 2 - (i + 0.5) * Dr / n;\n boxL('wood', 0, y0 + top - 0.03, lz, m.w - 0.08, 0.06, Dr / n + 0.03, wood); // step\n boxL('wood', 0, y0 + top - H / n / 2, lz + Dr / n / 2, m.w - 0.08, H / n, 0.025, under); // riser\n }\n const L = Math.hypot(Dr, H), al = Math.atan2(H, Dr), lzc = m.d / 2 - Dr / 2;\n for (const sd of [-1, 1]) {\n boxL('wood', sd * (m.w / 2 - 0.02), y0 + H / 2 - 0.12, lzc, 0.04, 0.24, L, under, al);\n const side = sd; // handrail on the side opposite the wall (local +x side) and on the other\n boxL('metal', side * (m.w / 2 - 0.02), y0 + H / 2 + 0.9, lzc, 0.04, 0.04, L, 0x4a4a4e, al);\n for (let k = 0; k <= 4; k++) { const t = k / 4, lz = m.d / 2 - t * Dr; boxL('metal', side * (m.w / 2 - 0.02), y0 + t * H + 0.45, lz, 0.03, 0.9, 0.03, 0x4a4a4e); }\n }\n cursor.pc = null; shared.ctx.stairs.push({ m, f, to: vo.to, y0, H, rect: stairFootprint(m), landingPoint: (vo.LP || 0) / m.d });\n }\n }\n function elevator() {\n const R = shared.ctx.r;\n for (const c of R.rooms.filter(c => c.type === 'elevator' && c.floor === 0)) {\n cursor.group = 'f0'; const [u0, v0, u1, v1] = rectsOf(c)[0], y0 = Y0(0);\n bx('metal', u0 + 0.15, y0 + 0.05, v0 + 0.15, u1 - 0.15, y0 + 2.3, v1 - 0.15, 0x9aa0a6); bx('emissive', u0 + 0.3, y0 + 2.28, v0 + 0.3, u1 - 0.3, y0 + 2.3, v1 - 0.3, shared.ctx.night ? 0xfff0c8 : 0xcfd2d4);\n for (const f of R.floors) { const yy = Y0(f.index); cursor.group = 'f' + f.index; bx('metal', u0 + 0.05, yy, (v0 + v1) / 2 - 0.4, u0 + 0.09, yy + 2.1, (v0 + v1) / 2 + 0.4, 0x8a9096); }\n }\n }\n Object.assign(K, { buildStairs, elevator });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module lights/fixtures). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installLightsFixtures(K: Kernel, shared: Shared): void {\n const seedKey = (id: any): any => K.seedKey(id);\n const { cursor, part, polyFace } = K;\n const makeApi = (...a: any[]): any => K.makeApi(...a);\n // ---------------- 21 fixtures ----------------\n // ===== lamps, plumbing (shower, taps, tub), mirror, curtain, switch, mailbox, water tank =====\n // Moving pieces come out as named parts (userData.part) with the pivot at the hinge/axis; see part() and applyPart() in 10-geom.js.\n function hashString(s) { let h = 2166136261; for (const ch of String(s)) h = Math.imul(h ^ ch.charCodeAt(0), 16777619); return h >>> 0; }\n function rngString(s) { let h = hashString(s) || 1; return () => { h = (h + 0x6D2B79F5) | 0; let t = Math.imul(h ^ (h >>> 15), 1 | h); t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; }\n const SEED = () => (shared.ctx.r && shared.ctx.r.seed) || 0;\n const STYLE = () => (shared.ctx.r && shared.ctx.r.style) || 'budget';\n // kit with the item's frame: W converts local->world; t = tube between two points; e = centred ellipsoid; part = moving part in the item's frame\n shared.api0 = null;\n // direct api (no recording): moving parts never go through the movable-item/curtain recorder\n function kit2(M, A, y0 = M.y || 0) {\n const c = Math.cos(M.ry), s = Math.sin(M.ry); let api = A;\n const W = (lx, ly, lz) => [M.x + lx * c + lz * s, M.base + y0 + ly, M.z - lx * s + lz * c];\n const K = {\n W, y0, M, get A() { return api; },\n b: (mat, x, y, z, w, h, d, color?, ry?, rx?, rz?) => api.box(M, mat, x, y0 + y, z, w, h, d, color, ry || 0, rx || 0, rz || 0),\n c: (mat, x, y, z, r, h, color?, seg?) => api.cylinder(M, mat, x, y0 + y, z, r, h, color, 0, 0, seg),\n e: (mat, x, y, z, r, h, color?) => api.cylinder(M, mat, x, y0 + y - h / 2, z, r, h, color, 0, 0, 'sphere'),\n t(mat, p, q, r, color?, seg?) {\n const dx = q[0] - p[0], dy = q[1] - p[1], dz = q[2] - p[2], L = Math.hypot(dx, dy, dz); if (L < 1e-5) return;\n const nx = dx / L, ny = dy / L, nz = dz / L;\n if (Math.abs(nx) < 1e-4 && Math.abs(nz) < 1e-4) { api.cylinder(M, mat, p[0], y0 + Math.min(p[1], q[1]), p[2], r, L, color, 0, 0, seg); return; }\n api.cylinder(M, mat, (p[0] + q[0]) / 2, y0 + (p[1] + q[1]) / 2, (p[2] + q[2]) / 2, r, L, color, Math.atan2(nz, ny), -Math.asin(nx), seg);\n },\n polyFace: (mat, pts, color, hint) => polyFace(mat, pts.map(p => W(p[0], p[1], p[2])), color, hint && [hint[0] * c + hint[2] * s, hint[1], -hint[0] * s + hint[2] * c]),\n part(type, lx, ly, lz, fn, meta) { if (type === 'lamp' && String(cursor.group).startsWith('ix:light:')) { fn(); return null; } const a0 = api; api = shared.api0 || (shared.api0 = makeApi()); try { return part(type, W(lx, ly, lz), fn, meta || {}, undefined, M.ry); } finally { api = a0; } },\n };\n return K;\n }\n const arcPoints = (cx, cy, r, a0, a1, n) => { const o = []; for (let i = 0; i <= n; i++) { const a = a0 + (a1 - a0) * i / n; o.push([cx + Math.cos(a) * r, cy + Math.sin(a) * r]); } return o; };\n // ---------- lamps ----------\n const TEMP_WARM = [0xffd49a, 0xffdca8, 0xffe2b4], TEMP_NEUTRAL = [0xfff0d8, 0xfff6e8, 0xf8f4ec], TEMP_COOL = [0xeaf2ff, 0xf4f8ff];\n function colorTemperature(M) { // colour temperature per room and seed: warm (2700 K), neutral (4000 K) or cool (5000 K)\n const r = rngString(SEED() + '|' + (seedKey(M.room) || seedKey(M.seed)) + '|temp'), v = r(), tp = M.typeWith || '';\n const cold = /bathroom|vanity|kitchen|laundry|garage|shop|counter|stockroom|office|pharmacy|market/.test(tp);\n const pool = cold ? (v < 0.5 ? TEMP_NEUTRAL : v < 0.85 ? TEMP_COOL : TEMP_WARM) : (v < 0.62 ? TEMP_WARM : TEMP_NEUTRAL);\n return pool[(r() * pool.length) | 0];\n }\n function lightStyle(M, requested) { // picks the ceiling lamp type by class, room and seed\n const r = rngString(SEED() + '|' + (seedKey(M.seed) || '') + '|' + (seedKey(M.room) || '') + '|luz'), v = r(), structure = STYLE(), tp = M.typeWith || '';\n if (structure === 'commercial') return 'trough';\n const social = /living|dining|hall|kitchen|gourmet/.test(tp);\n if (structure === 'budget') return v < 0.55 ? 'bare' : v < 0.9 ? 'round' : 'square';\n if (structure === 'mid') return v < 0.32 ? 'round' : v < 0.6 ? 'square' : v < 0.78 ? (social ? 'track' : 'round') : (social ? 'pendant' : 'square');\n return v < 0.28 ? 'recessed' : v < 0.5 ? 'track' : v < 0.75 ? (social ? 'pendant' : 'recessed') : (/living|dining|hall/.test(tp) ? 'chandelier' : 'recessed');\n }\n // builds the lamp: baked = unlit piece; on = emissive piece (part 'lamp', hidden when off)\n function ceilingLamp(M, A, type) {\n const K = kit2(M, A, 0), t = M.ceiling || 2.8, color = colorTemperature(M), r = rngString(SEED() + '|' + seedKey(M.seed) + '|lz');\n const id = 'lamp_' + (M.seed || hashString(M.x + ',' + M.z)), meta = { id, room: M.room, on: !!M.on, color, lightType: type, hidden: !M.on };\n const white = 0xf4f2ec, offset = 0xe9e7df;\n let yLight = t - 0.18, range = 6;\n const emitter = (fn) => K.part('lamp', 0, t, 0, fn, meta);\n if (type === 'bare') {\n K.c('plain', 0, t - 0.03, 0, 0.05, 0.03, white); K.c('metal', 0, t - 0.085, 0, 0.022, 0.055, 0x6a6a66); K.c('plain', 0, t - 0.105, 0, 0.026, 0.02, 0xd8d0b8);\n K.e('plain', 0, t - 0.165, 0, 0.036, 0.085, 0xf3f1ea);\n emitter(() => K.e('emissive', 0, t - 0.165, 0, 0.0385, 0.088, color)); yLight = t - 0.22; range = 5.5;\n } else if (type === 'round') {\n K.c('plain', 0, t - 0.05, 0, 0.19, 0.05, white); K.c('plain', 0, t - 0.07, 0, 0.165, 0.02, offset);\n emitter(() => K.c('emissive', 0, t - 0.073, 0, 0.1675, 0.023, color)); yLight = t - 0.2;\n } else if (type === 'square') {\n K.b('plain', 0, t - 0.05, 0, 0.36, 0.05, 0.36, white); K.b('plain', 0, t - 0.07, 0, 0.3, 0.02, 0.3, offset);\n emitter(() => K.b('emissive', 0, t - 0.073, 0, 0.3025, 0.023, 0.3025, color)); yLight = t - 0.2;\n } else if (type === 'recessed') {\n const o = 0.5;\n for (const [x, z] of [[-o, -o], [o, -o], [-o, o], [o, o]]) { K.c('metal', x, t - 0.014, z, 0.066, 0.014, 0xe2e2de); K.c('plain', x, t - 0.026, z, 0.05, 0.012, offset); }\n emitter(() => { for (const [x, z] of [[-o, -o], [o, -o], [-o, o], [o, o]]) K.c('emissive', x, t - 0.028, z, 0.0505, 0.014, color); }); yLight = t - 0.3; range = 6.5;\n } else if (type === 'track') {\n const len = 1.1, angle = r() < 0.5 ? 0 : Math.PI / 2, c = Math.cos(angle), s = Math.sin(angle);\n K.b('metal', 0, t - 0.03, 0, angle ? 0.035 : len, 0.03, angle ? len : 0.035, 0x2a2a2c);\n const cab = []; for (let i = -1; i <= 1; i++) { const u = i * len * 0.33, x = u * c, z = u * s; K.c('metal', x, t - 0.1, z, 0.016, 0.07, 0x2a2a2c); const p0 = [x, t - 0.1, z], d = [0.0, -0.78, 0.62], L = 0.13, q = [x + d[0] * L, t - 0.1 + d[1] * L, z + d[2] * L]; K.t('metal', p0, q, 0.034, 0x303034); cab.push([q, d]); }\n emitter(() => { for (const [q, d] of cab) K.t('emissive', [q[0] - d[0] * 0.003, q[1] - d[1] * 0.003, q[2] - d[2] * 0.003], [q[0] + d[0] * 0.012, q[1] + d[1] * 0.012, q[2] + d[2] * 0.012], 0.029); }); yLight = t - 0.3; range = 6.5;\n } else if (type === 'pendant') {\n const drop = Math.max(0.4, Math.min(1.1, t - 2.05)), yc = t - drop, cs = [0x2a2a2c, 0xe8e2d4, 0xb88a54, 0x35566e][(r() * 4) | 0];\n K.c('plain', 0, t - 0.025, 0, 0.05, 0.025, white); K.c('metal', 0, yc, 0, 0.006, drop - 0.02, 0x1a1a1a);\n K.e('plain', 0, yc - 0.09, 0, 0.19, 0.2, cs); K.e('plain', 0, yc - 0.2, 0, 0.065, 0.085, 0xf3f1ea);\n emitter(() => K.e('emissive', 0, yc - 0.2, 0, 0.069, 0.089, color)); yLight = yc - 0.3; range = 6.5;\n } else if (type === 'chandelier') {\n const yc = t - 0.5, gold = (shared.ctx.colors && shared.ctx.colors.metal != null) ? shared.ctx.colors.metal : 0x8a7a5a, N = 6;\n K.c('metal', 0, yc, 0, 0.012, 0.5, gold); K.e('metal', 0, yc - 0.03, 0, 0.055, 0.08, gold); K.c('metal', 0, yc - 0.06, 0, 0.14, 0.015, gold);\n for (let i = 0; i < N; i++) { const an = i * Math.PI * 2 / N, cx = Math.cos(an), cz = Math.sin(an); K.t('metal', [cx * 0.04, yc - 0.05, cz * 0.04], [cx * 0.28, yc - 0.02, cz * 0.28], 0.008, gold); K.c('plain', cx * 0.28, yc - 0.02, cz * 0.28, 0.02, 0.07, 0xf0e6c8); K.e('plain', cx * 0.28, yc + 0.07, cz * 0.28, 0.014, 0.034, 0xe9dcb4); K.e('glass', cx * 0.22, yc - 0.12, cz * 0.22, 0.016, 0.07, 0xffffff); }\n K.e('glass', 0, yc - 0.17, 0, 0.04, 0.16, 0xffffff);\n emitter(() => { for (let i = 0; i < N; i++) { const an = i * Math.PI * 2 / N; K.e('emissive', Math.cos(an) * 0.28, yc + 0.07, Math.sin(an) * 0.28, 0.0155, 0.036, color); } }); yLight = yc - 0.05; range = 7;\n } else if (type === 'trough') {\n K.b('metal', 0, t - 0.045, 0, 1.2, 0.045, 0.1, 0xdcdcd8); K.b('plain', 0, t - 0.058, 0, 1.12, 0.013, 0.06, 0xe9e9e4);\n emitter(() => K.b('emissive', 0, t - 0.0605, 0, 1.125, 0.0155, 0.0625, color)); yLight = t - 0.2; range = 7;\n }\n if (M.on && A.light) A.light(Object.assign({}, M, { lampId: id }), 0, yLight, 0, color, range, 'ceiling_light');\n }\n // standalone lamps\n function tableLamp(M, A, y) { // table lamp: base, stem and shade\n const K = kit2(M, A, 0), color = colorTemperature(M), id = 'lamp_ab_' + M.seed, cp = [0xf0e2c0, 0xe8e2d4, 0xcfd8de][(hashString(seedKey(M.seed) + 'cp') % 3)], meta = { id, room: M.room, on: !!M.on, color, lightType: 'table_lamp', hidden: !M.on };\n K.e('plain', 0, y + 0.045, 0, 0.065, 0.09, 0x3a3228); K.c('metal', 0, y + 0.08, 0, 0.008, 0.14, 0x8a7a5a); K.c('plain', 0, y + 0.2, 0, 0.115, 0.15, cp);\n K.part('lamp', 0, y + 0.2, 0, () => K.c('emissive', 0, y + 0.2, 0, 0.118, 0.152, color), meta);\n if (M.on && A.light) A.light(Object.assign({}, M, { lampId: id }), 0, y + 0.3, 0, color, 3.5, 'table_lamp');\n }\n function floorLamp(M, A) { // floor lamp: base, stem and cylindrical shade\n const K = kit2(M, A, M.y || 0), color = colorTemperature(M), id = 'lamp_pe_' + M.seed, h = Math.min(1.6, M.h || 1.5), meta = { id, room: M.room, on: !!M.on, color, lightType: 'floor', hidden: !M.on };\n K.c('metal', 0, 0, 0, 0.13, 0.025, 0x2a2a2c); K.c('metal', 0, 0.025, 0, 0.011, h - 0.3, 0x2a2a2c); K.c('plain', 0, h - 0.28, 0, 0.17, 0.26, 0xeee6d0);\n K.part('lamp', 0, h - 0.28, 0, () => K.c('emissive', 0, h - 0.28, 0, 0.173, 0.262, color), meta);\n if (M.on && A.light) A.light(Object.assign({}, M, { lampId: id }), 0, h - 0.15, 0, color, 5, 'floor');\n }\n function sconce(M, A) { // wall lamp: plate, arm and shade; front = +z\n const K = kit2(M, A, M.y || 1.7), color = colorTemperature(M), id = 'lamp_ar_' + M.seed, meta = { id, room: M.room, on: !!M.on, color, lightType: 'sconce', hidden: !M.on };\n K.b('metal', 0, -0.07, 0.008, 0.07, 0.14, 0.016, 0xd8d4c8); K.t('metal', [0, 0, 0.016], [0, 0, 0.075], 0.011, 0xb0a888);\n K.e('plain', 0, 0.0, 0.1, 0.06, 0.15, 0xf2ecdc);\n K.part('lamp', 0, 0, 0.1, () => K.e('emissive', 0, 0.0, 0.1, 0.0625, 0.153, color), meta);\n if (M.on && A.light) A.light(Object.assign({}, M, { lampId: id }), 0, 0.02, 0.2, color, 3, 'sconce');\n }\n function outdoorLamp(M, A) { // entrance door light: socket + bulb (budget) or wall lamp\n const K = kit2(M, A, M.y || 2.2), color = colorTemperature(M), id = 'lamp_ext_' + M.seed, structure = STYLE(), meta = { id, room: 'outside', on: !!M.on, color, lightType: 'outdoor', hidden: !M.on };\n if (structure === 'budget') { K.c('plain', 0, -0.0, 0.01, 0.05, 0.02, 0xf2f0ea); K.t('metal', [0, 0, 0.0], [0, 0, 0.07], 0.022, 0x6a6a66); K.e('plain', 0, 0, 0.115, 0.036, 0.085, 0xf3f1ea); K.part('lamp', 0, 0, 0.115, () => K.e('emissive', 0, 0, 0.115, 0.0385, 0.088, color), meta); }\n else { K.b('metal', 0, -0.08, 0.01, 0.12, 0.16, 0.02, 0x2a2a2c); K.b('plain', 0, -0.09, 0.07, 0.11, 0.18, 0.1, 0xe8e6de); K.part('lamp', 0, -0.09, 0.07, () => K.b('emissive', 0, -0.09, 0.07, 0.1125, 0.1825, 0.1025, color), meta); }\n // R61: the light is born AT the bulb (y is the lamp height in the house world: M.y, not relative to the floor of the storey as it was) and a hand's width in front of it; short range and weak (lum/dist/decay are suggestions the app uses on the PointLight)\n if (M.on && A.light) A.light(Object.assign({}, M, { lampId: id }), 0, (M.y != null ? M.y : 2.2) - (structure === 'budget' ? 0.0 : 0.09), structure === 'budget' ? 0.2 : 0.2, color, 3.2, 'outdoor', { lumens: 3.2, dist: 5.5, decay: 2 });\n }\n // ---------- switch: fixed plate + moving key (part 'light_switch'); front = +z, y = height ----------\n function lightSwitch(M, A) {\n const K = kit2(M, A, M.y != null && M.y > 0 ? M.y : 1.1), two = !!M.double;\n K.b('plain', 0, -0.045, 0.004, 0.085, 0.09, 0.008, 0xf2f1ec); K.b('plain', 0, -0.036, 0.0095, 0.062, 0.072, 0.003, 0xe6e4dd);\n for (let i = 0; i < (two ? 2 : 1); i++) { const x = two ? (i ? 0.022 : -0.022) : 0; K.part('light_switch', x, 0, 0.011, () => K.b('plain', x, -0.018, 0.0125, two ? 0.03 : 0.036, 0.034, 0.008, 0xfbfaf6, 0, -0.12), { id: 'sw_' + M.seed + '_' + i, room: M.room, target: M.target || M.room, opens: { type: 'toggle', axis: [1, 0, 0], angle: 0.24 }, on: !!M.on, t0: M.on ? 1 : 0 }); }\n }\n Object.assign(K, { hashString, rngString, SEED, STYLE, kit2, arcPoints, TEMP_WARM, TEMP_NEUTRAL, TEMP_COOL, colorTemperature, lightStyle, ceilingLamp, tableLamp, floorLamp, sconce, outdoorLamp, lightSwitch });\n}\n","// Literal port of the team's Casa3DSDK (module lights/decor). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installLightsDecor(K: Kernel, shared: Shared): void {\n const { EPS, OPEN_AREA, SEED, Y0, cursor, rngString, roomAt, stairFootprint } = K;\n const lightItem = (...a: any[]): any => K.lightItem(...a);\n // ===== extra lamps by class and seed: table lamp on a bedside table, floor lamp beside the sofa, sconces beside the mirror and an outdoor lamp at the entrance door =====\n function decorLights(api) {\n const R = shared.ctx.r, T = shared.ctx.types, structure = R.style, chance = structure === 'budget' ? 0.35 : structure === 'mid' ? 0.75 : 1, rnd = rngString(SEED() + '|decorluz');\n const itemsF = f => R.items.filter(m => (m.outdoor ? -1 : m.floor) === f && m.type !== 'stairs');\n const rectsF = f => itemsF(f).filter(m => (m.h || 0) > 0.3 && !/rug|floor|concrete|dirt|lawn|ceiling_light|curtain|blinds|picture|mirror|pendant|chandelier|spot/.test(m.type)).map(m => stairFootprint(m));\n const free = (f, x, z, margin) => { // point with no wall or furniture within a radius\n if (!roomAt(f, x, z)) return false;\n for (const c of shared.ctx.colliders) if ((c.f === f) && x > c.x0 - margin && x < c.x1 + margin && z > c.z0 - margin && z < c.z1 + margin) return false;\n for (const r of rectsF(f)) if (x > r[0] - margin && x < r[2] + margin && z > r[1] - margin && z < r[3] + margin) return false;\n return true;\n };\n const puts = (f, type, m0, extra) => {\n const ent = T[type]; if (!ent) return; const com = shared.ctx.roomById[m0.room], g = 'f' + f, base = Y0(f);\n const M = Object.assign({ x: m0.x, z: m0.z, ry: m0.ry || 0, w: m0.w || 0.3, d: m0.d || 0.3, h: m0.h || 0.3, y: 0, base, floor: f, colors: shared.ctx.colors, seed: m0.id, room: m0.room, typeWith: com ? com.type : null, ceiling: com ? com.ceiling : 2.8, on: shared.ctx.night, light: shared.ctx.night, lit: shared.ctx.night }, extra || {});\n cursor.group = g; lightItem({ id: m0.id, room: m0.room }, M, ent, api, g);\n };\n for (const c of R.rooms) {\n if (c.type === 'void' || OPEN_AREA(c)) continue; const f = c.floor, mv = R.items.filter(m => m.room === c.id && !m.outdoor);\n if (structure === 'commercial') continue;\n // table lamp on a bedside table / low chest (bedroom, living room)\n if (/bedroom|suite|living/.test(c.type)) for (const m of mv) if (/^(nightstand|dresser|console_table)$/.test(m.type) && (m.h || 1) <= 0.8 && rnd() < chance && !mv.some(o => o !== m && (o.y || 0) > 0.3 && Math.abs(o.x - m.x) < 0.3 && Math.abs(o.z - m.z) < 0.3)) { puts(f, 'table_lamp', { id: 'ab_' + m.id, room: c.id, x: m.x, z: m.z, ry: m.ry }, { y: m.h || 0.6 }); break; }\n // floor lamp beside the sofa\n if (c.type === 'living' && structure !== 'budget' && rnd() < 0.7) { const sf = mv.find(m => /^sofa/.test(m.type)); if (sf) { const co = Math.cos(sf.ry || 0), si = Math.sin(sf.ry || 0); for (const sd of (rnd() < 0.5 ? [1, -1] : [-1, 1])) { const lx = sd * (sf.w / 2 + 0.3), lz = -sf.d / 2 + 0.25, x = sf.x + lx * co + lz * si, z = sf.z - lx * si + lz * co; if (free(f, x, z, 0.32)) { puts(f, 'floor_lamp', { id: 'lp_' + sf.id, room: c.id, x, z, ry: 0 }, { h: 1.5 }); break; } } } }\n // sconces on both sides of the mirror (bathroom, powder room)\n if (/bathroom|vanity/.test(c.type) && structure !== 'budget') { const es = mv.find(m => m.type === 'mirror'); if (es && rnd() < 0.8) for (const sd of [-1, 1]) { const co = Math.cos(es.ry || 0), si = Math.sin(es.ry || 0), lx = sd * ((es.w || 0.6) / 2 + 0.2), x = es.x + lx * co, z = es.z - lx * si; puts(f, 'sconce', { id: 'ar' + sd + '_' + es.id, room: c.id, x, z, ry: es.ry || 0 }, { y: (es.y || 0.9) + (es.h || 1.2) * 0.75 + 0.1 }); } }\n }\n // lamp on the outside wall, beside the entrance door\n const pe = R.doors.find(p => p.exterior && p.side === 'front') || R.doors.find(p => p.exterior);\n if (pe && T.outdoor_lamp) {\n const alongU = pe.axis === 'u', wref = R.walls.find(w => w.floor === pe.floor && w.axis === pe.axis && Math.abs((alongU ? w.v0 : w.u0) - pe.pos) < EPS), th = wref ? wref.thickness || 0.15 : 0.15, n = pe.b === 'outside' ? 1 : -1; // n: direction of the outside relative to pe.a\n const inside = roomAt(pe.floor, alongU ? pe.at : pe.pos - 0.4, alongU ? pe.pos - 0.4 : pe.at), sd = inside ? 1 : -1; // outside = opposite the room\n const sdf = roomAt(pe.floor, alongU ? pe.at : pe.pos + 0.4, alongU ? pe.pos + 0.4 : pe.at) ? -1 : 1;\n const u = pe.at + pe.width / 2 + 0.32, face = pe.pos + sdf * th / 2, ry = alongU ? (sdf > 0 ? 0 : Math.PI) : (sdf > 0 ? K.PE : -K.PE);\n puts(pe.floor, 'outdoor_lamp', { id: 'ext_' + pe.id, room: 'outside', x: alongU ? u : face, z: alongU ? face : u, ry }, { y: Y0(pe.floor) + 2.15 - Y0(pe.floor) });\n void n; void sd;\n }\n }\n Object.assign(K, { decorLights });\n}\n","// Literal port of the team's Casa3DSDK (module lot/terrain). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installLotTerrain(K: Kernel, shared: Shared): void {\n const { rectsOf, MIRRORS, PARTS, bx, cursor } = K;\n // ---------------- 40 lot and roofs ----------------\n // ===== lot: terrain, walls and tops, gates, roofs =====\n function terrain() {\n PARTS.length = 0; MIRRORS.length = 0; K.CARS.length = 0; shared.partCount = 0; shared.ctx.parts = {}; shared.tapCount = 0; shared.ctx.clotheslines = [];\n if (shared.ctx.noTerrain) return; // opts.terrain === false: the app already has ground, street and lawn\n const R = shared.ctx.r, lt = R.lot, C = shared.ctx.colors; cursor.group = 'floor';\n const light = (c, f) => { const m = k => Math.round(((c >> k) & 255) * (1 - f) + 255 * f); return (m(16) << 16) | (m(8) << 8) | m(0); };\n bx('grass', -150, -0.5, -150, 170, -0.1, 170, light(C.lawn != null ? C.lawn : 0x7aa84a, 0.72)); // back lawn, subtle texture\n if (lt) {\n const [u0, v0, u1, v1] = lt.rect;\n bx('sidewalk', u0, -0.09, v0, u1, -0.03, v1, 0xdedad2); // lot base (the floor zones come on top)\n bx('asphalt', u0 - 40, -0.09, v0 - 9, u1 + 40, -0.03, v0 - 1.8, 0x8d9096); // street\n bx('sidewalk', u0 - 40, -0.06, v0 - 1.8, u1 + 40, 0.02, v0, 0xe4e0d6); // sidewalk\n for (let x = u0 - 38; x < u1 + 40; x += 6) bx('plaster', x, 0, v0 - 5.6, x + 2.6, 0.005, v0 - 5.4, 0xe8e4b8); // centre line\n } else {\n const b = shared.ctx.limits; bx('sidewalk', b.x0 - 6, -0.09, b.z0 - 6, b.x1 + 6, -0.03, b.z1 + 6, 0xdedad2);\n }\n }\n // R63: stretches [x0,x1] of the wall segment (axis a..b on line L) that do NOT go through a room of the house (room wall against the lot wall)\n function freeSpans(alongU, L, a, b) {\n const blocks = [];\n for (const c of shared.ctx.r.rooms) { if (c.type === 'void' || c.floor < 0) continue;\n for (const [u0, v0, u1, v1] of rectsOf(c)) { const c0 = alongU ? v0 : u0, c1 = alongU ? v1 : u1, lo = alongU ? u0 : v0, hi = alongU ? u1 : v1; if (L >= c0 - 0.3 && L <= c1 + 0.3 && hi > a && lo < b) blocks.push([lo - 0.3, hi + 0.3]); } }\n blocks.sort((p, q) => p[0] - q[0]); const out = []; let x = a;\n for (const [lo, hi] of blocks) { if (lo > x) out.push([x, Math.min(lo, b)]); x = Math.max(x, hi); if (x >= b) break; }\n if (x < b) out.push([x, b]); return out.filter(q => q[1] - q[0] > 0.3);\n }\n Object.assign(K, { terrain, freeSpans });\n}\n","// Literal port of the team's Casa3DSDK (module lot/perimeter). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installLotPerimeter(K: Kernel, shared: Shared): void {\n const { EPS, boxC, bx, colorOf, cursor, freeSpans, pieceRecord } = K;\n const makeApi = (...a: any[]): any => K.makeApi(...a);\n const sh = (...a: any[]): any => K.sh(...a);\n function perimeter() {\n const R = shared.ctx.r, lt = R.lot, C = shared.ctx.colors; if (!lt) return; cursor.group = 'lot';\n const rnd = (() => { let s = 99; return () => (s = (s * 16807) % 2147483647) / 2147483647; })();\n const api = makeApi();\n for (const s of lt.perimeter) {\n const alongU = Math.abs(s.v1 - s.v0) < EPS, L = alongU ? s.v0 : s.u0, a = Math.min(alongU ? s.u0 : s.v0, alongU ? s.u1 : s.v1), b = Math.max(alongU ? s.u0 : s.v0, alongU ? s.u1 : s.v1);\n cursor.pc = pieceRecord('lot_wall:' + s.id, s.type === 'wall' ? 'brick' : s.type === 'fence' ? 'wood_soft' : 'steel', null, { tags: ['wall'] });\n const th = s.thickness || 0.15, h = s.height, color = colorOf(s.color) != null ? colorOf(s.color) : (C.wall || 0xb8b4aa), len = b - a;\n const B = (mat, u0, y0, u1, y1, t, c, off = 0) => alongU ? bx(mat, u0, y0, L + off - t / 2, u1, y1, L + off + t / 2, c) : bx(mat, L + off - t / 2, y0, u0, L + off + t / 2, y1, u1, c);\n const col = { type: 'lot_wall', f: -1, x0: alongU ? a : L - th / 2, z0: alongU ? L - th / 2 : a, x1: alongU ? b : L + th / 2, z1: alongU ? L + th / 2 : b }; shared.ctx.colliders.push(col);\n if (s.type === 'wall') { B('plaster', a, 0, b, h, th, color); B('plaster', a, h, b, h + 0.05, th + 0.06, sh(color, 1.15)); }\n else if (s.type === 'fence') {\n const np = Math.max(2, Math.round(len / 2.4) + 1);\n for (let k = 0; k < np; k++) { const u = a + k * len / (np - 1); B('wood', u - 0.04, 0, u + 0.04, h, 0.08, 0x6a5a48); }\n B('screen', a, 0.1, b, h - 0.05, 0.01, 0xb8bcc0); B('metal', a, h - 0.05, b, h, 0.03, 0x8a8e92); B('metal', a, 0.08, b, 0.12, 0.03, 0x8a8e92);\n } else { // iron grille on a low wall\n const gc = C.gate != null ? C.gate : 0x2a2a2e, mh = 0.5;\n B('plaster', a, 0, b, mh, th, color); B('plaster', a, mh, b, mh + 0.04, th + 0.05, sh(color, 1.15));\n const n = Math.max(2, Math.round(len / 0.13)); for (let k = 0; k <= n; k++) { const u = a + k * len / n; B('metal', u - 0.012, mh + 0.04, u + 0.012, h, 0.025, gc); }\n B('metal', a, h - 0.06, b, h - 0.03, 0.04, gc); B('metal', a, mh + 0.1, b, mh + 0.13, 0.04, gc);\n }\n // top\n const top = s.top, ym = h + (s.type === 'wall' ? 0.05 : 0); cursor.pc = null;\n if (top === 'glass') { const cs = [0x2f7a4f, 0x8a5a2a, 0xe8eef0, 0x3a6aa0, 0x4f9a5f]; for (let u = a + 0.05; u < b - 0.03; u += 0.07 + rnd() * 0.04) { const hh = 0.07 + rnd() * 0.09, c = cs[(rnd() * cs.length) | 0], angle = (rnd() - 0.5) * 0.7; boxC('plain', alongU ? u : L + (rnd() - 0.5) * th * 0.6, ym + hh / 2, alongU ? L + (rnd() - 0.5) * th * 0.6 : u, 0.035, hh, 0.02, c, alongU ? 0 : 0, rnd() * 3, angle); } }\n else if (top === 'razor_wire' || top === 'barbed_wire') { // R63: where the house meets the lot wall the wire crossed the room's wall; cuts the stretch and closes each end with a post\n const frees = freeSpans(alongU, L, a, b), high = top === 'razor_wire' ? 0.46 : 0.4;\n for (const [x0, x1] of frees) {\n const w2 = x1 - x0, cm = (x0 + x1) / 2;\n const M = top === 'razor_wire' ? { x: alongU ? cm : L, z: alongU ? L : cm, ry: alongU ? 0 : K.PE, w: w2, d: 0.4, h: 0.4, y: ym, base: 0, floor: -1, colors: C, seed: s.id } : { x: alongU ? cm : L, z: alongU ? L : cm, ry: alongU ? 0 : K.PE, w: w2, d: 0.1, h: 0.3, y: 0, base: ym, floor: -1, colors: C, seed: s.id };\n try { shared.ctx.mv.builders[top](M, api); } catch (e) { console.warn(e); }\n for (const [e, cutOff] of [[x0, x0 > a + 0.01], [x1, x1 < b - 0.01]]) if (cutOff) { B('metal', e - 0.025, ym, e + 0.025, ym + high, 0.05, 0x55585c); B('metal', e - 0.04, ym + high, e + 0.04, ym + high + 0.025, 0.08, 0x3a3c40); }\n }\n }\n else if (top === 'railing') { const gc = C.gate != null ? C.gate : 0x2a2a2e, n = Math.max(2, Math.round(len / 0.14)); for (let k = 0; k <= n; k++) { const u = a + k * len / n; B('metal', u - 0.012, ym, u + 0.012, ym + 0.3, 0.025, gc); B('metal', u - 0.02, ym + 0.3, u + 0.02, ym + 0.38, 0.03, gc); } B('metal', a, ym + 0.08, b, ym + 0.11, 0.03, gc); }\n }\n }\n // SDK paths (lot.paths): paving from the gate to the door; comes over the zone floors (lawn 0.02, ceramic 0.035)\n function paths() {\n const lt = shared.ctx.r.lot; if (!lt || !lt.paths) return; cursor.group = 'lot';\n for (const c of lt.paths) {\n if (c.type === 'vehicle' && c.id !== 'cargo_path') continue; // the garage space already comes paved by the zone\n const color = c.type === 'pedestrian' ? 0xcfcac0 : 0xb4b0a8;\n for (const [u0, v0, u1, v1] of c.rects) {\n bx('sidewalk', u0, 0.0, v0, u1, 0.05, v1, color);\n }\n }\n }\n Object.assign(K, { perimeter, paths });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module lot/gates). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installLotGates(K: Kernel, shared: Shared): void {\n const { bx, colorOf, cursor, cylBase } = K;\n const sh = (...a: any[]): any => K.sh(...a);\n // gates: masonry pillars with caps, leaf set against the pillars (gap = a..b, leaf from a+0.05 to b-0.05 for 60-interacao.js to capture), hinges on the swing ones;\n // automatic tilt-up and sliding (mid/high) carry a motor box; the sliding one has a floor track, a top guide and a rack\n // opening direction of the sliding gate: +1 to the right (if it fits in the lot), otherwise -1\n function slideDirection(g, lt) { return (g.u + g.width / 2 + g.width + 1.2 <= lt.rect[2]) ? 1 : -1; }\n function gates() {\n const R = shared.ctx.r, lt = R.lot, C = shared.ctx.colors; if (!lt) return; cursor.group = 'lot';\n const structure = R.style, auto = structure !== 'budget', wall = colorOf('wall') || 0xb8b4aa, cu = (lt.rect[0] + lt.rect[2]) / 2, cz = (lt.rect[1] + lt.rect[3]) / 2;\n for (const g of lt.gates) {\n const gc = colorOf(g.color) != null ? colorOf(g.color) : (C.gate != null ? C.gate : 0x2a2a2e), a = g.u - g.width / 2, b = g.u + g.width / 2, v = g.v, h = g.height, t = 0.05, ped = g.model === 'pedestrian', tilt = g.model === 'tilting';\n const sd = cz - v >= 0 ? 1 : -1; // direction of the lot relative to the wall\n // pillars (they touch the leaf: inner face at a+0.03 and b-0.03) with cap and dark base\n const pil = (x0, x1, high) => {\n bx('plaster', x0, 0, v - 0.13, x1, high, v + 0.13, wall); bx('plaster', x0 - 0.03, high, v - 0.16, x1 + 0.03, high + 0.05, v + 0.16, sh(wall, 1.12)); bx('plaster', x0 - 0.01, 0, v - 0.14, x1 + 0.01, 0.25, v + 0.14, sh(wall, 0.72));\n bx('plain', (x0 + x1) / 2 - 0.05, high + 0.05, v - 0.05, (x0 + x1) / 2 + 0.05, high + 0.12, v + 0.05, sh(wall, 1.2)); // decorative post\n };\n pil(a - 0.22, a + 0.03, h + 0.14); pil(b - 0.03, b + 0.22, h + 0.14);\n const anchor = (x, y) => { cylBase('metal', x, y, v - 0.0, 0.016, 0.1, gc); };\n const bars = (u0, y0, u1, y1, zc) => { // grille leaf: frame and round bars\n const n = Math.max(3, Math.round((u1 - u0) / 0.12));\n bx('metal', u0, y0, zc - t / 2, u1, y0 + 0.07, zc + t / 2, gc); bx('metal', u0, y1 - 0.07, zc - t / 2, u1, y1, zc + t / 2, gc); bx('metal', u0, y0 + (y1 - y0) / 2, zc - t / 2, u1, y0 + (y1 - y0) / 2 + 0.05, zc + t / 2, gc);\n bx('metal', u0, y0, zc - t / 2, u0 + 0.05, y1, zc + t / 2, gc); bx('metal', u1 - 0.05, y0, zc - t / 2, u1, y1, zc + t / 2, gc);\n for (let k = 1; k < n; k++) { const u = u0 + k * (u1 - u0) / n; bx('metal', u - 0.015, y0 + 0.07, zc - 0.015, u + 0.015, y1 - 0.07, zc + 0.015, gc); }\n };\n const blade = (u0, y0, u1, y1, zc) => { bx('metal', u0, y0, zc - t / 2, u1, y1, zc + t / 2, gc); for (let y = y0 + 0.12; y < y1 - 0.05; y += 0.16) bx('metal', u0, y, zc - t / 2 - 0.01, u1, y + 0.03, zc + t / 2 + 0.01, sh(gc, 0.6)); };\n if (ped) {\n bars(a + 0.05, 0.1, b - 0.05, h - 0.03, v);\n for (const y of [0.3, h - 0.3]) { cylBase('metal', a + 0.035, y - 0.06, v, 0.014, 0.12, sh(gc, 1.3)); bx('metal', a + 0.0, y - 0.03, v - 0.012, a + 0.2 > b - 0.05 ? b - 0.05 : a + 0.04, y + 0.03, v + 0.012, sh(gc, 0.9)); } // hinges (pin on the pillar and flap)\n bx('plain', b - 0.032, h * 0.5 - 0.06, v - 0.03, b - 0.012, h * 0.5 + 0.06, v + 0.03, 0x2a2a2c); bx('metal', b - 0.06, h * 0.5 - 0.02, v - 0.034, b - 0.05, h * 0.5 + 0.02, v + 0.034, 0xc8c8cc); // lock and latch\n } else if (tilt) {\n blade(a + 0.05, 0.05, b - 0.05, h, v); bx('metal', a + 0.05, h - 0.06, v - 0.03, b - 0.05, h, v + 0.03, sh(gc, 0.8));\n bx('metal', a - 0.03, h - 0.02, v - 0.06, a + 0.05, h + 0.06, v + 0.06, 0x3a3a3e); bx('metal', b - 0.05, h - 0.02, v - 0.06, b + 0.03, h + 0.06, v + 0.06, 0x3a3a3e); // axle bearings\n if (auto) { const mx = g.u; bx('plain', mx - 0.2, h + 0.02, v - 0.05 + sd * 0.1, mx + 0.2, h + 0.3, v + 0.2 + sd * 0.1, 0xdcdcd8); bx('plain', mx - 0.17, h + 0.04, v + sd * 0.3, mx + 0.17, h + 0.12, v + sd * 0.31, 0x2a2a2c); bx('emissive', mx + 0.1, h + 0.2, v + sd * 0.2 + sd * 0.0, mx + 0.13, h + 0.23, v + sd * 0.21 + 0.003 * sd, 0xff5a3a); }\n } else { // sliding (R37): the WHOLE leaf (blade, frames, rack) slides on a track; the tail sits on the side it opens to, the track covers the whole travel\n const zc = v + sd * 0.19, tail = 0.9, dirx = slideDirection(g, lt), D = dirx * g.width;\n const x0 = dirx > 0 ? a + 0.05 : a + 0.05 - tail, x1 = dirx > 0 ? b - 0.05 + tail : b - 0.05;\n const r0 = Math.min(x0, x0 + D) - 0.1, r1 = Math.max(x1, x1 + D) + 0.1;\n bx('metal', r0, 0, zc - 0.05, r1, 0.04, zc + 0.05, 0x6a6a6e); bx('plain', r0, 0.04, zc - 0.012, r1, 0.05, zc + 0.012, 0x2a2a2c);\n bx('metal', r0, h + 0.02, zc - 0.05, r1, h + 0.09, zc + 0.05, 0x5a5a5e);\n for (const x of [r0 + 0.05, r1 - 0.05, dirx > 0 ? b + 0.1 : a - 0.1]) bx('metal', x - 0.025, 0, zc - 0.04, x + 0.025, h + 0.09, zc + 0.04, 0x5a5a5e);\n // leaf (captured by gatesInteractive: part 'ix:gate:<id>' with pose by type 'sliding_gate')\n blade(x0, 0.08, x1, h, zc); bx('metal', x0, 0.04, zc - 0.03, x1, 0.08, zc + 0.03, sh(gc, 0.8)); bx('metal', x0, h - 0.07, zc - 0.03, x1, h, zc + 0.03, sh(gc, 0.8));\n for (let x = x0 + 0.04; x < x1 - 0.04; x += 0.06) bx('metal', x, 0.08, zc + sd * 0.03, x + 0.03, 0.12, zc + sd * 0.045, 0x8a8a8e); // rack\n for (const x of [x0 + 0.2, x1 - 0.2]) cylBase('metal', x, 0.0, zc, 0.03, 0.05, 0x2a2a2c); // casters\n if (auto) { const mx = dirx > 0 ? b + 0.45 : a - 0.45; bx('plain', mx - 0.22, 0, zc - sd * 0.0 + sd * 0.1, mx + 0.22, 0.34, zc + sd * 0.45, 0xdcdcd8); bx('plain', mx - 0.2, 0.34, zc + sd * 0.12, mx + 0.2, 0.37, zc + sd * 0.43, 0x2a2a2c); cylBase('metal', mx, 0.05, zc + sd * 0.07, 0.035, 0.05, 0xb0b4b8); bx('emissive', mx + 0.1, 0.28, zc + sd * 0.452, mx + 0.14, 0.31, zc + sd * 0.455, 0x62e07a); }\n }\n if (!g.open || ped) shared.ctx.colliders.push({ type: 'gate', f: -1, x0: a, z0: v - 0.1, x1: b, z1: v + 0.1 });\n }\n }\n Object.assign(K, { slideDirection, gates });\n}\n","// Literal port of the team's Casa3DSDK (module roof/roofs). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installRoofRoofs(K: Kernel, shared: Shared): void {\n const { rectsOf, EPS, OPEN_AREA, Y0, bx, cursor } = K;\n const gutter = (...a: any[]): any => K.gutter(...a);\n const gutterConfig = (...a: any[]): any => K.gutterConfig(...a);\n const roofRect = (...a: any[]): any => K.roofRect(...a);\n const sh = (...a: any[]): any => K.sh(...a);\n const slabs = (...a: any[]): any => K.slabs(...a);\n function roofs() {\n const R = shared.ctx.r, F = R.facade, C = shared.ctx.colors, nA = R.floors.length, type = F.roof; cursor.group = 'roof';\n shared.ctx.roofRects = [];\n shared.ctx.gutter = gutterConfig(); shared.ctx.gutter.ncond = 0; shared.ctx.gutter.nbuz = 0; shared.ctx.gutter.bz = new Set(); shared.ctx.gutterInfo = { gutters: [], downpipes: [], drains: [] };\n const roofColor = C.roof != null ? C.roof : 0xa8543a, gable = (R.seed | 0) % 2 === 0;\n for (let f = 0; f < nA; f++) {\n // the roof only covers closed rooms of the top storey on that footprint: whatever has any room above (including terrace/balcony, whose floor is already the slab) gets no roof\n const rs: any[] = R.rooms.filter(c => c.floor === f && c.type !== 'void' && !c.outbuilding && !OPEN_AREA(c)).flatMap(rectsOf), up: any[] = R.rooms.filter(c => c.floor === f + 1 && c.type !== 'void').flatMap(rectsOf);\n if (!rs.length) continue;\n const xs = [...new Set(rs.flatMap(r => [r[0], r[2]]).map(v => +v.toFixed(3)))].sort((a, b) => a - b), zs = [...new Set(rs.flatMap(r => [r[1], r[3]]).map(v => +v.toFixed(3)))].sort((a, b) => a - b);\n const em = (L, x, z) => L.some(r => x > r[0] + EPS && x < r[2] - EPS && z > r[1] + EPS && z < r[3] - EPS), nx = xs.length - 1, nz = zs.length - 1;\n const cxs = i => (xs[i] + xs[i + 1]) / 2, czs = j => (zs[j] + zs[j + 1]) / 2;\n const occ = []; for (let j = 0; j < nz; j++) { occ[j] = []; for (let i = 0; i < nx; i++) occ[j][i] = em(rs, cxs(i), czs(j)) && !em(up, cxs(i), czs(j)); }\n const O = (j, i) => j >= 0 && j < nz && i >= 0 && i < nx && occ[j][i], U = (j, i) => j >= 0 && j < nz && i >= 0 && i < nx && em(up, cxs(i), czs(j));\n const full = (i0, i1, j0, j1) => { for (let j = j0; j <= j1; j++) for (let i = i0; i <= i1; i++) if (!O(j, i)) return false; return true; };\n const pe = (x0, z0, x1, z1) => { const cs = R.rooms.filter(c => c.floor === f && rectsOf(c).some(r => r[0] < x1 - EPS && r[2] > x0 + EPS && r[1] < z1 - EPS && r[3] > z0 + EPS)); return Y0(f) + Math.max(...cs.map(c => c.ceiling)) + 0.2; };\n if (type === 'slab') { for (let j = 0; j < nz; j++) for (let i = 0; i < nx; i++) if (O(j, i)) shared.ctx.roofRects.push({ f, r: [xs[i], zs[j], xs[i + 1], zs[j + 1]], slab: true, yb: pe(xs[i], zs[j], xs[i + 1], zs[j + 1]) + 0.03 }); slabs(f, xs, zs, O, U, nx, nz, full, pe, C); cursor.pc = null; continue; }\n // maximal rectangles (they may overlap): each becomes a hipped cover and the planes meet at the valleys\n const maxs = [];\n for (let j0 = 0; j0 < nz; j0++) for (let j1 = j0; j1 < nz; j1++) for (let i0 = 0; i0 < nx; i0++) for (let i1 = i0; i1 < nx; i1++) {\n if (!full(i0, i1, j0, j1)) continue;\n if ((i0 > 0 && full(i0 - 1, i1, j0, j1)) || (i1 < nx - 1 && full(i0, i1 + 1, j0, j1)) || (j0 > 0 && full(i0, i1, j0 - 1, j1)) || (j1 < nz - 1 && full(i0, i1, j0, j1 + 1))) continue;\n maxs.push({ i0, i1, j0, j1 });\n }\n const single = maxs.length === 1;\n for (const q of maxs) {\n const x0 = xs[q.i0], x1 = xs[q.i1 + 1], z0 = zs[q.j0], z1 = zs[q.j1 + 1];\n const touchesU = [0, 0, 0, 0]; // eave vanishes where the upper storey touches\n for (let j = q.j0; j <= q.j1; j++) { if (U(j, q.i0 - 1)) touchesU[0] = 1; if (U(j, q.i1 + 1)) touchesU[2] = 1; }\n for (let i = q.i0; i <= q.i1; i++) { if (U(q.j0 - 1, i)) touchesU[1] = 1; if (U(q.j1 + 1, i)) touchesU[3] = 1; }\n shared.ctx.roofRects.push({ f, r: [x0, z0, x1, z1], touchesU });\n const ybq = pe(x0, z0, x1, z1); roofRect(type, x0, z0, x1, z1, ybq, roofColor, gable && single, F, touchesU); cursor.pc = null;\n if (shared.ctx.gutter.on) gutter(type, f, x0, z0, x1, z1, ybq, touchesU);\n }\n }\n for (const e of shared.ctx.outbuildingList || []) { // R43: outbuilding cover (same type of roof as the house)\n const [x0, z0, x1, z1] = e.aabb, yb = Y0(0) + (e.ceiling || 2.6) + 0.2; shared.ctx.roofRects.push({ f: 0, r: [x0, z0, x1, z1], outbuilding: e.id });\n if (type === 'slab') { const c = C.facade != null ? C.facade : 0xd8d0c0; bx('plaster', x0 - 0.08, yb, z0 - 0.08, x1 + 0.08, yb + 0.03, z1 + 0.08, sh(C.ceiling != null ? C.ceiling : 0xb8b4ac, 0.85)); for (const [a, b, c2, d] of [[x0 - 0.08, z0 - 0.08, x1 + 0.08, z0 - 0.04], [x0 - 0.08, z1 + 0.04, x1 + 0.08, z1 + 0.08], [x0 - 0.08, z0 - 0.08, x0 - 0.04, z1 + 0.08], [x1 + 0.04, z0 - 0.08, x1 + 0.08, z1 + 0.08]]) bx('plaster', a, yb, b, c2, yb + 0.4, d, c); continue; }\n shared.ctx.noPiece = true; roofRect(type, x0, z0, x1, z1, yb, roofColor, true, F, [0, 0, 0, 0]); cursor.pc = null; shared.ctx.noPiece = false;\n if (shared.ctx.gutter.on) gutter(type, 0, x0, z0, x1, z1, yb, [0, 0, 0, 0]);\n }\n }\n Object.assign(K, { roofs });\n}\n","// Literal port of the team's Casa3DSDK (module roof/gutters). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installRoofGutters(K: Kernel, shared: Shared): void {\n const { boxC, bx, cursor, roomAt } = K;\n const sh = (...a: any[]): any => K.sh(...a);\n // ===== gutters and downpipes (deterministic by seed): luxury/high/mid ~60%, budget/commercial ~30% =====\n function gutterConfig() {\n const R = shared.ctx.r, structure = R.style, high = structure === 'high' || structure === 'luxury', p = high || structure === 'mid' ? 0.6 : 0.3;\n let h = 2166136261; for (const ch of String(R.seed) + '|' + K.seedKey(R.template) + '|calha') h = Math.imul(h ^ ch.charCodeAt(0), 16777619);\n const rnd = () => { h = (h + 0x6D2B79F5) | 0; let t = Math.imul(h ^ (h >>> 15), 1 | h); t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; return ((t ^ (t >>> 14)) >>> 0) / 4294967296; };\n const draw = rnd() < p, light = rnd() < 0.6; void draw; const on = true; // R55: every house has a gutter on every falling eave\n return { on, rnd, color: high ? 0x3a3d42 : (light ? 0xeceff1 : 0xa5abb0), bad: (shared.ctx.colors.meta && shared.ctx.colors.meta.state) === 'abandoned' || R.state === 'abandoned', fallback: false };\n }\n function gutter(type, f, X0, Z0, X1, Z1, yb, touchesU) {\n const G = shared.ctx.gutter, o = type === 'fiber_cement' ? 0.3 : 0.45, x0 = X0 - (touchesU[0] ? 0 : o), x1 = X1 + (touchesU[2] ? 0 : o), z0 = Z0 - (touchesU[1] ? 0 : o), z1 = Z1 + (touchesU[3] ? 0 : o), c = G.color, y = yb - 0.05;\n const run = (ax, a, b, p, outside, breaks) => { // box gutter (bottom + outer flange) along the axis ax; out = -1/+1 direction outwards\n const seg = (u0, u1, tilt) => {\n const L = u1 - u0, m = (u0 + u1) / 2, dy = tilt ? -Math.abs(tilt) * L * 0.5 : 0;\n if (ax === 'x') { boxC('plain', m, y + dy, p + outside * 0.05, L, 0.03, 0.1, c, 0, 0, tilt); boxC('plain', m, y + 0.03 + dy, p + outside * 0.1, L, 0.09, 0.02, c, 0, 0, tilt); }\n else { boxC('plain', p + outside * 0.05, y + dy, m, 0.1, 0.03, L, c, tilt, 0, 0); boxC('plain', p + outside * 0.1, y + 0.03 + dy, m, 0.02, 0.09, L, c, tilt, 0, 0); }\n };\n if (!breaks) seg(a - 0.1, b + 0.1, 0); else { const L = b - a; seg(a - 0.1, a + L * 0.45, 0); seg(a + L * 0.45, a + L * 0.72, 0.22); } // fallen stretch and stretch that vanished\n };\n const sides = [[!touchesU[1], 'x', x0, x1, z0, -1], [!touchesU[3], 'x', x0, x1, z1, 1], [!touchesU[0], 'z', z0, z1, x0, -1], [!touchesU[2], 'z', z0, z1, x1, 1]];\n const larger = sides.reduce((m, l, i) => (l[0] && (l[3] - l[2]) > (sides[m][3] - sides[m][2]) ? i : m), 0);\n sides.forEach((l, i) => { if (l[0]) run(l[1], l[2], l[3], l[4], l[5], G.bad && !G.fallback && i === larger && (G.fallback = true)); });\n // R55: gutter on every falling eave (free side); downpipes at the building corners run down flush with the wall to a floor drain with a grate, so every gutter has drainage\n const INF = shared.ctx.gutterInfo || (shared.ctx.gutterInfo = { gutters: [], downpipes: [], drains: [] });\n sides.forEach((l, i) => { if (l[0]) INF.gutters.push({ f, side: ['z0', 'z1', 'x0', 'x1'][i], axis: l[1], a: l[2], b: l[3], p: l[4], y }); });\n const freeAt = (px, pz, sx, sz) => { for (let kf = 0; kf < f; kf++) for (const [dx, dz] of [[0, 0], [sx * 0.5, 0], [0, sz * 0.5], [sx * 0.5, sz * 0.5], [-sx * 0.3, 0], [0, -sz * 0.3]]) if (roomAt(kf, px + dx, pz + dz)) return false; return true; };\n const freeRun = [!touchesU[1], !touchesU[3], !touchesU[0], !touchesU[2]]; // z0, z1, x0, x1\n // corner: [X, Z, sx, sz, adjacent runs (side indices)]\n const corners = [[X0, Z0, -1, -1, [0, 2]], [X1, Z1, 1, 1, [1, 3]], [X1, Z0, 1, -1, [0, 3]], [X0, Z1, -1, 1, [1, 2]]];\n const cover = new Set(), order = G.rnd() < 0.5 ? [0, 1, 2, 3] : [2, 3, 0, 1];\n const downpipe = (cx, cz, sx, sz, run) => {\n const px = cx + sx * 0.06, pz = cz + sz * 0.06; if (!freeAt(px, pz, sx, sz)) return false;\n const floats = G.bad && G.ncond === 1, yt = yb - 0.1, ybx = floats ? 0.7 : 0.04; G.ncond++; // abandoned: a downpipe ends loose, above the ground\n if (run >= 2) boxC('plain', (sides[run][4] + px) / 2, yt, pz, Math.abs(sides[run][4] - px), 0.07, 0.07, c); // gutter elbow (running in z) to the wall\n else boxC('plain', px, yt, (sides[run][4] + pz) / 2, 0.07, 0.07, Math.abs(sides[run][4] - pz), c); // gutter running in x\n boxC('plain', px, (ybx + yt) / 2, pz, 0.08, yt - ybx, 0.08, c);\n boxC('plain', px, ybx + 0.12, pz, 0.11, 0.05, 0.11, sh(c, 0.8)); // bracket/foot\n boxC('plain', px, yt - 1.2 > ybx + 0.3 ? yt - 1.2 : yt - 0.5, pz, 0.11, 0.04, 0.11, sh(c, 0.8));\n const rx = px + sx * 0.24, rz = pz + sz * 0.24; INF.downpipes.push({ f, x: px, z: pz, y0: ybx, y1: yt, drain: floats ? null : [rx, rz] });\n if (!floats) { drain(rx, rz, px, pz, c); INF.drains.push({ x: rx, z: rz }); } // pipe flush with the floor to the drain\n return true;\n };\n for (const k of order) { const [cx, cz, sx, sz, adj] = corners[k]; if (!adj.every(r => freeRun[r])) continue; if (adj.every(r => cover.has(r))) continue; if (downpipe(cx, cz, sx, sz, adj[1])) adj.forEach(r => cover.add(r)); }\n sides.forEach((l, i) => { if (!l[0] || cover.has(i)) return; // run without a downpipe (corner blocked by the upper storey): one drop at the free end\n for (const [cx, cz, sx, sz, adj] of corners) if (adj.includes(i) && (i >= 2 ? true : true)) { const tx = i >= 2 ? cx : cx + (sx > 0 ? -0.25 : 0.25), tz = i >= 2 ? cz + (sz > 0 ? -0.25 : 0.25) : cz; if (downpipe(tx, tz, i >= 2 ? sx : 0, i >= 2 ? 0 : sz, i)) { cover.add(i); break; } } });\n }\n // floor drain with grate: metal frame, dark bottom and bars\n function drain(x, z, px, pz, c) { // px,pz,c: foot of the downpipe and colour of the pipe leading to the drain (optional); stays in the ground floor group (shows even with the roof cut)\n const g0 = cursor.group; cursor.group = 'f0';\n if (px != null) boxC('plain', (px + x) / 2, 0.075, (pz + z) / 2, Math.abs(x - px) + 0.05, 0.05, Math.abs(z - pz) + 0.05, sh(c, 0.85));\n const t = 0.045; bx('plain', x - 0.12, 0, z - 0.12, x + 0.12, t - 0.006, z + 0.12, 0xb9b5ac); bx('metal', x - 0.11, t, z - 0.11, x + 0.11, t + 0.012, z + 0.11, 0x5a5d61); bx('plain', x - 0.085, t + 0.012, z - 0.085, x + 0.085, t + 0.014, z + 0.085, 0x16171a);\n for (let k = -3; k <= 3; k++) { bx('metal', x + k * 0.025 - 0.006, t + 0.012, z - 0.085, x + k * 0.025 + 0.006, t + 0.02, z + 0.085, 0x8a8e92); }\n bx('metal', x - 0.085, t + 0.012, z - 0.006, x + 0.085, t + 0.02, z + 0.006, 0x8a8e92);\n cursor.group = g0;\n }\n Object.assign(K, { gutterConfig, gutter, drain });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module roof/slabs). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installRoofSlabs(K: Kernel, shared: Shared): void {\n const { boxC, bx, cursor, drain, roomAt, structurePiece } = K;\n const sh = (...a: any[]): any => K.sh(...a);\n // slab: a plate per cell; parapet only on the outer perimeter (nothing between neighbouring slabs or next to the upper storey)\n function slabs(f, xs, zs, O, U, nx, nz, full, pe, C) {\n cursor.pc = null;\n const c = C.facade != null ? C.facade : 0xd8d0c0, cap = sh(c, 1.12), pr = 0.5, t = 0.14, o = 0.08, slab = sh(C.ceiling != null ? C.ceiling : 0xb8b4ac, 0.85);\n const yb0 = pe(xs[0], zs[0], xs[nx], zs[nz]);\n const free = (j, i) => !O(j, i) && !U(j, i);\n for (let j = 0; j < nz; j++) for (let i = 0; i < nx; i++) {\n if (!O(j, i)) continue;\n const x0 = xs[i], x1 = xs[i + 1], z0 = zs[j], z1 = zs[j + 1], yb = pe(x0, z0, x1, z1);\n cursor.pc = K.panelAt('slab_top', (x0 + x1) / 2, (z0 + z1) / 2); // the cell belongs to the panel of the roof slab it lies on\n const ex0 = free(j, i - 1) ? o : 0, ex1 = free(j, i + 1) ? o : 0, ez0 = free(j - 1, i) ? o : 0, ez1 = free(j + 1, i) ? o : 0;\n bx('plaster', x0 - ex0, yb, z0 - ez0, x1 + ex1, yb + 0.03, z1 + ez1, slab);\n const side = (ok, ax0, az0, ax1, az1) => { if (!ok) return; bx('plaster', ax0, yb, az0, ax1, yb + pr, az1, c); bx('plaster', ax0 - (ax1 - ax0 < 0.5 ? 0.03 : 0), yb + pr, az0 - (az1 - az0 < 0.5 ? 0.03 : 0), ax1 + (ax1 - ax0 < 0.5 ? 0.03 : 0), yb + pr + 0.04, az1 + (az1 - az0 < 0.5 ? 0.03 : 0), cap); };\n { const wt = 0.075, yc = yb - 0.2; // band: covers the 20 cm gap between the top of the wall and the slab at the outer edges\n if (free(j, i - 1)) bx('plaster', x0 - wt, yc, z0 - (free(j - 1, i) ? wt : 0), x0, yb, z1 + (free(j + 1, i) ? wt : 0), c);\n if (free(j, i + 1)) bx('plaster', x1, yc, z0 - (free(j - 1, i) ? wt : 0), x1 + wt, yb, z1 + (free(j + 1, i) ? wt : 0), c);\n if (free(j - 1, i)) bx('plaster', x0, yc, z0 - wt, x1, yb, z0, c);\n if (free(j + 1, i)) bx('plaster', x0, yc, z1, x1, yb, z1 + wt, c); }\n side(free(j, i - 1), x0 - o, z0 - ez0, x0 - o + t, z1 + ez1);\n side(free(j, i + 1), x1 + o - t, z0 - ez0, x1 + o, z1 + ez1);\n side(free(j - 1, i), x0 - ex0, z0 - o, x1 + ex1, z0 - o + t);\n side(free(j + 1, i), x0 - ex0, z1 + o - t, x1 + ex1, z1 + o);\n // scupper: drain spout crossing the parapet (up to 2 per house, only when the house has gutters)\n if (shared.ctx.gutter && shared.ctx.gutter.on) for (const [ok, dx, dz] of [[free(j - 1, i), 0, -1], [free(j + 1, i), 0, 1], [free(j, i - 1), -1, 0], [free(j, i + 1), 1, 0]] as any[][]) {\n const kd = f + ':' + dx + ':' + dz; if (!ok || shared.ctx.gutter.bz.has(kd)) continue; shared.ctx.gutter.bz.add(kd); shared.ctx.gutter.nbuz++; // R55: one scupper per free side of the slab, with a drop to a drain\n const mx = (x0 + x1) / 2, mz = (z0 + z1) / 2, ex = dx ? (dx < 0 ? x0 - o : x1 + o) : mx, ez = dz ? (dz < 0 ? z0 - o : z1 + o) : mz, cc = shared.ctx.gutter.color;\n boxC('plain', ex + dx * 0.15, yb + 0.1, ez + dz * 0.15, dx ? 0.42 : 0.14, 0.1, dz ? 0.42 : 0.14, cc);\n boxC('plain', ex + dx * 0.36, yb + 0.1, ez + dz * 0.36, dx ? 0.04 : 0.18, 0.14, dz ? 0.04 : 0.18, sh(cc, 0.8));\n if (shared.ctx.gutter.bad) boxC('plain', ex + dx * 0.05, yb + 0.5 * 0, ez + dz * 0.05, dx ? 0.06 : 0.3, 0.02, dz ? 0.06 : 0.3, 0x4a4a42); // drip stain\n { const tx = ex + dx * 0.38, tz = ez + dz * 0.38; let lv = true; for (let kf = 0; kf < f && lv; kf++) for (const [a, b] of [[0, 0], [dx * 0.4, dz * 0.4], [-dx * 0.2, -dz * 0.2]]) if (roomAt(kf, tx + a, tz + b)) { lv = false; break; }\n if (lv) { boxC('plain', tx, (0.045 + yb + 0.04) / 2, tz, 0.09, yb + 0.04 - 0.045, 0.09, cc); boxC('plain', tx, 0.9, tz, 0.12, 0.04, 0.12, sh(cc, 0.8)); const rx = tx + dx * 0.24, rz = tz + dz * 0.24; drain(rx, rz, tx, tz, cc);\n (shared.ctx.gutterInfo || (shared.ctx.gutterInfo = { gutters: [], downpipes: [], drains: [] })).downpipes.push({ f, x: tx, z: tz, y0: 0.045, y1: yb + 0.04, drain: [rx, rz], hornBox: true }); shared.ctx.gutterInfo.drains.push({ x: rx, z: rz }); } }\n }\n }\n }\n Object.assign(K, { slabs });\n}\n","// Literal port of the team's Casa3DSDK (module roof/tiles). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installRoofTiles(K: Kernel, shared: Shared): void {\n const { UV_SCALE, _Y, _h2, _q, accFor, cursor, put, rgbOf, structurePiece } = K;\n const sh = (...a: any[]): any => K.sh(...a);\n const R_STYLE = () => (shared.ctx.r && shared.ctx.r.style) || 'budget';\n // ===== R56: tile relief. colonial = curved rows (cap and channel); fibre cement = waves. Each plane is a strip extruded in the fall direction, with profile normals and a colour alternating per row; everything goes into the roof mesh =====\n function tileRelief(mat, pts, color, type) {\n const n = pts.length; if (n < 3) return;\n const [a, b, c] = pts; let nx = (b[1] - a[1]) * (c[2] - a[2]) - (b[2] - a[2]) * (c[1] - a[1]), ny = (b[2] - a[2]) * (c[0] - a[0]) - (b[0] - a[0]) * (c[2] - a[2]), nz = (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n const nl = Math.hypot(nx, ny, nz) || 1; nx /= nl; ny /= nl; nz /= nl; if (ny < 0) { nx = -nx; ny = -ny; nz = -nz; }\n const nh = Math.hypot(nx, nz); let dx, dy, dz; if (nh < 1e-4) { dx = 0; dy = 0; dz = 1; } else { dx = nx / nh; dy = -nh / ny; dz = nz / nh; const dl = Math.hypot(dx, dy, dz); dx /= dl; dy /= dl; dz /= dl; }\n let ex = ny * dz - nz * dy, ey = nz * dx - nx * dz, ez = nx * dy - ny * dx; const el = Math.hypot(ex, ey, ez) || 1; ex /= el; ey /= el; ez /= el; // e1 along the eave\n const o = pts[0], S = [], T = []; for (const p of pts) { const rx = p[0] - o[0], ry = p[1] - o[1], rz = p[2] - o[2]; S.push(rx * ex + ry * ey + rz * ez); T.push(rx * dx + ry * dy + rz * dz); }\n const colonial = type !== 'fiber_cement', P = colonial ? 0.2 : 0.177, A = colonial ? 0.032 : 0.0255, seg = shared.quality === 'game' ? (colonial ? 4 : 4) : (colonial ? 8 : 6), h = P / seg;\n const smin = Math.min(...S), smax = Math.max(...S); if (smax - smin < 1e-4) return;\n const xs = new Set(S.map(v => +v.toFixed(5))); for (let k = Math.ceil(smin / h); k * h < smax; k++) xs.add(+(k * h).toFixed(5)); xs.add(+smax.toFixed(5));\n const L = [...xs].filter(v => v >= smin - 1e-6 && v <= smax + 1e-6).sort((p, q) => p - q), col = [];\n for (const sv of L) { let lo = Infinity, hi = -Infinity; for (let i = 0; i < n; i++) { const j = (i + 1) % n, s0 = S[i], s1 = S[j]; if (Math.abs(s1 - s0) < 1e-7) { if (Math.abs(sv - s0) < 1e-5) { lo = Math.min(lo, T[i], T[j]); hi = Math.max(hi, T[i], T[j]); } } else if (sv >= Math.min(s0, s1) - 1e-6 && sv <= Math.max(s0, s1) + 1e-6) { const t = T[i] + (T[j] - T[i]) * (sv - s0) / (s1 - s0); lo = Math.min(lo, t); hi = Math.max(hi, t); } } col.push(lo <= hi ? [lo, hi] : null); }\n const AC = accFor(mat), m = L.length, [cr, cg, cb] = rgbOf(color), O = cursor.org; AC.ensure(m * 2, (m - 1) * 6);\n const base = AC.nv, w2 = 2 * Math.PI / P;\n for (let j = 0; j < m; j++) {\n const sv = L[j], ph = sv * w2, hh = A + A * Math.sin(ph), dh = A * w2 * Math.cos(ph), ql = Math.hypot(dh, 1), qx = (nx - dh * ex) / ql, qy = (ny - dh * ey) / ql, qz = (nz - dh * ez) / ql;\n const per = Math.floor(sv / P), rr = _h2(per * 7 + 3, 11), fil = colonial ? 0.9 + 0.2 * (0.5 + 0.5 * Math.sin(ph + 1.5708)) : 0.95 + 0.1 * (0.5 + 0.5 * Math.sin(ph + 1.5708)), v = 1.5 * fil * (0.94 + 0.1 * rr); // the relief darkens the average lighting: compensate\n const cj = col[j] || col[j - 1] || col[j + 1] || [0, 0];\n for (let k = 0; k < 2; k++) {\n const t = cj[k], oo = base + j * 2 + k, px = o[0] + sv * ex + t * dx + nx * hh, py = o[1] + sv * ey + t * dy + ny * hh, pz = o[2] + sv * ez + t * dz + nz * hh;\n AC.p[oo * 3] = px - O[0]; AC.p[oo * 3 + 1] = py - O[1]; AC.p[oo * 3 + 2] = pz - O[2]; AC.n[oo * 3] = qx; AC.n[oo * 3 + 1] = qy; AC.n[oo * 3 + 2] = qz;\n AC.c[oo * 3] = cr * v; AC.c[oo * 3 + 1] = cg * v; AC.c[oo * 3 + 2] = cb * v; AC.u[oo * 2] = sv / (UV_SCALE[mat] || 1); AC.u[oo * 2 + 1] = t / (UV_SCALE[mat] || 1);\n }\n }\n for (let j = 0; j + 1 < m; j++) { if (!col[j] && !col[j + 1]) continue; const a0 = base + j * 2, a1 = a0 + 1, b0 = a0 + 2, b1 = a0 + 3; AC.i[AC.ni++] = a0; AC.i[AC.ni++] = b0; AC.i[AC.ni++] = a1; AC.i[AC.ni++] = a1; AC.i[AC.ni++] = b0; AC.i[AC.ni++] = b1; }\n AC.nv += m * 2;\n }\n // ridge and hips: cap pieces along a line (colonial: clay half-round with rings; fibre cement: six-sided angular cap)\n function ridge(a, b, type, roofColor) {\n cursor.pc = pieceOfPane((a[0] + b[0]) / 2, (a[2] + b[2]) / 2);\n const dx = b[0] - a[0], dy = b[1] - a[1], dz = b[2] - a[2], Ln = Math.hypot(dx, dy, dz); if (Ln < 0.05) return;\n const colonial = type !== 'fiber_cement', r = colonial ? 0.085 : 0.075, c = sh(roofColor, colonial ? 0.82 : 0.9), lift = (colonial ? 0.05 : 0.035);\n _q.setFromUnitVectors(_Y, K._v3.set(dx / Ln, dy / Ln, dz / Ln));\n const mx = (a[0] + b[0]) / 2, my = (a[1] + b[1]) / 2 + lift, mz = (a[2] + b[2]) / 2;\n put('plain', colonial ? 'cyl' : 'cyl6', mx, my, mz, _q, r * 2, Ln, r * 2, c);\n if (colonial) for (let t = 0.25; t < Ln - 0.1; t += 0.42) { const f = t / Ln; put('plain', 'cyl', a[0] + dx * f, a[1] + dy * f + lift, a[2] + dz * f, _q, r * 2.25, 0.035, r * 2.25, sh(c, 0.7)); } // cap joints\n }\n function pieceOfPane(x, z) { // roof plane of the plan (res.roof.panes) under the point (x, z); with no plane, the nearest\n if (shared.ctx.noPiece || !shared.ctx.panes.length) return null;\n let m = null, md = 1e9;\n for (const a of shared.ctx.panes) { const b = a.aabb; if (!b) continue; const dx = x < b[0] ? b[0] - x : x > b[2] ? x - b[2] : 0, dz = z < b[1] ? b[1] - z : z > b[3] ? z - b[3] : 0, d = Math.hypot(dx, dz) * 1000 + (b[2] - b[0]) * (b[3] - b[1]) * 1e-3; if (d < md) { md = d; m = a; } }\n return m ? structurePiece(m.id) : null;\n }\n Object.assign(K, { R_STYLE, tileRelief, ridge, pieceOfPane });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module roof/rect). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installRoofRect(K: Kernel, shared: Shared): void {\n const { R_STYLE, bx, cursor, pieceOfPane, polyFace, ridge, tileRelief } = K;\n const sh = (...a: any[]): any => K.sh(...a);\n function roofRect(type, X0, Z0, X1, Z1, yb, roofColor, gable, F, touchesU = [0, 0, 0, 0]) {\n const C = shared.ctx.colors, o = type === 'fiber_cement' ? 0.3 : 0.45, x0 = X0 - (touchesU[0] ? 0 : o), x1 = X1 + (touchesU[2] ? 0 : o), z0 = Z0 - (touchesU[1] ? 0 : o), z1 = Z1 + (touchesU[3] ? 0 : o), dx = x1 - x0, dz = z1 - z0, xm = (x0 + x1) / 2, zm = (z0 + z1) / 2;\n const mat = type === 'fiber_cement' ? 'fiber_cement' : 'tile', tp = type === 'fiber_cement' ? 0.2 : 0.5, alongX = dx >= dz, up = [0, 1, 0];\n const Q = (pts) => { let cx = 0, cz = 0; for (const p of pts) { cx += p[0]; cz += p[2]; } cursor.pc = pieceOfPane(cx / pts.length, cz / pts.length); return tileRelief(mat, pts, roofColor, type); };\n cursor.pc = pieceOfPane(xm, zm);\n // closes the eave: masonry band over the wall (no gap up to the roof), eave soffit and fascia at the edge\n { const wt = 0.075, yc = yb - 0.2, cf = C.facade != null ? C.facade : 0xd8d0c0, fas = (R_STYLE() === 'budget') ? 0x6e4e34 : sh(roofColor, 0.55), sof = 0xe6e2d8, tz = 0.035;\n const gx = gable && alongX, gz = gable && !alongX; // gable end (no horizontal fascia)\n if (!touchesU[0]) { bx('plaster', X0 - wt, yc, Z0 - (touchesU[1] ? 0 : wt), X0, yb, Z1 + (touchesU[3] ? 0 : wt), cf); bx('plain', x0, yb - 0.025, z0, X0 - wt, yb, z1, sof); if (!gx) bx('plain', x0 - tz, yb - 0.13, z0 - tz, x0, yb + 0.03, z1 + tz, fas); }\n if (!touchesU[2]) { bx('plaster', X1, yc, Z0 - (touchesU[1] ? 0 : wt), X1 + wt, yb, Z1 + (touchesU[3] ? 0 : wt), cf); bx('plain', X1 + wt, yb - 0.025, z0, x1, yb, z1, sof); if (!gx) bx('plain', x1, yb - 0.13, z0 - tz, x1 + tz, yb + 0.03, z1 + tz, fas); }\n if (!touchesU[1]) { bx('plaster', X0 - (touchesU[0] ? 0 : wt) + (touchesU[0] ? 0 : wt), yc, Z0 - wt, X1 + (touchesU[2] ? 0 : 0), yb, Z0, cf); bx('plain', X0 - wt, yb - 0.025, z0, X1 + wt, yb, Z0 - wt, sof); if (!gz) bx('plain', x0, yb - 0.13, z0 - tz, x1, yb + 0.03, z0, fas); }\n if (!touchesU[3]) { bx('plaster', X0 + 0, yc, Z1, X1, yb, Z1 + wt, cf); bx('plain', X0 - wt, yb - 0.025, Z1 + wt, X1 + wt, yb, z1, sof); if (!gz) bx('plain', x0, yb - 0.13, z1, x1, yb + 0.03, z1 + tz, fas); }\n }\n const rm = alongX ? dz / 2 : dx / 2;\n { const rr = shared.ctx.roofRects[shared.ctx.roofRects.length - 1]; if (rr && !rr.yb) Object.assign(rr, { yb, tp, gable: !!gable, alongX, exterior: [x0, z0, x1, z1], rm }); } // R57: roof-plane geometry to rest the solar panels on\n if (gable) {\n const yr = yb + (alongX ? dz : dx) / 2 * tp;\n if (alongX) { Q([[x0, yb, z0], [x1, yb, z0], [x1, yr, zm], [x0, yr, zm]]); Q([[x0, yb, z1], [x1, yb, z1], [x1, yr, zm], [x0, yr, zm]]); ridge([x0, yr, zm], [x1, yr, zm], type, roofColor);\n for (const xe of [x0, x1]) polyFace('plaster', [[xe, yb, z0], [xe, yb, z1], [xe, yr - 0.02, zm]], C.facade, [xe < xm ? -1 : 1, 0, 0]); }\n else { Q([[x0, yb, z0], [x0, yb, z1], [xm, yr, z1], [xm, yr, z0]]); Q([[x1, yb, z0], [x1, yb, z1], [xm, yr, z1], [xm, yr, z0]]); ridge([xm, yr, z0], [xm, yr, z1], type, roofColor);\n for (const ze of [z0, z1]) polyFace('plaster', [[x0, yb, ze], [x1, yb, ze], [xm, yr - 0.02, ze]], C.facade, [0, 0, ze < zm ? -1 : 1]); }\n } else { // hipped\n const yr = yb + rm * tp;\n if (alongX) { const r0 = x0 + rm, r1 = x1 - rm; Q([[x0, yb, z0], [x1, yb, z0], [r1, yr, zm], [r0, yr, zm]]); Q([[x0, yb, z1], [x1, yb, z1], [r1, yr, zm], [r0, yr, zm]]); Q([[x0, yb, z0], [x0, yb, z1], [r0, yr, zm]]); Q([[x1, yb, z0], [x1, yb, z1], [r1, yr, zm]]); if (r1 > r0) ridge([r0, yr, zm], [r1, yr, zm], type, roofColor); for (const [px, pz, rx] of [[x0, z0, r0], [x0, z1, r0], [x1, z0, r1], [x1, z1, r1]]) ridge([px, yb, pz], [rx, yr, zm], type, roofColor); }\n else { const r0 = z0 + rm, r1 = z1 - rm; Q([[x0, yb, z0], [x0, yb, z1], [xm, yr, r1], [xm, yr, r0]]); Q([[x1, yb, z0], [x1, yb, z1], [xm, yr, r1], [xm, yr, r0]]); Q([[x0, yb, z0], [x1, yb, z0], [xm, yr, r0]]); Q([[x0, yb, z1], [x1, yb, z1], [xm, yr, r1]]); if (r1 > r0) ridge([xm, yr, r0], [xm, yr, r1], type, roofColor); for (const [px, pz, rz] of [[x0, z0, r0], [x1, z0, r0], [x0, z1, r1], [x1, z1, r1]]) ridge([px, yb, pz], [xm, yr, rz], type, roofColor); }\n }\n }\n Object.assign(K, { roofRect });\n}\n","// Literal port of the team's Casa3DSDK (module mirrors). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from './kernel-types.js';\n\nexport function installMirrors(K: Kernel, shared: Shared): void {\n const { DOC, THREE, Reflector, MIRRORS, Y0, _Y, roomAt } = K;\n // ===== mirrors: real reflection (Reflector) only on the nearest mirror, only when the camera is in the same room; the others use a cube environment map. 'game' quality: cube only, everything merged per group =====\n shared.mirrorEnv = null; shared.mirrorMat = null;\n function mirrorEnv() { // cheap procedural cube: light sky/ceiling on top, warm walls, dark floor (only once)\n if (shared.mirrorEnv) return shared.mirrorEnv;\n const mk = f => { const c = DOC.createElement('canvas'); c.width = c.height = 64; const g = c.getContext('2d'); f(g); return c; };\n const grad = (a, b) => g => { const q = g.createLinearGradient(0, 0, 0, 64); q.addColorStop(0, a); q.addColorStop(1, b); g.fillStyle = q; g.fillRect(0, 0, 64, 64); };\n const side = (j, k) => g => { grad('#e9e4da', '#b8ae9c')(g); if (j) { g.fillStyle = 'rgba(255,255,255,.75)'; g.fillRect(14, 12, 22, 30); g.fillStyle = 'rgba(120,150,180,.35)'; g.fillRect(18, 16, 14, 22); } if (k) { g.fillStyle = 'rgba(90,70,50,.5)'; g.fillRect(36, 22, 18, 42); } };\n const faces = [side(1, 0), side(0, 1), mk(g => { grad('#f3efe6', '#e2ddd2')(g); g.fillStyle = 'rgba(255,255,230,.9)'; g.fillRect(24, 24, 16, 16); }), mk(g => grad('#6d6455', '#4e463a')(g)), side(0, 0), side(1, 1)]\n .map(f => (typeof f === 'function' ? mk(f) : f));\n const t = new THREE.CubeTexture(faces); t.colorSpace = THREE.SRGBColorSpace; t.needsUpdate = true; shared.mirrorEnv = t;\n shared.mirrorMat = new THREE.MeshStandardMaterial({ color: 0xf4f6f8, metalness: 1, roughness: 0.06, envMap: t, envMapIntensity: 1.0 });\n return t;\n }\n const newMirrorState = () => ({ list: [], active: null, tmp: new THREE.Vector3(), house: null });\n shared.mirrors = newMirrorState();\n function assembleMirrors(groups) {\n shared.mirrors.list.length = 0; shared.mirrors.active = null;\n if (!MIRRORS.length) return;\n mirrorEnv();\n if (shared.quality === 'game' || !Reflector) { // no real reflection: one plane with the cube per mirror, all merged into one mesh per parent group\n const by = new Map(), m4 = new THREE.Matrix4(), qy = new THREE.Quaternion(), um = new THREE.Vector3(1, 1, 1), ps = new THREE.Vector3(), nm = new THREE.Matrix3(), v = new THREE.Vector3();\n for (const E of MIRRORS) {\n const geo = new THREE.PlaneGeometry(E.w, E.h); m4.compose(ps.set(E.x, E.y, E.z), qy.setFromAxisAngle(_Y, E.ry), um); nm.getNormalMatrix(m4);\n let B = by.get(E.parent); if (!B) by.set(E.parent, B = { P: [], N: [], U: [], I: [], nv: 0 });\n const pa = geo.attributes.position, na = geo.attributes.normal, ua = geo.attributes.uv;\n for (let i = 0; i < pa.count; i++) { v.fromBufferAttribute(pa, i).applyMatrix4(m4); B.P.push(v.x, v.y, v.z); v.fromBufferAttribute(na, i).applyMatrix3(nm).normalize(); B.N.push(v.x, v.y, v.z); B.U.push(ua.getX(i), ua.getY(i)); }\n for (const k of geo.index.array) B.I.push(B.nv + k); B.nv += pa.count; geo.dispose();\n }\n for (const [parent, B] of by) {\n const g = new THREE.BufferGeometry(); g.setAttribute('position', new THREE.Float32BufferAttribute(B.P, 3)); g.setAttribute('normal', new THREE.Float32BufferAttribute(B.N, 3)); g.setAttribute('uv', new THREE.Float32BufferAttribute(B.U, 2)); g.setIndex(B.I); g.computeBoundingSphere();\n const m = new THREE.Mesh(g, shared.mirrorMat); m.name = 'mirror/environment'; m.userData.part = 'mirror'; (groups[parent] || (groups[parent] = new THREE.Group())).add(m);\n }\n return;\n }\n for (const E of MIRRORS) {\n const g = new THREE.Group(); g.position.set(E.x, E.y, E.z); g.rotation.y = E.ry; g.name = 'mirror';\n g.userData.part = 'mirror'; g.userData.room = E.room;\n const geo = new THREE.PlaneGeometry(E.w, E.h);\n const fake = new THREE.Mesh(geo, shared.mirrorMat); fake.userData.part = 'mirror'; fake.name = 'mirror/environment'; g.add(fake);\n let real = null;\n try {\n real = new Reflector(geo, { textureWidth: 512, textureHeight: Math.round(512 * Math.max(0.5, Math.min(2, E.h / E.w))), color: 0xdfe6ea, clipBias: 0.002, multisample: 0 });\n real.position.z = 0.0015; real.visible = false; real.name = 'mirror/reflection'; real.userData.part = 'mirror'; g.add(real);\n } catch (e) { console.warn('mirror real', e); }\n (groups[E.parent] || (groups[E.parent] = new THREE.Group())).add(g);\n shared.mirrors.list.push({ E, g, fake, real });\n }\n }\n function floorAtY(y) { const A = shared.ctx.r.floors; let f = 0; for (let i = 0; i < A.length; i++) if (y >= A[i].y0 - 0.2) f = i; return f; }\n function chooseMirror(camera) { // call before drawing the camera (scene.onBeforeRender): turns on the real reflection of the mirror of the room the camera is in\n if (!shared.mirrors.list.length) return;\n let target = null;\n if (shared.mirrors.house && shared.ctx.r) {\n shared.mirrors.tmp.copy(camera.position); shared.mirrors.house.worldToLocal(shared.mirrors.tmp);\n const f = floorAtY(shared.mirrors.tmp.y), c = roomAt(f, shared.mirrors.tmp.x, shared.mirrors.tmp.z);\n if (c && shared.mirrors.tmp.y > Y0(f) && shared.mirrors.tmp.y < Y0(f) + 4) {\n let best = 1e9;\n for (const m of shared.mirrors.list) { if (m.E.room !== c.id || m.E.floor !== f || !m.g.parent || !m.g.parent.visible) continue; const d = Math.hypot(m.E.x - shared.mirrors.tmp.x, m.E.z - shared.mirrors.tmp.z); if (d < best) { best = d; target = m; } }\n }\n }\n if (target === shared.mirrors.active) return;\n shared.mirrors.active = target;\n for (const m of shared.mirrors.list) { const on = m === target && !!m.real; if (m.real) m.real.visible = on; m.fake.visible = !on; }\n }\n Object.assign(K, { mirrorEnv, newMirrorState, assembleMirrors, floorAtY, chooseMirror });\n}\n","// Literal port of the team's Casa3DSDK (module cars). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from './kernel-types.js';\n\nexport function installCars(K: Kernel, shared: Shared): void {\n const { THREE, FLEET, _Y } = K;\n // ===== fleet cars (vehicles/light fleet): model per style and seed (paint colour), merged by material (1 mesh per material signature) =====\n const CARS = [];\n // {x,y,z,ry,w,d,k,seed,parent}\n // car kinds per style: ids of the fleet (@adatechnology/game-vehicles-fleet); cfg.carKinds replaces the list of a style\n const CAR_BY_STYLE = Object.assign({\n budget: ['boxy_hatch', 'entry_hatch', 'beetle', 'family_hatch', 'rideshare_hatch'],\n mid: ['compact_hatch', 'rideshare_hatch', 'turbo_hatch', 'midsize_sedan', 'fastback_sedan', 'compact_suv', 'family_hatch'],\n high: ['electric_hatch', 'hybrid_suv', 'midsize_suv', 'v8_coupe', 'large_suv', 'midsize_pickup', 'crossover_pickup', 'fastback_sedan'],\n }, K.cfg.carKinds);\n\n const CAR_CACHE = new Map();\n function materialSignature(m) {\n const f = v => (v == null ? '' : typeof v === 'number' ? v.toFixed(3) : v.isColor ? v.getHexString() : v.uuid || String(v));\n return [m.type, f(m.color), f(m.roughness), f(m.metalness), f(m.opacity), m.transparent ? 1 : 0, m.side, f(m.map), f(m.emissive), f(m.emissiveIntensity), m.vertexColors ? 1 : 0, m.flatShading ? 1 : 0, f(m.envMapIntensity), f(m.alphaTest)].join('|');\n }\n const BUCKETS = new Map();\n function bucketMaterial(m) {\n if (m.type !== 'MeshStandardMaterial' || m.map || m.alphaTest || m.vertexColors || !m.color) return null;\n const mt = m.metalness > 0.5 ? 2 : m.metalness > 0.2 ? 1 : 0, rg = m.roughness < 0.3 ? 0 : m.roughness < 0.6 ? 1 : 2, tr = m.transparent || m.opacity < 1, op = tr ? Math.max(0.2, Math.min(0.9, Math.round(m.opacity * 5) / 5)) : 1, sig = 'bucket' + mt + rg + 's' + m.side + (tr ? 't' + op : '');\n let b = BUCKETS.get(sig); if (!b) { b = { sig, mat: new THREE.MeshStandardMaterial({ vertexColors: true, side: m.side, transparent: tr, opacity: op, depthWrite: !tr, metalness: [0.05, 0.4, 0.8][mt], roughness: [0.22, 0.45, 0.8][rg], envMap: m.envMap || null, envMapIntensity: m.envMapIntensity != null ? m.envMapIntensity : 1 }) }; BUCKETS.set(sig, b); }\n if (!b.mat.envMap && m.envMap) b.mat.envMap = m.envMap;\n return b;\n }\n function carModel(k, seed) { // built once per key: geometry merged by material (signature), +z axis in front, centre at x/z = 0, floor at y = 0\n const kc = k + '|' + shared.quality + '|' + (seed || 0); if (CAR_CACHE.has(kc)) return CAR_CACHE.get(kc);\n if (!FLEET) return null;\n let res = null;\n try {\n const v0 = FLEET.build(k, { quality: shared.quality, seed: seed || 0 }), c = { root: v0.group, g: v0.group }; c.root.updateMatrixWorld(true); // fleet: 'high' in the viewer, 'game' (<= 6 materials) in the game\n const inv = new THREE.Matrix4(); // identity: the fleet already comes out with +z in front\n const byMaterial = new Map(), tmp = new THREE.Matrix4(), v = new THREE.Vector3(), nm = new THREE.Matrix3(), bb = new THREE.Box3();\n c.g.traverse(o => {\n if (!o.isMesh || o.isInstancedMesh || o.isSkinnedMesh || !o.geometry || !o.geometry.attributes.position) return;\n for (let p = o; p; p = p.parent) if (p.visible === false) return;\n const mats = Array.isArray(o.material) ? o.material : [o.material];\n let geo = o.geometry; if (geo.index) geo = geo.toNonIndexed();\n if (!geo.attributes.normal) { geo = geo.clone(); geo.computeVertexNormals(); }\n tmp.multiplyMatrices(inv, o.matrixWorld); nm.getNormalMatrix(tmp);\n const pa = geo.attributes.position, na = geo.attributes.normal, ua = geo.attributes.uv, total = pa.count;\n const grs = Array.isArray(o.material) && o.geometry.groups.length ? o.geometry.groups : [{ start: 0, count: total, materialIndex: 0 }];\n for (const gr of grs) {\n const m = mats[gr.materialIndex] || mats[0]; if (!m) continue;\n const a0 = Math.min(gr.start, total), n0 = Math.min(gr.count, total - a0) - (Math.min(gr.count, total - a0) % 3); if (n0 < 3) continue;\n const P = new Float32Array(n0 * 3), N = new Float32Array(n0 * 3), U = new Float32Array(n0 * 2);\n for (let i = 0; i < n0; i++) {\n v.fromBufferAttribute(pa, a0 + i).applyMatrix4(tmp); P[i * 3] = v.x; P[i * 3 + 1] = v.y; P[i * 3 + 2] = v.z; bb.expandByPoint(v);\n v.fromBufferAttribute(na, a0 + i).applyMatrix3(nm).normalize(); N[i * 3] = v.x; N[i * 3 + 1] = v.y; N[i * 3 + 2] = v.z;\n if (ua) { U[i * 2] = ua.getX(a0 + i); U[i * 2 + 1] = ua.getY(a0 + i); }\n }\n const r: any = { P, N, U, I: null }; // simple merge per material, without simplifying or dropping pieces (bumpers, headlights and grille stay whole)\n const bk = bucketMaterial(m); if (bk) r.color = m.color; // plain opaque ones: one material per shine class, colour per vertex\n const sig = bk ? bk.sig : materialSignature(m); let G = byMaterial.get(sig); if (!G) byMaterial.set(sig, G = { m: bk ? bk.mat : m, list: [], vc: !!bk }); G.list.push(r);\n }\n });\n const parts = [];\n for (const { m, list, vc } of byMaterial.values()) {\n let nv = 0, ni = 0; for (const e of list) { nv += e.P.length / 3; ni += e.I ? e.I.length : e.P.length / 3; }\n const P = new Float32Array(nv * 3), N = new Float32Array(nv * 3), U = new Float32Array(nv * 2), I = new Uint32Array(ni); let ov = 0, oi = 0;\n for (const e of list) { const n = e.P.length / 3; P.set(e.P, ov * 3); N.set(e.N, ov * 3); U.set(e.U, ov * 2); if (e.I) for (let q = 0; q < e.I.length; q++) I[oi++] = e.I[q] + ov; else for (let q = 0; q < n; q++) I[oi++] = ov + q; ov += n; }\n const g = new THREE.BufferGeometry(); g.setAttribute('position', new THREE.BufferAttribute(P, 3)); g.setAttribute('normal', new THREE.BufferAttribute(N, 3)); g.setAttribute('uv', new THREE.BufferAttribute(U, 2)); g.setIndex(new THREE.BufferAttribute(I.subarray(0, oi), 1));\n if (vc) { const C = new Float32Array(nv * 3); let q = 0; for (const e of list) { const n = e.P.length / 3, cr = e.color; for (let i = 0; i < n; i++, q++) { C[q * 3] = cr.r; C[q * 3 + 1] = cr.g; C[q * 3 + 2] = cr.b; } } g.setAttribute('color', new THREE.BufferAttribute(C, 3)); }\n g.userData.shared = true; parts.push({ geo: g, mat: m });\n }\n const cx = (bb.min.x + bb.max.x) / 2, cz = (bb.min.z + bb.max.z) / 2, y0 = bb.min.y;\n for (const p of parts) { p.geo.translate(-cx, -y0, -cz); p.geo.computeBoundingSphere(); p.geo.computeBoundingBox(); }\n if (v0.release) v0.release(); res = { damageables: v0.damageables || [], off: [cx, y0, cz], parts, W: bb.max.x - bb.min.x, L: bb.max.z - bb.min.z, H: bb.max.y - bb.min.y, tris: parts.reduce((a, p) => a + p.geo.index.count / 3, 0) };\n } catch (e) { console.warn('car ' + k, e); res = null; }\n CAR_CACHE.set(kc, res); return res;\n }\n function carGroup(k, w, d, seed) {\n const mod = carModel(k, seed); if (!mod) return null;\n const s = Math.min(1, d / mod.L, Math.max(0.5, w - 0.05) / mod.W);\n const g = new THREE.Group(); g.name = 'car:' + k; g.scale.setScalar(s);\n for (const p of mod.parts) { const m = new THREE.Mesh(p.geo, p.mat); m.castShadow = !p.mat.transparent; m.receiveShadow = true; m.renderOrder = p.mat.transparent ? 2 : 0; m.name = 'car/' + k; g.add(m); }\n return g;\n }\n function assembleCars(groups) {\n if (shared.quality === 'game') return assembleMergedCars(groups);\n for (const C of CARS) {\n const g = carGroup(C.k, C.w, C.d, C.seed); if (!g) continue;\n g.position.set(C.x, C.y, C.z); g.rotation.y = C.ry || 0;\n (groups[C.parent] || (groups[C.parent] = new THREE.Group())).add(g);\n }\n }\n // 'game' quality: all the house's cars merged into one mesh per (parent group, material signature); each car's transform goes into the vertices\n function assembleMergedCars(groups) {\n const m4 = new THREE.Matrix4(), qy = new THREE.Quaternion(), sc = new THREE.Vector3(), ps = new THREE.Vector3(), nm = new THREE.Matrix3(), v = new THREE.Vector3(), by = new Map();\n for (const C of CARS) {\n const mod = carModel(C.k, C.seed); if (!mod) continue;\n const s = Math.min(1, C.d / mod.L, Math.max(0.5, C.w - 0.05) / mod.W);\n m4.compose(ps.set(C.x, C.y, C.z), qy.setFromAxisAngle(_Y, C.ry || 0), sc.setScalar(s)); nm.getNormalMatrix(m4);\n for (const p of mod.parts) {\n const pa = p.geo.attributes.position, na = p.geo.attributes.normal, ua = p.geo.attributes.uv, ca = p.geo.attributes.color, key = C.parent + '|' + materialSignature(p.mat) + (ca ? '|vc' : '');\n let B = by.get(key); if (!B) by.set(key, B = { parent: C.parent, mat: p.mat, P: [], N: [], U: [], Cc: [], I: [], nv: 0 });\n for (let i = 0; i < pa.count; i++) {\n v.fromBufferAttribute(pa, i).applyMatrix4(m4); B.P.push(v.x, v.y, v.z); v.fromBufferAttribute(na, i).applyMatrix3(nm).normalize(); B.N.push(v.x, v.y, v.z);\n B.U.push(ua ? ua.getX(i) : 0, ua ? ua.getY(i) : 0); if (ca) B.Cc.push(ca.getX(i), ca.getY(i), ca.getZ(i));\n }\n const ix = p.geo.index.array; for (let i = 0; i < ix.length; i++) B.I.push(B.nv + ix[i]); B.nv += pa.count;\n }\n }\n for (const B of by.values()) {\n const g = new THREE.BufferGeometry(); g.setAttribute('position', new THREE.Float32BufferAttribute(B.P, 3)); g.setAttribute('normal', new THREE.Float32BufferAttribute(B.N, 3)); g.setAttribute('uv', new THREE.Float32BufferAttribute(B.U, 2));\n if (B.Cc.length) g.setAttribute('color', new THREE.Float32BufferAttribute(B.Cc, 3)); g.setIndex(B.I); g.computeBoundingSphere(); g.computeBoundingBox();\n const m = new THREE.Mesh(g, B.mat); m.castShadow = !B.mat.transparent; m.receiveShadow = true; m.renderOrder = B.mat.transparent ? 2 : 0; m.name = 'cars/' + B.parent;\n (groups[B.parent] || (groups[B.parent] = new THREE.Group())).add(m);\n }\n }\n Object.assign(K, { CARS, CAR_BY_STYLE, CAR_CACHE, materialSignature, BUCKETS, bucketMaterial, carModel, carGroup, assembleCars, assembleMergedCars });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module house/building). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installHouseBuilding(K: Kernel, shared: Shared): void {\n const { bx, cursor } = K;\n // ---------------- 50 building ----------------\n // ===== new apartment building: stacked floors, hall, stairs, elevator; the chosen unit is highlighted =====\n function building() {\n const R = shared.ctx.r, P = R.building, C = shared.ctx.colors, N = shared.ctx.pa, uf = shared.ctx.pf, pe = P.ceilingHeight, fa = C.facade != null ? C.facade : 0xd8d0c0;\n cursor.group = 'building';\n const uw = P.unit.w, ud = P.unit.d, un = P.units;\n const unitBox = u => { const x = u.ry ? [u.u - uw, u.u] : [u.u, u.u + uw], z = u.ry ? [u.v - ud, u.v] : [u.v, u.v + ud]; return [x[0], z[0], x[1], z[1]]; };\n const un0 = unitBox(un[0]), color = P.corridor, hall = P.hall, el = P.elevator.rect, es = P.stairs.rect;\n const sel = un[shared.ctx.pu] || un[0], selR = unitBox(sel);\n const shell = (rc, y0, y1, thickness = 0.15) => { // translucent walls of a block\n const [a, b, c, d] = rc; bx('building', a, y0, b, c, y1, b + thickness, fa); bx('building', a, y0, d - thickness, c, y1, d, fa); bx('building', a, y0, b + thickness, a + thickness, y1, d - thickness, fa); bx('building', c - thickness, y0, b + thickness, c, y1, d - thickness, fa);\n };\n for (let k = 0; k < N; k++) {\n const y0 = k * pe, ehSel = k === uf - 1;\n for (const u of un) {\n const rc = unitBox(u), isSelected = ehSel && u === sel;\n if (!isSelected) { bx('plaster', rc[0], y0 - 0.2, rc[1], rc[2], y0, rc[3], 0xcfcbc2); shell(rc, y0, y0 + pe - 0.2); const side = u.ry ? 1 : -1; bx('glass', rc[0] + 0.5, y0 + 0.9, u.ry ? rc[1] - 0.001 : rc[3] + 0.001, rc[2] - 0.5, y0 + 2.0, u.ry ? rc[1] + 0.001 : rc[3] + 0.002, 0xffffff); }\n }\n // corridor and hall: slab and walls\n for (const rc of [color, hall]) { bx('plaster', rc[0], y0 - 0.2, rc[1], rc[2], y0, rc[3], 0xb8b4aa); }\n shell([Math.min(color[0], hall[0]), hall[1], color[2], color[3]], y0, y0 + pe - 0.2);\n // core: elevator and stairs\n bx('metal', el[0] + 0.05, y0, el[1] + 0.05, el[2] - 0.05, y0 + pe, el[3] - 0.05, 0x7e848a); bx('building', es[0], y0, es[1], es[2], y0 + pe - 0.2, es[3], 0xcfcbc2);\n const ns = 16, rise = pe / ns, wl = es[2] - es[0] - 0.2; // straight stair inside the shaft\n for (let i = 0; i < ns; i++) bx('wood', es[0] + 0.1, y0 + (i + 1) * rise - 0.05, es[1] + 0.05 + i * (es[3] - es[1] - 0.1) / ns, es[0] + 0.1 + wl, y0 + (i + 1) * rise, es[1] + 0.05 + (i + 1) * (es[3] - es[1] - 0.1) / ns, 0x8a6a48);\n if (k === 0) bx('building', hall[0] - 3, y0, hall[1], hall[0], y0 + pe, hall[3], 0x9ab0c0);\n // highlight strip of the unit's floor\n if (ehSel) { const cc = 0xffa31a, e = 0.08, [a, b, c, d] = selR; for (const [x0, z0, x1, z1] of [[a, b, c, b + e], [a, d - e, c, d], [a, b, a + e, d], [c - e, b, c, d]]) { bx('emissive', x0, y0 - 0.2, z0, x1, y0 - 0.12, z1, cc); bx('emissive', x0, y0 + pe - 0.28, z0, x1, y0 + pe - 0.2, z1, cc); }\n for (const [px, pz] of [[a, b], [c - e, b], [a, d - e], [c - e, d - e]]) bx('emissive', px, y0 - 0.2, pz, px + e, y0 + pe - 0.2, pz + e, cc); }\n }\n // building roof\n const ytop = N * pe - 0.2; bx('plaster', Math.min(hall[0] - 3, color[0]), ytop, Math.min(un[1] ? unitBox(un[1])[1] : 0, el[1]), Math.max(color[2], un0[2]), ytop + 0.2, Math.max(un0[3], un[1] ? unitBox(un[1])[3] : 0), 0xb4b0a8);\n shared.ctx.limits = { x0: Math.min(hall[0] - 3, color[0]), z0: Math.min(el[1], un[1] ? unitBox(un[1])[1] : 0), x1: Math.max(color[2], un0[2]), z1: Math.max(un0[3], un[1] ? unitBox(un[1])[3] : 0) };\n }\n Object.assign(K, { building });\n}\n","// Literal port of the team's Casa3DSDK (module utilities/water). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installUtilitiesWater(K: Kernel, shared: Shared): void {\n const { THREE, _Y, _q, cursor, cylBase, part, pieceRecord, put } = K;\n // ===== R69: water network: tank level at run time (house.water) and the visible pipes (tank outlet, under the sink; the ones in the wall stay hidden) =====\n function createWater(r, state) {\n const H = r.utilities.plumbing, cap = H ? +H.capacityL || 0 : 0, ls = { dry: [], full: [] }, points: any = {}, itemPoint = {};\n if (H) for (const p of H.points) { points[p.id] = p; itemPoint[p.item] = p.id; }\n const st = state.water && state.water.cap === cap ? state.water : (state.water = { cap, level: cap, rate: 0 }); // the state survives the rebuild (night/cut)\n const emits = ev => { for (const f of ls[ev].slice()) { try { f(api); } catch (e) { console.warn('water.on', ev, e); } } };\n const api = {\n capacity: cap, points, itemPoint, runs: H ? H.visibleRuns : [],\n level() { return st.level; },\n fraction() { return cap ? st.level / cap : 0; },\n // draws litres from the point (tap, shower, flush...) and returns the litres delivered (less than requested if the tank ran dry); 0 if the point does not exist\n consume(pointId, liters) { if (!points[pointId] || !(liters > 0)) return 0; const before = st.level, d = Math.min(liters, st.level); st.level -= d; if (before > 0 && st.level <= 1e-9) { st.level = 0; emits('dry'); } return d; },\n fill(liters) { if (!(liters > 0)) return 0; const before = st.level, d = Math.min(liters, cap - st.level); st.level += d; if (before < cap && st.level >= cap - 1e-9) { st.level = cap; emits('full'); } return d; },\n leak(rate) { st.rate = Math.max(0, +rate || 0); return st.rate; }, // litres per second; 0 stops it\n get leakage() { return st.rate; },\n get dry() { return st.level <= 0; },\n on(ev, fn) { if (!ls[ev]) throw new Error(\"water.on: event must be 'dry' or 'full'\"); ls[ev].push(fn); return () => api.off(ev, fn); },\n off(ev, fn) { const l = ls[ev]; if (l) { const i = l.indexOf(fn); if (i >= 0) l.splice(i, 1); } },\n step(dt) { if (st.rate > 0 && st.level > 0 && dt > 0) { const before = st.level; st.level = Math.max(0, st.level - st.rate * dt); if (before > 0 && st.level <= 0) emits('dry'); } },\n };\n return api;\n }\n const PIPE_COLOR = 0xb58a55;\n // brown weldable PVC\n function pipe(a, b, diameter, color) { // cylinder between two points [x, y, z]\n const dx = b[0] - a[0], dy = b[1] - a[1], dz = b[2] - a[2], L = Math.hypot(dx, dy, dz); if (L < 1e-3) return;\n _q.setFromUnitVectors(_Y, _v3.set(dx / L, dy / L, dz / L)); put('plain', 'cyl', (a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2, _q, diameter, L, diameter, color);\n }\n const _v3 = new THREE.Vector3();\n function waterPipes() {\n const H = shared.ctx.r.utilities.plumbing; if (!H || !H.visibleRuns) return; const nA = shared.ctx.r.floors.length;\n const groupOf = c => c && c.floor >= 0 ? 'f' + Math.min(c.floor, nA - 1) : 'lot', xyz = p => [p[0], p[2], p[1]]; // plan points: [u, v, y] -> [x, y, z]\n for (const tr of H.visibleRuns) {\n const pts = tr.points.map(xyz), d = tr.diameter || 0.025;\n if (tr.exposed === 'wall') { // inside the wall: hidden part (vanishes until the wall breaks)\n const pt = H.points.find(p => p.run === tr.id), com = shared.ctx.roomById[tr.to], g = groupOf(com || (pt && { floor: pt.floor }));\n part('wall_pipe', [0, 0, 0], () => { for (let i = 0; i + 1 < pts.length; i++) pipe(pts[i], pts[i + 1], d, PIPE_COLOR); for (const p of pts) cylBase('plain', p[0], p[1] - d, p[2], d * 0.7, d * 2, PIPE_COLOR); }, { id: 'pipe:' + tr.id, hidden: true, run: tr.id, to: tr.to, from: tr.from }, g === 'lot' ? 'f0' : g);\n continue;\n }\n let g;\n if (tr.exposed === 'tank_outlet') g = (shared.ctx.waterTankPos && shared.ctx.waterTankPos.group) || 'f0';\n else { const pt = H.points.find(p => p.id === tr.to); g = groupOf(pt); }\n cursor.group = g; cursor.pc = pieceRecord('pipe:' + tr.id, 'plastic', null, { tags: ['pipe'] });\n for (let i = 0; i + 1 < pts.length; i++) pipe(pts[i], pts[i + 1], d, PIPE_COLOR);\n for (const p of pts) { cylBase('metal', p[0], p[1] - d * 0.9, p[2], d * 0.75, d * 1.8, 0xc8c8c4); }\n cursor.pc = null; // sleeves/valves at the ends and bends\n }\n }\n Object.assign(K, { createWater, PIPE_COLOR, pipe, _v3, waterPipes });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module utilities/electrical). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installUtilitiesElectrical(K: Kernel, shared: Shared): void {\n const { _Y, _q, _v3, bx, cursor, cylBase, pieceRecord, put } = K;\n const sh = (...a: any[]): any => K.sh(...a);\n // ===== R50: electrical structure (res.electrical): pole, service drop and meter, breaker panel, exposed conduits. Outlets and switches belong to the furniture team: here only their positions are registered (house.electrical) =====\n function electricalStructure() {\n const E = shared.ctx.r.utilities.electrical; shared.ctx.electricalInfo = null; if (!E) return;\n const R = shared.ctx.r, nA = R.floors.length, lotGroup = R.lot ? 'lot' : 'f0', concreteColor = 0xb6b3ab, iron = 0x4a4c50, wireRun = 0x1c1c1e, info = { pole: null, meter: null, panel: null, conduits: [], outlets: [], switches: [], circuits: E.circuits || [], exposed: !!E.exposed };\n const en = E.serviceEntrance, KV = shared.ctx.iv ? shared.ctx.iv.plane : null; // with cfg.interactives the kit draws the service pole, the meter, the panel and the exposed conduits (here only the neighbouring poles and the street grid)\n const wireL = (a, b, r_ = 0.008) => { const L = Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]); if (L < 1e-3) return; _q.setFromUnitVectors(_Y, _v3.set((b[0] - a[0]) / L, (b[1] - a[1]) / L, (b[2] - a[2]) / L)); put('plain', 'cyl', (a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2, _q, r_ * 2, L, r_ * 2, wireRun); };\n const pole = (u, v, h) => { // concrete pole: two sections, crossarm with insulators\n cursor.group = lotGroup; cursor.pc = pieceRecord('pole:' + u.toFixed(1), 'concrete', null, { tags: ['pole'] }); cylBase('plain', u, 0, v, 0.11, h * 0.55, concreteColor); cylBase('plain', u, h * 0.55, v, 0.08, h * 0.45, sh(concreteColor, 0.95));\n bx('wood', u - 0.8, h - 0.7, v - 0.04, u + 0.8, h - 0.62, v + 0.04, 0x6a4a30); for (const dx of [-0.65, -0.2, 0.25, 0.7]) cylBase('plain', u + dx, h - 0.62, v, 0.025, 0.1, 0xd0cfc8); cursor.pc = null;\n };\n if (en && en.pole) {\n const P = en.pole; if (!(KV && KV.serviceEntrance)) pole(P.u, P.v, P.h); info.pole = { pos: [P.u, 0, P.v], h: P.h };\n for (const k of [-1, 1]) pole(P.u + k * 22, P.v, P.h); // neighbouring poles and the grid that follows the street\n cursor.pc = pieceRecord('wiring:grid', 'copper', null, { tags: ['wiring'] }); for (const dx of [-0.65, -0.2, 0.25, 0.7]) for (const k of [-1, 1]) wireL([P.u + dx, P.h - 0.5, P.v], [P.u + k * 22 + dx, P.h - 0.5, P.v], 0.007);\n if (en.drop && en.drop.length > 1 && !(KV && KV.serviceEntrance)) { // service drop: pole -> meter head\n const r0 = en.drop[0], r1 = en.drop[en.drop.length - 1];\n for (const dz of [0, 0.04]) wireL([r0[0], r0[2], r0[1]], [r1[0], r1[2], r1[1] + dz], 0.009);\n wireL([P.u - 0.2, P.h - 0.5, P.v], [r0[0], r0[2], r0[1]], 0.008);\n }\n cursor.pc = null;\n if (en.descent && en.descent.length > 1 && !(KV && KV.serviceEntrance)) { // drop: steel conduit from the head to the meter box\n const d0 = en.descent[0], d1 = en.descent[en.descent.length - 1]; cylBase('metal', d0[0], d1[2], d0[1], 0.02, d0[2] - d1[2], 0x8a8e92); bx('metal', d0[0] - 0.05, d0[2] - 0.03, d0[1] - 0.05, d0[0] + 0.05, d0[2] + 0.08, d0[1] + 0.05, 0x7a7e84);\n }\n const M = en.meter;\n if (M) { // meter box with window and seal, on the face of the pillar/facade turned to the street (with the kit: power_meter)\n const hw = (M.w || 0.35) / 2, hd = (M.d || 0.2) / 2, hh = (M.h || 0.5) / 2, fr = M.side === 'front' ? -1 : 1;\n if (!(KV && KV.meter)) bx('plain', M.u - hw, M.y - hh, M.v - hd, M.u + hw, M.y + hh, M.v + hd, 0xd9dbdd);\n const fz = fr < 0 ? [M.v - hd - 0.012, M.v - hd] : [M.v + hd, M.v + hd + 0.012];\n if (!(KV && KV.meter)) { bx('glass', M.u - hw * 0.6, M.y - hh * 0.2, fz[0], M.u + hw * 0.6, M.y + hh * 0.6, fz[1], 0xffffff); bx('plain', M.u - hw * 0.35, M.y - hh * 0.1, fz[0] - fr * 0.002 * 0, M.u + hw * 0.35, M.y + hh * 0.3, fz[1], 0x2b2f33);\n bx('metal', M.u - 0.02, M.y - hh * 0.85, fz[0], M.u + 0.02, M.y - hh * 0.6, fz[1], 0x9a9ea2); }\n info.meter = { id: M.id, pos: [M.u, M.y, M.v], place: M.place };\n }\n }\n const Q = E.panel;\n if (Q) { // breaker panel flush/surface-mounted on the wall, light door with a row of breakers (with the kit: electrical_panel)\n const g0 = cursor.group, noDrawing = !!(KV && KV.picture);\n cursor.group = 'f' + Math.max(0, Math.min(nA - 1, Q.floor || 0)); const frontU = Q.frontU || 0, frontV = Q.frontV || 0, w = Q.w || 0.3, h = Q.h || 0.4, hw = w / 2, d = 0.05;\n const bq = (a0, y0_, a1, y1_, o0, o1, mat, color) => { // a = along the wall (u if the wall is on the u axis), o = out of the wall (into the room)\n if (frontV) bx(mat, Q.u + a0, Q.y + y0_, Q.v + (frontV > 0 ? o0 : -o1), Q.u + a1, Q.y + y1_, Q.v + (frontV > 0 ? o1 : -o0), color); else bx(mat, Q.u + (frontU > 0 ? o0 : -o1), Q.y + y0_, Q.v + a0, Q.u + (frontU > 0 ? o1 : -o0), Q.y + y1_, Q.v + a1, color);\n };\n if (!noDrawing) { bq(-hw, -h / 2, hw, h / 2, -0.015, 0.06, 'plain', 0xcfd2d6); bq(-hw + 0.02, -h / 2 + 0.02, hw - 0.02, h / 2 - 0.02, 0.06, 0.072, 'plain', 0xe6e8ea); bq(hw - 0.05, -0.03, hw - 0.035, 0.03, 0.072, 0.082, 'metal', 0x6a6e72);\n const nd = Math.max(2, Math.min(12, Q.breakers || 5)), per = Math.min(nd, 6); // breakers behind a window: row of black keys\n bq(-hw + 0.04, h / 2 - 0.1, hw - 0.04, h / 2 - 0.04, 0.072, 0.075, 'plain', 0x33373b);\n for (let k = 0; k < per; k++) { const a = -hw + 0.06 + k * (w - 0.12) / per; bq(a, -h * 0.1, a + (w - 0.12) / per * 0.7, h * 0.15, 0.072, 0.082, 'plain', 0x1f2226); } }\n cursor.group = g0;\n info.panel = { id: Q.id, pos: [Q.u, Q.y, Q.v], normal: [frontU, 0, frontV], room: Q.room, breakers: Q.breakers };\n }\n // exposed conduits (only the exposed ones), L-shaped in the horizontal plane and plumb going down/up\n const colorD = 0xe6e2d6, circ = {}; for (const c of E.circuits || []) circ[c.id] = c;\n for (const t of E.conduits || []) {\n if (!t.exposed) continue; if (KV && KV.conduits.indexOf(t.id) >= 0) { info.conduits.push(t.id); continue; } const c = circ[t.circuit], com = c && shared.ctx.roomById[c.room]; cursor.group = 'f' + Math.max(0, Math.min(nA - 1, com ? com.floor : 0)); const d = t.diameter || 0.02, P = t.points.map(p => [p[0], p[2], p[1]]), seg = [];\n for (let i = 0; i + 1 < P.length; i++) { const a = P[i], b = P[i + 1]; if (Math.abs(a[1] - b[1]) < 1e-3 && Math.abs(a[0] - b[0]) > 0.02 && Math.abs(a[2] - b[2]) > 0.02) { const m = [b[0], a[1], a[2]]; seg.push([a, m], [m, b]); } else seg.push([a, b]); }\n cursor.pc = pieceRecord('conduit:' + t.id, 'plastic', null, { tags: ['conduit'] });\n for (const [a, b] of seg) pipe2(a, b, d, colorD); for (const p of P) cylBase('plain', p[0], p[1] - d * 0.9, p[2], d * 0.62, d * 1.8, sh(colorD, 0.85));\n cursor.pc = null;\n info.conduits.push(t.id);\n }\n for (const t of E.outlets || []) info.outlets.push({ id: t.id, pos: [t.u, t.y, t.v], normal: [t.frontU || 0, 0, t.frontV || 0], room: t.room, floor: t.floor, type: t.type, voltage: t.voltage });\n for (const t of E.switches || []) info.switches.push({ id: t.id, pos: [t.u, t.y, t.v], normal: [t.frontU || 0, 0, t.frontV || 0], room: t.room, floor: t.floor, controls: t.controls });\n shared.ctx.electricalInfo = info;\n }\n function pipe2(a, b, diameter, color) { const dx = b[0] - a[0], dy = b[1] - a[1], dz = b[2] - a[2], L = Math.hypot(dx, dy, dz); if (L < 1e-3) return; _q.setFromUnitVectors(_Y, _v3.set(dx / L, dy / L, dz / L)); put('plain', 'cyl', (a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2, _q, diameter, L, diameter, color); }\n Object.assign(K, { electricalStructure, pipe2 });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module house/baseboard). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installHouseBaseboard(K: Kernel, shared: Shared): void {\n const { Y0, bx, cursor, sideOf } = K;\n const sh = (...a: any[]): any => K.sh(...a);\n // ===== R46: external baseboard and protective sidewalk around the ground floor, closing the outer corners =====\n function baseboardAndSidewalk() {\n const R = shared.ctx.r, W = 0.6, t = 0.012, ht = 0.35, color = sh(shared.ctx.colors.facade != null ? shared.ctx.colors.facade : 0xd8d0c0, 0.62), y0 = Y0(0), cal = 0xd4d0c6;\n const ws = R.walls.filter(w => w.floor === 0 && w.type === 'wall').map(w => { const au = w.axis === 'u'; return { w, au, L: au ? w.v0 : w.u0, a: Math.min(au ? w.u0 : w.v0, au ? w.u1 : w.v1), b: Math.max(au ? w.u0 : w.v0, au ? w.u1 : w.v1), th: w.thickness || 0.15 }; });\n cursor.group = 'f0';\n // what meets the end of a wall (point e = position along the axis, L = line): +1 convex (another wall moves away on the outside), -1 concave or in a T, 0 free end\n const junction = (A, e, sd) => {\n let r = 0;\n for (const B of ws) { if (B === A || B.au === A.au) continue; if (Math.abs(B.L - e) > 0.03 || A.L < B.a - 0.03 || A.L > B.b + 0.03) continue;\n const dir = Math.abs(B.a - A.L) < 0.03 ? 1 : Math.abs(B.b - A.L) < 0.03 ? -1 : 0; // direction in which B leaves the line of A\n if (dir === 0 || dir === sd) return -1; r = 1; }\n return r;\n };\n for (const A of ws) for (const [side, sd] of [[A.w.sides[0], -1], [A.w.sides[1], 1]]) {\n if (!sideOf(side, false).exterior) continue;\n const strip = (k, y1, y2, o0, o1, mat, c, y1b?) => { // k = extra clearance at convex corners; o0..o1 = offset from the outer face\n const ea = junction(A, A.a, sd) > 0 ? A.th / 2 + k : junction(A, A.a, sd) < 0 ? -A.th / 2 : 0, eb = junction(A, A.b, sd) > 0 ? A.th / 2 + k : junction(A, A.b, sd) < 0 ? -A.th / 2 : 0;\n const s0 = A.a - ea, s1 = A.b + eb, f0 = A.L + sd * (A.th / 2 + o0), f1 = A.L + sd * (A.th / 2 + o1), lo = Math.min(f0, f1), hi = Math.max(f0, f1);\n if (s1 - s0 < 1e-3) return; if (A.au) bx(mat, s0, y1, lo, s1, y2, hi, c); else bx(mat, lo, y1, s0, hi, y2, s1, c);\n };\n strip(t, y0, y0 + ht, 0, t, 'plaster', color); // baseboard (35 cm dark strip) with closed corners\n strip(W, y0, y0 + 0.045, 0, W, 'sidewalk', cal); // 60 cm protective sidewalk with filled corners\n }\n }\n Object.assign(K, { baseboardAndSidewalk });\n}\n","// Literal port of the team's Casa3DSDK (module utilities/solar). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installUtilitiesSolar(K: Kernel, shared: Shared): void {\n const { Y0, boxC, bx, cursor, cylBase } = K;\n // ===== R57: solar panels (res.solarPanels) on the roof plane or on racks over the slab, and the inverter on the wall =====\n function roofHeightAt(u, v, f?) { // height of the roof surface at (u,v): rects of storey f (or of any storey if none covers)\n let y = null;\n for (const rr of shared.ctx.roofRects || []) {\n if (rr.yb == null || (f != null && rr.f !== f)) continue;\n if (rr.slab) { const [a, b, c, d] = rr.r; if (u >= a - 0.05 && u <= c + 0.05 && v >= b - 0.05 && v <= d + 0.05) y = Math.max(y == null ? -1e9 : y, rr.yb); continue; }\n const [x0, z0, x1, z1] = rr.exterior; if (u < x0 || u > x1 || v < z0 || v > z1) continue;\n const dz = Math.min(v - z0, z1 - v), dx = Math.min(u - x0, x1 - u), dd = rr.gable ? (rr.alongX ? dz : dx) : Math.min(dx, dz), h = rr.yb + rr.tp * Math.min(dd, rr.rm);\n y = Math.max(y == null ? -1e9 : y, h);\n }\n return y;\n }\n function solar() {\n const R = shared.ctx.r, S = R.utilities.solar; shared.ctx.solarInfo = null; if (!S || !S.panels || !S.panels.length) return; cursor.group = 'roof';\n const silver = 0xc9cdd2, blue = 0x1b2a4e, line = 0x8d96a6, sv = S.north === 'front' ? -1 : 1, info = { type: S.type, panels: [], inverter: null }, onRack = S.type === 'slab_rack';\n const nA = R.floors.length, fa = Math.max(0, Math.min(nA - 1, S.floor != null ? S.floor : nA - 1));\n for (const p of S.panels) {\n const d = p.d, hw = p.w / 2, hd = d / 2;\n const yA = roofHeightAt(p.u, p.v - hd), yB = roofHeightAt(p.u, p.v + hd), yC = roofHeightAt(p.u, p.v); // the highest plane at the point (over a double-height void it is the ground floor cover)\n let yc, tilt;\n if (onRack) { const base = yC != null ? yC : Y0(fa) + 0.02, /* no cover slab under the panel (the plan put some over the balcony): rests on the storey floor */ angle = (S.tilt || 15) * Math.PI / 180, high = Math.sin(angle) * p.length; tilt = sv * Math.atan2(high, d); yc = base + 0.25 + high / 2; // the low side sits 0.25 m from the slab\n const yLow = base + 0.25, yHigh = yLow + high;\n for (const ex of [-0.8, 0.8]) for (const [vv, yTop] of [[p.v - sv * hd, yLow], [p.v + sv * hd, yHigh]]) bx('metal', p.u + ex * hw - 0.025, base, vv - 0.025, p.u + ex * hw + 0.025, yTop - 0.02, vv + 0.025, 0x7a7e84);\n bx('metal', p.u - hw * 0.9, base + 0.01, p.v - sv * hd - 0.02, p.u + hw * 0.9, base + 0.05, p.v - sv * hd + 0.02, 0x7a7e84); }\n else { if (yA == null || yB == null || yC == null) continue; tilt = Math.atan2(yA - yB, d); yc = yC + 0.13; }\n // panel frame: x = u, y = face normal, z = along the plane; box rotated about x\n const co = Math.cos(tilt), si = Math.sin(tilt), pb = (lx, ly, lz, sx, sy, sz, mat, color) => boxC(mat, p.u + lx, yc + ly * co - lz * si, p.v + ly * si + lz * co, sx, sy, sz, color, tilt, 0, 0), L = p.length;\n pb(0, 0, 0, p.w, 0.04, L, 'metal', silver); pb(0, 0.0205, 0, p.w - 0.07, 0.006, L - 0.07, 'plain', blue);\n for (let k = 1; k < 4; k++) pb(-hw + 0.035 + k * (p.w - 0.07) / 4, 0.0245, 0, 0.006, 0.003, L - 0.07, 'metal', line);\n for (let k = 1; k < 6; k++) pb(0, 0.0245, -L / 2 + 0.035 + k * (L - 0.07) / 6, p.w - 0.07, 0.003, 0.006, 'metal', line);\n info.panels.push({ id: p.id, pos: [p.u, yc, p.v], tilt, w: p.w, length: L });\n }\n const iv = S.inverter;\n if (iv) {\n cursor.group = 'f0'; const y0 = iv.y != null ? iv.y : 1.5, W = (iv.w || 0.4) / 2, D = (iv.d || 0.15) / 2, h = iv.h || 0.5, side = iv.side, alongV = side === 'left' || side === 'right', sg = side === 'left' || side === 'front' ? -1 : 1;\n const ex = alongV ? D : W, ez = alongV ? W : D; // half-extent in u and in v\n bx('plain', iv.u - ex, y0 - h / 2, iv.v - ez, iv.u + ex, y0 + h / 2, iv.v + ez, 0xdcdfe3); // inverter box, against the outer wall\n const t = 0.004, fa0 = sg > 0 ? D : -D - t, fa1 = sg > 0 ? D + t : -D; // outer face (screen and led)\n if (alongV) { bx('plain', iv.u + fa0, y0 + 0.05, iv.v - W * 0.6, iv.u + fa1, y0 + 0.17, iv.v + W * 0.6, 0x20262c); bx('emissive', iv.u + fa0, y0 - 0.12, iv.v - 0.03, iv.u + fa1, y0 - 0.09, iv.v + 0.03, 0x62e07a); }\n else { bx('plain', iv.u - W * 0.6, y0 + 0.05, iv.v + fa0, iv.u + W * 0.6, y0 + 0.17, iv.v + fa1, 0x20262c); bx('emissive', iv.u - 0.03, y0 - 0.12, iv.v + fa0, iv.u + 0.03, y0 - 0.09, iv.v + fa1, 0x62e07a); }\n // PVC conduit rises flush with the wall to the eave and crosses to the panels\n const top = Math.max(...(shared.ctx.roofRects || []).filter(t => t.yb != null).map(t => t.yb), Y0(fa) + 2.8);\n cylBase('plain', iv.u, y0 + h / 2, iv.v, 0.016, Math.max(0.2, top - 0.2 - (y0 + h / 2)), 0xe8e4d8);\n info.inverter = { id: iv.id, pos: [iv.u, y0, iv.v], side: iv.side, link: iv.link };\n }\n shared.ctx.solarInfo = info;\n }\n Object.assign(K, { roofHeightAt, solar });\n}\n","// Literal port of the team's Casa3DSDK (module house/outbuildings). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installHouseOutbuildings(K: Kernel, shared: Shared): void {\n const { t, bx, cursor, floorColor } = K;\n const sh = (...a: any[]): any => K.sh(...a);\n // ===== R43: yard buildings (res.outbuildings: walk-in outbuilding) =====\n // room, walls (with the door gap), door, windows and items enter the plan lists the rest of the SDK already knows how to draw (doors/colliders/E, windows, ceiling, roof, light)\n const OUTBUILDING_USE = { guest_room: ['bedroom', 'bedroom', t('outbuilding.guest_room')], office: ['office', 'office', t('outbuilding.office')], storage: ['stockroom', 'stockroom', t('outbuilding.storage')], gourmet: ['living', 'gourmet', t('outbuilding.gourmet')] };\n function applyOutbuildings(r) {\n // the structure pack names a wall by its floor and its place in the list (wall_<floor>_<index>); the renderer finds the part of the structure by that id\n const counts = new Map();\n r = Object.assign({}, r, { utilities: r.utilities || {}, walls: r.walls.map(w => { const i = counts.get(w.floor) || 0; counts.set(w.floor, i + 1); return w.id ? w : Object.assign({}, w, { id: `wall_${w.floor}_${i}` }); }) });\n const E = (r.outbuildings || []).filter(e => e && e.walls && e.walls.length && e.interior && e.interior.length); if (!E.length) return r;\n const rooms = r.rooms.slice(), walls = r.walls.slice(), doors = r.doors.slice(), windows = r.windows.slice(), items = r.items.filter(m => m.type !== 'outbuilding');\n for (const e of E) {\n const ti = OUTBUILDING_USE[e.use] || OUTBUILDING_USE.gourmet, it = e.interior[0], cx = (it[0] + it[2]) / 2, cz = (it[1] + it[3]) / 2, pe = e.ceiling || 2.6;\n rooms.push({ id: e.id, type: ti[0], name: ti[2], floor: 0, u0: it[0], v0: it[1], u1: it[2], v1: it[3], parts: e.interior, link: null, ceiling: pe, outbuilding: true, color: { wall: 'wall_' + ti[1], floor: 'floor_' + ti[1] } });\n for (const w of e.walls) { const alongU = w.axis === 'u', L = alongU ? w.v0 : w.u0, below = L < (alongU ? cz : cx); walls.push({ floor: 0, axis: w.axis, u0: w.u0, v0: w.v0, u1: w.u1, v1: w.v1, thickness: w.thickness, sides: below ? ['outside', e.id] : [e.id, 'outside'], exterior: true, type: 'wall', h: w.h, outbuilding: e.id }); }\n for (const p of e.doors || []) { const alongU = p.axis === 'u', below = p.pos < (alongU ? cz : cx); doors.push({ id: p.id, floor: 0, u: p.u, v: p.v, axis: p.axis, pos: p.pos, at: p.at, width: p.width, a: below ? 'outside' : e.id, b: below ? e.id : 'outside', opensTo: e.id, exterior: true, side: p.side, leaves: 1, model: 'single', hinge: 'start', zones: [], blocked: false, outbuilding: e.id }); }\n for (const j of e.windows || []) windows.push({ id: j.id, floor: 0, u: j.u, v: j.v, axis: j.axis, pos: j.pos, at: j.at, width: j.width, y0: j.y0, y1: j.y1, room: e.id, side: j.side, outbuilding: e.id });\n (e.items || []).forEach((m, i) => items.push({ id: e.id + '.' + m.type + i, type: m.type, category: m.category, x: m.u, z: m.v, ry: m.ry || 0, w: m.w, d: m.d, h: m.h, y: 0.04, frontU: m.frontU, frontV: m.frontV, room: e.id, floor: 0, outdoor: false, aabb: m.aabb, color: 'wood' }));\n items.push({ id: e.id + '.ceiling_light', type: 'ceiling_light', category: 'ceiling_light', x: cx, z: cz, ry: 0, w: 0.35, d: 0.35, h: 0.1, y: pe - 0.1, room: e.id, floor: 0, outdoor: false, assembly: 'ceiling', color: 'metal', decor: true });\n }\n return Object.assign({}, r, { rooms, walls, doors, windows, items });\n }\n function outbuildings() { // floor slab (above the yard soil) and door threshold\n const E = (shared.ctx.r.outbuildings || []).filter(e => shared.ctx.roomById[e.id] && shared.ctx.roomById[e.id].outbuilding); shared.ctx.outbuildingList = E; if (!E.length) return;\n cursor.group = 'f0';\n for (const e of E) {\n const c = shared.ctx.roomById[e.id], col = floorColor(c);\n for (const [a, b, c2, d] of e.interior) bx('plaster', a - 0.075, 0, b - 0.075, c2 + 0.075, 0.04, d + 0.075, col);\n for (const p of e.doors || []) { const alongU = p.axis === 'u', th = e.thickness || 0.15; if (alongU) bx('plaster', p.at - p.width / 2, 0, p.pos - th / 2 - 0.12, p.at + p.width / 2, 0.03, p.pos + th / 2 + 0.12, sh(shared.ctx.colors.facade || 0xd8d0c0, 0.8)); else bx('plaster', p.pos - th / 2 - 0.12, 0, p.at - p.width / 2, p.pos + th / 2 + 0.12, 0.03, p.at + p.width / 2, sh(shared.ctx.colors.facade || 0xd8d0c0, 0.8)); }\n }\n }\n Object.assign(K, { OUTBUILDING_USE, applyOutbuildings, outbuildings });\n}\n","// Literal port of the team's Casa3DSDK (module furniture/api). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installFurnitureApi(K: Kernel, _shared: Shared): void {\n const { _e, _h2, _q, boxC, cursor, macroGround, polyFace, put } = K;\n // ---------------- 20 furniture ----------------\n // ===== furniture: adapter of the Moveis3DSDK + builders ported from the game (26-casa.js) and generic families =====\n const MATERIAL_MAP = { plain: 'plain', metal: 'metal', wood: 'wood', glass: 'glass', fabric: 'fabric', plant: 'plant', water: 'water', emissive: 'emissive', 'atlas_picture': 'picture', 'atlas_floor': 'floor', plaster: 'plain', matte: 'glass', glass_light: 'emissive', light: 'emissive', ceramic_tile: 'plain', parquet: 'plain', ceramic: 'plain' };\n const mm = k => MATERIAL_MAP[k] || 'plain';\n const LIGHTS = [];\n // real lights requested by the builders: {x,y,z,color,range,type,floor}\n function makeApi() {\n const loc = (M, lx, lz) => { const c = Math.cos(M.ry), s = Math.sin(M.ry); return [M.x + lx * c + lz * s, M.z - lx * s + lz * c]; };\n return {\n box(M, mat, x, y, z, w, h, d, color, ry = 0, rx = 0, rz = 0) { const [px, pz] = loc(M, x, z); boxC(mm(mat), px, M.base + y + h / 2, pz, w, h, d, color, rx, M.ry + ry, rz); },\n cylinder(M, mat, x, y, z, r, h, color, rx = 0, rz = 0, seg) { const [px, pz] = loc(M, x, z); _q.setFromEuler(_e.set(rx || 0, M.ry, rz || 0, 'YXZ')); put(mm(mat), seg || 'cyl', px, M.base + y + ((rx || rz) ? 0 : h / 2), pz, _q, r * 2, h, r * 2, color); },\n leaf(M, x, y, z, w, h, color, ry = 0, rx = 0) { // 3D leaf: curved rib and two folded flaps in a V (no flat plane seen from the side)\n const [px, pz] = loc(M, x, z), a = M.ry + (ry || 0), ca = Math.cos(a), sa = Math.sin(a), t1 = (rx || 0) * 0.8, t2 = (rx || 0) * 1.5, y0 = M.base + y;\n const P = (lx, ly, lz) => [px + lx * ca + lz * sa, y0 + ly, pz - lx * sa + lz * ca];\n const my = Math.cos(t1) * h * 0.5, mz = Math.sin(t1) * h * 0.5, ty = my + Math.cos(t2) * h * 0.5, tz = mz + Math.sin(t2) * h * 0.5, f = w * 0.5, dn = f * 0.32;\n const B = P(0, 0, 0), Mi = P(0, my + 0.004, mz), T = P(0, ty, tz), L = P(-f, my - dn, mz - dn * 0.3), R = P(f, my - dn, mz - dn * 0.3);\n polyFace('plant', [B, L, T, Mi], color, [0, 1, 0]); polyFace('plant', [B, Mi, T, R], sh(color, 0.92), [0, 1, 0]);\n },\n plane(M, mat, x, y, z, w, h, color, ry = 0, rx = 0, rz = 0, uv) {\n const [px, pz] = loc(M, x, z); _q.setFromEuler(_e.set(rx || 0, M.ry + (ry || 0), rz || 0, 'YXZ'));\n if (uv && mat === 'atlas_floor') { // atlas floor: random rotation/mirror per patch and macro colour variation (soil and lawn) to break the repetition\n const col = Math.floor(uv.u0 * 4 + 1e-6), lin = uv.v0 < 0.5 ? 1 : 0, cell = col + 4 * lin, h0 = _h2(Math.round(px * 8), Math.round(pz * 8)), type = cell === 5 ? 'dirt' : (cell === 0 || cell === 1) ? 'lawn' : null;\n if (type === 'dirt') { put('dirt', 'plane', px, M.base + y, pz, _q, w, h, 1, sh(color, 1 / 0.965)); return; } // R46: soil with world UV and noise in the shader (no 2 m atlas cells)\n if (type) uv = { u0: uv.u0, u1: uv.u1, v0: uv.v0, v1: uv.v1, rot: (h0 * 4) | 0, fx: h0 > 0.5 ? 1 : 0, vc: (wx, wz) => macroGround(wx, wz, type) };\n }\n put(mm(mat), 'plane', px, M.base + y, pz, _q, w, h, 1, color, uv);\n },\n light(M, x, y, z, color, range, type, ex) { const [px, pz] = loc(M, x, z); LIGHTS.push(Object.assign({ x: px, y: M.base + y, z: pz, color, range, type, floor: M.floor, group: cursor.group, base: M.base, room: M.room, id: M.lampId }, ex || null)); },\n };\n }\n const sh = (c, f) => { const r = Math.min(255, ((c >> 16) & 255) * f) | 0, g = Math.min(255, ((c >> 8) & 255) * f) | 0, b = Math.min(255, (c & 255) * f) | 0; return (r << 16) | (g << 8) | b; };\n const paletteColor = (M, k, d) => (M.palette && M.palette[k] != null ? M.palette[k] : d);\n function rngOf(M) { let s = (Math.round((M.x || 0) * 37 + (M.z || 0) * 91 + 1000) >>> 0) || 7; return () => (s = (s * 16807) % 2147483647) / 2147483647; }\n // shortcuts: lb = box, lc = cylinder; they add M.y (mounting height) to everything\n function kk(M, A) { const y0 = M.y || 0; return { b: (mat, x, y, z, w, h, d, color, ry, rx, rz) => A.box(M, mat, x, y0 + y, z, w, h, d, color, ry || 0, rx || 0, rz || 0), c: (mat, x, y, z, r, h, color, rx, rz, seg) => A.cylinder(M, mat, x, y0 + y, z, r, h, color, rx || 0, rz || 0, seg), rnd: rngOf(M), wood: paletteColor(M, 'wood', 0x7a5434), met: paletteColor(M, 'metal', 0x9a9ea2) }; }\n const PE = Math.PI / 2;\n Object.assign(K, { MATERIAL_MAP, mm, LIGHTS, makeApi, sh, paletteColor, rngOf, kk, PE });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars, no-constant-condition -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module furniture/builders). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installFurnitureBuilders(K: Kernel, _shared: Shared): void {\n const { PE, _q, kit2, kk, paletteColor, put, rngOf, sh } = K;\n const counterTap = (...a: any[]): any => K.counterTap(...a);\n const FURNITURE = {\n sofa(M, A) {\n const { b: lb } = kk(M, A), c = M.color != null ? M.color : paletteColor(M, 'fabric_main', 0x62778c), cd = sh(c, 0.8), w = M.w, d = M.d, ac = paletteColor(M, 'fabric_accent', 0x8a8070), wood = sh(paletteColor(M, 'wood', 0x4a3a2a), 0.6);\n lb('wood', 0, 0, 0, w, 0.12, d - 0.05, wood);\n for (const sx of [-1, 1]) for (const sz of [-1, 1]) lb('wood', sx * (w / 2 - 0.08), 0, sz * (d / 2 - 0.1), 0.05, 0.1, 0.05, sh(wood, 0.7));\n lb('fabric', 0, 0.1, 0.02, w - 0.3, 0.22, d - 0.08, cd);\n const n = w > 2.5 ? 4 : w > 1.8 ? 3 : 2;\n for (let k = 0; k < n; k++) lb('fabric', (k - (n - 1) / 2) * (w - 0.32) / n, 0.32, 0.08, (w - 0.36) / n - 0.02, 0.14, d - 0.3, c, 0, -0.02);\n lb('fabric', 0, 0.1, -d / 2 + 0.11, w - 0.3, 0.72, 0.22, cd);\n for (let k = 0; k < n; k++) lb('fabric', (k - (n - 1) / 2) * (w - 0.32) / n, 0.42, -d / 2 + 0.27, (w - 0.36) / n - 0.03, 0.4, 0.14, c, 0, 0.15);\n for (const s of [-1, 1]) lb('fabric', s * (w / 2 - 0.08), 0.1, 0, 0.16, 0.52, d - 0.04, cd);\n lb('fabric', w * 0.28, 0.46, 0.05, 0.38, 0.32, 0.12, ac, 0.4, 0.35);\n },\n armchair(M, A) {\n const { b: lb } = kk(M, A), c = M.color != null ? M.color : paletteColor(M, 'fabric_accent', 0x84604a), w = M.w, d = M.d, h = M.h || 0.85;\n lb('wood', 0, 0, 0, w, 0.1, d, sh(paletteColor(M, 'wood', 0x3a2a1e), 0.6));\n lb('fabric', 0, 0.1, 0.04, w - 0.26, 0.32, d - 0.15, c); lb('fabric', 0, 0.1, -d / 2 + 0.1, w, h - 0.1, 0.2, sh(c, 0.85));\n for (const s of [-1, 1]) lb('fabric', s * (w / 2 - 0.07), 0.1, 0, 0.14, 0.5, d, sh(c, 0.85));\n },\n cabinet(M, A, o: any = {}) { // box with doors (rack, sideboard, laundry cabinet...)\n const { b: lb, c: lc } = kk(M, A), w = M.w, d = M.d, h = M.h, wood = o.color != null ? o.color : (M.color != null && o.useColor ? M.color : paletteColor(M, 'wood', 0x6a4a34)), pe = o.ceiling != null ? o.ceiling : 0.08, np = o.doors || Math.max(1, Math.round(w / 0.55));\n lb('wood', 0, pe, 0, w, h - pe, d, wood); lb('wood', 0, h - 0.02, 0, w + 0.03, 0.03, d + 0.03, sh(wood, 1.1)); if (pe > 0.01) lb('wood', 0, 0, 0, w - 0.06, pe, d - 0.06, sh(wood, 0.45));\n for (let k = 0; k < np; k++) { const u = -w / 2 + (k + 0.5) * w / np; lb('wood', u, pe + 0.03, d / 2 + 0.004, w / np - 0.03, h - pe - 0.08, 0.012, sh(wood, 1.12)); lb('metal', u + (k % 2 ? -0.12 : 0.12) * Math.min(1, w / np / 0.4), h * 0.55, d / 2 + 0.014, 0.012, 0.1, 0.014, kk(M, A).met); }\n if (o.glass) lb('glass', 0, h * 0.35, d / 2 + 0.01, w - 0.1, h * 0.55, 0.01, 0xffffff);\n },\n dresser(M, A) { // chest / bedside table / sideboard with drawers\n const { b: lb, c: lc } = kk(M, A), w = M.w, d = M.d, h = M.h, wood = paletteColor(M, 'wood', 0x6a4a34), ng = h > 0.7 ? 3 : 2, gh = (h - 0.12) / ng;\n lb('wood', 0, 0.04, 0, w, h - 0.08, d, wood); lb('wood', 0, h - 0.04, 0, w + 0.03, 0.04, d + 0.03, sh(wood, 1.15));\n for (const sx of [-1, 1]) for (const sz of [-1, 1]) lb('wood', sx * (w / 2 - 0.04), 0, sz * (d / 2 - 0.04), 0.04, 0.04, 0.04, sh(wood, 0.4));\n for (let k = 0; k < ng; k++) { lb('wood', 0, 0.08 + k * gh, d / 2 + 0.005, w - 0.06, gh - 0.03, 0.012, sh(wood, 1.12)); lc('metal', 0, 0.08 + k * gh + gh / 2 - 0.015, d / 2 + 0.02, 0.015, 0.02, 0xb0a070, PE); }\n if (h < 0.7) { lc('plain', -0.08, h, -0.05, 0.06, 0.03, 0x8a7a5a); lc('metal', -0.08, h + 0.03, -0.05, 0.01, 0.2, 0x8a7a5a); _q.identity(); const [px, pz] = [M.x + (-0.08) * Math.cos(M.ry) + (-0.05) * Math.sin(M.ry), M.z - (-0.08) * Math.sin(M.ry) + (-0.05) * Math.cos(M.ry)]; put('fabric', 'cone', px, M.base + h + 0.32, pz, _q, 0.36, 0.2, 0.36, 0xe8d8b0); }\n },\n shelf(M, A, o: any = {}) { // bookcase with shelves and books; o.iron = metal frame\n const { b: lb } = kk(M, A), w = M.w, d = M.d, h = M.h, rnd = rngOf(M), iron = !!o.iron, wood = iron ? 0x6e7276 : paletteColor(M, 'wood', 0x5a4030), ns = Math.max(3, Math.round(h / 0.4));\n for (const s of [-1, 1]) lb(iron ? 'metal' : 'wood', s * (w / 2 - 0.02), 0, 0, 0.04, h, d, wood);\n if (!iron && !o.open) lb('wood', 0, 0, -d / 2 + 0.01, w, h, 0.02, sh(wood, 0.8));\n for (let k = 0; k < ns; k++) {\n const y = 0.05 + k * (h - 0.08) / (ns - 1); lb(iron ? 'metal' : 'wood', 0, y, 0, w - 0.04, 0.03, d, wood);\n if (k === ns - 1) continue;\n let u = -w / 2 + 0.06; while (u < w / 2 - 0.1) { const bw = 0.03 + rnd() * 0.05, bh = 0.18 + rnd() * 0.14; if (rnd() < 0.2) { u += 0.14; continue; } if (o.crates) lb('plain', u + 0.1, y + 0.03, 0, 0.2, 0.2 + rnd() * 0.1, d * 0.8, [0xa8865a, 0xc8b08a, 0x8a6a46][(rnd() * 3) | 0]); else lb('plain', u + bw / 2, y + 0.03, 0.02, bw, bh, d * 0.75, [0x8a2a2a, 0x2a4a6a, 0x3a5a3a, 0xc8b88a, 0x5a3a5a, 0x1a1a1a][(rnd() * 6) | 0]); u += o.crates ? 0.24 : bw + 0.004; }\n }\n },\n table(M, A, o: any = {}) { // table with chairs; o.round, o.chairs\n const { b: lb, c: lc } = kk(M, A), w = M.w, d = M.d, h = M.h || 0.75, wood = o.color != null ? o.color : paletteColor(M, 'wood', 0x7a5434), chairColor = sh(paletteColor(M, 'wood', 0x6a4a30), 0.85);\n if (o.round) { lc('wood', 0, h - 0.04, 0, w / 2, 0.04, wood); lc('wood', 0, 0, 0, 0.05, h - 0.04, sh(wood, 0.7)); lc('wood', 0, 0, 0, w * 0.3, 0.03, sh(wood, 0.7)); }\n else { lb('wood', 0, h - 0.04, 0, w, 0.04, d, wood); for (const sx of [-1, 1]) for (const sz of [-1, 1]) lb('wood', sx * (w / 2 - 0.06), 0, sz * (d / 2 - 0.06), 0.05, h - 0.04, 0.05, sh(wood, 0.75)); }\n if (o.tablecloth) lb('fabric', 0, h, 0, w * 0.7, 0.005, d * 0.95, paletteColor(M, 'fabric_accent', 0xd8c8a8));\n if (o.noChairs) return;\n const chair = (u, v, g) => { const C = { x: M.x + u * Math.cos(M.ry) + v * Math.sin(M.ry), z: M.z - u * Math.sin(M.ry) + v * Math.cos(M.ry), ry: M.ry + g, base: M.base, palette: M.palette }, k = kk(C, A);\n k.b('wood', 0, 0.44, 0, 0.42, 0.04, 0.42, chairColor); for (const sx of [-1, 1]) for (const sz of [-1, 1]) k.b('wood', sx * 0.18, 0, sz * 0.18, 0.035, 0.44, 0.035, sh(chairColor, 0.7)); k.b('wood', 0, 0.48, -0.19, 0.42, 0.45, 0.03, chairColor); };\n if (o.round) { const n = Math.max(3, Math.round(w / 0.3)); for (let k = 0; k < n; k++) { const a = k / n * Math.PI * 2; chair(Math.sin(a) * (w / 2 + 0.2), Math.cos(a) * (w / 2 + 0.2), a + Math.PI); } }\n else if (o.oneSide) { chair(0, d / 2 + 0.28, Math.PI); }\n else { const n = Math.max(1, Math.round(w / 0.65)); for (let k = 0; k < n; k++) { const u = (k - (n - 1) / 2) * w / n; chair(u, -d / 2 - 0.2, 0); chair(u, d / 2 + 0.2, Math.PI); } if (w > 1.8 || o.headboard) { chair(-w / 2 - 0.2, 0, PE); chair(w / 2 + 0.2, 0, -PE); } }\n },\n bed(M, A, o: any = {}) {\n const { b: lb } = kk(M, A), w = M.w, d = M.d, c = M.color != null && o.useColor ? M.color : paletteColor(M, 'fabric_accent', 0x7a3a3a), wood = paletteColor(M, 'wood', 0x8a6444), sheet = paletteColor(M, 'fabric_main', 0xe0dcd0);\n lb('wood', 0, 0, 0, w, 0.3, d, wood); lb('wood', 0, 0, -d / 2 + 0.03, w + 0.06, 1.05, 0.06, sh(wood, 0.85)); lb('wood', 0, 0, d / 2 - 0.02, w, 0.42, 0.04, sh(wood, 0.85));\n lb('fabric', 0, 0.3, 0, w - 0.06, 0.2, d - 0.1, sh(sheet, 1.25));\n lb('fabric', 0, 0.5, 0.25, w - 0.02, 0.05, d * 0.62, c, 0, 0.02); lb('fabric', 0.1, 0.55, 0.0, w * 0.6, 0.06, 0.4, sh(c, 0.8), 0.2);\n const np = w > 1.3 ? 2 : 1; for (let s = 0; s < np; s++) lb('fabric', (np === 1 ? 0 : (s ? 1 : -1) * w * 0.23), 0.5, -d / 2 + 0.3, w * (np === 1 ? 0.6 : 0.4), 0.12, 0.34, 0xf0eee6, (s ? 1 : -1) * 0.08);\n },\n wardrobe(M, A) {\n const { b: lb } = kk(M, A), w = M.w, d = M.d, h = M.h, wood = M.color != null && false ? M.color : paletteColor(M, 'wood', 0x5b4030), np = Math.max(2, Math.round(w / 0.7));\n lb('wood', 0, 0.06, 0, w, h - 0.06, d, wood); lb('wood', 0, h, 0, w + 0.04, 0.04, d + 0.04, sh(wood, 0.8)); lb('wood', 0, 0, 0, w - 0.04, 0.06, d - 0.04, sh(wood, 0.4));\n for (let k = 0; k < np; k++) { const u = -w / 2 + (k + 0.5) * w / np; lb('wood', u, 0.1, d / 2, w / np - 0.02, h - 0.14, 0.015, sh(wood, 1.15)); lb('metal', u + (k % 2 ? -0.2 : 0.2) * Math.min(1, w / np / 0.7), h * 0.48, d / 2 + 0.012, 0.012, 0.18, 0.015, 0xc0b080); }\n lb('metal', -w / np, 0.35, d / 2 + 0.01, w / np - 0.14, h * 0.65, 0.008, 0xb8c4c8);\n },\n fridge(M, A, o: any = {}) {\n const { b: lb, c: lc } = kk(M, A), w = M.w, d = M.d, h = M.h, c = o.color != null ? o.color : 0xe2e0d8;\n if (o.low) { lb('plain', 0, 0.05, 0, w, h - 0.05, d, c); lb('plain', 0, h - 0.02, 0, w - 0.1, 0.03, d - 0.1, 0xdad8d0); lb('metal', 0, h * 0.55, d / 2 + 0.01, w - 0.04, 0.03, 0.02, 0xa0a0a0); lb('plain', 0, 0, 0, w - 0.06, 0.05, d - 0.08, 0x2a2a2a); return; }\n lb('plain', 0, 0.04, -0.03, w, h - 0.04, d - 0.06, c); lb('plain', 0, h * 0.68, d / 2 - 0.04, w - 0.02, h * 0.3, 0.04, 0xeceae2); lb('plain', 0, 0.06, d / 2 - 0.04, w - 0.02, h * 0.62, 0.04, 0xeceae2);\n if (o.glass) lb('glass', 0, 0.1, d / 2 + 0.01, w - 0.06, h - 0.2, 0.012, 0xffffff);\n lb('metal', w / 2 - 0.08, h * 0.38, d / 2, 0.03, h * 0.22, 0.04, 0x9a9a9a); lb('metal', w / 2 - 0.08, h * 0.72, d / 2, 0.03, h * 0.14, 0.04, 0x9a9a9a); lb('plain', 0, 0, 0, w - 0.04, 0.04, d - 0.1, 0x2a2a2a);\n },\n stove(M, A) {\n const { b: lb, c: lc } = kk(M, A), w = M.w, d = M.d, h = M.h || 0.9;\n lb('plain', 0, 0.05, 0, w, h - 0.13, d, 0xdcd8cc); lb('plain', 0, 0, 0, w - 0.04, 0.05, d - 0.06, 0x1a1a1a); lb('metal', 0, h - 0.08, 0, w, 0.025, d, 0x2a2a2c);\n for (const [u, v] of [[-.15, -.12], [.15, -.12], [-.15, .13], [.15, .13]]) { lc('metal', u * w / 0.62, h - 0.055, v * d / 0.6, 0.06, 0.02, 0x1a1a1a); lb('metal', u * w / 0.62, h - 0.035, v * d / 0.6, 0.2, 0.012, 0.012, 0x3a3a3a); lb('metal', u * w / 0.62, h - 0.035, v * d / 0.6, 0.012, 0.012, 0.2, 0x3a3a3a); }\n lb('plain', 0, h - 0.08, -d / 2 + 0.03, w, 0.14, 0.04, 0xdcd8cc); lb('plain', 0, 0.18, d / 2, w - 0.08, 0.5, 0.012, 0xcac6ba); lb('plain', 0, 0.3, d / 2 + 0.008, w - 0.24, 0.26, 0.006, 0x14161a); lb('metal', 0, h - 0.23, d / 2 + 0.04, w - 0.12, 0.02, 0.02, 0xa0a0a0);\n },\n kitchen_cabinet(M, A, o: any = {}) { // kitchen counter with sink (and overhead cabinet)\n const { b: lb, c: lc } = kk(M, A), w = M.w, d = M.d, h = M.h || 0.95, color = paletteColor(M, 'wall_kitchen', 0xe8e2d4), wood = paletteColor(M, 'wood', 0xb09060);\n lb('plain', 0, 0.08, -0.02, w, h - 0.15, d - 0.05, color); lb('plain', 0, 0, 0, w - 0.04, 0.08, d - 0.12, 0x2a2a2a);\n const nd = Math.max(2, Math.round(w / 0.55)); for (let k = 0; k < nd; k++) { const u = -w / 2 + (k + 0.5) * w / nd; lb('plain', u, 0.12, d / 2 - 0.02, w / nd - 0.03, h - 0.28, 0.02, sh(color, 1.06)); lb('metal', u + (k % 2 ? -0.2 : 0.2) * (w / nd), h * 0.62, d / 2, 0.012, 0.12, 0.015, 0x8a8a8a); }\n if (o.noBasin) lb('plain', 0, h - 0.07, 0, w + 0.03, 0.035, d + 0.03, 0x4a4844);\n if (!o.noBasin) { // cut-out top: 4 strips around the sink (no overlapping boxes with the same top)\n const cu = w > 1.0 ? -w * 0.2 : 0, bw = Math.min(0.5, w * 0.35), bd = 0.36, cz = 0.02, yt = h - 0.07, ht = 0.035, ytop = h - 0.035, tc = 0x4a4844, hb = h - 0.17;\n const x0 = cu - bw / 2, x1 = cu + bw / 2, z0 = cz - bd / 2, z1 = cz + bd / 2, W0 = -w / 2 - 0.015, W1 = w / 2 + 0.015, D0 = -d / 2 - 0.015, D1 = d / 2 + 0.015;\n lb('plain', (W0 + x0) / 2, yt, 0, x0 - W0, ht, D1 - D0, tc); lb('plain', (x1 + W1) / 2, yt, 0, W1 - x1, ht, D1 - D0, tc);\n lb('plain', cu, yt, (D0 + z0) / 2, bw, ht, z0 - D0, tc); lb('plain', cu, yt, (z1 + D1) / 2, bw, ht, D1 - z1, tc);\n for (const [px, pz, sx, sz] of [[x0, cz, 0.012, bd], [x1, cz, 0.012, bd], [cu, z0, bw, 0.012], [cu, z1, bw, 0.012]]) lb('metal', px, hb, pz, sx, ytop - hb, sz, 0x9aa0a4); // sink walls\n lb('metal', cu, hb - 0.012, cz, bw, 0.012, bd, 0x8a9094); lc('metal', cu, hb - 0.0, cz, 0.026, 0.004, 0x2a2e30); // bottom and drain\n lb('metal', cu, ytop, z0 - 0.012, bw + 0.04, 0.008, 0.024, 0xb4b8bc); lb('metal', cu, ytop, z1 + 0.012, bw + 0.04, 0.008, 0.024, 0xb4b8bc); lb('metal', x0 - 0.012, ytop, cz, 0.024, 0.008, bd, 0xb4b8bc); lb('metal', x1 + 0.012, ytop, cz, 0.024, 0.008, bd, 0xb4b8bc); // sink frame\n counterTap(kit2(M, A), cu, ytop, -d / 2 + 0.07, 0.2, 0.17, { kitchen: true });\n }\n if (!o.noOverhead && (M.overhead === true || (M.overhead == null && w >= 1.2))) { const ya = 1.55; lb('plain', 0, ya, -d / 2 + 0.18, w, 0.6, 0.35, color); for (let k = 0; k < 3; k++) lb('plain', -w / 2 + (k + 0.5) * w / 3, ya + 0.02, -d / 2 + 0.36, w / 3 - 0.03, 0.56, 0.015, sh(color, 1.06)); } // R27: follows the SDK's m.overhead (y 1.55-2.15 m); false = no overhead cabinet (window in front)\n },\n counter(M, A, o: any = {}) { // commercial counter / buffet / display case\n const { b: lb } = kk(M, A), w = M.w, d = M.d, h = M.h, color = o.color != null ? o.color : paletteColor(M, 'wood', 0x8a6a48), top = o.top != null ? o.top : 0xd8d4cc;\n lb('plain', 0, 0, 0, w, h * (o.glass ? 0.45 : 1) - 0.04, d, color); lb('plain', 0, h * (o.glass ? 0.45 : 1) - 0.04, 0, w + 0.03, 0.04, d + 0.03, top);\n if (o.glass) { lb('glass', 0, h * 0.45, 0, w - 0.04, h * 0.55, d - 0.04, 0xffffff); lb('metal', 0, h - 0.02, 0, w, 0.02, d, 0x888c90); }\n if (o.items) { const rnd = rngOf(M); for (let k = 0; k < Math.max(3, Math.round(w / 0.25)); k++) lb('plain', -w / 2 + 0.15 + k * 0.25, h - 0.04 + 0.04, (rnd() - 0.5) * (d - 0.2), 0.16, 0.12, 0.16, [0xc0392b, 0xe08a1c, 0x4a8a3a, 0xd8c030][k % 4]); }\n if (o.register) { lb('plain', w * 0.3, h, 0, 0.3, 0.12, 0.3, 0x2a2a2c); lb('plain', w * 0.3, h + 0.12, 0, 0.26, 0.2, 0.04, 0x1a2a30, 0, -0.5); }\n },\n ironBench(M, A) { const { b: lb } = kk(M, A), w = M.w, d = M.d, h = M.h; lb('metal', 0, h - 0.04, 0, w, 0.04, d, 0xb0b4b8); for (const sx of [-1, 1]) for (const sz of [-1, 1]) lb('metal', sx * (w / 2 - 0.03), 0, sz * (d / 2 - 0.03), 0.05, h - 0.04, 0.05, 0x6e7276); lb('metal', 0, 0.25, 0, w - 0.08, 0.03, d - 0.08, 0x8a8e92); },\n gondola(M, A) { // market gondola: double shelves with coloured products\n const { b: lb } = kk(M, A), w = M.w, d = M.d, h = M.h, rnd = rngOf(M);\n lb('metal', 0, 0, 0, w, 0.12, d, 0x8a8e92); lb('metal', 0, 0.12, -0.01, w - 0.04, h - 0.12, 0.03, 0xc8ccd0);\n for (let k = 0; k < 4; k++) { const y = 0.2 + k * 0.28; for (const s of [-1, 1]) { lb('metal', 0, y, s * d * 0.22, w - 0.04, 0.025, d * 0.42, 0xa0a4a8); let u = -w / 2 + 0.06; while (u < w / 2 - 0.1) { const bw = 0.07 + rnd() * 0.07; lb('plain', u + bw / 2, y + 0.025, s * d * 0.22, bw, 0.12 + rnd() * 0.1, d * 0.3, [0xc0392b, 0x2a6aaa, 0xe0b020, 0x3a8a4a, 0xe8e4d8, 0x8a4a9a][(rnd() * 6) | 0]); u += bw + 0.015; } } }\n },\n bench(M, A, o: any = {}) { const { b: lb, c: lc } = kk(M, A), w = M.w, d = M.d, h = M.h, wood = paletteColor(M, 'wood', 0x7a5434); if (o.stool) { lc('wood', 0, h - 0.04, 0, w / 2, 0.04, wood); for (let k = 0; k < 4; k++) lb('wood', Math.cos(k * PE + 0.78) * w * 0.3, 0, Math.sin(k * PE + 0.78) * w * 0.3, 0.03, h - 0.04, 0.03, sh(wood, 0.7)); return; } lb('wood', 0, h - 0.05, 0, w, 0.05, d, wood); for (const s of [-1, 1]) lb('wood', s * (w / 2 - 0.06), 0, 0, 0.05, h - 0.05, d - 0.04, sh(wood, 0.75)); if (o.backrest) lb('wood', 0, h, -d / 2 + 0.03, w, h * 0.7, 0.04, wood); },\n floorMirror(M, A) { const { b: lb } = kk(M, A), w = M.w, h = M.h, wood = paletteColor(M, 'wood', 0x6a4a30); lb('wood', 0, 0.05, 0, w, h - 0.05, 0.05, wood, 0, -0.1); lb('metal', 0, 0.12, 0.03, w - 0.1, h - 0.2, 0.01, 0xc0ccd0, 0, -0.1); },\n toilet(M, A) { // toilet\n const { b: lb, c: lc } = kk(M, A);\n lc('plain', 0, 0, 0.06, 0.15, 0.4, 0xf2f2ee); lb('plain', 0, 0.4, 0.04, 0.38, 0.03, 0.46, 0xf2f2ee); lb('plain', 0, 0.4, -0.25, 0.4, 0.38, 0.17, 0xeeeeea); lb('plain', 0, 0.43, -0.05, 0.38, 0.03, 0.42, 0xe4e4e0, 0, -0.3);\n },\n washbasin(M, A, o: any = {}) {\n const { b: lb, c: lc } = kk(M, A), w = M.w, d = M.d, h = M.h || 0.85;\n if (o.column) { lc('plain', 0, 0, 0, 0.07, h - 0.15, 0xf2f2ee); lb('plain', 0, h - 0.15, 0, w, 0.15, d, 0xf2f2ee); lb('plain', 0, h - 0.011, 0.03, w * 0.7, 0.012, d * 0.65, 0xdfe3e6); counterTap(kit2(M, A), 0, h, -d / 2 + 0.06, 0.1, 0.06, { bathroom: true }); return; }\n lb('wood', 0, 0.06, 0, w, h - 0.14, d, 0xe8e4dc); lb('wood', 0, 0.1, d / 2, w - 0.04, h - 0.22, 0.015, 0xf2eee6); lb('metal', 0.18 * w / 0.7, h * 0.65, d / 2 + 0.01, 0.012, 0.12, 0.015, 0x9a9a9a);\n lb('plain', 0, h - 0.08, 0, w + 0.02, 0.06, d + 0.02, 0xf2f2ee); lb('plain', 0, h - 0.04, 0.03, w * 0.6, 0.03, d * 0.6, 0xc8ccd0); counterTap(kit2(M, A), 0, h - 0.01, -d / 2 + 0.07, 0.12, 0.09, { bathroom: true });\n },\n box(M, A) { const { b: lb, c: lc } = kk(M, A), w = M.w, d = M.d; lb('metal', 0, 1.95, -d / 2, 0.06, 0.06, 0.06, 0x9aa0a4); lc('metal', 0, 1.85, -d / 2 + 0.12, 0.08, 0.03, 0xb0b4b8); lb('metal', 0, 1.93, -d / 2 + 0.06, 0.02, 0.02, 0.12, 0x9aa0a4); lc('metal', 0, 0.005, 0, 0.05, 0.005, 0x4a4a4a); for (const [u, v, ww, dd] of [[-w / 2, 0, 0.02, d], [0, d / 2, w, 0.02]]) { lb('glass', u, 0.05, v, ww, 1.9, dd, 0xffffff); lb('metal', u, 1.95, v, ww + 0.01, 0.03, dd + 0.01, 0x9aa0a4); } },\n washing_machine(M, A) { const { b: lb, c: lc } = kk(M, A), w = M.w, d = M.d, h = M.h; lb('plain', 0, 0, 0, w, h, d, 0xeeeeea); lc('metal', 0, h * 0.45, d / 2 + 0.005, w * 0.32, 0.03, 0x9aa0a4, PE); lc('glass', 0, h * 0.45, d / 2 + 0.02, w * 0.26, 0.02, 0xffffff, PE); lb('plain', 0, h - 0.18, d / 2 + 0.005, w - 0.1, 0.1, 0.01, 0x3a3a40); },\n hamper(M, A) { const { c: lc } = kk(M, A); lc('plain', 0, 0, 0, M.w / 2, M.h, paletteColor(M, 'fabric_accent', 0x9a8a6a)); lc('plain', 0, M.h - 0.01, 0, M.w / 2 - 0.03, 0.02, 0x2a2a2a); },\n trash_bin(M, A) { const { c: lc } = kk(M, A); lc('plain', 0, 0, 0, M.w / 2, M.h, 0x6a6c6e); lc('plain', 0, M.h, 0, M.w / 2 + 0.01, 0.025, 0x4a4c4e); },\n plant(M, A) { const { b: lb, c: lc } = kk(M, A), r = Math.min(M.w, M.d) / 2, ph = Math.min(0.3, M.h * 0.4); lc('plain', 0, 0, 0, r * 0.8, ph, 0xb06a46); lc('plain', 0, ph, 0, r * 0.7, 0.02, 0x3a2a1e); const green = paletteColor(M, 'plant', 0x3a6a34); for (let k = 0; k < 5; k++) { const a = k * 1.3; A.leaf(M, Math.cos(a) * r * 0.35, (M.y || 0) + ph, Math.sin(a) * r * 0.35, r * 1.1, M.h - ph, k % 2 ? green : sh(green, 0.8), a, 0.25); } },\n floor_lamp(M, A) { const { c: lc } = kk(M, A); lc('plain', 0, 0, 0, 0.14, 0.03, 0x2a2a2a); lc('metal', 0, 0.03, 0, 0.012, M.h - 0.35, 0x8a7a5a); _q.identity(); put('fabric', 'cone', M.x, M.base + (M.y || 0) + M.h - 0.2, M.z, _q, 0.4, 0.3, 0.4, 0xe0d2a8); },\n microwave(M, A) { const { b: lb } = kk(M, A); lb('plain', 0, 0, 0, M.w, M.h, M.d, 0xc8c8c4); lb('plain', -M.w * 0.1, 0.04, M.d / 2 + 0.005, M.w * 0.6, M.h - 0.08, 0.01, 0x1a1c20); },\n rug(M, A) { const { b: lb } = kk(M, A), c = M.color != null ? M.color : paletteColor(M, 'fabric_accent', 0x7a3a2a); lb('fabric', 0, 0.003, 0, M.w, 0.012, M.d, c); lb('fabric', 0, 0.009, 0, M.w - 0.25, 0.012, M.d - 0.25, sh(c, 1.25)); lb('fabric', 0, 0.015, 0, M.w - 0.6, 0.012, M.d - 0.6, sh(c, 0.8)); },\n // ---- yard ----\n laundry_tub(M, A) { const { b: lb, c: lc } = kk(M, A), w = M.w, d = M.d; lb('plain', 0, 0.55, 0, w, 0.35, d, 0xb4b0a4); lb('plain', 0, 0.62, 0, w - 0.1, 0.3, d - 0.1, 0x7a8a8c); for (const sx of [-1, 1]) lb('plain', sx * (w / 2 - 0.05), 0, 0, 0.08, 0.55, d - 0.06, 0xb4b0a4); lc('metal', 0, 0.9, -d / 2 + 0.05, 0.015, 0.2, 0xb0b4b8); },\n clothesline(M, A) { const { b: lb } = kk(M, A), w = M.w, h = M.h, ex = paletteColor(M, 'fabric_accent', 0xa8483a); for (const s of [-1, 1]) lb('wood', s * w / 2, 0, 0, 0.07, h, 0.07, 0x5a4a3a); lb('metal', 0, h - 0.1, 0, w, 0.01, 0.01, 0x8a8a8a); for (let k = 0; k < 5; k++) lb('fabric', -w / 2 + 0.4 + k * (w - 0.8) / 4, h - 0.7, 0, 0.35 + (k % 2) * 0.1, 0.6 - (k % 3) * 0.08, 0.02, [0xc8c0a8, 0x4a6a8a, ex, 0xe0dcd0, 0x6a8a5a][k]); },\n bbq_grill(M, A) { const { b: lb } = kk(M, A), w = M.w, d = M.d, t = paletteColor(M, 'exterior_floor', 0xa86a50); lb('plain', 0, 0, 0, w, 0.85, d, t); lb('plain', 0, 0.85, 0.05, w - 0.2, 0.08, d - 0.2, 0x2a2a2a); lb('plain', 0, 0.85, -d / 2 + 0.1, w, 0.55, 0.2, t); lb('plain', 0, 1.4, -d / 2 + 0.12, 0.35, M.h - 1.4, 0.24, t); lb('metal', 0, 0.9, 0.05, w - 0.25, 0.015, d - 0.25, 0x6a6a6a); },\n water_tank(M, A) { const { b: lb, c: lc } = kk(M, A), w = M.w, d = M.d; for (const sx of [-1, 1]) for (const sz of [-1, 1]) lb('plain', sx * (w / 2 - 0.08), 0, sz * (d / 2 - 0.08), 0.12, 1.0, 0.12, 0xb4b0a4); lb('plain', 0, 1.0, 0, w, 0.1, d, 0xb4b0a4); lc('plain', 0, 1.1, 0, w * 0.46, 0.65, 0x3a6a9a); lc('plain', 0, 1.75, 0, w * 0.3, 0.05, 0x2a4a6a); },\n doghouse(M, A) { const { b: lb } = kk(M, A), w = M.w, d = M.d, h = M.h; lb('wood', 0, 0, 0, w, h * 0.7, d, 0x8a5a3a); lb('plain', 0, 0.01, d / 2 + 0.005, w * 0.5, h * 0.5, 0.01, 0x14100c); lb('wood', 0, h * 0.7, 0, w + 0.1, 0.06, d + 0.1, 0x6a3a2a); lb('wood', 0, h * 0.7 + 0.06, 0, w * 0.7, h * 0.2, d * 0.7, 0x6a3a2a); },\n cash_register(M, A) { // counter cash register: base, drawer, tilted keyboard, display and receipt roll\n const { b: lb, c: lc } = kk(M, A), w = M.w, d = M.d;\n lb('plain', 0, 0, 0, w, 0.13, d, 0x3a4048); lb('plain', 0, 0.02, d / 2 + 0.004, w - 0.06, 0.08, 0.012, 0x2a2f35); lc('metal', 0, 0.06, d / 2 + 0.02, 0.014, 0.02, 0xc0c4c8, PE);\n lb('plain', 0, 0.13, 0.03, w - 0.04, 0.05, d * 0.6, 0x4b525b, 0, -0.28);\n for (let i = 0; i < 4; i++) for (let j = 0; j < 3; j++) lb('plain', (i - 1.5) * 0.065, 0.185, 0.0 + j * 0.05, 0.05, 0.012, 0.04, (i + j) % 4 === 0 ? 0xd9a441 : 0xe8e8e4, 0, -0.28);\n lb('metal', 0, 0.13, -d * 0.28, 0.05, 0.14, 0.04, 0x30353b); lb('plain', 0, 0.26, -d * 0.28, w * 0.55, 0.1, 0.04, 0x1d2126, 0, -0.35); lb('emissive', 0, 0.275, -d * 0.28 + 0.022, w * 0.45, 0.065, 0.004, 0x7fe3a0, 0, -0.35);\n lc('plain', w * 0.3, 0.13, -d * 0.4, 0.035, 0.07, 0xf2f2ee, PE);\n },\n baskets(M, A) { // stack of shopping baskets with handle\n const { b: lb } = kk(M, A), w = M.w, d = M.d, h = M.h, n = Math.max(2, Math.round(h / 0.17)), alt = h / n, colors = [0xd8392f, 0x2f6fd8, 0xd8392f];\n for (let k = 0; k < n; k++) { const c = colors[k % 3], y = k * alt * 0.82, e = k * 0.012;\n lb('plain', e, y, 0, w - 0.06, 0.02, d - 0.06, sh(c, 0.8));\n lb('plain', e, y, d / 2 - 0.02 - 0.02, w - 0.01, alt, 0.02, c); lb('plain', e, y, -d / 2 + 0.02, w - 0.01, alt, 0.02, c);\n lb('plain', e + w / 2 - 0.02, y, 0, 0.02, alt, d - 0.04, c); lb('plain', e - w / 2 + 0.02, y, 0, 0.02, alt, d - 0.04, c); }\n lb('metal', 0, h - 0.02, 0, w * 0.8, 0.02, 0.025, 0x9a9ea2); lb('metal', -w * 0.4, h - 0.12, 0, 0.02, 0.12, 0.025, 0x9a9ea2); lb('metal', w * 0.4, h - 0.12, 0, 0.02, 0.12, 0.025, 0x9a9ea2);\n },\n wall_shelf(M, A) { // wall shelf: panel, boards and product boxes\n const { b: lb } = kk(M, A), w = M.w, d = M.d, h = M.h, rnd = rngOf(M), ns = Math.max(4, Math.round(h / 0.4)), colors = [0xf2f2ee, 0x3a7bd5, 0x3fa56b, 0xe2b53a, 0xd8574a, 0xe8e8e4];\n lb('wood', 0, 0, -d / 2 + 0.015, w, h, 0.03, 0xc9bda6); for (const s of [-1, 1]) lb('metal', s * (w / 2 - 0.02), 0, 0, 0.04, h, d, 0x8a8e92);\n for (let k = 0; k < ns; k++) { const y = 0.12 + k * (h - 0.2) / (ns - 1); lb('metal', 0, y, 0, w - 0.04, 0.025, d, 0xa4a8ac); lb('metal', 0, y + 0.025, d / 2 - 0.01, w - 0.04, 0.04, 0.012, 0xe4e4e0);\n if (k === ns - 1) continue; const gap = (h - 0.2) / (ns - 1) - 0.06; let x = -w / 2 + 0.07;\n while (x < w / 2 - 0.1) { const bw = 0.07 + rnd() * 0.08, bh = Math.min(gap, 0.12 + rnd() * 0.16), bd = d * 0.55; if (x + bw > w / 2 - 0.05) break; lb('plain', x + bw / 2, y + 0.025, 0.02, bw - 0.012, bh, bd, colors[(rnd() * colors.length) | 0]); x += bw + 0.012; } }\n },\n weighingScale(M, A) { // column scale (pharmacy): platform, column and display\n const { b: lb, c: lc } = kk(M, A), w = M.w, d = M.d, h = M.h;\n lb('plain', 0, 0, 0, w, 0.05, d, 0x3a3f46); lb('plain', 0, 0.05, 0, w - 0.05, 0.015, d - 0.05, 0xdadcd8);\n lc('metal', 0, 0.065, -d * 0.3, 0.025, h - 0.25, 0xb4b8bc); lb('plain', 0, h - 0.24, -d * 0.3, 0.22, 0.16, 0.06, 0xe8e8e4, 0, -0.25); lc('plain', 0, h - 0.2, -d * 0.3 + 0.04, 0.06, 0.012, 0x20252b, PE); lb('metal', 0, h - 0.06, -d * 0.3, 0.1, 0.012, 0.012, 0x6a6e72);\n },\n gas_cylinder(M, A) { const { c: lc } = kk(M, A); lc('plain', 0, 0, 0, M.w / 2, M.h, 0x6a7a9a); lc('metal', 0, M.h, 0, M.w * 0.22, 0.05, 0x8a8a8a); },\n outdoor_bin(M, A) { const { c: lc } = kk(M, A); lc('plain', 0, 0, 0, M.w / 2, M.h, 0x3a4a3a); lc('plain', 0, M.h, 0, M.w / 2 + 0.01, 0.04, 0x2a362a); },\n outdoor_pot(M, A) { const { c: lc } = kk(M, A), v = paletteColor(M, 'plant', 0x3a6a34); lc('plain', 0, 0, 0, M.w * 0.4, M.h * 0.45, 0xa8603e); for (let k = 0; k < 4; k++) A.leaf(M, Math.cos(k * 1.6) * 0.07, M.h * 0.45, Math.sin(k * 1.6) * 0.07, 0.4, M.h * 0.6, k % 2 ? v : sh(v, 0.8), k * 1.6, 0.3); },\n planter_bed(M, A) { const { b: lb } = kk(M, A), w = M.w, d = M.d, v = paletteColor(M, 'plant', 0x4a7a3a); lb('plain', 0, 0, 0, w, 0.25, d, 0xb4b0a4); lb('plain', 0, 0.2, 0, w - 0.1, 0.08, d - 0.1, paletteColor(M, 'dirt', 0x3a2a1e)); for (let k = 0; k < Math.max(2, Math.round(w / 0.5)); k++) A.leaf(M, -w / 2 + 0.3 + k * 0.5, 0.28, (k % 2 - 0.5) * d * 0.4, 0.5, 0.45 + (k % 3) * 0.1, k % 2 ? v : sh(v, 0.8), k, 0.2); },\n tree(M, A, o: any = {}) { // generic tree: trunk and canopy in ellipsoids\n const { c: lc } = kk(M, A), h = M.h, w = Math.max(M.w, M.d), v = paletteColor(M, 'plant', 0x3f7a3a), rnd = rngOf(M), th = h * (o.lowCrown ? 0.35 : 0.45);\n lc('wood', 0, 0, 0, Math.max(0.05, w * 0.05), th, sh(paletteColor(M, 'wood', 0x6a4a30), 0.7));\n const n = o.shrub ? 3 : 4; for (let k = 0; k < n; k++) { const a = k * 2.4, r = o.shrub ? w * 0.18 : w * 0.2; lc('plant', Math.cos(a) * r, th * (o.shrub ? 0.2 : 0.9) + k * (h - th) / n * 0.5, Math.sin(a) * r, w * (o.shrub ? 0.3 : 0.32), (h - th) * (o.shrub ? 1.2 : 0.55), sh(v, 0.8 + rnd() * 0.4), 0, 0, 'sphere'); }\n },\n fountain(M, A) { const { b: lb, c: lc } = kk(M, A), w = M.w; lc('plain', 0, 0, 0, w / 2, 0.45, 0xc8c4b8); lc('water', 0, 0.4, 0, w / 2 - 0.1, 0.04, 0x6ab8d8); lc('plain', 0, 0.4, 0, 0.18, 0.55, 0xc8c4b8); lc('plain', 0, 0.9, 0, 0.45, 0.08, 0xc8c4b8); lc('water', 0, 0.97, 0, 0.4, 0.03, 0x6ab8d8); lc('plain', 0, 0.97, 0, 0.08, M.h - 0.97, 0xc8c4b8); },\n outbuilding(M, A) { const { b: lb } = kk(M, A), w = M.w, d = M.d, h = M.h, c = paletteColor(M, 'facade', 0xd8d0c0); lb('plain', 0, 0, 0, w, h, d, c); lb('plain', 0, h, 0, w + 0.3, 0.12, d + 0.3, paletteColor(M, 'roof', 0x8a5a44)); lb('wood', 0, 0, d / 2 + 0.01, 0.9, 2.0, 0.04, paletteColor(M, 'wood', 0x6a4a30)); lb('glass', w * 0.28, 1.0, d / 2 + 0.01, 0.8, 0.9, 0.02, 0xffffff); },\n motorcycle(M, A) { const { b: lb, c: lc } = kk(M, A), d = M.d, color = M.color != null ? M.color : 0xa83a34; for (const s of [-1, 1]) lc('plain', 0, 0.3, s * d * 0.34, 0.3, 0.12, 0x1a1a1a, 0, PE); lb('plain', 0, 0.35, 0, 0.18, 0.28, d * 0.5, color); lb('plain', 0, 0.62, -0.1, 0.22, 0.1, 0.6, 0x222222); lb('metal', 0, 0.7, d * 0.28, 0.5, 0.04, 0.04, 0xb0b4b8); },\n dumpster(M, A) { const { b: lb } = kk(M, A), w = M.w, d = M.d, h = M.h, c = M.color != null ? M.color : 0x3a6a8a; lb('metal', 0, 0.12, 0, w, h - 0.12, d, c); lb('metal', 0, h - 0.04, 0, w - 0.2, 0.05, d - 0.2, sh(c, 0.4)); lb('metal', 0, 0, 0, w - 0.3, 0.12, d - 0.2, 0x2a2a2a); },\n pallet(M, A) { const { b: lb } = kk(M, A), w = M.w, d = M.d; for (let k = 0; k < 3; k++) lb('wood', 0, 0.02, (k - 1) * (d / 2 - 0.05), w, 0.1, 0.1, 0x9a7a52); for (let k = 0; k < 6; k++) lb('wood', 0, 0.12, -d / 2 + 0.06 + k * (d - 0.12) / 5, w, 0.025, 0.1, 0xb08a5a); const h = M.h; if (h > 0.4) { lb('plain', 0, 0.15, 0, w - 0.1, h - 0.15, d - 0.1, 0xc8a878); lb('plain', 0, 0.15 + (h - 0.15) / 2, d / 2 - 0.04, w - 0.12, 0.02, 0.01, 0xa88858); } },\n crates(M, A) { const { b: lb } = kk(M, A), w = M.w, d = M.d, h = M.h, rnd = rngOf(M); const nx = Math.max(1, Math.round(w / 0.4)), nz = Math.max(1, Math.round(d / 0.4)); for (let i = 0; i < nx; i++) for (let j = 0; j < nz; j++) { const nh = 1 + ((rnd() * (h / 0.35)) | 0); for (let k = 0; k < nh; k++) lb('plain', (i - (nx - 1) / 2) * w / nx, k * 0.35, (j - (nz - 1) / 2) * d / nz, w / nx - 0.03, 0.34, d / nz - 0.03, [0xc8a878, 0xb89868, 0xd8b888][(i + j + k) % 3], (rnd() - 0.5) * 0.1); } },\n bicycle(M, A) { const { b: lb, c: lc } = kk(M, A), d = M.d; for (const s of [-1, 1]) lc('plain', 0, 0.33, s * d * 0.34, 0.33, 0.03, 0x1a1a1a, 0, PE); lb('metal', 0, 0.5, 0, 0.03, 0.03, d * 0.6, M.color != null ? M.color : 0x2a5a9a, 0, -0.3); lb('metal', 0, 0.9, d * 0.3, 0.4, 0.03, 0.03, 0x2a2a2a); },\n cart(M, A) { const { b: lb } = kk(M, A), w = M.w, d = M.d, h = M.h; lb('metal', 0, 0.3, 0, w, 0.03, d, 0xb0b4b8); for (const s of [-1, 1]) lb('metal', s * w / 2, 0.3, 0, 0.02, h - 0.3, d, 0xb0b4b8); lb('metal', 0, 0.3, -d / 2, w, h - 0.3, 0.02, 0xb0b4b8); lb('metal', 0, h - 0.04, d / 2, w, 0.03, 0.03, 0x3a3a3a); },\n };\n Object.assign(K, { FURNITURE });\n}\n","// Literal port of the team's Casa3DSDK (module furniture/type-table). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installFurnitureTypeTable(K: Kernel, _shared: Shared): void {\n const { FURNITURE, kk, paletteColor } = K;\n const extraTypes = (...a: any[]): any => K.extraTypes(...a);\n // picks the builder of each type: {f: fn(M,A), note}. types of the MV come from MV.builders\n function typeTable(props) {\n const B = props.builders, T: any = {};\n const mv = (type, id?) => { if (B[id || type]) T[type] = { f: B[id || type], source: 'props3d' }; };\n const mine = (type, f, source = 'game') => { T[type] = { f, source }; };\n for (const id of props.names) mv(id);\n const alias = (type, id) => { if (B[id]) T[type] = { f: B[id], source: 'props3d (alias of ' + id + ')' }; };\n // living room\n mine('sofa_3seat', FURNITURE.sofa); mine('sofa_2seat', FURNITURE.sofa); mine('sofa_xl', FURNITURE.sofa, 'game (sofa)'); mine('armchair', FURNITURE.armchair); mine('armchair_high', FURNITURE.armchair, 'game (armchair)');\n mine('tv_unit', (M, A) => FURNITURE.cabinet(M, A, { doors: 3 })); mine('tv_unit_small', (M, A) => FURNITURE.cabinet(M, A, { doors: 2 })); mine('tv_unit_large', (M, A) => FURNITURE.cabinet(M, A, { doors: 4 }));\n alias('tv', 'flat_tv'); alias('tv_large', 'flat_tv');\n mine('coffee_table', (M, A) => FURNITURE.table(M, A, { noChairs: true })); mine('coffee_table_round', (M, A) => FURNITURE.table(M, A, { without: true, round: true }));\n mine('rug', FURNITURE.rug); mine('rug_small', FURNITURE.rug, 'game (rug)');\n mine('shelf_unit', FURNITURE.shelf); mine('shelf_unit_small', FURNITURE.shelf, 'game (shelf)'); mine('bookcase', FURNITURE.shelf, 'game (shelf)');\n mine('tool_shelf', (M, A) => FURNITURE.shelf(M, A, { iron: true, crates: true })); mine('metal_shelf', (M, A) => FURNITURE.shelf(M, A, { iron: true, crates: true })); mine('laundry_shelf', (M, A) => FURNITURE.shelf(M, A, { crates: true, open: true }));\n mine('plant_tall', FURNITURE.plant); mine('plant_short', FURNITURE.plant); mine('floor_lamp', FURNITURE.floor_lamp);\n mine('sideboard', (M, A) => FURNITURE.cabinet(M, A, { doors: 2 })); mine('console_table', FURNITURE.dresser); mine('dresser', FURNITURE.dresser); mine('nightstand', FURNITURE.dresser);\n mine('bench', (M, A) => FURNITURE.bench(M, A, {})); mine('stool', (M, A) => FURNITURE.bench(M, A, { stool: true })); mine('garden_bench', (M, A) => FURNITURE.bench(M, A, { backrest: true })); mine('waiting_bench', (M, A) => FURNITURE.bench(M, A, { backrest: true }));\n mine('workbench', FURNITURE.ironBench); mine('floor_mirror', FURNITURE.floorMirror);\n mine('buffet', (M, A) => FURNITURE.counter(M, A, {})); mine('china_cabinet', (M, A) => FURNITURE.cabinet(M, A, { glass: true, doors: 2, ceiling: 0.1 })); mine('filing_cabinet', (M, A) => FURNITURE.cabinet(M, A, { color: 0x8a8e92, doors: 1, ceiling: 0 }));\n // kitchen / pantry\n mine('fridge', FURNITURE.fridge); mine('fridge_large', FURNITURE.fridge); mine('display_fridge_medium', (M, A) => FURNITURE.fridge(M, A, { glass: true })); mine('display_fridge', (M, A) => FURNITURE.fridge(M, A, { glass: true, color: 0xd8dadc })); mine('freezer', (M, A) => FURNITURE.fridge(M, A, { low: true }));\n mine('stove', FURNITURE.stove); mine('stove_4burner', FURNITURE.stove); mine('kitchen_cabinet', FURNITURE.kitchen_cabinet); mine('kitchen_cabinet_large', FURNITURE.kitchen_cabinet); mine('kitchen_cabinet_small', FURNITURE.kitchen_cabinet);\n mine('microwave', FURNITURE.microwave); mine('pantry', (M, A) => FURNITURE.cabinet(M, A, { color: paletteColor(M, 'wall_kitchen', 0xd8d0b8), doors: 2, ceiling: 0.04 })); mine('trash_bin', FURNITURE.trash_bin);\n mine('dining_table', (M, A) => FURNITURE.table(M, A, { tablecloth: true })); mine('dining_table_small', (M, A) => FURNITURE.table(M, A, { tablecloth: true })); mine('dining_table_round', (M, A) => FURNITURE.table(M, A, { round: true, tablecloth: true })); mine('dining_table_large', (M, A) => FURNITURE.table(M, A, { tablecloth: true, headboard: true }));\n mine('meeting_table', (M, A) => FURNITURE.table(M, A, { headboard: true })); mine('outdoor_table', (M, A) => FURNITURE.table(M, A, { headboard: true })); mine('gourmet_table', (M, A) => FURNITURE.table(M, A, { headboard: true })); mine('gourmet_table_small', (M, A) => FURNITURE.table(M, A, {}));\n mine('office_desk', (M, A) => FURNITURE.table(M, A, { oneSide: true })); mine('office_desk_large', (M, A) => FURNITURE.table(M, A, { oneSide: true })); mine('desk', (M, A) => FURNITURE.table(M, A, { oneSide: true }));\n // bedroom / bathroom / service\n mine('double_bed', FURNITURE.bed); mine('queen_bed', FURNITURE.bed); mine('king_bed', FURNITURE.bed); mine('single_bed', FURNITURE.bed); mine('mattress', FURNITURE.bed);\n mine('wardrobe', FURNITURE.wardrobe); mine('wardrobe_small', FURNITURE.wardrobe); mine('wardrobe_large', FURNITURE.wardrobe); mine('closet_wardrobe', FURNITURE.wardrobe); mine('vanity_table', (M, A) => { FURNITURE.dresser(M, A); const k = kk(M, A); k.b('metal', 0, M.h, -M.d / 2 + 0.01, M.w * 0.8, 0.7, 0.015, 0xc0ccd0); });\n mine('toilet', FURNITURE.toilet); mine('washbasin', FURNITURE.washbasin); mine('pedestal_basin', (M, A) => FURNITURE.washbasin(M, A, { column: true })); mine('shower', FURNITURE.box); mine('shower_large', FURNITURE.box);\n mine('hamper', FURNITURE.hamper); mine('washing_machine', FURNITURE.washing_machine); mine('laundry_cabinet', (M, A) => FURNITURE.cabinet(M, A, { doors: 2, color: 0xe8e4dc })); mine('laundry_tub', FURNITURE.laundry_tub);\n // commerce\n mine('gondola_shelf', FURNITURE.gondola); mine('gondola_shelf_short', FURNITURE.gondola); mine('checkout_counter', (M, A) => FURNITURE.counter(M, A, { register: true })); mine('pharmacy_counter', (M, A) => FURNITURE.counter(M, A, { glass: true })); mine('display_case', (M, A) => FURNITURE.counter(M, A, { glass: true }));\n mine('produce_stand', (M, A) => FURNITURE.counter(M, A, { items: true })); mine('display_stand', (M, A) => FURNITURE.cabinet(M, A, { glass: true, doors: 1, ceiling: 0.1 })); mine('display_rack', (M, A) => FURNITURE.shelf(M, A, { iron: true, crates: true }));\n mine('cash_register', FURNITURE.cash_register); mine('baskets', FURNITURE.baskets); mine('wall_shelving', FURNITURE.wall_shelf); mine('scale', FURNITURE.weighingScale);\n mine('pallet', FURNITURE.pallet); mine('boxes', FURNITURE.crates); mine('crate', FURNITURE.crates);\n // yard\n mine('bbq_grill', FURNITURE.bbq_grill); mine('clothesline', FURNITURE.clothesline); mine('water_tank', FURNITURE.water_tank); mine('doghouse', FURNITURE.doghouse); mine('gas_cylinder', FURNITURE.gas_cylinder); mine('cooking_gas_cylinder', FURNITURE.cooking_gas_cylinder); mine('outdoor_bin', FURNITURE.outdoor_bin); mine('outdoor_pot', FURNITURE.outdoor_pot);\n mine('planter_bed', FURNITURE.planter_bed); mine('planter_bed_small', FURNITURE.planter_bed); mine('tree_small', (M, A) => FURNITURE.tree(M, A, {})); mine('tree_large', (M, A) => FURNITURE.tree(M, A, { lowCrown: true })); mine('shrub', (M, A) => FURNITURE.tree(M, A, { shrub: true }));\n mine('fountain', FURNITURE.fountain); mine('outbuilding', FURNITURE.outbuilding); mine('motorcycle', FURNITURE.motorcycle); mine('dumpster', FURNITURE.dumpster); mine('bicycle', FURNITURE.bicycle); mine('shopping_cart', FURNITURE.cart);\n alias('car', 'garage_car'); alias('car_small', 'garage_car'); alias('pool_large', 'pool'); alias('pool_small', 'pool'); alias('pool_medium', 'pool');\n alias('breakfast_bar', 'breakfast_bar'); alias('gourmet_counter_small', 'gourmet_counter'); alias('window_boards', 'window_boards'); alias('closet_wardrobe', 'closet'); T.closet_wardrobe = { f: B.closet || FURNITURE.wardrobe, fountain: 'moveis3d (alias de closet)' };\n extraTypes(T, props);\n return T;\n }\n Object.assign(K, { typeTable });\n}\n","// Literal port of the team's Casa3DSDK (module furniture/taps). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installFurnitureTaps(K: Kernel, shared: Shared): void {\n // ---------- plumbing ----------\n shared.tapCount = 0;\n // countertop tap (sink): base, column, arched spout, lever (handle part) and hidden water thread (tap_water part)\n function counterTap(K, x, y, z, reach, back, meta: any = {}) {\n const cr = 0xc4c8cc, id = 'tap_' + (K.M.seed || '') + '_' + (shared.tapCount++);\n K.c('metal', x, y, z, 0.028, 0.012, cr); K.c('metal', x, y + 0.012, z, 0.014, 0.12, cr);\n const pts = []; for (let i = 0; i <= 5; i++) { const a = Math.PI / 2 - i * (Math.PI * 0.62) / 5; pts.push([x, y + 0.13 + Math.sin(a) * 0.075, z + (1 - Math.cos(a)) * reach * 0.5 + (i > 0 ? 0 : 0)]); }\n for (let i = 0; i < 5; i++) K.t('metal', pts[i], pts[i + 1], 0.0115, cr);\n const tip = pts[5]; K.t('metal', tip, [tip[0], tip[1] - 0.045, tip[2]], 0.0135, cr); K.e('metal', tip[0], tip[1], tip[2], 0.0125, 0.025, cr);\n K.part('handle', x, y + 0.075, z, () => { K.t('metal', [x, y + 0.075, z], [x + 0.06, y + 0.095, z], 0.0075, cr); K.e('metal', x + 0.062, y + 0.096, z, 0.011, 0.022, cr); K.c('metal', x, y + 0.07, z, 0.017, 0.012, 0xa8acb0); },\n Object.assign({ id: id + '_m', target: id, room: K.M.room, opens: { type: 'swing', axis: [0, 1, 0], angle: -0.7 }, waterId: id + '_a' }, meta));\n const ya = tip[1] - 0.05;\n K.part('water_tap', tip[0], ya, tip[2], () => { K.t('water', [tip[0], ya, tip[2]], [tip[0], y - back, tip[2]], 0.006, 0xcfe8f4); }, { id: id + '_a', target: id, hidden: true, fluid: 'water' });\n return id;\n }\n // wall tap (laundry tub, garden): plate on the wall (z = zw), pipe, elbow and spout, cross handwheel\n function wallTap(K, x, y, zw, direction, back, meta: any = {}) {\n const cr = 0xc4c8cc, id = 'tap_' + (K.M.seed || '') + '_' + (shared.tapCount++), s = direction || 1;\n K.t('metal', [x, y, zw], [x, y, zw + s * 0.025], 0.03, cr); K.t('metal', [x, y, zw + s * 0.02], [x, y, zw + s * 0.1], 0.016, cr);\n K.e('metal', x, y, zw + s * 0.105, 0.019, 0.04, cr); K.t('metal', [x, y, zw + s * 0.105], [x, y - 0.065, zw + s * 0.105], 0.0125, cr); K.c('metal', x, y - 0.075, zw + s * 0.105, 0.0145, 0.014, 0xa8acb0);\n K.t('metal', [x, y + 0.0, zw + s * 0.06], [x, y + 0.045, zw + s * 0.06], 0.009, cr);\n K.part('handle', x, y + 0.045, zw + s * 0.06, () => { K.c('metal', x, y + 0.045, zw + s * 0.06, 0.012, 0.012, cr); K.b('metal', x, y + 0.057, zw + s * 0.06, 0.085, 0.012, 0.014, cr); K.b('metal', x, y + 0.057, zw + s * 0.06, 0.014, 0.012, 0.085, cr); K.e('metal', x, y + 0.063, zw + s * 0.06, 0.012, 0.016, 0xa8acb0); },\n Object.assign({ id: id + '_m', target: id, room: K.M.room, opens: { type: 'swing', axis: [0, 1, 0], angle: 1.6 }, waterId: id + '_a' }, meta));\n const ya = y - 0.08;\n K.part('water_tap', x, ya, zw + s * 0.105, () => { K.t('water', [x, ya, zw + s * 0.105], [x, back, zw + s * 0.105], 0.0065, 0xcfe8f4); }, { id: id + '_a', target: id, hidden: true, fluid: 'water' });\n return id;\n }\n Object.assign(K, { counterTap, wallTap });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module furniture/fixtures). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installFurnitureFixtures(K: Kernel, _shared: Shared): void {\n const seedKey = (id: any): any => K.seedKey(id);\n const { FURNITURE, MIRRORS, SEED, arcPoints, cursor, kit2, rngString, sh } = K;\n // shower: curved arm, round head, round valve (handle part), hidden water; stall with rounded corners and profiles\n FURNITURE.box = function (M, A) {\n const K = kit2(M, A, 0), w = M.w, d = M.d, cr = 0xc8ccd0, id = 'shower_' + (M.seed || ''), zw = -d / 2, X = w / 2 - 0.0;\n const R = Math.min(0.32, w * 0.34, d * 0.34), gh = 1.95, gt = 0.008;\n // tray: low slab, rounded edge and round drain\n K.b('plain', 0, 0, 0, w - 0.02, 0.05, d - 0.02, 0xe6e8e6); K.c('metal', 0, 0.05, 0, 0.045, 0.006, 0xb0b4b8); K.c('plain', 0, 0.05, 0, 0.032, 0.008, 0x40484c);\n // stall walls: back (-z) and side (-x). Glass: side (+x), 90 degree arc at the front corner and front panel with an access gap\n const px0 = w / 2 - 0.012, pzF = d / 2 - 0.012, gl = (x0, z0, x1, z1) => { const L = Math.hypot(x1 - x0, z1 - z0), a = Math.atan2(-(z1 - z0), x1 - x0); K.b('glass', (x0 + x1) / 2, 0.052, (z0 + z1) / 2, L + 0.004, gh - 0.052, gt, 0xffffff, a); };\n const tube = (p, q, r) => K.t('metal', p, q, r, cr);\n gl(px0, -d / 2 + 0.05, px0, pzF - R); // side\n const arc = arcPoints(px0 - R, pzF - R, R, 0, Math.PI / 2, 6); // curved corner (x,z)\n for (let i = 0; i < arc.length - 1; i++) gl(arc[i][0], arc[i][1], arc[i + 1][0], arc[i + 1][1]);\n const fx1 = Math.max(-w / 2 + 0.36, px0 - R - 0.5); gl(px0 - R, pzF, fx1, pzF); // fixed front panel\n const rail = (y, r) => { tube([px0, y, -d / 2 + 0.05], [px0, y, pzF - R], r); for (let i = 0; i < arc.length - 1; i++) tube([arc[i][0], y, arc[i][1]], [arc[i + 1][0], y, arc[i + 1][1]], r); tube([px0 - R, y, pzF], [fx1, y, pzF], r); };\n rail(gh, 0.011); rail(0.055, 0.009);\n for (const [x, z] of [[px0, -d / 2 + 0.05], [fx1, pzF]]) tube([x, 0.05, z], [x, gh + 0.005, z], 0.011);\n for (const [x, y, z] of [[px0, gh, -d / 2 + 0.05], [fx1, gh, pzF], [px0 - R, gh, pzF]]) K.e('metal', x, y, z, 0.013, 0.026, cr);\n // swing door in the gap (up to the -x wall): glass with a round pull, hinged on the fixed panel\n const hx = fx1, dw = hx - (-w / 2 + 0.03);\n if (dw > 0.2) K.part('shower_door', hx, 0.06, pzF, () => { K.b('glass', hx - dw / 2, 0.06 + (gh - 0.12) / 2, pzF, dw, gh - 0.12, gt, 0xffffff); K.t('metal', [hx - dw * 0.8, 0.9, pzF + 0.02], [hx - dw * 0.8, 1.1, pzF + 0.02], 0.009, cr); K.e('metal', hx - dw * 0.8, 0.9, pzF + 0.02, 0.012, 0.02, cr); K.e('metal', hx - dw * 0.8, 1.1, pzF + 0.02, 0.012, 0.02, cr); },\n { id: id + '_door', opens: { type: 'swing', axis: [0, 1, 0], angle: -1.7 } });\n // curved arm and round head, at the centre of the back wall\n const ax = 0.1, ya = 2.08, z0 = zw + 0.012, Ra = 0.22, n = 6, pa = [];\n for (let i = 0; i <= n; i++) { const f = i / n * Math.PI / 2; pa.push([ax, ya - Ra * (1 - Math.cos(f)), z0 + Ra * Math.sin(f)]); }\n K.t('metal', [ax, ya, zw - 0.0], [ax, ya, z0 + 0.025], 0.03, cr);\n for (let i = 0; i < n; i++) K.t('metal', pa[i], pa[i + 1], 0.0125, cr);\n const ph = pa[n]; K.e('metal', ph[0], ph[1] - 0.005, ph[2], 0.026, 0.05, cr);\n const hy = ph[1] - 0.045; K.t('metal', [ph[0], ph[1] - 0.02, ph[2]], [ph[0], hy, ph[2]], 0.018, cr);\n K.c('metal', ph[0], hy - 0.012, ph[2], 0.115, 0.02, cr); K.c('plain', ph[0], hy - 0.0125, ph[2], 0.098, 0.006, 0xdadde0); K.c('metal', ph[0], hy - 0.022, ph[2], 0.0875, 0.01, 0xb8bcc0);\n // round valve: fixed base and rotating knob (handle part)\n const vx = ax, vy = 1.05; K.t('metal', [vx, vy, zw], [vx, vy, zw + 0.012], 0.052, cr);\n K.part('handle', vx, vy, zw + 0.012, () => { K.t('metal', [vx, vy, zw + 0.012], [vx, vy, zw + 0.04], 0.03, 0xb8bcc0); K.t('metal', [vx, vy, zw + 0.04], [vx, vy, zw + 0.052], 0.036, cr); K.b('metal', vx, vy + 0.03, zw + 0.046, 0.012, 0.032, 0.014, 0x8a8e92); },\n { id: id + '_m', target: id, room: M.room, opens: { type: 'swing', axis: [0, 0, 1], angle: 1.3 }, waterId: id + '_a' });\n // water (hidden): thin strands from the head to the floor\n K.part('water_shower', ph[0], hy - 0.03, ph[2], () => { for (let i = 0; i < 8; i++) { const a = i * Math.PI / 4, r1 = 0.07, r2 = 0.14; K.t('water', [ph[0] + Math.cos(a) * r1, hy - 0.03, ph[2] + Math.sin(a) * r1], [ph[0] + Math.cos(a) * r2, 0.06, ph[2] + Math.sin(a) * r2 + 0.05], 0.0045, 0xcfe8f4); } }, { id: id + '_a', target: id, hidden: true, fluid: 'water' });\n };\n // ---------- mirror with real reflection (45-espelho.js) ----------\n FURNITURE.mirror = function (M, A) {\n const w = M.w || 0.6, d = M.d || 0.03, h = M.h || 1.2, y = M.y || 0.9, K = kit2(M, A, 0), cm = M.color != null ? M.color : ((M.palette && M.palette.metal != null) ? M.palette.metal : 0x3a3a3c);\n K.b('plain', 0, y, 0, w, h, d, cm); // frame and back\n K.b('plain', 0, y + 0.012, d / 2 - 0.001, w - 0.045, h - 0.024, 0.004, 0x9aa4a8); // glass blanked until the reflection loads\n const [px, py, pz] = K.W(0, y + h / 2, d / 2 + 0.006);\n MIRRORS.push({ x: px, y: py, z: pz, ry: M.ry, w: w - 0.06, h: h - 0.06, room: M.room, floor: M.floor, parent: cursor.group });\n };\n // ---------- curtain: rod, rings and fabric pleats ('fabric' boxes, one list per side: 60-interacao.js cuts each side into a panel that opens and closes) ----------\n FURNITURE.curtain = function (M, A) {\n const w = M.w || 1.6, h = M.h || 2.3, y = M.y != null && M.y > 0 ? M.y : 0.1, K = kit2(M, A, 0), top = y + h;\n const rnd = rngString(SEED() + '|' + seedKey(M.seed) + '|cort'), color = M.color != null ? M.color : [0xd8cdb4, 0x9fb0be, 0xc5a88c, 0xe0dcd0][(rnd() * 4) | 0], gold = (M.palette && M.palette.metal != null) ? M.palette.metal : 0x5a5048;\n K.t('metal', [-w / 2 - 0.05, top + 0.02, 0], [w / 2 + 0.05, top + 0.02, 0], 0.012, gold); for (const s of [-1, 1]) K.e('metal', s * (w / 2 + 0.07), top + 0.02, 0, 0.022, 0.045, gold);\n const pw = w / 2 + 0.03, n = Math.max(8, Math.round(pw / 0.075));\n for (const s of [-1, 1]) for (let i = 0; i < n; i++) { const ux = s * (i + 0.5) * pw / n; K.b('fabric', ux, y, (i % 2 ? 0.03 : -0.012), pw / n * 1.12, h - 0.04, 0.018, i % 2 ? sh(color, 0.88) : color); }\n for (const s of [-1, 1]) for (let i = 0; i < n; i += 2) K.e('metal', s * (i + 0.5) * pw / n, top + 0.012, 0, 0.012, 0.024, gold);\n };\n}\n","/* eslint-disable prefer-const -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module furniture/plants). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installFurniturePlants(K: Kernel, _shared: Shared): void {\n const seedKey = (id: any): any => K.seedKey(id);\n const { SEED, kit2, rngString, sh } = K;\n // ---------- plants: blob shrubs, palms with fronds, grass tufts, flowers and pots (no crossed planes) ----------\n const GREENS = [0x3f7a3a, 0x2f6a30, 0x4f8a42, 0x5a9448, 0x3a7a4c];\n const FLOWERS = [0xe0508a, 0xf2c230, 0xf5f2ea, 0xd8332a, 0x8a5ad0, 0xf08a3a];\n function blobs(K, cx, cy, cz, R, n, green, rnd, o: any = {}) { // cluster of rounded ellipsoids; lighter at the top\n for (let i = 0; i < n; i++) {\n const a = rnd() * 6.283, u = Math.sqrt(rnd()), ph = (rnd() - 0.2) * 1.2, dx = Math.cos(a) * u * R * 0.75, dz = Math.sin(a) * u * R * 0.75, dy = (o.flatten ? 0.35 : 0.55) * R * (Math.sin(ph) * 0.5 + 0.5) * 1.5 - R * 0.15;\n const r = R * (0.34 + rnd() * 0.22) * (1 - u * 0.25), alt = r * 2 * (o.flatten ? 0.75 : 0.95), f = 0.72 + Math.min(1, (dy + R * 0.2) / (R * 1.2)) * 0.32 + rnd() * 0.12;\n K.e('plant', cx + dx, cy + dy + r * 0.5, cz + dz, r, alt, sh(green, f));\n if (o.flower && rnd() < o.flower) { const fa = rnd() * 6.283; K.e('plain', cx + dx + Math.cos(fa) * r * 0.78, cy + dy + r * 0.5 + rnd() * r * 0.5, cz + dz + Math.sin(fa) * r * 0.78, 0.028 + rnd() * 0.012, 0.05, o.flowers[(rnd() * o.flowers.length) | 0]); }\n }\n }\n function potModel(K, x, y, z, r, h, color, soil = true) { // conical clay pot with rim\n const rimR = r * 1.1;\n K.c('plain', x, y, z, r * 0.62, h * 0.55, sh(color, 0.92)); K.c('plain', x, y + h * 0.5, z, r * 0.84, h * 0.34, color); K.c('plain', x, y + h * 0.82, z, rimR, h * 0.18, sh(color, 1.08));\n if (soil) K.c('plain', x, y + h * 0.995, z, r * 0.92, h * 0.012, 0x3a2a1e);\n return y + h;\n }\n function arcLeaf(K, bx_, by, bz, az, len, elev, drop, wmax, color, serrated, nSeg = 6) { // arched leaf/frond with a central rib and two flaps folded in a V\n const c = Math.cos(az), s = Math.sin(az), pts = [];\n for (let i = 0; i <= nSeg; i++) { const f = i / nSeg, d = f * len; pts.push([bx_ + c * d, by + elev * d - drop * d * d / len, bz + s * d]); }\n const px = -s, pz = c; // horizontal perpendicular\n for (let i = 0; i < nSeg; i++) {\n const f0 = i / nSeg, f1 = (i + 1) / nSeg, w0 = wmax * Math.sin(Math.PI * Math.min(1, f0 * 0.85 + 0.12)) * (serrated && i % 2 ? 0.7 : 1), w1 = wmax * Math.sin(Math.PI * Math.min(1, f1 * 0.85 + 0.12)) * (serrated && i % 2 ? 1 : 0.7), dn = 0.35;\n for (const sd of [-1, 1]) K.polyFace('plant', [pts[i], pts[i + 1], [pts[i + 1][0] + px * sd * w1, pts[i + 1][1] - w1 * dn, pts[i + 1][2] + pz * sd * w1], [pts[i][0] + px * sd * w0, pts[i][1] - w0 * dn, pts[i][2] + pz * sd * w0]], i % 2 ? sh(color, 0.9) : color, [0, 1, 0]);\n }\n return pts[nSeg];\n }\n function tuft(K, x, y, z, r, n, color, rnd) { // tuft: thin, curved blades of varied lengths\n for (let i = 0; i < n; i++) {\n const a = rnd() * 6.283, d0 = rnd() * r * 0.35, L = r * (0.8 + rnd() * 1.1), bw = 0.012 + rnd() * 0.008, lean = 0.25 + rnd() * 0.5, c = Math.cos(a), s = Math.sin(a), px = -s, pz = c, x0 = x + c * d0, z0 = z + s * d0;\n const m = [x0 + c * lean * L * 0.35, y + L * 0.55, z0 + s * lean * L * 0.35], t = [x0 + c * lean * L, y + L * (0.95 - lean * 0.2), z0 + s * lean * L], vc = sh(color, 0.78 + rnd() * 0.4);\n K.polyFace('plant', [[x0 - px * bw, y, z0 - pz * bw], [x0 + px * bw, y, z0 + pz * bw], [m[0] + px * bw * 0.6, m[1], m[2] + pz * bw * 0.6], t, [m[0] - px * bw * 0.6, m[1], m[2] - pz * bw * 0.6]], vc, [0, 1, 0]);\n }\n }\n function palm_tree(M, A, o: any = {}) {\n const K = kit2(M, A), h = M.h || 3.2, rnd = rngString(SEED() + '|' + seedKey(M.seed) + '|palm'), green = (M.palette && M.palette.plant != null) ? M.palette.plant : 0x3f7a3a, trunk = 0x8a6a48, tilts = (rnd() - 0.5) * 0.25;\n const nseg = 8, th = h * 0.78; let tx = 0, tz = 0, ty = 0;\n for (let i = 0; i < nseg; i++) { const f = i / nseg, rr = 0.075 - f * 0.03, hh = th / nseg; K.c('wood', tx, ty, tz, rr, hh + 0.01, i % 2 ? sh(trunk, 0.86) : trunk); tx += tilts * hh; ty += hh; }\n K.c('wood', tx, ty, tz, 0.062, 0.1, sh(trunk, 0.7)); K.e('plant', tx, ty + 0.08, tz, 0.11, 0.16, sh(green, 0.6));\n const nf = 10;\n for (let i = 0; i < nf; i++) { const az = i * 6.283 / nf + rnd() * 0.3, el = 0.55 - (i % 3) * 0.2 + rnd() * 0.15; arcLeaf(K, tx, ty + 0.1, tz, az, h * (0.4 + rnd() * 0.12), el, 0.5 + (i % 3) * 0.25, 0.2, sh(green, 0.85 + rnd() * 0.3), true, 8); }\n if (o.coconut) for (let i = 0; i < 3; i++) K.e('plain', tx + Math.cos(i * 2.1) * 0.1, ty - 0.05, tz + Math.sin(i * 2.1) * 0.1, 0.05, 0.08, 0x6a4a2a);\n }\n function treeModel(M, A, o: any = {}) { // tree: trunk with branches and a canopy of clustered blobs (fruit trees carry fruit)\n const K = kit2(M, A), h = M.h || 2.5, w = Math.max(M.w || 1, M.d || 1), rnd = rngString(SEED() + '|' + seedKey(M.seed) + '|arv'), green = (M.palette && M.palette.plant != null) ? M.palette.plant : 0x3f7a3a, th = h * (o.lowCrown ? 0.38 : 0.46);\n K.c('wood', 0, 0, 0, Math.max(0.05, w * 0.045), th, 0x6a4a30); K.c('wood', 0, 0, 0, Math.max(0.07, w * 0.065), 0.12, 0x5a3e28);\n for (let i = 0; i < 3; i++) { const a = i * 2.1 + rnd(), L = w * 0.25; K.t('wood', [0, th * 0.75, 0], [Math.cos(a) * L, th + 0.15, Math.sin(a) * L], 0.025, 0x6a4a30); }\n const R = w * 0.5, ch = h - th; blobs(K, 0, th - 0.1, 0, R, o.lowCrown ? 12 : 14, green, rnd, { flatten: false });\n blobs(K, 0, th + ch * 0.45, 0, R * 0.72, 8, green, rnd);\n if (o.fruit) for (let i = 0; i < 9; i++) { const a = rnd() * 6.283, u = 0.5 + rnd() * 0.45; K.e('plain', Math.cos(a) * R * u, th + ch * (0.1 + rnd() * 0.55), Math.sin(a) * R * u, 0.045, 0.08, o.fruit[(rnd() * o.fruit.length) | 0]); }\n }\n function shrubModel(M, A, o: any = {}) {\n const K = kit2(M, A), rnd = rngString(SEED() + '|' + seedKey(M.seed) + '|arb'), w = Math.max(M.w || 0.8, M.d || 0.8), green = (M.palette && M.palette.plant != null) ? M.palette.plant : GREENS[(rnd() * 3) | 0];\n blobs(K, 0, 0, 0, w * 0.55, 10, green, rnd, { flatten: true, flower: o.flower, flowers: o.flowers || FLOWERS });\n K.e('plain', 0, 0.03, 0, w * 0.3, 0.06, 0x3a2a1e);\n }\n function potPlant(M, A, o: any = {}) { // potted plant (indoor or outdoor): pot + dracaena/ficus/fern\n const K = kit2(M, A), rnd = rngString(SEED() + '|' + seedKey(M.seed) + '|vaso'), h = M.h || 0.9, r = Math.min(0.26, Math.min(M.w || 0.4, M.d || 0.4) * 0.42), pot = M.color != null ? M.color : [0xb5603c, 0xa8603e, 0xe8e2d4, 0x4a4a4c, 0x7a8a8c][(rnd() * 5) | 0];\n const ph = Math.min(0.34, h * 0.38), top = potModel(K, 0, 0, 0, r, ph, pot), green = (M.palette && M.palette.plant != null) ? M.palette.plant : GREENS[(rnd() * 5) | 0], type = o.type || ['ficus', 'dracena', 'samambaia'][(rnd() * 3) | 0];\n if (type === 'ficus') { K.t('wood', [0, top, 0], [0.02, top + (h - ph) * 0.45, 0], 0.014, 0x6a4a30); blobs(K, 0, top + (h - ph) * 0.35, 0, Math.max(0.2, (h - ph) * 0.4), 9, green, rnd); }\n else if (type === 'dracena') { for (let i = 0; i < 3; i++) { const a = i * 2.1, hh = (h - ph) * (0.5 + 0.2 * i / 2); K.t('wood', [0, top, 0], [Math.cos(a) * 0.04, top + hh, Math.sin(a) * 0.04], 0.012, 0x7a6a48); for (let k = 0; k < 7; k++) arcLeaf(K, Math.cos(a) * 0.04, top + hh, Math.sin(a) * 0.04, k * 0.9 + a, 0.22 + rnd() * 0.08, 0.35 - k % 3 * 0.1, 0.3, 0.028, sh(green, 0.85 + rnd() * 0.3), false, 4); } }\n else { for (let k = 0; k < 11; k++) arcLeaf(K, 0, top, 0, k * 0.6 + rnd() * 0.3, (h - ph) * (0.7 + rnd() * 0.4), 0.9 - (k % 3) * 0.25, 1.2, 0.05, sh(green, 0.8 + rnd() * 0.35), true, 6); }\n }\n function tablePot(M, A) { // small pot on furniture: succulent/foliage in blobs\n const K = kit2(M, A), rnd = rngString(SEED() + '|' + seedKey(M.seed) + '|vm'), top = potModel(K, 0, 0, 0, 0.055, 0.09, [0xf0eee8, 0xc0603c, 0x8a8e90][(rnd() * 3) | 0]);\n for (let i = 0; i < 6; i++) { const a = i * 1.1; arcLeaf(K, 0, top, 0, a, 0.1 + rnd() * 0.06, 0.8, 0.4, 0.022, sh(GREENS[(rnd() * 5) | 0], 1), false, 3); }\n }\n function planterModel(M, A, o: any = {}) { // planter bed with low wall, soil and tufts/flowering shrubs/grass\n const K = kit2(M, A), w = M.w, d = M.d, rnd = rngString(SEED() + '|' + seedKey(M.seed) + '|cant'), dirt = (M.palette && M.palette.dirt != null) ? M.palette.dirt : 0x3a2a1e, wallPart = 0xb4b0a4, green = (M.palette && M.palette.plant != null) ? M.palette.plant : 0x4a7a3a, bh = 0.22, t = 0.07;\n K.b('plain', 0, 0, -d / 2 + t / 2, w, bh, t, wallPart); K.b('plain', 0, 0, d / 2 - t / 2, w, bh, t, wallPart); K.b('plain', -w / 2 + t / 2, 0, 0, t, bh, d - 2 * t, wallPart); K.b('plain', w / 2 - t / 2, 0, 0, t, bh, d - 2 * t, wallPart);\n K.b('plain', 0, bh - 0.012, -d / 2 + t / 2, w + 0.02, 0.02, t + 0.02, sh(wallPart, 1.1)); K.b('plain', 0, bh - 0.012, d / 2 - t / 2, w + 0.02, 0.02, t + 0.02, sh(wallPart, 1.1));\n K.b('plain', 0, 0.01, 0, w - 2 * t, bh - 0.05, d - 2 * t, dirt);\n const n = Math.max(3, Math.round(w / 0.55)), tp = o.type || ['flower', 'shrub', 'grass'][(rnd() * 3) | 0];\n for (let i = 0; i < n; i++) {\n const x = -w / 2 + t + 0.2 + (i + 0.5) * (w - 2 * t - 0.4) / n, z = (rnd() - 0.5) * (d - 2 * t) * 0.5, k = (i + (tp === 'flower' ? 0 : 1)) % 3;\n if (tp === 'grass' || k === 2) tuft(K, x, bh - 0.04, z, 0.2, 14, sh(green, 1.05), rnd);\n else blobs(K, x, bh - 0.05, z, 0.24 + rnd() * 0.08, 6, green, rnd, { flatten: true, flower: tp === 'flower' ? 0.9 : 0.25, flowers: FLOWERS.slice(i % 3, (i % 3) + 3) });\n }\n }\n Object.assign(K, { GREENS, FLOWERS, blobs, potModel, arcLeaf, tuft, palm_tree, treeModel, shrubModel, potPlant, tablePot, planterModel });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module furniture/yard). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installFurnitureYard(K: Kernel, shared: Shared): void {\n const seedKey = (id: any): any => K.seedKey(id);\n const { FURNITURE, SEED, STYLE, kit2, rngString, sh, wallTap } = K;\n // ---------- laundry tub: rounded-corner basin, wavy washboard, feet and wall tap ----------\n FURNITURE.laundry_tub = function (M, A) {\n const K = kit2(M, A), w = M.w || 0.6, d = M.d || 0.55, H = M.h || 0.9, structure = STYLE(), upper = structure === 'budget', color = upper ? 0xb4b0a4 : 0xf0efea, int = upper ? 0x9aa4a6 : 0xe2e6e8, rim = sh(color, 1.06);\n const yb = H - 0.36, t = 0.04, rc = 0.055, zw = -d / 2;\n for (const sx of [-1, 1]) for (const sz of [-1, 1]) K.c('plain', sx * (w / 2 - rc), yb, sz * (d / 2 - rc), rc, 0.36, color);\n K.b('plain', 0, yb, d / 2 - t / 2, w - 2 * rc + 0.01, 0.36, t, color); K.b('plain', 0, yb, -d / 2 + t / 2, w - 2 * rc + 0.01, 0.36, t, color);\n K.b('plain', -w / 2 + t / 2, yb, 0, t, 0.36, d - 2 * rc + 0.01, color); K.b('plain', w / 2 - t / 2, yb, 0, t, 0.36, d - 2 * rc + 0.01, color);\n K.b('plain', 0, yb, 0, w - 2 * t, 0.06, d - 2 * t, int);\n // rounded top edge (ring of cylinders and strips)\n for (const sx of [-1, 1]) for (const sz of [-1, 1]) K.c('plain', sx * (w / 2 - rc), H - 0.004, sz * (d / 2 - rc), rc + 0.008, 0.012, rim);\n K.b('plain', 0, H - 0.004, d / 2 - 0.011, w - 2 * rc, 0.012, 0.022, rim); K.b('plain', 0, H - 0.004, -d / 2 + 0.011, w - 2 * rc, 0.012, 0.022, rim);\n K.b('plain', -w / 2 + 0.011, H - 0.004, 0, 0.022, 0.012, d - 2 * rc, rim); K.b('plain', w / 2 - 0.011, H - 0.004, 0, 0.022, 0.012, d - 2 * rc, rim);\n // wavy scrubbing board, tilted on the left side of the basin\n const tw = Math.min(0.2, w * 0.34), tx = -w / 2 + t + tw / 2 + 0.01, zt1 = d / 2 - t - 0.01, zt0 = -d / 2 + t + 0.08, ytop = H - 0.03, ybot = yb + 0.14, L = Math.hypot(zt1 - zt0, ytop - ybot), al = Math.atan2(ytop - ybot, zt1 - zt0);\n K.b('plain', tx, (ytop + ybot) / 2 - 0.015, (zt0 + zt1) / 2, tw, 0.03, L, sh(color, 0.96), 0, -al, 0);\n const nr = 7; for (let i = 0; i < nr; i++) { const f = (i + 0.5) / nr, zz = zt0 + (zt1 - zt0) * f, yy = ybot + (ytop - ybot) * f; K.b('plain', tx, yy + 0.003, zz, tw - 0.02, 0.014, 0.018, sh(color, 0.88), 0, -al, 0); }\n // drain and plug with chain\n K.c('metal', 0.1, yb + 0.06, 0, 0.034, 0.008, 0xb0b4b8); K.c('plain', 0.1, yb + 0.068, 0, 0.026, 0.01, 0x3a3e42);\n // feet: two concrete gables (budget) or round legs\n if (upper) { for (const sx of [-1, 1]) K.b('plain', sx * (w / 2 - 0.035), 0, 0, 0.07, yb, d - 0.05, sh(color, 0.94)); K.b('plain', 0, yb - 0.04, 0, w - 0.1, 0.04, d - 0.06, sh(color, 0.9)); }\n else for (const sx of [-1, 1]) for (const sz of [-1, 1]) { K.c('metal', sx * (w / 2 - 0.07), 0, sz * (d / 2 - 0.07), 0.022, yb, 0xb4b8bc); K.c('metal', sx * (w / 2 - 0.07), 0, sz * (d / 2 - 0.07), 0.03, 0.012, 0x6a6e72); }\n wallTap(K, 0.0, H + 0.14, zw + 0.0, 1, yb + 0.06, { laundry_tub: true });\n };\n // ---------- clothesline with clothes swaying in the wind (one 'clothes' mesh with per-vertex sway) ----------\n const CLOTHES_COLORS = [0xd8d0b8, 0x4a6a8a, 0xb8483a, 0xe8e4d8, 0x6a8a5a, 0xe2b04a, 0x8a5a8a, 0x2f4a6a, 0xd47a8a, 0x7aa6b8];\n function strip(K, rows, zc, rot, color, cx) { // cloth strip: rows = [[y, xl, xr], ...] from top to bottom; rot = rotation of the cloth about y\n const c = Math.cos(rot), s = Math.sin(rot), P = (x, y) => [cx + (x - cx) * c, y, zc + (x - cx) * s];\n for (let i = 0; i < rows.length - 1; i++) { const a = rows[i], b = rows[i + 1]; K.polyFace('clothes', [P(a[1], a[0]), P(a[2], a[0]), P(b[2], b[0]), P(b[1], b[0])], i % 2 ? sh(color, 0.96) : color, [0, 0, 1]); }\n }\n function garment(K, type, cx, ly, zc, rot, color, rnd) { // ly = height of the line; cx = position along the line\n const sh0 = (rows, dx = 0) => rows.map(r => [ly + r[0], cx + dx + r[1], cx + dx + r[2]]);\n if (type === 'shirt') strip(K, sh0([[0.0, -0.13, 0.13], [-0.03, -0.27, 0.27], [-0.15, -0.3, 0.3], [-0.2, -0.2, 0.2], [-0.62, -0.2, 0.2], [-0.63, -0.2, 0.2]]), zc, rot, color, cx);\n else if (type === 'trousers') { strip(K, sh0([[0, -0.19, -0.01], [-0.4, -0.18, -0.02], [-0.78, -0.16, -0.03], [-0.79, -0.16, -0.03]]), zc, rot, color, cx); strip(K, sh0([[0, 0.01, 0.19], [-0.4, 0.02, 0.18], [-0.78, 0.03, 0.16], [-0.79, 0.03, 0.16]]), zc, rot, sh(color, 0.95), cx); }\n else if (type === 'shorts') { strip(K, sh0([[0, -0.2, -0.01], [-0.3, -0.2, -0.02], [-0.31, -0.2, -0.02]]), zc, rot, color, cx); strip(K, sh0([[0, 0.01, 0.2], [-0.3, 0.02, 0.2], [-0.31, 0.02, 0.2]]), zc, rot, sh(color, 0.95), cx); }\n else if (type === 'towel') { strip(K, sh0([[0, -0.32, 0.32], [-0.2, -0.32, 0.32], [-0.22, -0.32, 0.32], [-0.5, -0.32, 0.32], [-0.9, -0.32, 0.32], [-0.91, -0.32, 0.32]]), zc, rot, color, cx); strip(K, sh0([[-0.22, -0.32, 0.32], [-0.3, -0.32, 0.32]]), zc, rot, sh(color, 1.25), cx); }\n else if (type === 'sheet') strip(K, sh0([[0, -0.5, 0.5], [-0.35, -0.5, 0.5], [-0.7, -0.5, 0.5], [-1.05, -0.5, 0.5], [-1.06, -0.5, 0.5]]), zc, rot, color, cx);\n else if (type === 'dress') strip(K, sh0([[0, -0.14, 0.14], [-0.06, -0.2, 0.2], [-0.3, -0.16, 0.16], [-0.62, -0.28, 0.28], [-0.63, -0.28, 0.28]]), zc, rot, color, cx);\n else { strip(K, sh0([[0, -0.05, 0.05], [-0.14, -0.05, 0.05], [-0.15, -0.05, 0.05]], -0.06), zc, rot, color, cx); strip(K, sh0([[0, -0.05, 0.05], [-0.14, -0.05, 0.05], [-0.15, -0.05, 0.05]], 0.06), zc, rot, sh(color, 0.9), cx); } // socks\n // clothespins\n K.b('plain', cx - 0.05, ly - 0.02, zc, 0.018, 0.05, 0.016, 0xe8e0c8); K.b('plain', cx + 0.05, ly - 0.02, zc, 0.018, 0.05, 0.016, 0xc8483a);\n }\n FURNITURE.clothesline = function (M, A) {\n const K = kit2(M, A), w = M.w || 3.6, d = M.d || 0.4, h = M.h || 2.0, rnd = rngString(SEED() + '|' + seedKey(M.seed) + '|varal'), ly = h - 0.1, nf = 3, zs = [-0.14, 0, 0.14];\n for (const s of [-1, 1]) { const x = s * w / 2; K.c('metal', x, 0, 0, 0.032, h, 0x6a6e72); K.c('metal', x, 0, 0, 0.06, 0.03, 0x4a4e52); K.b('metal', x, h - 0.03, 0, 0.05, 0.03, d + 0.04, 0x6a6e72); K.e('metal', x, h + 0.01, 0, 0.032, 0.05, 0x6a6e72); }\n for (const z of zs) K.t('metal', [-w / 2, ly, z], [w / 2, ly, z], 0.0045, 0xb0b4b8);\n K.part('laundry', 0, ly, 0, () => {\n const types = ['shirt', 'trousers', 'towel', 'shorts', 'shirt', 'dress', 'sheet', 'sock', 'shirt', 'trousers'];\n const gap = 0.085; let x = -w / 2 + 0.38, i = 0, zi = 0;\n for (const z of zs) { x = -w / 2 + 0.3 + rnd() * 0.15; zi++; while (x < w / 2 - 0.35) { const tp = types[(rnd() * types.length) | 0], ww = tp === 'sheet' ? 1.0 : tp === 'towel' ? 0.66 : tp === 'shirt' ? 0.6 : tp === 'dress' ? 0.56 : tp === 'sock' ? 0.28 : 0.42; if (x + ww / 2 > w / 2 - 0.25) break; garment(K, tp, x + ww / 2 - w / 2 * 0, ly, z, (rnd() - 0.5) * 0.28, CLOTHES_COLORS[(rnd() * CLOTHES_COLORS.length) | 0], rnd); x += ww + gap + rnd() * 0.1; i++; } }\n }, { id: 'laundry_' + M.seed, swing: true, room: 'yard' });\n (shared.ctx.clotheslines || (shared.ctx.clotheslines = [])).push(M.seed);\n };\n // ---------- polyethylene water tank: round reservoir with ribs, lid, float and pipes; on the slab when M.y > 0.5 ----------\n FURNITURE.water_tank = function (M, A) {\n const K = kit2(M, A), w = M.w || 1, d = M.d || 1, onGround = !M.onSlab && (M.y || 0) < 0.5, color = (M.palette && M.palette.tank_water != null) ? M.palette.tank_water : 0x2f6aa8, r = Math.min(w, d) * 0.46, rc = 0xb4b0a4;\n let y0 = 0;\n if (onGround) { for (const sx of [-1, 1]) for (const sz of [-1, 1]) K.b('plain', sx * (w / 2 - 0.08), 0, sz * (d / 2 - 0.08), 0.14, 1.0, 0.14, rc); K.b('plain', 0, 1.0, 0, w, 0.12, d, rc); y0 = 1.12; }\n else { K.b('plain', 0, 0, 0, r * 2 + 0.2, 0.1, r * 2 + 0.2, rc); y0 = 0.1; }\n const H = Math.max(0.7, (M.h || 1.8) - (onGround ? 1.12 : 0.1) - 0.0), th = Math.min(0.95, H * 0.88);\n K.part('water_tank', 0, y0, 0, () => {\n K.c('plain', 0, y0, 0, r, th, color); for (const f of [0.18, 0.5, 0.82]) K.c('plain', 0, y0 + th * f - 0.025, 0, r * 1.028, 0.05, sh(color, 0.88));\n K.e('plain', 0, y0 + th + 0.03, 0, r * 1.0, 0.16, sh(color, 0.95)); K.c('plain', 0, y0 + th + 0.09, 0, r * 0.5, 0.05, sh(color, 0.8)); K.c('plain', 0, y0 + th + 0.14, 0, r * 0.18, 0.035, 0x1d3d66);\n }, { id: 'tank_' + M.seed, breakable: true, fluid: 'water', volume: Math.PI * r * r * th, radius: r, height: th });\n K.t('metal', [r * 0.7, y0 + th * 0.25, 0.0], [r * 0.7, y0 + 0.03, 0], 0.02, 0x303438); K.t('metal', [r * 0.7, y0 + 0.03, 0], [r * 0.7 + 0.2, y0 + 0.03, 0], 0.02, 0x303438);\n K.t('metal', [-r * 0.5, y0 + th + 0.08, 0], [-r * 0.5, y0 + th + 0.35, 0], 0.014, 0x2a2a2a); K.t('metal', [-r * 0.5, y0 + th + 0.35, 0], [-r * 0.2, y0 + th + 0.35, 0], 0.014, 0x2a2a2a);\n };\n // P13 gas cylinder (0.36 x 0.47 m): shell, protection ring with three feet, valve, regulator and the hose to the stove (M.hose = [[x,z,y] of the cylinder, [x,z,y] of the stove], plan coordinates).\n // One damageable part (type 'gas'): only two meshes (plain: shell and hose; metal: ring, valve and regulator), everything merged by the accumulators.\n FURNITURE.cooking_gas_cylinder = function (M, A) {\n const K = kit2(M, A), r = Math.min(M.w || 0.36, M.d || 0.36) / 2, H = M.h || 0.47, color = 0x3f6ea8, scale = sh(color, 0.7), brass = 0xc9a24a, c = Math.cos(M.ry || 0), s = Math.sin(M.ry || 0);\n K.part('gas_cylinder', 0, 0, 0, () => {\n K.c('plain', 0, 0, 0, r * 0.88, 0.05, scale); // foot (skirt)\n K.c('plain', 0, 0.04, 0, r, H * 0.5, color); K.e('plain', 0, 0.04 + H * 0.5, 0, r * 0.99, 0.08, sh(color, 0.9)); // shell and waist\n K.c('plain', 0, H * 0.5 + 0.04, 0, r * 1.012, 0.018, scale); // central weld\n K.e('plain', 0, H * 0.77, 0, r * 0.98, H * 0.36, color); // rounded shoulder\n K.c('metal', 0, H * 0.86, 0, 0.05, 0.05, 0x8a8e92); // neck\n for (let k = 0; k < 3; k++) { const a = k * 2.0944 + 0.5, x = Math.cos(a) * r * 0.62, z = Math.sin(a) * r * 0.62; K.t('metal', [x, H * 0.84, z], [Math.cos(a) * r * 0.62, H - 0.012, Math.sin(a) * r * 0.62], 0.009, 0x7a7e82); } // ring feet\n const N = 10, ra = r * 0.62; for (let k = 0; k < N; k++) { const a0 = k * 6.2832 / N, a1 = (k + 1) * 6.2832 / N; K.t('metal', [Math.cos(a0) * ra, H - 0.012, Math.sin(a0) * ra], [Math.cos(a1) * ra, H - 0.012, Math.sin(a1) * ra], 0.009, 0x7a7e82); } // handling ring\n K.c('metal', 0, H * 0.9, 0, 0.026, H * 0.1, brass); K.c('metal', 0, H - 0.015, 0, 0.034, 0.02, 0x2a2c2e); // valve and handwheel\n K.c('metal', 0.045, H * 0.9 - 0.002, 0, 0.022, 0.07, 0xc23a1e); K.b('metal', 0.075, H * 0.9 + 0.045, 0, 0.05, 0.022, 0.03, 0x2a2c2e); // pressure regulator and outlet\n if (M.hose && M.hose.length > 1) { // hose: leaves the regulator, drops in a curve and rises to the stove\n const q = M.hose[M.hose.length - 1], dx = q[0] - M.x, dz = q[1] - M.z, lx = dx * c - dz * s, lz = dx * s + dz * c, y1 = Math.max(0.1, (q[2] != null ? q[2] : 0.5)) - (M.y || 0);\n const P0 = [0.1, H * 0.9 + 0.045, 0], P2 = [lx, y1, lz], len = Math.hypot(lx - P0[0], lz - P0[2]), back = Math.min(0.28, 0.08 + len * 0.06), n = 8, pts = [];\n for (let k = 0; k <= n; k++) { const t = k / n, u = 1 - t; pts.push([u * P0[0] + t * P2[0], Math.max(0.02, u * P0[1] + t * P2[1] - 4 * t * u * back * (1 + len * 0.05)), u * P0[2] + t * P2[2]]); }\n for (let k = 0; k < n; k++) K.t('plain', pts[k], pts[k + 1], 0.011, 0xb8321e);\n K.c('metal', P2[0], P2[1] - 0.025, P2[2], 0.016, 0.05, brass); // stove connection\n }\n }, { id: 'gas_cylinder_' + M.seed, breakable: true, fluid: 'gas', explosive: true, capacityKg: 13 });\n };\n // ---------- mailbox: metal box with hinged lid (part), slot, number and pillar ----------\n FURNITURE.mailbox = function (M, A) {\n const K = kit2(M, A, 0), w = M.w || 0.3, d = M.d || 0.22, h = M.h || 0.3, y = M.y != null && M.y > 0 ? M.y : 1.0, structure = STYLE(), pc = structure === 'high' ? 0x2a2c30 : structure === 'mid' ? 0xd0b060 : 0xc84a3a, rnd = rngString(SEED() + '|' + seedKey(M.seed) + '|correio');\n if (M.pole !== false && !(M.y > 0)) { K.b('plain', 0, 0, -d / 2 - 0.1, 0.12, y, 0.12, 0xb8b4aa); }\n K.b('metal', 0, y, 0, w, h * 0.78, d, pc); K.b('metal', 0, y + h * 0.78, 0, w + 0.02, 0.025, d + 0.02, sh(pc, 0.8));\n K.b('metal', 0, y + h * 0.805, 0, w * 0.55, 0.03, d * 0.7, sh(pc, 0.65), 0, 0.5); // sloped roof\n K.b('plain', 0, y + h * 0.5, d / 2 + 0.002, w * 0.5, 0.012, 0.004, 0x1a1a1a); // slot\n K.part('mailbox_door', 0, y + 0.04, d / 2, () => { K.b('metal', 0, y + 0.04, d / 2 + 0.006, w - 0.06, h * 0.4, 0.012, sh(pc, 1.1)); K.b('metal', 0, y + 0.04 + h * 0.3, d / 2 + 0.018, 0.05, 0.02, 0.012, 0x909498); },\n { id: 'mailbox_' + M.seed, opens: { type: 'swing', axis: [1, 0, 0], angle: 1.5 } });\n K.b('plain', 0.0, y + h * 0.62, d / 2 + 0.004, 0.08, 0.05, 0.004, 0xf2f0ea);\n };\n Object.assign(K, { CLOTHES_COLORS, strip, garment });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module furniture/extra-types). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installFurnitureExtraTypes(K: Kernel, _shared: Shared): void {\n const seedKey = (id: any): any => K.seedKey(id);\n const { CARS, CAR_BY_STYLE, FURNITURE, SEED, STYLE, carModel, ceilingLamp, cursor, floorLamp, kit2, lightStyle, lightSwitch, outdoorLamp, palm_tree, planterModel, potPlant, rngString, sconce, shrubModel, tableLamp, tablePot, treeModel, tuft } = K;\n // ---------- extra types linked to the table ----------\n function extraTypes(T, props) {\n const origCar = T.garage_car;\n const car = (M, A) => {\n const structure = STYLE(), list = CAR_BY_STYLE[structure] || CAR_BY_STYLE.mid, r = rngString(SEED() + '|' + (seedKey(M.seed) || M.id || '') + '|' + Math.round((M.x || 0) * 10) + '|' + Math.round((M.z || 0) * 10) + '|carro');\n const k = list[Math.floor(r() * list.length)], paint = 1 + Math.floor(r() * 8); // seed = paint colour (8 colours per model, so the cache does not grow)\n if (!carModel(k, paint)) { if (origCar) origCar.f(M, A); return; }\n const K = kit2(M, A, 0), [px, py, pz] = K.W(0, 0, 0);\n CARS.push({ x: px, y: py, z: pz, ry: M.ry, w: M.w || 1.8, d: M.d || 4.2, k, seed: paint, parent: cursor.group });\n };\n const mine = (type, f, source = 'game') => { T[type] = { f, source }; };\n for (const t of ['ceiling_light', 'pendant', 'track_spot', 'chandelier']) mine(t, (M, A) => ceilingLamp(M, A, t === 'ceiling_light' ? lightStyle(M) : t === 'pendant' ? 'pendant' : t === 'chandelier' ? 'chandelier' : 'track'), 'game (lamps)');\n mine('table_lamp', (M, A) => tableLamp(M, A, M.y || 0)); mine('car', car); mine('car_small', car); mine('garage_car', car); mine('outdoor_lamp', outdoorLamp); mine('floor_lamp', floorLamp); mine('floor_lamp', floorLamp); mine('sconce', sconce); mine('light_switch', lightSwitch);\n mine('mirror', FURNITURE.mirror); mine('curtain', FURNITURE.curtain); mine('shower', FURNITURE.box); mine('shower_large', FURNITURE.box); mine('laundry_tub', FURNITURE.laundry_tub); mine('clothesline', FURNITURE.clothesline); mine('water_tank', FURNITURE.water_tank); mine('mailbox', FURNITURE.mailbox); mine('correio', FURNITURE.mailbox);\n mine('palm_tree', (M, A) => palm_tree(M, A, { coconut: true })); mine('fruit_tree', (M, A) => treeModel(M, A, { fruit: [0xd8332a, 0xf2a22a, 0xf0d030] }));\n mine('tree_small', (M, A) => treeModel(M, A, {})); mine('tree_large', (M, A) => treeModel(M, A, { lowCrown: true })); mine('shrub', (M, A) => shrubModel(M, A, {})); mine('flowering_shrub', (M, A) => shrubModel(M, A, { flower: 0.9 }));\n mine('plant_tall', (M, A) => potPlant(M, A, {})); mine('plant_short', (M, A) => potPlant(M, A, {})); mine('outdoor_pot', (M, A) => potPlant(M, A, {})); mine('floor_plant', (M, A) => potPlant(M, A, {})); mine('table_plant', tablePot);\n mine('planter_bed', (M, A) => planterModel(M, A, {})); mine('planter_bed_small', (M, A) => planterModel(M, A, {})); mine('garden_bed', (M, A) => planterModel(M, A, { type: 'grass' }));\n mine('tuft', (M, A) => { const K = kit2(M, A), rnd = rngString(SEED() + '|' + seedKey(M.seed) + '|tf'); tuft(K, 0, 0, 0, Math.max(0.2, (M.w || 0.4) / 2), 16, 0x4f8a42, rnd); });\n }\n Object.assign(K, { extraTypes });\n}\n","// Literal port of the team's Casa3DSDK (module furniture/place-items). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installFurniturePlaceItems(K: Kernel, shared: Shared): void {\n const { THREE, Y0, _col, boxC, colorOf, cursor, decorLights, makeApi, structurePiece } = K;\n const buildItem = (...a: any[]): any => K.buildItem(...a);\n const registerCollision = (...a: any[]): any => K.registerCollision(...a);\n const vegItem = (...a: any[]): any => K.vegItem(...a);\n function houseItems() {\n const R = shared.ctx.r, T = shared.ctx.types, api = makeApi(), noModel = new Map();\n const list = R.items.concat(R.stateItems.filter(e => e.w != null && e.d != null && e.type !== 'razor_wire' && e.type !== 'barbed_wire'));\n const rect = poly => { let a = 0; for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) a += poly[j][0] * poly[i][1] - poly[i][0] * poly[j][1]; const xs = poly.map(p => p[0]), zs = poly.map(p => p[1]); return Math.abs(a) / 2 > 0.98 * (Math.max(...xs) - Math.min(...xs)) * (Math.max(...zs) - Math.min(...zs)); };\n for (const m of list) {\n if (m.type === 'stairs') continue;\n const exterior = m.outdoor || m.floor < 0, f = exterior ? -1 : Math.min(m.floor, R.floors.length - 1);\n cursor.group = exterior ? 'lot' : 'f' + f;\n const com = shared.ctx.roomById[m.room], base = exterior ? 0 : Y0(f);\n const M: any = { x: m.x, z: m.z, ry: m.ry || 0, w: m.w, d: m.d, h: m.h, y: m.y || 0, base, floor: exterior ? -1 : f, palette: shared.ctx.colors, color: m.category === 'ground_cover' ? undefined : (colorOf(m.color) != null ? colorOf(m.color) : undefined), seed: m.id, room: m.room, typeWith: com ? com.type : null, ceiling: com ? com.ceiling : 2.9, on: shared.ctx.night, light: shared.ctx.night, lit: shared.ctx.night, open: !!m.doorOpen, overhead: m.overhead, assembly: m.assembly, hose: m.hose };\n if (m.category === 'ground_cover' && m.polygon) {\n const xs = m.polygon.map(p => p[0]), zs = m.polygon.map(p => p[1]); M.x = (Math.min(...xs) + Math.max(...xs)) / 2; M.z = (Math.min(...zs) + Math.max(...zs)) / 2; M.w = Math.max(...xs) - Math.min(...xs); M.d = Math.max(...zs) - Math.min(...zs); M.ry = 0;\n if (!rect(m.polygon)) M.poly = m.polygon.map(p => [p[0] - M.x, p[1] - M.z]);\n }\n if (shared.ctx.veg && vegItem(m, M, exterior ? 'lot' : 'f' + f)) continue;\n if (shared.ctx.iv && shared.ctx.iv.replace.has(m.id)) { registerCollision(m, M); continue; } // the interactables kit draws this furniture (the collision is still a single one)\n const ent = T[m.type];\n if (!ent) { labeledBox(m, M, exterior ? 'lot' : 'f' + f); noModel.set(m.type, (noModel.get(m.type) || 0) + 1); continue; }\n try { buildItem(m, M, ent, api, cursor.group); } catch (e) { cursor.group = exterior ? 'lot' : 'f' + f; console.warn('builder', m.type, e); labeledBox(m, M, exterior ? 'lot' : 'f' + f); noModel.set(m.type, (noModel.get(m.type) || 0) + 1); }\n }\n try { waterTankOfHouse(api); } catch (e) { console.warn('water tank', e); }\n try { decorLights(api); } catch (e) { console.warn('decorLights', e); }\n return noModel;\n }\n // R23: water tank from res.waterTank: on the slab (floor group, always visible) or in the attic under the sloped roof (group 'cxd', only shown with the roof cut)\n function waterTankOfHouse(api) {\n const cd = shared.ctx.r.waterTank; if (!cd || !shared.ctx.types.water_tank) return;\n const lc = cd.place === 'raised_slab' && cd.platform, slab = cd.place === 'slab' || !!lc, nA = shared.ctx.r.floors.length, f = Math.max(0, Math.min(nA - 1, cd.floor));\n // the SDK gives y at the top of the floor slab; the viewer draws the ceiling (0.2 m) and the cover slab (0.03 m) above the ceiling height\n const base = lc ? cd.platform.topY : cd.y + (shared.ctx.r.rooms.some(c => c.id === cd.room && c.type === 'terrace') ? 0 : 0.2 + (slab ? 0.03 : 0));\n cursor.group = slab ? 'f' + f : 'attic_tank';\n if (lc) { // tank slab: pillars + small slab that rises out of the sloped roof (tank above the ridge)\n const P = cd.platform, [x0, z0, x1, z1] = P.aabb, e = P.thickness, color = shared.ctx.colors.slab != null ? shared.ctx.colors.slab : 0xb9b5ac;\n cursor.pc = structurePiece('tank_slab'); boxC('plain', (x0 + x1) / 2, P.topY - e / 2, (z0 + z1) / 2, x1 - x0, e, z1 - z0, color, 0, 0, 0);\n P.pillars.forEach((p, k) => { cursor.pc = structurePiece('tank_column_' + k); boxC('plain', p.u, (P.baseY + P.topY - e) / 2, p.v, p.side, P.topY - e - P.baseY, p.side, color, 0, 0, 0); });\n cursor.pc = null;\n }\n if (!slab) { // R44: attic variant (group cxd, only with the roof cut): concrete platform on four feet that go down to the floor of the storey, so the tank does not float in the cut view\n const color = shared.ctx.colors.slab != null ? shared.ctx.colors.slab : 0xb9b5ac, yp = Y0(f), hw = cd.w / 2 + 0.1, hd = cd.d / 2 + 0.1;\n boxC('plain', cd.u, base - 0.06, cd.v, hw * 2, 0.12, hd * 2, color);\n for (const sx of [-1, 1]) for (const sz of [-1, 1]) boxC('plain', cd.u + sx * (hw - 0.07), (yp + base - 0.12) / 2, cd.v + sz * (hd - 0.07), 0.1, base - 0.12 - yp, 0.1, color);\n }\n const M = { x: cd.u, z: cd.v, ry: 0, w: cd.w, d: cd.d, h: cd.h + 0.12, y: 0, base, floor: f, colors: shared.ctx.colors, seed: 'water_tank', room: cd.room, onSlab: true, ceiling: 2.9 };\n shared.ctx.waterTankPos = { x: cd.u, z: cd.v, y: base, group: cursor.group };\n shared.ctx.types.water_tank.f(M, api);\n }\n function hashColor(s) { let h = 7; for (const ch of String(s)) h = (h * 31 + ch.charCodeAt(0)) | 0; return _col.setHSL(((h >>> 0) % 360) / 360, 0.45, 0.55).getHex(); }\n function labeledBox(m, M, group) { // no builder: a box on the item's footprint and height, in the paper colour\n const color = M.color != null ? M.color : hashColor(m.category || m.type), h = Math.max(0.05, m.h || 0.5);\n boxC('plain', m.x, M.base + (m.y || 0) + h / 2, m.z, m.w, h, m.d, color, 0, m.ry || 0, 0);\n shared.ctx.labels.push({ pos: new THREE.Vector3(m.x, M.base + (m.y || 0) + h + 0.15, m.z), text: m.type, group, type: 'no_model' });\n }\n Object.assign(K, { houseItems, waterTankOfHouse, hashColor, labeledBox });\n}\n","// Literal port of the team's Casa3DSDK (module vegetation/bridge). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installVegetationBridge(K: Kernel, shared: Shared): void {\n const seedKey = (id: any): any => K.seedKey(id);\n const { THREE, SEED, rngString } = K;\n // ---------- R39: vegetation from the game-vegetation package (cfg.vegetation): one merged mesh per group (wood, foliage, flowers), wind and bending around the player ----------\n const VEG_POT = ['potted_areca', 'potted_snake_plant', 'potted_fern'], VEG_CACTUS = { cactus_mandacaru: 'mandacaru', cactus_palm: 'prickly_pear', cactus_crown: 'crown_cactus', cactus_xique: 'xique_xique', cactus_pot: 'potted_cactus' };\n const VEG_MAP = {\n tree_small: ['guava_tree', 'lemon_tree', 'pitanga_bush_tree'], tree_large: ['mango_tree', 'oak_like'], fruit_tree: ['mango_tree', 'avocado_tree', 'lemon_tree', 'jabuticaba_tree'], palm_tree: ['coconut_palm'],\n shrub: ['generic_round_shrub'], flowering_shrub: ['hibiscus_shrub', 'azalea', 'croton'], floor_plant_tall: VEG_POT, floor_plant: VEG_POT, outdoor_pot: VEG_POT, toilet: VEG_POT, floor_plant_low: ['potted_succulents', 'potted_cactus'], table_plant: ['potted_succulents', 'potted_cactus'],\n clump: ['lawn_tuft'], banana_plant: ['banana_with_bunch'], ipe_tree: ['yellow_ipe', 'pink_ipe'], climber: ['bougainvillea_vine', 'ivy'], hedge: ['boxwood_hedge', 'ixora_hedge'],\n };\n for (const k of Object.keys(VEG_CACTUS)) VEG_MAP[k] = [VEG_CACTUS[k]];\n const VEG_PLANTER = { planter_bed: ['rose_bush_red', 'rose_bush_pink', 'rose_bush_white', 'marigold', 'periwinkle_pink', 'periwinkle_white', 'daisy'], planter_bed_small: ['rose_bush_red', 'marigold', 'periwinkle_pink', 'daisy'], garden_bed: ['lawn_tuft', 'wild_flowers'] };\n // plan item -> plan positions (returns true if the vegetation took care of the item; false lets the old builder draw)\n function vegItem(m, M, group) {\n const V = shared.ctx.veg; if (!V) return false; const ids = VEG_MAP[m.type], can = VEG_PLANTER[m.type]; if (!ids && !can) return false;\n const rnd = rngString(SEED() + '|' + seedKey(m.id) + '|veg'), pick = l => l[Math.min(l.length - 1, (rnd() * l.length) | 0)], ok = id => { if (V.ok.has(id)) return V.ok.get(id); let r = true; try { V.S.toSpec(id); } catch (e) { r = false; } V.ok.set(id, r); return r; };\n const y = (M.base || 0) + (M.y || 0), key = group + '|' + y.toFixed(3); let G = V.groups.get(key); if (!G) V.groups.set(key, G = { group, y, pl: [] });\n const sd = (rnd() * 1e9) | 0;\n if (can) {\n const ids2 = can.filter(ok); if (!ids2.length) return false; const sw = Math.abs(Math.sin(M.ry || 0)) > 0.7, w = sw ? M.d : M.w, d = sw ? M.w : M.d;\n const lst = V.G.scatter({ rect: { x: M.x - w / 2 + 0.06, z: M.z - d / 2 + 0.06, w: w - 0.12, d: d - 0.12 } }, [{ species: ids2, density: 4.5, minDistance: 0.32, scale: [0.85, 1.15], prefer: 'any' }], { seed: SEED() + '|' + m.id });\n for (const p of lst) G.pl.push(p); return lst.length > 0;\n }\n const lst = ids.filter(ok); if (!lst.length) return false;\n if (m.type === 'hedge') { const n = Math.max(1, Math.round((M.w || 1) / 0.55)), c = Math.cos(M.ry || 0), sn = Math.sin(M.ry || 0), id = pick(lst); for (let i = 0; i < n; i++) { const lx = -M.w / 2 + (i + 0.5) * M.w / n; G.pl.push({ species: id, x: M.x + lx * c, z: M.z - lx * sn, ry: M.ry || 0, scale: 1, seed: sd + i }); } return true; }\n G.pl.push({ species: pick(lst), x: M.x, z: M.z, ry: M.ry || 0, scale: 1, seed: sd }); return true;\n }\n function assembleVegetation(groups) { // closes the plants collected by vegItem into one merged object per group\n const V = shared.ctx.veg; if (!V) return; let pl = 0, tri = 0; const col = [], lod = [0, 0, 0], mats = V.mats();\n for (const G of V.groups.values()) {\n if (!G.pl.length) continue;\n const lot = V.G.buildLot(G.pl, id => V.S.toSpec(id), Object.assign({ seed: SEED() + '|veg|' + G.group }, V.opts)), obj = V.G.createLotObject(THREE, lot, mats);\n obj.position.y = G.y; obj.name = 'vegetation'; obj.traverse(o => { if (o.isMesh) { o.castShadow = true; o.receiveShadow = true; o.name = 'veg/' + o.name; o.userData.vegetation = true; } });\n (groups[G.group] || (groups[G.group] = new THREE.Group())).add(obj);\n pl += lot.plantCount - lot.thinnedCount; tri += lot.triangleCount; for (const c of lot.colliders) col.push(Object.assign({ y: G.y, group: G.group }, c)); for (let i = 0; i < 3; i++) lod[i] += lot.lodCounts[i];\n }\n shared.ctx.vegInfo = { plants: pl, triangles: tri, colliders: col, lodCounts: lod, materials: mats };\n }\n Object.assign(K, { VEG_POT, VEG_CACTUS, VEG_MAP, VEG_PLANTER, vegItem, assembleVegetation });\n}\n","// Literal port of the team's Casa3DSDK (module interaction/state). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installInteractionState(K: Kernel, shared: Shared): void {\n const { THREE, cfg, colliderChanged, invalidateShadow, invalidate, UV_SCALE, applyPart, texture } = K;\n const ivRoomEffective = (...a: any[]): any => K.ivRoomEffective(...a);\n const ivRoomLight = (...a: any[]): any => K.ivRoomLight(...a);\n // ---------------- 60 interaction (moving parts, doors, lights, object collision) ----------------\n // ===== interaction: free flight, object collision, handles, switches, curtains, gates and cabinets =====\n // Moving pieces are drawn as \"ix:...\" groups (one mesh per material) and then wrapped in two nodes:\n // \"outer\" at the hinge/axis (item position + rotation) and \"inner\", which receives the animation in the item's frame.\n shared.partState = new Map();\n // piece name / 'light:living' -> target; reset together with DOOR_STATE when the model changes\n const newInteractiveState = () => ({ defs: new Map(), items: [], pieces: [], lights: new Map(), litRooms: new Set(), objs: [], anim: new Set(), msg: null, target: null });\n shared.inter = newInteractiveState();\n const MESSAGE_MS = 2200;\n UV_SCALE.doorWood = 1.0;\n UV_SCALE.doorPaint = 1.0;\n function createInteractiveMaterials(mats) {\n const rg = (s => () => (s = (s * 16807) % 2147483647) / 2147483647)(777);\n const wood = texture(256, (g, n) => { // soft vertical grain, light tone to take the vertex colour\n g.fillStyle = '#e8dccb'; g.fillRect(0, 0, n, n);\n for (let i = 0; i < 90; i++) { const x = rg() * n, w = 1 + rg() * 5, v = 150 + rg() * 90 | 0; g.fillStyle = `rgba(${v - 40},${v - 70},${v - 110},${0.10 + rg() * 0.16})`; g.fillRect(x, 0, w, n); }\n for (let i = 0; i < 400; i++) { const x = rg() * n, y = rg() * n; g.fillStyle = `rgba(90,60,30,${0.05 + rg() * 0.1})`; g.fillRect(x, y, 1, 8 + rg() * 30); }\n for (let k = 0; k < 2; k++) { const x = 30 + rg() * 190, y = 30 + rg() * 190; g.strokeStyle = 'rgba(70,45,20,0.25)'; for (let r = 2; r < 9; r += 2) { g.beginPath(); g.ellipse(x, y, r * 0.8, r * 2.2, 0, 0, 6.3); g.stroke(); } }\n g.fillStyle = 'rgba(60,40,20,0.22)'; g.fillRect(0, 0, 2, n); g.fillRect(n - 2, 0, 2, n);\n });\n const paint = texture(256, (g, n) => { // matte paint with a slight roller texture and scratches\n g.fillStyle = '#f4f3f0'; g.fillRect(0, 0, n, n);\n for (let i = 0; i < 2600; i++) { const v = 220 + rg() * 35 | 0; g.fillStyle = `rgba(${v},${v},${v},0.55)`; g.fillRect(rg() * n, rg() * n, 1 + rg() * 3, 2 + rg() * 8); }\n for (let i = 0; i < 40; i++) { g.strokeStyle = `rgba(0,0,0,${0.03 + rg() * 0.05})`; g.beginPath(); const x = rg() * n, y = rg() * n; g.moveTo(x, y); g.lineTo(x + (rg() - 0.5) * 24, y + rg() * 30); g.stroke(); }\n });\n mats.doorWood = new THREE.MeshLambertMaterial({ vertexColors: true, map: wood });\n mats.doorPaint = new THREE.MeshLambertMaterial({ vertexColors: true, map: paint });\n mats.off = new THREE.MeshBasicMaterial({ vertexColors: true, color: 0x8a8780 });\n }\n // ---------- utilities ----------\n const _EY = new THREE.Vector3(0, 1, 0), _UM3 = new THREE.Vector3(1, 1, 1);\n const hudMessage = text => { shared.inter.msg = { text, until: performance.now() + MESSAGE_MS }; if (cfg.onMessage) cfg.onMessage(text); };\n function definePiece(name, def) { def.name = name; def.meshes = []; def.t = def.target = shared.partState.has(name) ? shared.partState.get(name) : (def.t0 || 0); shared.inter.defs.set(name, def); shared.inter.pieces.push(def); return def; }\n const localOf = (M, lx, lz) => { const c = Math.cos(M.ry), s = Math.sin(M.ry); return [M.x + lx * c + lz * s, M.z - lx * s + lz * c]; };\n function visibleChain(o) { for (let n = o; n; n = n.parent) if (!n.visible) return false; return true; }\n function assembleInteractive(gs) {\n for (const [name, def] of shared.inter.defs) {\n const g = gs[name]; if (!g) continue; delete gs[name];\n const outer = new THREE.Group(); outer.position.set(...def.pivot); outer.rotation.y = def.ry || 0; outer.updateMatrix();\n const inv = new THREE.Matrix4().compose(new THREE.Vector3(...def.pivot), new THREE.Quaternion().setFromAxisAngle(_EY, def.ry || 0), _UM3).invert();\n g.traverse(o => { if (o.isMesh) { o.geometry.applyMatrix4(inv); o.userData.piece = def; def.meshes.push(o); } });\n outer.add(g); def.outer = outer; def.inner = g;\n const parent = def.leaf ? def.leaf.gs[def.k] : (gs[def.parent] || (gs[def.parent] = new THREE.Group()));\n if (parent) parent.add(outer);\n if (def.roomId) { if (!shared.inter.lights.has(def.roomId)) shared.inter.lights.set(def.roomId, []); shared.inter.lights.get(def.roomId).push(def); }\n applyPiece(def);\n }\n for (const roomId of shared.inter.litRooms) applyLight(roomId);\n shared.inter.defs.forEach(d => { if (d.col) d.col.off = d.t > 0.5; });\n }\n function applyPiece(p) {\n const n = p.inner; if (!n) return;\n switch (p.kind) {\n case 'swing': n.rotation.y = p.sgn * p.t * p.angle; break;\n case 'drawer': n.position.z = p.t * p.travel; break;\n case 'curtain': n.scale.x = 1 + (p.k - 1) * p.t; break;\n case 'gate_swing': n.rotation.y = p.t * p.angle; break;\n case 'gate_tilting': n.rotation.x = p.t * p.angle; break;\n case 'gate_sliding': n.position.x = p.t * p.travel; break;\n case 'light_switch': n.rotation[p.axis] = (p.t * 2 - 1) * 0.42 * p.sgn; break;\n case 'handle': n.rotation[p.axis] = p.t * p.angle; break;\n case 'part': applyPart(n, p.t); return; // moving part of the part:<id>:<n> contract (mailbox): pose by userData.opens\n }\n n.updateMatrix();\n }\n const DURATION = { swing: 0.55, drawer: 0.4, curtain: 0.9, gate_swing: 0.9, gate_tilt: 1.4, gate_slide: 1.6, lightSwitch: 0.12, part: 0.4 };\n function animateInteractive(dt) {\n if (!shared.inter.anim.size) return;\n for (const p of shared.inter.anim) {\n const step = dt / (DURATION[p.kind] || 0.5), d = p.target - p.t;\n p.t = Math.abs(d) <= step ? p.target : p.t + Math.sign(d) * step; applyPiece(p);\n if (p.col && p.col.off !== (p.target > 0.5)) { p.col.off = p.target > 0.5; colliderChanged(p.col); } // the gate stops blocking as soon as it starts to open\n if (p.t === p.target) shared.inter.anim.delete(p);\n }\n invalidateShadow();\n }\n function togglePiece(p) { p.target = p.target > 0.5 ? 0 : 1; shared.partState.set(p.name, p.target); if (p.col && p.col.off !== (p.target > 0.5)) { p.col.off = p.target > 0.5; colliderChanged(p.col); } shared.inter.anim.add(p); }\n const lightBase = roomId => (roomId == null ? true : (shared.partState.has('light:' + roomId) ? !!shared.partState.get('light:' + roomId) : !!shared.ctx.night));\n const lightOn = roomId => { const S = roomId != null && shared.ctx.iv && shared.ctx.iv.roomStates.get(roomId); return S ? S.ef : lightBase(roomId); };\n // with cfg.interactives the room is lit when some kit lamp is on and powered\n function applyLight(roomId) {\n const on = lightOn(roomId);\n for (const d of shared.inter.lights.get(roomId) || []) for (const m of d.meshes) if (m.name.endsWith('/emissive')) m.material = on ? shared.mats.emissive : shared.mats.off;\n const sw = shared.inter.defs.get('ix:int:' + roomId); if (sw) { sw.target = on ? 1 : 0; if (sw.t !== sw.target) shared.inter.anim.add(sw); }\n invalidate();\n }\n function toggleLight(roomId) {\n const S = shared.ctx.iv && shared.ctx.iv.roomStates.get(roomId);\n if (S) { ivRoomLight(shared.ctx.iv, roomId, !S.ef); const ef = ivRoomEffective(shared.ctx.iv, S); if (ef !== S.ef) { S.ef = ef; applyLight(roomId); if (cfg.onLight) cfg.onLight(roomId, ef); } return; }\n shared.partState.set('light:' + roomId, !lightOn(roomId)); applyLight(roomId); if (cfg.onLight) cfg.onLight(roomId, lightOn(roomId));\n }\n Object.assign(K, { newInteractiveState, MESSAGE_MS, createInteractiveMaterials, _EY, _UM3, hudMessage, definePiece, localOf, visibleChain, assembleInteractive, applyPiece, DURATION, animateInteractive, togglePiece, lightBase, lightOn, applyLight, toggleLight });\n}\n","// Literal port of the team's Casa3DSDK (module interaction/collision). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installInteractionCollision(K: Kernel, shared: Shared): void {\n // ---------- collision with objects (first person) ----------\n const NO_COLLIDE = /(^|_)(rug|floor|concrete|dirt|lawn|deck|ceiling_light|pendant|chandelier|spot|picture|curtain|blinds|wall_shelving|plank_shelf|wall_ac|ac_condenser|pool|soaking_tub|pergola|stairs|mirror)/;\n function registerCollision(m, M) {\n const h = m.h || 0, y = M.y || 0;\n if (NO_COLLIDE.test(m.type) || m.category === 'ground_cover' || h < 0.3 || y >= 0.9 || !(m.w > 0.05) || !(m.d > 0.05)) return;\n let w = m.w, d = m.d; if (/tree|palm_tree/.test(m.type)) { w = Math.min(w, 0.5); d = Math.min(d, 0.5); }\n shared.inter.objs.push({ f: M.floor, cx: m.x, cz: m.z, c: Math.cos(M.ry), s: Math.sin(M.ry), hw: w / 2, hd: d / 2, type: m.type });\n }\n function objectDistance(o, x, z) { // signed distance to the rectangle (negative inside)\n const dx = x - o.cx, dz = z - o.cz, lx = dx * o.c - dz * o.s, lz = dx * o.s + dz * o.c, ex = Math.abs(lx) - o.hw, ez = Math.abs(lz) - o.hd;\n return ex > 0 || ez > 0 ? Math.hypot(Math.max(ex, 0), Math.max(ez, 0)) : Math.max(ex, ez);\n }\n function collideObject(x, z, fx, fz, floor) { // blocks entering or going deeper into an object; whoever is already inside (when clicking the room) can leave\n const R = 0.2;\n for (const o of shared.inter.objs) { if (o.f !== -1 ? o.f !== floor : floor !== 0) continue; const d1 = objectDistance(o, x, z); if (d1 < R && d1 < objectDistance(o, fx, fz) - 1e-6) return true; }\n return false;\n }\n // collision of whoever walks (radius opt.radius, default 0.24): walls, closed doors, lot walls, gates and furniture. opt.from = [x, z] of where they came from (whoever is already inside a piece of furniture can leave).\n // The game may ignore this and use its own grid: the same volumes are in colliders (aabb / obb) and the open/closed state arrives through cfg.onCollider.\n function collideAt(x, z, floor, opt) {\n opt = opt || {}; const R = opt.radius != null ? opt.radius : 0.24;\n for (const c of shared.ctx.colliders) {\n if (c.off) continue;\n if (c.f !== -1 && c.f !== floor) continue; if (c.f === -1 && floor !== 0) continue;\n const nx = Math.max(c.x0, Math.min(x, c.x1)), nz = Math.max(c.z0, Math.min(z, c.z1));\n if ((x - nx) ** 2 + (z - nz) ** 2 < R * R) return true;\n }\n const de = opt.from || [x + 1e4, z + 1e4];\n return collideObject(x, z, de[0], de[1], floor);\n }\n Object.assign(K, { NO_COLLIDE, registerCollision, objectDistance, collideObject, collideAt });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\n// Literal port of the team's Casa3DSDK (module interaction/items). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installInteractionItems(K: Kernel, shared: Shared): void {\n const { t, LIGHTS, cursor, definePiece, localOf, registerCollision, togglePiece } = K;\n // ---------- construction of the items (called by houseItems) ----------\n const DOOR_ITEM = /^(tv_unit|tv_unit_small|tv_unit_large|sideboard|china_cabinet|filing_cabinet|pantry|laundry_cabinet|wardrobe|wardrobe_small|wardrobe_large|closet_wardrobe|kitchen_cabinet|kitchen_cabinet_large|kitchen_cabinet_small|fridge|fridge_large|display_fridge_medium|display_fridge)$/;\n const DRAWER_ITEM = /^(console_table|dresser|nightstand|vanity_table)$/;\n const LIGHT_TYPES = new Set(['ceiling_light', 'pendant', 'chandelier', 'track_spot', 'hanging_plant']);\n function objectName(type, drawer) { return drawer ? 'drawer' : /^wardrobe/.test(type) ? 'wardrobe' : /fridge|refrig|freezer/.test(type) ? 'fridge' : /pantry/.test(type) ? 'pantry' : 'cabinet'; }\n function recordApi(api) { const calls = [], pr = { light: (MM, ...a) => api.light(MM, ...a) }; for (const n of ['box', 'cylinder', 'leaf', 'plane']) pr[n] = (MM, ...a) => { calls.push([n, a]); }; return { pr, calls }; }\n function buildItem(m, M, ent, api, parent) {\n registerCollision(m, M);\n const type = m.type;\n if (LIGHT_TYPES.has(type)) return lightItem(m, M, ent, api, parent);\n if (type === 'curtain') return curtainItem(m, M, ent, api, parent);\n if (DOOR_ITEM.test(type) || DRAWER_ITEM.test(type)) return furnitureItem(m, M, ent, api, parent, DRAWER_ITEM.test(type));\n ent.f(M, api);\n }\n function lightItem(m, M, ent, api, parent) { // own lamp: separate mesh and lights tagged with the room\n M.on = M.light = M.lit = true; const n0 = LIGHTS.length, name = shared.quality === 'game' ? 'ix:light:' + m.room + '@' + parent : 'ix:light:' + m.id; // 'game': all the room's lamps in a single piece\n cursor.group = name; try { ent.f(M, api); } finally { cursor.group = parent; }\n for (let i = n0; i < LIGHTS.length; i++) LIGHTS[i].roomId = m.room;\n if (!shared.inter.defs.has(name)) definePiece(name, { kind: 'light', pivot: [0, 0, 0], ry: 0, parent, roomId: m.room }); shared.inter.litRooms.add(m.room);\n }\n function curtainItem(m, M, ent, api, parent) {\n M.open = false; const { pr, calls } = recordApi(api); ent.f(M, pr);\n const side = { '-1': [], '1': [] }; const body = [];\n for (const c of calls) { const a = c[1]; if (c[0] === 'box' && a[0] === 'fabric') side[a[1] < 0 ? '-1' : '1'].push(c); else body.push(c); }\n const opens = Math.min(0.5, (M.w || 1.6) * 0.3), open0 = !!m.doorOpen, parts = [];\n for (const sd of [-1, 1]) {\n const L = side[sd]; if (!L.length) continue;\n const exterior = Math.max(...L.map(c => Math.abs(c[1][1]) + c[1][4] / 2)), inn = Math.min(...L.map(c => Math.abs(c[1][1]) - c[1][4] / 2)), width = Math.max(0.2, exterior - Math.max(0, inn));\n const [px, pz] = localOf(M, sd * exterior, 0), name = 'ix:curtain:' + m.id + ':' + (sd < 0 ? 'E' : 'D');\n const p = definePiece(name, { kind: 'curtain', pivot: [px, M.base, pz], ry: M.ry, parent, k: Math.max(0.15, Math.min(1, opens / width)), t0: open0 ? 1 : 0 }); parts.push(p);\n cursor.group = name; for (const c of L) api[c[0]](M, ...c[1]); cursor.group = parent;\n }\n for (const c of body) api[c[0]](M, ...c[1]);\n if (!parts.length) return;\n const [ax, az] = localOf(M, 0, 0.2);\n shared.inter.items.push({ type: 'curtain', id: m.id, floor: M.floor, anchor: [ax, M.base + (M.y || 0) + (m.h || 2) * 0.5, az], range: 2.4, angle: 1.0, pieces: parts, text: () => t(parts[0].target > 0.5 ? 'prompt.close' : 'prompt.open', { what: t('what.curtain') }), action: () => { const al = parts[0].target > 0.5 ? 0 : 1; for (const p of parts) { p.target = al; shared.partState.set(p.name, al); shared.inter.anim.add(p); } } });\n }\n function furnitureItem(m, M, ent, api, parent, drawer) {\n const { pr, calls } = recordApi(api), front = M.d / 2; ent.f(M, pr);\n const panels = []; // {i, x0,x1,y0,y1, zc, ext:[indices], h: pull side}\n calls.forEach((c, i) => {\n if (c[0] !== 'box') return; const [mat, x, y, z, w, h, d, , ry, rx, rz] = c[1];\n if (ry || rx || rz) return;\n const ok = drawer ? (mat === 'wood' && d <= 0.02 && z + d / 2 >= front - 0.005 && h >= 0.08 && w >= 0.15)\n : ((mat === 'plain' || mat === 'wood') && d <= 0.045 && z + d / 2 >= front - 0.03 && h >= 0.25 && w >= 0.2 && w <= M.w * 1.02);\n if (ok) panels.push({ i, x0: x - w / 2, x1: x + w / 2, y0: y, y1: y + h, zc: z, exterior: [], grip: 0 });\n });\n const owner = new Map(); // call index -> panel\n panels.forEach(p => owner.set(p.i, p));\n const overlap = (a0, a1, b0, b1) => Math.min(a1, b1) - Math.max(a0, b0);\n calls.forEach((c, i) => {\n if (owner.has(i)) return; const a = c[1]; let x0, x1, y0, y1, ok = false, grip = 0, wide = false;\n if (c[0] === 'box') { const [mat, x, y, z, w, h, d, , ry, rx, rz] = a; if (ry || rx || rz || d > 0.05 || z + d / 2 < front - 0.005 || w > M.w * 1.01) return; if (!(mat === 'metal' || mat === 'glass' || mat === 'plain')) return; x0 = x - w / 2; x1 = x + w / 2; y0 = y; y1 = y + h; ok = true; grip = mat === 'metal' && w <= 0.06 ? x : 0; wide = mat === 'glass'; }\n else if (c[0] === 'cylinder') { const [mat, x, y, z, r] = a; if (mat !== 'metal' || z < front - 0.005 || r > 0.03) return; x0 = x - r; x1 = x + r; y0 = y - r; y1 = y + r; ok = true; }\n if (!ok) return;\n const candidate = panels.filter(p => overlap(x0, x1, p.x0, p.x1) > 0 && overlap(y0, y1, p.y0, p.y1) > 0);\n if (!candidate.length) return;\n if (wide && candidate.length > 1) { for (const p of candidate) { p.exterior.push(['box', [a[0], (p.x0 + p.x1) / 2, a[2], a[3], p.x1 - p.x0 - 0.02, a[5], a[6], a[7], a[8], a[9], a[10]]]); } owner.set(i, 'dup'); return; }\n candidate.sort((p, q) => overlap(x0, x1, q.x0, q.x1) - overlap(x0, x1, p.x0, p.x1));\n owner.set(i, candidate[0]); if (grip) candidate[0].grip = grip;\n });\n const name = objectName(m.type, drawer), parts = [];\n panels.forEach((p, k) => {\n const nm = 'ix:' + (drawer ? 'drawer' : 'door') + ':' + m.id + ':' + k, cx = (p.x0 + p.x1) / 2, width = p.x1 - p.x0;\n let def;\n if (drawer) { const [px, pz] = localOf(M, cx, front); def = definePiece(nm, { kind: 'drawer', pivot: [px, M.base, pz], ry: M.ry, parent, travel: Math.min(0.34, M.d * 0.7) }); }\n else { const dir = p.grip && p.grip < cx ? -1 : 1, hx = dir > 0 ? p.x0 : p.x1, [px, pz] = localOf(M, hx, p.zc); def = definePiece(nm, { kind: 'swing', pivot: [px, M.base, pz], ry: M.ry, parent, sgn: -dir, angle: 1.75 }); }\n p.def = def; parts.push(def);\n const [ax, az] = localOf(M, cx, front + 0.08);\n shared.inter.items.push({ type: drawer ? 'drawer' : 'cabinet', id: m.id, floor: M.floor, anchor: [ax, M.base + (M.y || 0) + (p.y0 + p.y1) / 2, az], range: 1.6, angle: 0.4, pieces: [def], text: () => t(def.target > 0.5 ? 'prompt.close' : 'prompt.open', { what: t('what.' + name) }), action: () => togglePiece(def) });\n def.item = shared.inter.items[shared.inter.items.length - 1];\n });\n calls.forEach((c, i) => {\n const p = owner.get(i); if (p === 'dup') return;\n cursor.group = p && p.def ? p.def.name : parent; api[c[0]](M, ...c[1]);\n });\n for (const p of panels) if (p.exterior.length) { cursor.group = p.def.name; for (const c of p.exterior) api[c[0]](M, ...c[1]); }\n cursor.group = parent;\n }\n Object.assign(K, { DOOR_ITEM, DRAWER_ITEM, LIGHT_TYPES, objectName, recordApi, buildItem, lightItem, curtainItem, furnitureItem });\n}\n","// Literal port of the team's Casa3DSDK (module interaction/fittings). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installInteractionFittings(K: Kernel, shared: Shared): void {\n const { t, EPS, OPEN_AREA, Y0, applyPiece, bx, cursor, definePiece, gates, lightOn, roomAt, slideDirection, toggleLight, togglePiece } = K;\n // ---------- lot gates ----------\n function gatesInteractive() {\n const lt = shared.ctx.r.lot; if (!lt) return;\n const cz0 = (lt.rect[1] + lt.rect[3]) / 2;\n const orig = K.getBx(), gs = lt.gates, opening = gs.map(g => g.open), reg = gs.map(g => { const color = g.model === 'sliding', dx = color ? slideDirection(g, lt) : 0, a = g.u - g.width / 2, b = g.u + g.width / 2, zc = g.v + (cz0 - g.v >= 0 ? 1 : -1) * 0.19; return { g, a, b, v: g.v, x0: Infinity, x1: -Infinity, y1: 0, color, dx, zc, lo: color ? (dx > 0 ? a + 0.04 : a - 0.9) : a + 0.05, hi: color ? (dx > 0 ? b + 0.9 + 0.01 : b - 0.04) : b + 0.01, zv: color ? 0.07 : 0.04, zm: color ? zc : g.v }; });\n K.setBx(function (mat, x0, y0, z0, x1, y1, z1, color) {\n if (mat === 'metal') for (const r of reg) if (r.g.axis === 'u' && x0 >= r.lo && x1 <= r.hi && z0 >= r.zm - r.zv && z1 <= r.zm + r.zv && y0 >= 0.03) {\n r.x0 = Math.min(r.x0, x0); r.x1 = Math.max(r.x1, x1); r.y1 = Math.max(r.y1, y1);\n const g0 = cursor.group; cursor.group = 'ix:gate:' + r.g.id; orig(mat, x0, y0, z0, x1, y1, z1, color); cursor.group = g0; return;\n }\n return orig(mat, x0, y0, z0, x1, y1, z1, color);\n });\n const n0 = shared.ctx.colliders.length;\n try { gs.forEach(g => { g.open = false; }); gates(); } finally { K.setBx(orig); gs.forEach((g, i) => { g.open = opening[i]; }); }\n const cols = shared.ctx.colliders.slice(n0), cz = (lt.rect[1] + lt.rect[3]) / 2, cu = (lt.rect[0] + lt.rect[2]) / 2;\n reg.forEach((r, i) => {\n const g = r.g; if (!isFinite(r.x0)) return;\n const sd = (g.axis === 'u' ? cz - g.v : cu - g.u) >= 0 ? 1 : -1, name = 'ix:gate:' + g.id, ped = g.model === 'pedestrian', tilt = g.model === 'tilting';\n const base = { parent: 'lot', ry: 0, t0: g.open ? 1 : 0, col: cols[i], gate: g };\n const p = ped ? definePiece(name, Object.assign(base, { kind: 'gate_swing', pivot: [r.x0, 0, g.v], angle: -sd * 1.65 }))\n : tilt ? definePiece(name, Object.assign(base, { kind: 'gate_tilting', pivot: [(r.x0 + r.x1) / 2, r.y1, g.v], angle: -sd * 1.45 }))\n : definePiece(name, Object.assign(base, { kind: 'gate_sliding', pivot: [r.x0, 0, r.zm], travel: r.dx * g.width }));\n if (p.col) p.col.off = p.target > 0.5;\n const text = () => t(p.target > 0.5 ? 'prompt.close' : 'prompt.open', { what: t(ped ? 'what.pedestrianGate' : 'what.garageGate') });\n shared.inter.items.push({ type: 'gate', id: g.id, floor: -1, anchor: [g.u, 1.0, g.v + sd * 0.4], range: 2.8, angle: 0.9, pieces: [p], text, action: () => togglePiece(p), noWall: true });\n });\n }\n // ---------- mailbox (R20): E opens and closes the lid (part mailbox_door, registered in CTX.parts) ----------\n function mailboxInteractive() {\n for (const m of shared.ctx.r.items) {\n if (m.type !== 'mailbox') continue;\n const g = shared.ctx.parts && shared.ctx.parts['mailbox_' + m.id]; if (!g) continue;\n const name = 'ix:correio:' + m.id, def = definePiece(name, { kind: 'part', pivot: [0, 0, 0], ry: 0, parent: 'lot' }); def.inner = g;\n const fx = Math.sin(m.ry || 0), fz = Math.cos(m.ry || 0), ay = (m.y || 1) + (m.h || 0.3) * 0.4;\n shared.inter.items.push({ type: 'mailbox', id: m.id, floor: -1, anchor: [m.x + fx * 0.2, ay, m.z + fz * 0.2], range: 2.2, angle: 0.7, pieces: [def], text: () => t(def.target > 0.5 ? 'prompt.close' : 'prompt.open', { what: t('what.mailbox') }), action: () => togglePiece(def), noWall: true });\n applyPiece(def);\n }\n }\n // ---------- switches ----------\n function placeSwitches() {\n const R = shared.ctx.r, used = new Set();\n for (const c of R.rooms) {\n if (c.type === 'void' || OPEN_AREA(c) || !shared.inter.litRooms.has(c.id) || used.has(c.id) || (shared.ctx.iv && shared.ctx.iv.switchRooms.has(c.id))) continue;\n const doors = R.doors.filter(p => p.floor === c.floor && (p.a === c.id || p.b === c.id));\n doors.sort((p, q) => ((q.exterior ? 1 : 0) - (p.exterior ? 1 : 0)) * (c.type === 'living' ? 1 : -1));\n for (const p of doors) if (putSwitch(c, p)) { used.add(c.id); break; }\n }\n }\n function putSwitch(c, p) {\n const R = shared.ctx.r, f = p.floor, alongU = p.axis === 'u', L = p.pos, a = p.at - p.width / 2, b = p.at + p.width / 2;\n const wref = R.walls.find(w => w.floor === f && w.axis === p.axis && Math.abs((alongU ? w.v0 : w.u0) - L) < EPS), th = wref ? wref.thickness || 0.15 : 0.15;\n const inside = sd => { const cc = roomAt(f, alongU ? p.at : L + sd * 0.4, alongU ? L + sd * 0.4 : p.at); return cc && cc.id === c.id; };\n const sd = inside(1) ? 1 : inside(-1) ? -1 : 0; if (!sd) return false;\n const sides = p.hinge === 'end' ? [-1, 1] : [1, -1]; // lock side first\n for (const ld of sides) {\n const u = ld > 0 ? b + 0.2 : a - 0.2, lo = u - 0.1, hi = u + 0.1;\n const wall = R.walls.some(w => w.floor === f && w.axis === p.axis && w.type === 'wall' && Math.abs((alongU ? w.v0 : w.u0) - L) < EPS && Math.min(alongU ? w.u0 : w.v0, alongU ? w.u1 : w.v1) <= lo - 0.08 && Math.max(alongU ? w.u0 : w.v0, alongU ? w.u1 : w.v1) >= hi + 0.08);\n const free = !R.doors.concat(R.windows).some(o => o.floor === f && o.axis === p.axis && Math.abs(o.pos - L) < EPS && o.at + o.width / 2 > lo - 0.05 && o.c - o.width / 2 < hi + 0.05);\n if (!wall || !free) continue;\n const y0 = Y0(f), yc = y0 + 1.1, face = L + sd * th / 2, roomId = c.id, g0 = cursor.group;\n cursor.group = 'f' + f;\n if (alongU) bx('plain', u - 0.043, yc - 0.065, Math.min(face, face + sd * 0.012), u + 0.043, yc + 0.065, Math.max(face, face + sd * 0.012), 0xe9e5dc);\n else bx('plain', Math.min(face, face + sd * 0.012), yc - 0.065, u - 0.043, Math.max(face, face + sd * 0.012), yc + 0.065, u + 0.043, 0xe9e5dc);\n const f2 = face + sd * 0.012, f3 = f2 + sd * 0.014;\n cursor.group = 'ix:int:' + roomId;\n if (alongU) bx('plain', u - 0.016, yc - 0.032, Math.min(f2, f3), u + 0.016, yc + 0.032, Math.max(f2, f3), 0xf7f4ec);\n else bx('plain', Math.min(f2, f3), yc - 0.032, u - 0.016, Math.max(f2, f3), yc + 0.032, u + 0.016, 0xf7f4ec);\n cursor.group = g0;\n const pv = alongU ? [u, yc, f2] : [f2, yc, u];\n const piece = definePiece('ix:int:' + roomId, { kind: 'light_switch', pivot: pv, ry: 0, parent: 'f' + f, axis: alongU ? 'x' : 'z', sgn: alongU ? sd : -sd, t0: lightOn(roomId) ? 1 : 0 });\n piece.t = piece.target = lightOn(roomId) ? 1 : 0;\n const an = alongU ? [u, yc, face + sd * 0.12] : [face + sd * 0.12, yc, u];\n shared.inter.items.push({ type: 'light_switch', id: roomId, floor: f, anchor: an, range: 1.5, angle: 0.45, pieces: [piece], text: () => t(lightOn(roomId) ? 'prompt.lightOff' : 'prompt.lightOn'), action: () => toggleLight(roomId) });\n return true;\n }\n return false;\n }\n Object.assign(K, { gatesInteractive, mailboxInteractive, placeSwitches, putSwitch });\n}\n","// Literal port of the team's Casa3DSDK (module interaction/doors). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installInteractionDoors(K: Kernel, shared: Shared): void {\n const { t, colliderChanged, invalidateShadow, applyPiece, hudMessage } = K;\n // ---------- doors: turning handle, lock and phased movement ----------\n function linkDoorLeaves() { // called after assembleInteractive: wires the handles to the leaf\n for (const fo of shared.ctx.leaves) fo.handles = (fo.handleNames || []).map(n => shared.inter.defs.get(n)).filter(Boolean);\n }\n function handleApply(fo) { for (const mc of fo.handles || []) { mc.t = fo.hT || 0; applyPiece(mc); } }\n function toggleDoor(fo) {\n if (fo.phase === 'rattle') return;\n if (fo.phase === 'handle' || fo.phase === 'swing') { fo.open = !fo.open; shared.doorState.set(fo.id, fo.open); fo.col.off = fo.open; colliderChanged(fo.col); fo.anim = true; fo.phase = 'swing'; return; } // reverses in the middle of the movement\n if (fo.blockedFlag || fo.locked) { fo.phase = 'rattle'; fo.jig = 0.7; shared.ctx.animateDoorsOn = true; hudMessage(t(fo.blockedFlag ? 'message.boarded' : 'message.locked')); return; }\n fo.open = !fo.open; shared.doorState.set(fo.id, fo.open); fo.col.off = fo.open; colliderChanged(fo.col); fo.anim = true; shared.ctx.animateDoorsOn = true;\n if (fo.handles && fo.handles.length) { fo.phase = 'handle'; fo.hT = fo.hT || 0; } else fo.phase = 'swing';\n }\n function animateDoors(dt) {\n if (!shared.ctx.animateDoorsOn) return; let active = false;\n for (const fo of shared.ctx.leaves) {\n if (!fo.phase) continue; active = true;\n if (fo.phase === 'handle') { fo.hT = Math.min(1, (fo.hT || 0) + dt / 0.16); handleApply(fo); if (fo.hT >= 1) fo.phase = 'swing'; }\n else if (fo.phase === 'swing') {\n const target = fo.open ? 1 : 0, d = target - fo.t, step = dt / 0.35; fo.t = Math.abs(d) <= step ? target : fo.t + Math.sign(d) * step; applyLeaf(fo);\n if (fo.t === target) { fo.anim = false; fo.phase = (fo.handles && fo.handles.length) ? 'rise' : null; }\n } else if (fo.phase === 'rise') { fo.hT = Math.max(0, fo.hT - dt / 0.2); handleApply(fo); if (fo.hT <= 0) fo.phase = null; }\n else if (fo.phase === 'rattle') { fo.jig -= dt; fo.hT = fo.jig > 0 ? 0.55 * Math.abs(Math.sin(fo.jig * 26)) : 0; handleApply(fo); if (fo.jig <= 0) { fo.hT = 0; handleApply(fo); fo.phase = null; } }\n }\n shared.ctx.animateDoorsOn = active; invalidateShadow();\n }\n function wallBlocks(ex, ez, ax, az, floor) { // does the eye->target segment cut a wall?\n const n = shared.ctx.wallColliders != null ? shared.ctx.wallColliders : 0;\n for (let i = 0; i < n; i++) {\n const c = shared.ctx.colliders[i]; if (c.f !== floor && !(c.f === -1 && floor === 0)) continue;\n let t0 = 0, t1 = 1; const dx = ax - ex, dz = az - ez;\n for (const [p, d, lo, hi] of [[ex, dx, c.x0 + 0.01, c.x1 - 0.01], [ez, dz, c.z0 + 0.01, c.z1 - 0.01]]) {\n if (Math.abs(d) < 1e-9) { if (p < lo || p > hi) { t0 = 2; break; } } else { let a = (lo - p) / d, b = (hi - p) / d; if (a > b) [a, b] = [b, a]; t0 = Math.max(t0, a); t1 = Math.min(t1, b); if (t0 > t1) break; }\n }\n if (t0 <= t1) return true;\n }\n return false;\n }\n const doorText = fo => (fo.blockedFlag || fo.locked ? t('prompt.lockedDoor') : t(fo.open ? 'prompt.close' : 'prompt.open', { what: t('what.door') }));\n function applyLeaf(fo) {\n for (const g of fo.gs) { if (fo.type === 'steel') g.scale.y = 1 - fo.t * (1 - fo.minScale); else g.rotation.y = fo.t * fo.rot; g.updateMatrix(); }\n }\n Object.assign(K, { linkDoorLeaves, handleApply, toggleDoor, animateDoors, wallBlocks, doorText, applyLeaf });\n}\n","// Literal port of the team's Casa3DSDK (module interaction/target). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installInteractionTarget(K: Kernel, shared: Shared): void {\n const { doorText, toggleDoor, visibleChain, wallBlocks } = K;\n const ivTarget = (...a: any[]): any => K.ivTarget(...a);\n // interaction target of whoever is at o = {x, y, z, yaw, pitch, floor} (eye, in house coordinates): the best among doors (by distance and angle) and items (anchor, reach, angle or aim ray).\n // opts.hit(meshes) receives the visible meshes of the moving pieces and returns the first intersection (THREE) or nothing: the app casts its own camera ray (aim at the screen centre).\n function targetOf(o, opt) {\n if (!o) return null; opt = opt || {};\n const ex = o.x, ey = o.y, ez = o.z, floor = o.floor, cp = Math.cos(o.pitch || 0), vx = Math.sin(o.yaw) * cp, vy = Math.sin(o.pitch || 0), vz = Math.cos(o.yaw) * cp;\n let best = null; const tries = (score, text, action, target) => { if (!best || score < best.score) best = { score, text, action, target }; };\n for (const fo of shared.ctx.leaves) {\n if (fo.floor !== floor) continue; const d = Math.hypot(fo.cx - ex, fo.cz - ez); if (d > 1.7) continue;\n const angle = Math.acos(Math.max(-1, Math.min(1, ((fo.cx - ex) * vx + (fo.cz - ez) * vz) / (d || 1) / Math.max(0.2, Math.hypot(vx, vz)))));\n if (angle > 1.35 && d > 0.9) continue;\n tries(angle * 1.6 + d * 0.5 + (angle < 0.25 ? 0 : 0.6), doorText(fo), () => toggleDoor(fo), fo);\n }\n const vis = shared.inter.pieces.flatMap(p => p.meshes).filter(visibleChain), hit = vis.length && opt.strike ? opt.strike(vis) : null;\n const kitA = shared.ctx.iv ? ivTarget(shared.ctx.iv, o, opt && opt.interactives) : null; // kit object: if it is between the eye and the piece hit by the ray (mailbox in front of the gate), the piece behind does not count\n const nearKit = kitA && hit && Math.hypot(kitA.target.pos[0] - ex, kitA.target.pos[1] - ey, kitA.target.pos[2] - ez) < hit.distance + 0.1;\n const pieceHit = hit && !nearKit && hit.object.userData.piece;\n for (const it of shared.inter.items) {\n if (it.floor !== floor && !(it.floor === -1 && floor === 0)) continue;\n const [ax, ay, az] = it.anchor, dx = ax - ex, dy = ay - ey, dz = az - ez, d = Math.hypot(dx, dy, dz), dh = Math.hypot(dx, dz); if (dh > it.range + 0.4) continue;\n const angle = Math.acos(Math.max(-1, Math.min(1, (dx * vx + dy * vy + dz * vz) / (d || 1))));\n const byRay = pieceHit && it.pieces.includes(pieceHit) && hit.distance <= it.range + 0.5;\n if (!byRay && !(dh <= it.range && angle <= it.angle)) continue;\n if (!it.noWall && wallBlocks(ex, ez, ax, az, it.floor < 0 ? 0 : it.floor)) continue;\n tries((byRay ? 0 : angle * 2) + d * 0.3 - (byRay ? 1.5 : 0), it.text(), it.action, it);\n }\n if (kitA) tries(kitA.score - (nearKit ? 0.5 : 0), kitA.text, kitA.action, kitA.target);\n return best;\n }\n Object.assign(K, { targetOf });\n}\n","// Literal port of the team's Casa3DSDK (module interactables/bridge). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installInteractablesBridge(K: Kernel, shared: Shared): void {\n const { t, THREE, invalidate, invalidateShadow, cfg, DOC, LIGHT_TYPES, _Y, _q, _v3, accFor, applyLight, cursor, hashString, hudMessage, lightBase, pieceRecord, put, rgbOf, sh, wallBlocks } = K;\n const enter = (...a: any[]): any => K.enter(...a);\n const roomLightMask = (...a: any[]): any => K.roomLightMask(...a);\n // ---------------- 75 interactables (cfg.interactives) ----------------\n // ===== interactive objects of the game-interactables kit (sdk/interactables) in place of the house's static or simple furniture =====\n // With cfg.interactives the SDK plans the house with the interactables adapter (res -> kit objects), creates the kit world, wires the water (house.water), the circuits (res.electrical),\n // the switches to the room lamps and the breaker panel. What the kit draws enters the house accumulators (one mesh per group and material, no extra draw call);\n // only the moving pieces (doors, drawers, lids, keys, curtains) stay in groups of their own. house.interactives exposes the world, the E target, the seat and the block.\n const IV_MATERIAL = { plain: 'plain', metal: 'metal', wood: 'wood', glass: 'glass', fabric: 'fabric', plant: 'plant', water: 'water', emissive: 'emissive', atlas_picture: 'picture', atlas_floor: 'floor' };\n const IV_WIRE = { conduit: 0xcfcdc4, cable: 0x2a2724, drop: 0x151515, cord: 0x1b1b1d, earth: 0x2f7a3a, hose: 0xb0551c };\n const IV_DOOR = /^(door|drawer)/;\n const ivGroup = e => (e.floor < 0 ? 'lot' : 'f' + Math.min(e.floor, shared.ctx.r.floors.length - 1));\n // accumulates a THREE geometry (position, normal, optional per-vertex colour, uv) in local coordinates of an object placed at (ox, oy, oz) with rotation ry, into the accumulator (SCENE.group, mat)\n function ivAccumulate(mat, g, ox, oy, oz, ry, color) {\n const P = g.attributes.position, N = g.attributes.normal, C = color == null ? g.attributes.color : null, U = g.attributes.uv, I = g.index, nv = P.count, ni = I ? I.count : nv;\n const A = accFor(mat); A.ensure(nv, ni);\n const c = Math.cos(ry), s = Math.sin(ry), b = A.nv, rgb = color != null ? rgbOf(color) : [1, 1, 1];\n for (let k = 0; k < nv; k++) {\n const x = P.getX(k), y = P.getY(k), z = P.getZ(k), o = b + k;\n A.p[o * 3] = x * c + z * s + ox; A.p[o * 3 + 1] = y + oy; A.p[o * 3 + 2] = -x * s + z * c + oz;\n if (N) { const nx = N.getX(k), ny = N.getY(k), nz = N.getZ(k); A.n[o * 3] = nx * c + nz * s; A.n[o * 3 + 1] = ny; A.n[o * 3 + 2] = -nx * s + nz * c; } else { A.n[o * 3] = 0; A.n[o * 3 + 1] = 1; A.n[o * 3 + 2] = 0; }\n if (C) { A.c[o * 3] = C.getX(k); A.c[o * 3 + 1] = C.getY(k); A.c[o * 3 + 2] = C.getZ(k); } else { A.c[o * 3] = rgb[0]; A.c[o * 3 + 1] = rgb[1]; A.c[o * 3 + 2] = rgb[2]; }\n if (U) { A.u[o * 2] = U.getX(k); A.u[o * 2 + 1] = U.getY(k); } else { A.u[o * 2] = 0; A.u[o * 2 + 1] = 0; }\n }\n if (I) for (let k = 0; k < ni; k++) A.i[A.ni + k] = b + I.getX(k); else for (let k = 0; k < ni; k++) A.i[A.ni + k] = b + k;\n A.nv += nv; A.ni += ni;\n }\n // 1st phase (before the SDK furniture): plans, creates the kit world, draws each object (static into the accumulators, moving pieces into groups) and wires water, light and the electrical grid\n function ivBuild(h, water) {\n const ik = K.IVK, r = shared.ctx.r, A = ik.A, world0 = null; void world0;\n const plane = A.plan(r, { seed: r.seed });\n const IV: any = { k: ik, plane, world: null, water, entries: new Map(), roots: [], replace: new Set(), roomStates: new Map(), lampRoom: new Map(), anim: new Map(), screens: new Map(), efx: null, items: null, itemsDirty: true, itemsT: 0, dirty: true, list: null, listT: 0, t: 0, circuits: [], switchRooms: new Set(), warnings: [], tBuild: 0 };\n h.IV = IV; const t0 = performance.now();\n const lamps = new Set(plane.items.filter(e => e.type === 'lamp').map(e => e.id));\n for (const id of plane.mapped) if (!lamps.has(id)) IV.replace.add(id);\n // lamps -> room (only the ones the SDK lights per room: ceiling light, pendant, chandelier, spot)\n const furnitureById = new Map<any, any>(r.items.map(m => [m.id, m]));\n for (const e of plane.items) {\n if (e.type !== 'lamp') continue; const m = furnitureById.get(e.id); if (!m || !LIGHT_TYPES.has(m.type) || !m.room) continue;\n let S = IV.roomStates.get(m.room); if (!S) IV.roomStates.set(m.room, S = { id: m.room, lamps: [], ef: false, switches: [] }); S.lamps.push(e.id); IV.lampRoom.set(e.id, m.room);\n }\n const wants = roomId => lightBase(roomId); // initial intent of the lamp: the room's stored state, otherwise night\n const entById = new Map<any, any>(plane.items.map(e => [e.id, e]));\n const entByItem = new Map(plane.items.map(e => [e.item, e]));\n IV.mats = { plain: shared.mats.plain, metal: shared.mats.metal, wood: shared.mats.wood, glass: shared.mats.glass, fabric: shared.mats.fabric, plant: shared.mats.plant, water: shared.mats.water, emissive: shared.mats.emissive, atlas_picture: shared.mats.picture, atlas_floor: shared.mats.floor };\n const ev = e => ivEvent(h, e);\n const world = IV.world = A.createWorld(r, { water, seed: r.seed, onEvent: ev });\n const add0 = world.add;\n world.add = (id, spec, tr) => { // initial state: lamp on if the room is lit (night or stored); switch key in the same position\n const e = entById.get(id);\n if (e && e.type === 'lamp') {\n const roomId = IV.lampRoom.get(id); spec.devices[0].on = roomId ? wants(roomId) : !!shared.ctx.night;\n // the lamp is not an E target (the switch turns it on): the action only counts with the '_x' lock open, which ivRoomLight does for an instant\n spec.parts = (spec.parts || []).concat([{ id: '_x', pivot: [0, 0, 0], motion: { kind: 'slide', axis: [0, 1, 0], distance: 0.001 }, label: '' }]);\n spec.interactions = [{ id: 'device.lamp', pos: [0, 0, 0], action: { do: 'toggle_device', device: 'lamp' }, label: '', requires: { object: id, part: '_x' } }];\n }\n else if (e && e.type === 'wall_switch') { const l = (e.connections.controls || [])[0], roomId = l && IV.lampRoom.get(l); if (roomId) for (const p of spec.parts || []) if (p.id === 'rocker') p.t0 = wants(roomId) ? 1 : 0; }\n return add0(id, spec, tr);\n };\n const added = A.add(world, plane, { isBlocked: A.blockedOf(r), build: (type, item) => ivDraw(IV, entByItem.get(item), type, item) });\n world.add = add0;\n IV.warnings = added.warnings; IV.added = added;\n if (h.state.iv) { // rebuild (night/cut): doors, drawers, breakers, appliances come back; the lamps follow the per-room intent\n try {\n const st = JSON.parse(JSON.stringify(h.state.iv));\n for (const [id, o] of Object.entries<any>(st.objects)) { const e = entById.get(id); if (!e) { delete st.objects[id]; continue; } if (e.type === 'lamp' && o.devices && o.devices.lamp) { const roomId = IV.lampRoom.get(id); o.devices.lamp.on = roomId ? wants(roomId) : !!shared.ctx.night; } else if (e.type === 'wall_switch' && o.parts && o.parts.rocker !== undefined) { const l = (e.connections.controls || [])[0], roomId = l && IV.lampRoom.get(l); if (roomId) o.parts.rocker = wants(roomId) ? 1 : 0; } }\n world.load(st);\n } catch (err) { console.warn('interactables: state', err); }\n }\n // kit switches per room; circuits\n for (const e of plane.items) if (e.type === 'wall_switch') for (const l of e.connections.controls || []) { const roomId = IV.lampRoom.get(l); if (roomId) { IV.switchRooms.add(roomId); IV.roomStates.get(roomId).switches.push(e.id); } }\n const E = r.utilities.electrical;\n if (E) for (const c of E.circuits || []) IV.circuits.push({ id: c.id, room: c.room, outlets: (c.outlets || []).slice(), switches: (c.switches || []).slice(), lamps: (c.lamps || []).slice() });\n ivCords(IV);\n for (const S of IV.roomStates.values()) S.ef = ivRoomEffective(IV, S);\n IV.tBuild = performance.now() - t0;\n return IV;\n }\n function ivRoomEffective(IV, S) { const w = IV.world; for (const id of S.lamps) if (w.power.isOn(id, 'lamp') && w.power.isPowered(id, 'lamp')) return true; return false; }\n // draws a kit object: static into the house accumulators (floor group), moving pieces in a group at the object's position\n function ivDraw(IV, ent, type, item) {\n const ik = IV.k, loc = Object.assign({}, item, { x: 0, z: 0, ry: 0 });\n const mesh = ik.gfx.createMeshApi({ quality: 'game', materials: IV.mats, shadows: true, mergeParts: true, swayAmplitude: 0.03 });\n const spec = ik.A.household.build(type, loc, mesh.api);\n const out = mesh.finish(spec);\n for (const l of out.lights) l.removeFromParent(); // the house decides the real lights (per-room lighting)\n const group = ivGroup(ent), g0 = cursor.group, root = new THREE.Group(); root.name = 'iv:' + ent.id;\n root.position.set(item.x, ent.floorY, item.z); root.rotation.y = item.ry; root.userData.iv = ent.id;\n const screen = spec.devices && spec.devices.some(d => d.kind === 'screen');\n let body = null;\n cursor.group = group; const pieceBefore = cursor.pc;\n if (type === 'gas_bottle') { // gas cylinder of the interactables kit: destruction piece (holds gas, explodes); the merged static geometry carries its range\n cursor.pc = pieceRecord('gas_cylinder:' + ent.id, 'steel', null, { floor: ent.floor, mass: 11, form: 'cyl', thickness: 0.003, fill: 0.03, contains: { fluid: 'gas', liters: 13, pressurized: true }, explodes: { energy: 120000, radius: 5, atC: 300 }, tags: ['gas_bottle'] });\n for (const m of out.group.children) if (!m.name.startsWith('static:')) m.traverse(o => { if (o.isMesh) { o.userData.destructionPart = cursor.pc.id; o.userData.destructionMaterial = 'steel'; } });\n }\n try {\n for (const m of out.group.children.slice()) {\n if (m.isMesh && m.name.startsWith('static:')) {\n if (screen && m.userData.material === 'emissive') { body = m; root.add(m); continue; } // the TV screen swaps material: stays as a mesh of its own\n ivAccumulate(IV_MATERIAL[m.userData.material] || 'plain', m.geometry, item.x, ent.floorY, item.z, item.ry, null); m.geometry.dispose();\n } else root.add(m);\n }\n } finally { cursor.group = g0; cursor.pc = pieceBefore; }\n const base = new Set(Object.values<any>(IV.mats));\n root.traverse(o => { if (!o.isMesh) return; o.userData.iv = ent.id;\n if (o.castShadow) { if (!o.geometry.boundingSphere) o.geometry.computeBoundingSphere(); if (o.geometry.boundingSphere.radius < 0.07) o.castShadow = false; } // tiny pieces (keys, breakers, pulls) cast no shadow: less drawing in the sun pass\n for (const m of Array.isArray(o.material) ? o.material : [o.material]) if (m && !base.has(m) && m.userData && m.userData.roomLightMask && m.onBeforeCompile === THREE.Material.prototype.onBeforeCompile) { m.userData.roomLightMask = false; roomLightMask(m); } // copies made by mergeParts lose the light mask hook\n });\n const E = { id: ent.id, type, entry: ent, floor: ent.floor, group, root, parts: out.parts, spec, screen: body, pos: [item.x, ent.floorY, item.z], ry: item.ry, origin: ent.origin };\n IV.entries.set(ent.id, E);\n if (root.children.length) IV.roots.push(E);\n return spec;\n }\n // outlet cords to the appliances, wires and fixed conduits: thin tubes in the 'plain' accumulator\n function ivCords(IV) {\n const ik = IV.k, w = IV.world, wl = (o, p) => ik.GI.localToWorld(o.transform, p), g0 = cursor.group;\n const tube = (pts, radius, color, ox, oy, oz, ry) => { try { const m = ik.gfx.createCord(pts, radius, shared.mats.plain); ivAccumulate('plain', m.geometry, ox, oy, oz, ry, color); m.geometry.dispose(); } catch (e) { /* menos de 2 pontos */ } };\n try {\n for (const E of IV.entries.values()) {\n const o = w.get(E.id), spec = o.spec; cursor.group = E.group;\n for (const wr of spec.wires || []) { if (wr.kind === 'cord' || !wr.points || wr.points.length < 2) continue; tube(wr.points, wr.radius || 0.01, IV_WIRE[wr.kind] || IV_WIRE.cable, E.pos[0], E.pos[1], E.pos[2], E.ry); }\n for (const d of spec.devices || []) {\n if (!d.plug) continue;\n const wire = (spec.wires || []).find(x => x.id === d.id + '_cord'), pts = (wire ? wire.points : [d.plug]).map(p => wl(o, p));\n const sid = w.power.pluggedInto(E.id, d.id);\n if (sid) {\n const cut = sid.indexOf(':'), so = w.get(sid.slice(0, cut)), sk = so && so.spec.sockets.find(s => s.id === sid.slice(cut + 1));\n if (so && sk) {\n const sp = wl(so, sk.pos), dir = [Math.sin(so.transform.ry), Math.cos(so.transform.ry)], last = pts[pts.length - 1];\n if (last[1] < 0.3 + E.pos[1]) {\n const foot = [sp[0] + dir[0] * 0.035, E.pos[1] + 0.012, sp[2] + dir[1] * 0.035];\n pts.push([last[0] + (foot[0] - last[0]) * 0.4, E.pos[1] + 0.012, last[2] + (foot[2] - last[2]) * 0.4], [last[0] + (foot[0] - last[0]) * 0.75, E.pos[1] + 0.012, last[2] + (foot[2] - last[2]) * 0.75], foot, [foot[0], Math.max(E.pos[1] + 0.1, sp[1] - 0.04), foot[2]], [sp[0] + dir[0] * 0.012, sp[1] - 0.01, sp[2] + dir[1] * 0.012]);\n } else { const hang = ik.gfx.catenary(last, [sp[0] + dir[0] * 0.012, sp[1] - 0.01, sp[2] + dir[1] * 0.012], 0.1, 8); hang.shift(); for (const p of hang) pts.push(p); }\n }\n }\n tube(pts, 0.006, IV_WIRE.cord, 0, 0, 0, 0);\n }\n }\n } finally { cursor.group = g0; }\n }\n // 2nd phase (after closeScene): puts the moving-piece groups into the floor groups and syncs the initial pose\n function ivAssemble(IV, gs) {\n for (const E of IV.roots) { (gs[E.group] || (gs[E.group] = new THREE.Group())).add(E.root); }\n for (const [roomId] of IV.roomStates) if (!shared.inter.litRooms.has(roomId)) IV.roomStates.delete(roomId); // rooms without an SDK lamp keep the old switch\n for (const E of IV.entries.values()) if (E.parts && Object.keys(E.parts).length) IV.k.gfx.syncObject(IV.world, E.id, E.parts, { time: 0 });\n for (const E of IV.entries.values()) if (E.screen) ivScreen(IV, E);\n }\n function ivScreen(IV, E) { // TV screen: animated texture that turns on with the appliance\n let sc = IV.screens.get(E.id);\n if (!sc) { sc = IV.k.gfx.createScreen({ w: 160, h: 90, seed: hashString(E.id) }); roomLightMask(sc.material); IV.screens.set(E.id, sc); }\n E.screen.material = sc.material; E.screen.castShadow = false; E.screen.receiveShadow = false;\n }\n // events of the kit world\n function ivEvent(h, e) {\n const IV = h.IV; if (!IV) { if (e.type === 'message') hudMessage(e.text); return; }\n IV.dirty = true;\n switch (e.type) {\n case 'part': if (e.part === '_x') break; IV.anim.set(e.object + '|' + e.part, { object: e.object, part: e.part, target: e.target, t0: IV.t }); IV.itemsDirty = true; invalidate(); break;\n case 'device': { const roomId = IV.lampRoom.get(e.object); if (roomId) shared.partState.set('light:' + roomId, !!e.on); invalidate(); break; }\n case 'message': hudMessage(e.text); break;\n case 'pickup': IV.itemsDirty = true; if (e.actor === 'player' && e.stack) { const d = IV.world.t('item.' + e.stack.type); hudMessage(t('message.pickedUp', { name: d, qty: e.stack.qty > 1 ? ' x' + e.stack.qty : '' })); } break;\n case 'seat': IV.itemsDirty = true; break;\n }\n if (K.IVK.onEvent) { try { K.IVK.onEvent(e, h.IV.pub); } catch (err) { console.warn('interactables.onEvent', err); } }\n if (e.type === 'seat' && K.IVK.onSeat && e.actor === 'player') { try { K.IVK.onSeat(e.seated ? ivSeat(IV) : null, e); } catch (err) { console.warn('interactables.onSeat', err); } }\n }\n function ivSeat(IV) {\n const w = IV.world, s = w.seatOf('player'); if (!s) return null;\n const o = w.get(s.object), seat = o.spec.seats.find(q => q.id === s.seat), L = IV.k.GI.localToWorld, tr = o.transform, E = IV.entries.get(s.object);\n const eye = L(tr, [seat.pos[0], seat.pos[1] + (seat.eye === undefined ? (seat.pose === 'lie' ? 0.18 : 0.62) : seat.eye), seat.pos[2]]);\n return { object: s.object, seatInfo: s.seat, pose: seat.pose, eye: eye, yaw: tr.ry + seat.ry, pitch: seat.pose === 'lie' ? 0.55 : -0.08, exitPoint: L(tr, seat.exit), floor: E ? E.floor : 0, type: E ? E.type : null };\n }\n // per frame: kit world, changing poses, room lights, screens, effects and items of open containers\n function ivUpdate(h, dt, time, focus) {\n const IV = h.IV; if (!IV || h.lodCurrent >= 2) return;\n const w = IV.world, ik = IV.k; IV.t += dt; IV.focus = focus || null;\n if (dt > 0) w.update(dt);\n if (IV.anim.size) {\n for (const [k, a] of IV.anim) {\n const E = IV.entries.get(a.object); if (E && E.parts) ik.gfx.syncObject(w, a.object, E.parts, { time: IV.t });\n if (w.partT(a.object, a.part) === a.target || IV.t - a.t0 > 4) IV.anim.delete(k);\n }\n invalidateShadow(); if (!IV.anim.size) IV.itemsDirty = true;\n }\n for (const S of IV.roomStates.values()) { const ef = ivRoomEffective(IV, S); if (ef !== S.ef) { S.ef = ef; applyLight(S.id); if (cfg.onLight) cfg.onLight(S.id, ef); } }\n for (const [id, sc] of IV.screens) { const on = w.power.isOn(id, 'tv') && w.power.isPowered(id, 'tv'); if (sc.on !== on) { sc.setOn(on); invalidate(); } if (on) { const ch = w.power.channel(id, 'tv'); if (sc.channel !== ch) sc.setChannel(ch); sc.update(dt); invalidate(); } }\n const em = w.emitters();\n if (em.length && !IV.efx && K.IVK.effects) { const g = h.houseGroup; IV.efx = ik.gfx.createEffects(g, { maxParticles: 1400, seed: 11, document: DOC }); }\n if (IV.efx) { const alive = IV.efx.stats().alive; if (em.length || alive) { IV.efx.update(dt, em, K.IVK.camera ? (typeof K.IVK.camera === 'function' ? K.IVK.camera() : K.IVK.camera) : undefined); invalidate(); } }\n if (K.IVK.items && IV.itemsDirty && IV.t - IV.itemsT > 0.1 && !IV.anim.size) ivItems(IV, h);\n }\n // items inside open containers (a single mesh per house, rebuilt when something opens, closes or is picked up)\n const IV_SHAPE = {\n can: [['cyl', 1, 1, 1, 0, 1]], bottle: [['cyl', 0.9, 0.72, 0.9, 0, 1], ['cyl', 0.36, 0.3, 0.36, 0.7, 0.55]], jar: [['cyl', 1, 0.86, 1, 0, 1], ['cyl', 1.02, 0.14, 1.02, 0.86, 0.6]], cup: [['cyl', 1, 1, 1, 0, 1]],\n dish: [['cyl', 1, 0.3, 1, 0, 1]], roll: [['cyl', 1, 1, 1, 0, 1]], tube: [['cyl', 0.6, 1, 0.6, 0, 1]], fruit: [['sphere', 1, 1, 1, 0, 1]], bag: [['box', 1, 0.9, 1, 0, 1], ['box', 0.9, 0.1, 0.5, 0.9, 0.7]],\n box: [['box', 1, 1, 1, 0, 1]], cloth: [['box', 1, 1, 1, 0, 1]], paper: [['box', 1, 1, 1, 0, 1]], tool: [['box', 1, 1, 1, 0, 1]], shoe: [['box', 1, 0.7, 1, 0, 1]],\n };\n function ivItems(IV, h) {\n IV.itemsDirty = false; IV.itemsT = IV.t;\n const w = IV.world, items = IV.k.A.household.items, f = IV.focus, g0 = cursor.group, list = []; let fl = null;\n if (f) { h.houseGroup.updateWorldMatrix(true, false); fl = _v3.set(f.x, f.y, f.z); h.houseGroup.worldToLocal(fl); }\n for (const E of IV.entries.values()) {\n if (fl && E.floor >= 0 && Math.hypot(E.pos[0] - fl.x, E.pos[2] - fl.z) > 14) continue;\n for (const c of E.spec.containers || []) {\n if (!w.accessible(E.id, c.id)) continue; if (c.access && w.partT(E.id, c.access) < 0.02) continue;\n const st = w.contents(E.id, c.id);\n for (let i = 0; i < st.length; i++) { if (st[i] && items[st[i].type]) list.push([E, c.id, i, items[st[i].type]]); }\n }\n }\n if (!list.length) { if (IV.items) IV.items.visible = false; return; }\n cursor.group = 'iv-items';\n try {\n for (const [E, cid, slot, def] of list) {\n const p = w.slotPosition(E.id, cid, slot), form = IV_SHAPE[def.shape] || IV_SHAPE.box;\n for (const [geo, fx, fy, fz, y0, tone] of form) {\n const sx = def.size[0] * fx, sy = def.size[1] * fy, sz = def.size[2] * fz; _q.setFromAxisAngle(_Y, E.ry);\n const color = def.color == null ? 0xcccccc : def.color; put('plain', geo, p[0], p[1] + def.size[1] * y0 + sy / 2, p[2], _q, sx, sy, sz, tone === 1 ? color : sh(color, tone));\n }\n }\n const A = cursor.accs.get('iv-items|plain'); cursor.accs.delete('iv-items|plain');\n const gm = new THREE.BufferGeometry();\n gm.setAttribute('position', new THREE.BufferAttribute(A.p.slice(0, A.nv * 3), 3)); gm.setAttribute('normal', new THREE.BufferAttribute(A.n.slice(0, A.nv * 3), 3));\n gm.setAttribute('color', new THREE.BufferAttribute(A.c.slice(0, A.nv * 3), 3)); gm.setAttribute('uv', new THREE.BufferAttribute(A.u.slice(0, A.nv * 2), 2));\n gm.setIndex(new THREE.BufferAttribute(A.i.slice(0, A.ni), 1)); gm.computeBoundingSphere();\n if (!IV.items) { IV.items = new THREE.Mesh(gm, shared.mats.plain); IV.items.name = 'iv-items'; IV.items.castShadow = false; IV.items.receiveShadow = true; IV.items.frustumCulled = false; h.houseGroup.add(IV.items); }\n else { IV.items.geometry.dispose(); IV.items.geometry = gm; }\n IV.items.visible = true;\n } finally { cursor.group = g0; }\n invalidateShadow();\n }\n // E target among the kit objects: the best candidate in the world (reach and cone), no wall in between; returns {score, text, action, target}\n function ivTarget(IV, o, opt) {\n const w = IV.world, floor = o.floor < 0 ? 0 : o.floor;\n const k = w.target({ x: o.x, y: o.y, z: o.z, yaw: (o.yaw || 0) + Math.PI, pitch: o.pitch || 0 }, { reach: opt && opt.reach || 2.3, cone: opt && opt.cone || 0.55 });\n if (!k) return null;\n const E = IV.entries.get(k.object); if (!E) return null;\n if (opt && opt.exclude && opt.exclude(E, k)) return null;\n if (E.floor >= 0 && E.floor !== floor) return null;\n const p = k.pos, d = Math.hypot(p[0] - o.x, p[1] - o.y, p[2] - o.z);\n if (wallBlocks(o.x, o.z, p[0], p[2], E.floor < 0 ? 0 : E.floor)) return null;\n const cp = Math.cos(o.pitch || 0), vx = Math.sin(o.yaw) * cp, vy = Math.sin(o.pitch || 0), vz = Math.cos(o.yaw) * cp;\n const angle = Math.acos(Math.max(-1, Math.min(1, ((p[0] - o.x) * vx + (p[1] - o.y) * vy + (p[2] - o.z) * vz) / (d || 1))));\n const text = 'E: ' + k.label.charAt(0).toLowerCase() + k.label.slice(1);\n const target = { kit: true, id: k.id, type: 'kit:' + k.kind, object: E, item: k, floor: E.floor, pos: p.slice(), text: () => text };\n return { score: angle * 2 + d * 0.3 - 0.2, text, action: () => { IV.dirty = true; return k.act('player'); }, target };\n }\n function ivRoomLight(IV, roomId, on) { // turns the room's lamps on or off (what the old switch did)\n const S = IV.roomStates.get(roomId), w = IV.world; if (!S) return;\n for (const id of S.lamps) if (w.power.isOn(id, 'lamp') !== on) { w.setPart(id, '_x', 1, true); w.act(id + ':device.lamp', 'player'); w.setPart(id, '_x', 0, true); }\n }\n // doors and drawers of the kit furniture become parts 'ix:door:<furniture>:..' and 'ix:drawer:<furniture>:..' (same names as the SDK, so the game opens the loot cabinet)\n function ivParts(IV, parts, tagDamage) {\n const w = IV.world;\n for (const E of IV.entries.values()) {\n for (const p of E.spec.parts || []) {\n if (!IV_DOOR.test(p.id) || (p.motion.kind !== 'hinge' && p.motion.kind !== 'slide')) continue;\n const door = p.motion.kind === 'hinge', id = 'ix:' + (door ? 'door' : 'drawer') + ':' + E.origin + ':' + E.id + '.' + p.id, g = E.parts[p.id] || E.root, dn = tagDamage('wood');\n g.userData.partId = id;\n parts[id] = { id, type: door ? 'swing' : 'drawer', group: g, damageable: dn, kit: E.id + ':' + p.id, opens: t => { w.setPart(E.id, p.id, t > 0.5 ? 1 : 0); }, get t() { return w.partT(E.id, p.id); } };\n }\n }\n }\n function ivDispose(h) {\n const IV = h.IV; try { h.state.iv = IV.world.serialize(); } catch (e) { /* no stored state */ }\n if (IV.efx) { try { IV.efx.dispose(); } catch (e) { /* already released */ } }\n for (const sc of IV.screens.values()) sc.dispose();\n if (IV.items) IV.items.geometry.dispose();\n }\n // what the house shows whoever uses it: house.interactives\n function ivPublish(h) {\n const IV = h.IV, w = IV.world, ik = IV.k, com = fn => (...a) => { enter(h); return fn(...a); };\n const rot = k => 'E: ' + k.label.charAt(0).toLowerCase() + k.label.slice(1);\n IV.isBlocked = ik.A.blockedOf(h.ctx.r);\n IV.pub = {\n active: true, world: w, plane: IV.plane, kit: ik, entries: IV.entries, circuits: IV.circuits, roomStates: IV.roomStates, warnings: IV.warnings, water: IV.water,\n screens: IV.screens, effects: () => IV.efx || null, // TV screens (id -> kit screen) and the particle system (smoke), for whoever wants to inspect\n isBlocked: IV.isBlocked, // (x, z, floor) -> inside a wall (same check as the fitSweep of the furniture doors)\n furnitureObjects: mid => [...IV.entries.values()].filter(E => E.origin === mid), // one PlantasSDK furniture can become several objects (sink = basin + cabinet + overhead)\n target: com((eye, opt) => ivTarget(IV, eye, opt)), // {score, text, action, target} of the best kit object for the eye {x,y,z,yaw,pitch,floor} (house coordinates)\n interact: com((eye, opt) => { const a = ivTarget(IV, eye, opt); if (!a) return false; if (cfg.onInteract && cfg.onInteract({ id: a.target.id, type: a.target.type, label: a.text, ref: a.target }, a) === false) return false; return !!a.action(); }),\n interactables: com(() => w.interactables().map(k => { const E = IV.entries.get(k.object); return { id: k.id, type: 'kit:' + k.kind, floor: E ? E.floor : 0, pos: k.pos, radius: k.radius, label: rot(k), act: () => k.act('player') }; })),\n seatInfo: () => ivSeat(IV), // {object, seat, pose: 'sit'|'lie', eye, yaw, pitch, exit, floor} if the player is sitting/lying\n sit: com((object, seatInfo) => !!w.sit(object, seatInfo, 'player')),\n stand: com(() => w.stand('player')),\n opens: com((mid, target) => { for (const E of IV.entries.values()) if (E.origin === mid) for (const p of E.spec.parts || []) if (IV_DOOR.test(p.id)) w.setPart(E.id, p.id, target ? 1 : 0); }), // opens or closes all the doors and drawers of a piece of furniture\n breaker: com((circuit, on) => { if (on === undefined) return w.power.breaker(circuit); w.power.setBreaker(circuit, !!on); const q = IV.plane.panel && IV.entries.get(IV.plane.panel); if (q && q.parts['breaker_' + circuit]) w.setPart(q.id, 'breaker_' + circuit, on ? 1 : 0); IV.dirty = true; return !!on; }),\n lightOn: roomId => { const S = IV.roomStates.get(roomId); return S ? S.ef : null; },\n light: com((roomId, on) => { ivRoomLight(IV, roomId, !!on); }),\n animate: com(() => IV.anim.size > 0),\n };\n return IV.pub;\n }\n Object.assign(K, { IV_MATERIAL, IV_WIRE, IV_DOOR, ivGroup, ivAccumulate, ivBuild, ivRoomEffective, ivDraw, ivCords, ivAssemble, ivScreen, ivEvent, ivSeat, ivUpdate, IV_SHAPE, ivItems, ivTarget, ivRoomLight, ivParts, ivDispose, ivPublish });\n}\n","// Literal port of the team's Casa3DSDK (module animation/clotheslines). Generated by codemod and reviewed; see MIGRATION.md.\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installAnimationClotheslines(K: Kernel, shared: Shared): void {\n const { invalidate, CLOTHES_UNIFORMS } = K;\n // ---------------- 80 light animations ----------------\n // ===== light scenery animations: laundry swaying in the wind (time uniform; no per-frame allocation) =====\n const WIND = { t0: performance.now(), last: 0, base: 0.55 };\n function animateClotheslines(now) {\n if (!shared.ctx.clotheslines || !shared.ctx.clotheslines.length) return;\n if (now - WIND.last < 33) return; WIND.last = now; // ~30 frames/s is enough for cloth\n const t = (now - WIND.t0) / 1000;\n CLOTHES_UNIFORMS.uTime.value = t;\n CLOTHES_UNIFORMS.uVento.value = WIND.base + 0.45 * Math.sin(t * 0.23) * Math.sin(t * 0.11 + 1.3) + 0.25 * Math.max(0, Math.sin(t * 0.57)); // slow gusts\n const g = shared.ctx.parts && shared.ctx.parts['laundry_' + shared.ctx.clotheslines[0]];\n if (g) { let vis = true; for (let n = g; n; n = n.parent) if (!n.visible) { vis = false; break; } if (!vis) return; }\n invalidate();\n }\n Object.assign(K, { WIND, animateClotheslines });\n}\n","import type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installBuildInstance(K: Kernel, shared: Shared): void {\n const { PROPS, THREE, DOC, cfg, HP, createInteractiveMaterials, createMaterials, typeTable } = K;\n // ====================== instance: tables and materials ======================\n const props = PROPS.create(THREE, { document: DOC, emit: () => { } });\n const TYPES = typeTable(props);\n shared.mats = createMaterials(props);\n createInteractiveMaterials(shared.mats);\n if (cfg.materials) for (const k of Object.keys(cfg.materials)) { const v = cfg.materials[k]; shared.mats[k] = typeof v === 'function' ? (v(shared.mats[k], k) || shared.mats[k]) : v; }\n // material swap by the app (e.g. the game's materials)\n\n const newState = () => ({ doors: new Map(), inter: new Map(), water: null, iv: null });\n // state of doors/parts/lights; pass the same object to build() to rebuild without closing everything\n function enter(h) { shared.ctx = h.ctx; shared.inter = h.inter; shared.doorState = h.state.doors; shared.partState = h.state.inter; shared.mirrors = h.mirrors; shared.quality = h.quality; }\n const tagDamage = type => ({ type, hp: HP[type], hpMax: HP[type] });\n Object.assign(K, { props, TYPES, newState, enter, tagDamage });\n}\n","import { FloorplanInteractables } from '@adatechnology/game-floorplan-interactables';\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installInteractablesKit(K: Kernel, shared: Shared): void {\n const { t, THREE, DOC, cfg, Reflector } = K;\n const roomLightMask = (...a: any[]): any => K.roomLightMask(...a); // installed after this module\n // cfg.interactives = { GameInteractables, GameInteractablesHousehold, GameInteractablesThree, adapter (optional: an adapter or a factory with create(); the default is @adatechnology/game-floorplan-interactables), adapterOptions (passed to create()), locale, region, items, effects, camera, onEvent, onSeat }.\n // Everything is injected by the caller; this package never reads globals.\n const IVK = (() => {\n const o = cfg.interactives; if (!o) return null;\n const GI = o.GameInteractables || null, HH = o.GameInteractablesHousehold || null, GT = o.GameInteractablesThree || null, AD = o.adapter || FloorplanInteractables;\n if (!GI || !HH || !GT) { console.warn(t('warn.interactablesIncomplete')); return null; }\n const A = AD.plan ? AD : AD.create({ ...(o.adapterOptions || {}), GameInteractables: GI, GameInteractablesHousehold: HH, locale: o.locale || cfg.locale, region: o.region, ...(cfg.seedKey ? { seedKey: cfg.seedKey } : {}) });\n return { GI, HH, GT, A, gfx: GT.createThreeAdapter(THREE, { document: DOC, Reflector }), items: o.items !== false, effects: o.effects !== false, camera: o.camera || null, onEvent: o.onEvent || null, onSeat: o.onSeat || null };\n })();\n // Vegetation package (cfg.vegetation = { GameVegetation, GameVegetationSpecies }); without it the props' plant builders stay in use.\n const VEG = (() => { const l = cfg.vegetation || null, G = l && (l.GameVegetation || (l.buildLot ? l : null)), S = l && (l.GameVegetationSpecies || (l.toSpec ? l : null)); return G && S && G.buildLot && S.toSpec ? { G, S } : null; })();\n shared.vegMaterials = null;\n const vegMaterials = () => shared.vegMaterials || (shared.vegMaterials = (() => { const m = VEG.G.createVegetationMaterials(THREE); for (const k of ['wood', 'foliage', 'flowers', 'fruit', 'spines']) roomLightMask(m[k]); return m; })());\n Object.assign(K, { IVK, VEG, vegMaterials });\n}\n","import type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installLightsRoomLight(K: Kernel, shared: Shared): void {\n const { THREE, rectsOf } = K;\n // ====================== R62: per-room lighting ======================\n // A room's light does not cross walls or slabs: each PointLight carries a \"box\" (x/z rectangles of the room, a y band, and optionally an exclusion box for the outside lamp) and the material shader\n // multiplies the light by 1 inside the box and 0 outside. Only the 1 or 2 rooms closest to the camera cast shadows (512 cube); in the others the mask does the job. A \"fake indirect\" (weak ambient light limited to the box) lights the faces turned away from the lamp.\n const MAX_LIGHTS = 12, EMPTY = [1e9, 1e9, -1e9, -1e9];\n const LZU = { uRB0: { value: new Float32Array(MAX_LIGHTS * 4) }, uRB1: { value: new Float32Array(MAX_LIGHTS * 4) }, uRB2: { value: new Float32Array(MAX_LIGHTS * 4) }, uRBY: { value: new Float32Array(MAX_LIGHTS * 2) }, uREx: { value: new Float32Array(MAX_LIGHTS * 4) }, uIndK: { value: 0.06 } };\n for (let i = 0; i < MAX_LIGHTS; i++) for (const k of ['uRB0', 'uRB1', 'uRB2', 'uREx']) LZU[k].value.set(EMPTY, i * 4);\n function roomLightMask(m) { // applies the per-room light mask to a material with lights (Lambert, Phong, Standard); idempotent\n if (!m || (m.userData && m.userData.roomLightMask) || !(m.isMeshLambertMaterial || m.isMeshPhongMaterial || m.isMeshStandardMaterial || m.isMeshPhysicalMaterial)) return m;\n m.userData = m.userData || {}; m.userData.roomLightMask = true; const prev = m.onBeforeCompile, pk = m.customProgramCacheKey;\n m.onBeforeCompile = function (sh, r) {\n if (prev) prev.call(this, sh, r);\n if (!sh || !sh.fragmentShader) return; if (sh.uniforms) Object.assign(sh.uniforms, LZU); // (an inspection call without uniforms/vertexShader also passes)\n if (sh.vertexShader) sh.vertexShader = sh.vertexShader.replace('void main() {', 'varying vec3 vRoomW;\\nvoid main() {').replace('#include <begin_vertex>', '#include <begin_vertex>\\n vRoomW = ( modelMatrix * vec4( transformed, 1.0 ) ).xyz;');\n sh.fragmentShader = sh.fragmentShader.replace('void main() {', `varying vec3 vRoomW;\n #if NUM_POINT_LIGHTS > 0\n uniform vec4 uRB0[ NUM_POINT_LIGHTS ]; uniform vec4 uRB1[ NUM_POINT_LIGHTS ]; uniform vec4 uRB2[ NUM_POINT_LIGHTS ]; uniform vec2 uRBY[ NUM_POINT_LIGHTS ]; uniform vec4 uREx[ NUM_POINT_LIGHTS ];\n #endif\n uniform float uIndK;\n bool inRoomR( vec4 r, vec3 p ) { return p.x >= r.x && p.x <= r.z && p.z >= r.y && p.z <= r.w; }\n float roomMask( vec4 a, vec4 b, vec4 c, vec2 yy, vec4 ex ) {\n vec3 p = vRoomW; float k = ( inRoomR( a, p ) || inRoomR( b, p ) || inRoomR( c, p ) ) ? 1.0 : 0.0;\n k *= ( p.y >= yy.x && p.y <= yy.y ) ? 1.0 : 0.0; if ( inRoomR( ex, p ) ) k = 0.0; return k;\n }\n void main() {`).replace('getPointLightInfo( pointLight, geometryPosition, directLight );', `getPointLightInfo( pointLight, geometryPosition, directLight );\n \t\tfloat rmk = roomMask( uRB0[ i ], uRB1[ i ], uRB2[ i ], uRBY[ i ], uREx[ i ] );\n \t\tdirectLight.color *= rmk;\n \t\treflectedLight.indirectDiffuse += BRDF_Lambert( material.diffuseColor ) * pointLight.color * ( rmk * uIndK * ( 1.0 - smoothstep( 0.0, max( pointLight.distance, 0.1 ), length( pointLight.position - geometryPosition ) ) ) );`);\n };\n m.customProgramCacheKey = function () { return (pk ? pk.call(this) : '') + '|rm1'; };\n m.needsUpdate = true; return m;\n }\n function lighting(o) {\n o = o || {}; const scene = o.scene, N = Math.max(1, Math.min(MAX_LIGHTS, o.n || 6)), NS = Math.max(0, Math.min(N, o.shadows != null ? o.shadows : 2)), size = o.shadowSize || 512, MAX_EXTERNAL = o.external != null ? o.external : 2;\n for (const k of Object.keys(shared.mats)) roomLightMask(shared.mats[k]);\n const PL = [], sig = new Array(N).fill(''), seg = { n: 0 };\n for (let i = 0; i < N; i++) {\n const l = new THREE.PointLight(0xffc880, 0, 8, 1.6); l.visible = true; l.castShadow = i < NS; l.name = 'room_light_' + i;\n if (i < NS) { l.shadow.mapSize.set(size, size); l.shadow.bias = -0.0012; l.shadow.normalBias = 0.05; l.shadow.camera.near = 0.12; l.shadow.autoUpdate = false; l.shadow.needsUpdate = true; }\n if (scene) scene.add(l); PL.push(l);\n }\n const A: any = { lights: PL, crates: new Array(N).fill(null), n: N, shadows: NS, stats: { rooms: 0, external: 0, shadows: 0, shadowChanged: false }, indirect: v => { LZU.uIndK.value = v; } };\n const _p = new THREE.Vector3(), _f = new THREE.Vector3();\n const lim = (v, a, b) => Math.max(a, Math.min(b, v));\n A.invalidate = () => { for (let i = 0; i < NS; i++) PL[i].shadow.needsUpdate = true; };\n // houses: [house] (or one house); focus: world THREE.Vector3 (first-person camera or orbit target); op: {maxFloor: -1 all, focusHouse, focusRoom: id of the room the camera is in}\n A.update = function (houses, focus, op) {\n op = op || {}; houses = (Array.isArray(houses) ? houses : [houses]).filter(Boolean); _f.set(focus.x, focus.y, focus.z);\n const rooms = [], exterior = [];\n for (const house of houses) {\n if (house.group && !house.group.visible) continue; house.house.updateMatrixWorld(true); const M = house.house.matrixWorld, by = new Map();\n for (const l of house.lights.list) {\n if (op.floorMax != null && op.floorMax >= 0 && l.floor > op.floorMax) continue; if (!house.lightOn(l.roomId)) continue;\n const k = l.type === 'outdoor' ? 'ext:' + (l.id || exterior.length) : (l.roomId != null ? l.roomId : l.room); let g = by.get(k); if (!g) by.set(k, g = { k, house, ls: [], exterior: l.type === 'outdoor' }); g.ls.push(l);\n }\n for (const g of by.values()) {\n const ls = g.ls, n = ls.length; let cx = 0, cy = 0, cz = 0, range = 0; for (const l of ls) { _p.set(l.x, l.y, l.z).applyMatrix4(M); cx += _p.x; cy += _p.y; cz += _p.z; range = Math.max(range, l.range || 5); } cx /= n; cy /= n; cz /= n; g.pos = [cx, cy, cz]; g.color = ls[0].color; g.n = n; g.range = range;\n if (g.exterior) { g.rects = [[cx - 7, cz - 7, cx + 7, cz + 7]]; g.y = [cy - 3.2, cy + 4]; let x0 = 1e9, z0 = 1e9, x1 = -1e9, z1 = -1e9; for (const c of house.r.rooms) { if (c.type === 'void') continue; for (const [a, b, c2, d] of rectsOf(c)) for (const [u, v] of [[a, b], [c2, b], [a, d], [c2, d]]) { _p.set(u, 0, v).applyMatrix4(M); x0 = Math.min(x0, _p.x); x1 = Math.max(x1, _p.x); z0 = Math.min(z0, _p.z); z1 = Math.max(z1, _p.z); } } g.exclusion = [x0 + 0.03, z0 + 0.03, x1 - 0.03, z1 - 0.03]; g.lumens = ls[0].lumens != null ? ls[0].lumens : 3.2; g.dist = ls[0].dist != null ? ls[0].dist : 5.5; g.decay = ls[0].decay != null ? ls[0].decay : 2; }\n else {\n const c = house.r.rooms.find(q => q.id === g.k); if (!c) continue; const rs = []; let ymin = 1e9, ymax = -1e9;\n for (const [a, b, c2, d] of rectsOf(c)) { let x0 = 1e9, z0 = 1e9, x1 = -1e9, z1 = -1e9; for (const [u, v] of [[a, b], [c2, b], [a, d], [c2, d]]) { _p.set(u, house.y0(c.floor), v).applyMatrix4(M); x0 = Math.min(x0, _p.x); x1 = Math.max(x1, _p.x); z0 = Math.min(z0, _p.z); z1 = Math.max(z1, _p.z); ymin = Math.min(ymin, _p.y); } rs.push([x0 - 0.08, z0 - 0.08, x1 + 0.08, z1 + 0.08]); }\n _p.set(0, house.y0(c.floor), 0).applyMatrix4(M); const yb = _p.y; g.y = [yb - 0.06, yb + (c.ceiling || 2.8) + 0.3]; ymax = g.y[1]; void ymin; void ymax;\n while (rs.length > 3) { const b2 = rs.pop(), a2 = rs[rs.length - 1]; rs[rs.length - 1] = [Math.min(a2[0], b2[0]), Math.min(a2[1], b2[1]), Math.max(a2[2], b2[2]), Math.max(a2[3], b2[3])]; }\n g.rects = rs; g.floor = c.floor; g.exclusion = null; g.roomId = c;\n let dm = 0; for (const [a, b, c2, d] of rs) for (const [x, z] of [[a, b], [c2, b], [a, d], [c2, d]]) dm = Math.max(dm, Math.hypot(x - cx, z - cz)); g.dm = dm;\n }\n // distance from the camera to the room (box), 0 if inside it\n let dd = 1e9; for (const [a, b, c2, d] of g.rects) { const dx = Math.max(a - _f.x, 0, _f.x - c2), dz = Math.max(b - _f.z, 0, _f.z - d); dd = Math.min(dd, Math.hypot(dx, dz)); } const dy = Math.max(g.y[0] - _f.y, 0, _f.y - g.y[1]); g.d = Math.hypot(dd, dy * 2.5);\n if (op.focusRoom && house === op.focusHouse && g.k === op.focusRoom) g.d = -1;\n (g.exterior ? exterior : rooms).push(g);\n }\n }\n rooms.sort((a, b) => a.d - b.d); exterior.sort((a, b) => a.d - b.d);\n const Ne = Math.min(MAX_EXTERNAL, exterior.length, Math.max(0, N - 1)), Ni = Math.min(rooms.length, N - Ne), asg = rooms.slice(0, Ni).concat(exterior.slice(0, Ne));\n A.stats.rooms = Ni; A.stats.external = Ne; let shadows = 0;\n for (let i = 0; i < N; i++) {\n const pl = PL[i], g = asg[i], b0 = LZU.uRB0.value, b1 = LZU.uRB1.value, b2 = LZU.uRB2.value, by = LZU.uRBY.value, ex = LZU.uREx.value;\n A.crates[i] = g ? { k: g.k, rects: g.rects, y: g.y, exterior: !!g.exterior, exclusion: g.exclusion || null, d: g.d } : null;\n if (!g) { pl.intensity = 0; for (const a of [b0, b1, b2, ex]) a.set(EMPTY, i * 4); by.set([0, 0], i * 2); continue; }\n pl.position.set(g.pos[0], g.pos[1], g.pos[2]); pl.color.set(g.color);\n if (g.exterior) { pl.intensity = g.lumens; pl.distance = g.dist; pl.decay = g.decay; }\n else { pl.intensity = (7 + g.range * 0.8) * lim(1 + 0.4 * (Math.sqrt(g.n) - 1), 1, 2.2); pl.distance = Math.max(3, g.dm * 1.3 + 0.5); pl.decay = 1.6; }\n const rs = g.rects; b0.set(rs[0] || EMPTY, i * 4); b1.set(rs[1] || EMPTY, i * 4); b2.set(rs[2] || EMPTY, i * 4); by.set(g.y, i * 2); ex.set(g.exclusion || EMPTY, i * 4);\n if (i < NS) { shadows++; const s2 = g.house.group.uuid + '|' + g.k + '|' + g.pos.map(v => v.toFixed(2)).join(','); if (sig[i] !== s2) { sig[i] = s2; pl.shadow.needsUpdate = true; seg.n++; A.stats.shadowChanged = true; } pl.shadow.camera.far = Math.max(4, pl.distance); }\n }\n A.stats.shadows = shadows; return A.stats;\n };\n A.dispose = () => { for (const l of PL) { if (l.shadow && l.shadow.map) l.shadow.map.dispose(); l.removeFromParent(); } };\n return A;\n }\n Object.assign(K, { MAX_LIGHTS, EMPTY, LZU, roomLightMask, lighting });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\nimport { assemblyPart, getAssembly } from '@adatechnology/game-destruction';\nimport { DENSITY, MEMBER_CAGE, toDestructibleSpec } from '@adatechnology/game-floorplan-structure';\nimport type { Kernel, Shared } from '../kernel-types.js';\nimport { panelViewOf } from './panels.js';\n\nexport function installDestructionPieces(K: Kernel, shared: Shared): void {\n const { THREE, floorAtY, pieceRecord } = K;\n // ====================== destruction: house.structure and the adapter to the game-destruction SDK (cfg.destruction) ======================\n // The meshes carry userData.destructionMaterial / destructionPart / structuralRole (and destructionParts + ranges on merged meshes).\n // house.structure describes the pieces; house.destruction registers the house in the `cfg.destruction` world (createDestruction) on first need and listens to its\n // events: fracture hides the piece and releases shards, collapse brings the piece down, leak empties the water tank. Whoever steps the world (world.update(dt)) is the app.\n shared.destructionSeq = 0;\n const FRAGMENT_COLOR = { brick: 0xa8553a, concrete: 0x9a9a96, plaster: 0xd8d4c8, ceramic: 0xb4623e, glass: 0xaecfd8, tempered_glass: 0xaecfd8, wood_soft: 0xb08a58, wood_hard: 0x7a5434, plywood: 0xb89a6a, mdf: 0xb89a6a, steel: 0x8a8e92, aluminium: 0xb8bcc0, plastic: 0x2f6aa8, copper: 0xb87333, stone: 0x8a8a84, fabric: 0xcfc4a8 };\n const FRAGMENT_GEO = new THREE.BoxGeometry(1, 1, 1), FRAGMENT_MAT = {};\n const fragmentMaterial = m => FRAGMENT_MAT[m] || (FRAGMENT_MAT[m] = new THREE.MeshLambertMaterial({ color: FRAGMENT_COLOR[m] != null ? FRAGMENT_COLOR[m] : 0x8a8a84 }));\n function markGroups(r, root, parts) { // pieces that are loose groups (doors, water tank, gas cylinder, pipes in the wall, gates, panels): userData on the meshes + record\n const tagObject = (id, objs, mat, role, extra) => {\n objs = objs.filter(Boolean); if (!objs.length) return; const pc = pieceRecord(id, mat, role, extra); shared.ctx.pieceObjects.set(id, objs);\n for (const o of objs) o.traverse(m => { if (!m.isMesh) return; const u = m.userData; u.destructionPart = id; u.destructionMaterial = mat; if (role) u.structuralRole = role; if (pc.contains) u.destructionContains = pc.contains; if (pc.explodes) u.destructionExplodes = pc.explodes; });\n };\n for (const fo of shared.ctx.leaves) { const pr = r.doors.find(p => p.id === fo.id); tagObject('door:' + fo.id, fo.gs, fo.type === 'steel' ? 'steel' : (pr && pr.exterior) ? 'wood_hard' : 'mdf', null, { floor: fo.floor, mass: fo.type === 'steel' ? 60 : 18, tags: ['door'] }); }\n const cap = r.utilities.plumbing ? +r.utilities.plumbing.capacityL || 0 : 0;\n for (const [id, g] of Object.entries<any>(shared.ctx.parts || {})) {\n const tp = g.userData.part;\n if (tp === 'water_tank') { const e = shared.ctx.structureIndex.water_tank, L = cap || (g.userData.volume ? Math.round(g.userData.volume * 1000) : 0); tagObject('water_tank', [g], 'plastic', e ? e.role : null, { floor: e ? e.floor : 0, contains: L ? { fluid: 'water', liters: L } : undefined, mass: e ? e.mass : 25, thickness: 0.004, fill: 0.05, tags: ['tank'] }); }\n else if (tp === 'gas_cylinder') tagObject(id, [g], 'steel', null, { mass: 11, form: 'cylinder', thickness: 0.003, fill: 0.03, contains: { fluid: 'gas', liters: 13, pressurized: true }, explodes: { energy: 120000, radius: 5, atC: 300 }, tags: ['gas_bottle'] });\n else if (tp === 'wall_pipe') tagObject(id, [g], 'plastic', null, { mass: 3, tags: ['pipe'] });\n else if (tp === 'shower_door') tagObject(id, [g], 'tempered_glass', null, { mass: 25 });\n else if (tp === 'gate_leaf' || tp === 'mailbox_door') tagObject(id, [g], 'steel', null, { mass: 30 });\n }\n for (const def of shared.inter.defs.values()) { if (!def.outer) continue; if (/^gate/.test(def.kind)) tagObject(def.name, [def.outer], 'steel', null, { mass: 80, tags: ['gate'] }); else if (def.kind === 'swing' || def.kind === 'drawer') tagObject(def.name, [def.outer], 'mdf', null, { mass: 6 }); }\n }\n function assembleStructure(r0, root) {\n const E0 = r0.structure || { parts: [], supports: [], levels: [], elevation: 0 }, meshes = new Map(), add = (id, it) => { let l = meshes.get(id); if (!l) meshes.set(id, l = []); l.push(it); };\n root.updateMatrixWorld(true);\n root.traverse(o => { if (o.isMesh && o.userData.ranges) { const nv = o.geometry.attributes.position.count; for (const f of o.userData.ranges) add(f.id, { mesh: o, v0: f.v0, v1: f.v1, i0: f.i0, i1: f.i1, whole: f.v0 === 0 && f.v1 === nv }); } });\n for (const [id, objs] of shared.ctx.pieceObjects) for (const o of objs) add(id, { obj: o });\n const box3 = id => { const b = new THREE.Box3(), v = new THREE.Vector3();\n for (const it of meshes.get(id) || []) {\n if (it.obj) { const bb = new THREE.Box3().setFromObject(it.obj); if (!bb.isEmpty()) for (const x of [bb.min.x, bb.max.x]) for (const y of [bb.min.y, bb.max.y]) for (const z of [bb.min.z, bb.max.z]) b.expandByPoint(v.set(x, y, z).applyMatrix4(shared.ctx.unitInverse)); }\n else { const P = it.mesh.geometry.attributes.position.array; for (let k = it.v0; k < it.v1; k++) b.expandByPoint(v.set(P[k * 3], P[k * 3 + 1], P[k * 3 + 2])); }\n }\n return b.isEmpty() ? null : [b.min.x, b.min.y, b.min.z, b.max.x, b.max.y, b.max.z]; };\n const parts = [], byId = new Map(), supports = E0.supports.map(a => Object.assign({}, a));\n for (const e of E0.parts) { const p = Object.assign({}, e, { meshes: (meshes.get(e.id) || []).length, extra: false }), pc = shared.ctx.pieces.get(e.id); if (pc) for (const k of ['contains', 'explodes', 'tags', 'form', 'thickness', 'fill']) if (pc[k] != null && p[k] == null) p[k] = pc[k]; parts.push(p); byId.set(p.id, p); }\n const base = parts.length, view = shared.ctx.panelView || panelViewOf(null, false), panelIds = new Set(view.panels.map(e => e.id)); // the panels are pieces of the structure, not of the plan\n for (const [id, pc] of shared.ctx.pieces) { // tagged pieces that do not come from the plan: windows, doors, tank, pipes, wiring, cylinder, walls\n if (byId.has(id) || panelIds.has(id) || !meshes.has(id)) continue;\n const b = box3(id); if (!b) continue; const vol = Math.max(1e-6, (b[3] - b[0]) * (b[4] - b[1]) * (b[5] - b[2]));\n const p = { id, role: 'none', material: pc.mat, aabb: [b[0], b[2], b[3], b[5]], y0: b[1], y1: b[4], floor: pc.floor != null ? pc.floor : floorAtY(b[1] + 0.1), mass: pc.mass != null ? pc.mass : Math.max(0.5, vol * (DENSITY[pc.mat] || 800) * (pc.fill != null ? pc.fill : 0.15)), meshes: meshes.get(id).length, extra: true };\n for (const k of ['contains', 'explodes', 'tags', 'form', 'thickness', 'fill']) if (pc[k] != null) p[k] = pc[k];\n parts.push(p); byId.set(id, p);\n }\n const inside = (p, q, m) => { const cx = (p.aabb[0] + p.aabb[2]) / 2, cz = (p.aabb[1] + p.aabb[3]) / 2, cy = (p.y0 + p.y1) / 2; return cx >= q.aabb[0] - m && cx <= q.aabb[2] + m && cz >= q.aabb[1] - m && cz <= q.aabb[3] + m && cy >= q.y0 - m && cy <= q.y1 + m; };\n for (const p of parts.slice(base)) { // what is fitted into a wall or slab falls with it (a joint that does not carry)\n if (!/^(window|window_pane|door|jamb|pipe|water_tank)/.test(p.id)) continue;\n const target = /^water_tank/.test(p.id) ? ['slab'] : ['wall', 'partition'];\n let m = null, md = 1e9; for (const q of parts.slice(0, base)) { if (!target.includes(q.role) || !inside(p, q, 0.2)) continue; const d = Math.hypot((p.aabb[0] + p.aabb[2] - q.aabb[0] - q.aabb[2]) / 2, (p.aabb[1] + p.aabb[3] - q.aabb[1] - q.aabb[3]) / 2); if (d < md) { md = d; m = q; } }\n if (m) supports.push({ part: p.id, on: m.id, joint: /^(window|jamb)/.test(p.id) ? 'glue' : 'clip', bears: false, extra: true });\n }\n // The spec is made from the pieces of the plan (the slabs whole), and the structure cuts them into panels; the house is then bound to the panels: a floor, a\n // ceiling and a roof slab are drawn tile by tile in the panel they lie on (house/floors), and the slab they were cut from is not a piece any more.\n const specParts = parts.slice(), specSupports = supports.slice();\n if (view.panels.length) {\n const gone = new Set(view.replaced);\n parts.splice(0, parts.length, ...parts.filter(p => !gone.has(p.id)));\n for (const id of gone) byId.delete(id);\n for (const e of view.panels) { const p = Object.assign({}, e, { meshes: (meshes.get(e.id) || []).length, extra: false }), pc = shared.ctx.pieces.get(e.id); if (pc) for (const k of ['contains', 'explodes', 'tags', 'form', 'thickness', 'fill']) if (pc[k] != null && p[k] == null) p[k] = pc[k]; parts.push(p); byId.set(p.id, p); }\n supports.splice(0, supports.length, ...supports.filter(s => !gone.has(s.part) && !gone.has(s.on)), ...view.supports.filter(s => byId.has(s.part) && (byId.has(s.on) || s.on === 'ground')).map(a => Object.assign({}, a)));\n }\n const structure: any = {\n ...E0, system: (r0.construction && r0.construction.system) || 'masonry', parts, supports, levels: (E0.levels || []).slice(), elevation: E0.elevation || 0, byId,\n meshesOf: id => meshes.get(id) || [],\n // raycast hit (object + faceIndex) -> piece id: merged mesh by its ranges, single-piece mesh (or loose group) by userData\n pieceId(obj, face) { for (let n = obj; n; n = n.parent) { const u = n.userData; if (!u) continue; if (u.ranges && face != null) { const ix = face * 3; for (const f of u.ranges) if (ix >= f.i0 && ix < f.i1) return f.id; } if (u.destructionPart) return u.destructionPart; } return null; },\n // One part per wall, as the house draws them (a mesh range per wall): the panels of `wallDetail: 'panels'` would name parts the meshes do not have.\n // A masonry wall keeps its assembly (layers, units, rebar, breach) on the same box, so its stage 2 can open the courses; `o.wallDetail` still overrides.\n spec: o => {\n const spec = toDestructibleSpec({ ...structure, parts: specParts, supports: specSupports }, { wallDetail: 'coarse', ...o });\n if (o && o.wallDetail && o.wallDetail !== 'coarse') return spec;\n // what a part holds, what makes it explode and how thin its wall is (the water tank, the gas cylinder) comes from the piece; the structure package's spec does not carry it\n spec.parts = spec.parts.map(sp => {\n const pc0 = byId.get(sp.id); if (!pc0) return sp;\n const extra: any = {}; for (const k of ['contains', 'explodes', 'thickness', 'fill', 'tags']) if (pc0[k] != null && sp[k] == null) extra[k] = pc0[k];\n return Object.keys(extra).length ? { ...sp, ...extra } : sp;\n });\n spec.parts = spec.parts.map(sp => {\n const pc = byId.get(sp.id) || (sp.structure ? { role: sp.structure.role, material: sp.material } : null); if (!pc || pc.unit) return sp; // what the structure adds to the plan (beams and pillars of the slab panels) is reinforced concrete like the rest\n // Concrete slabs, beams, pillars and stairs are not walls: they keep their box and take the rebar of reinforced concrete (the renderer draws the cage when the concrete spalls).\n if (pc.role !== 'wall' && pc.role !== 'partition') {\n const def = getAssembly(pc.assembly || (pc.material === 'concrete' && ['slab', 'beam', 'column', 'stair'].includes(pc.role) ? 'reinforced_concrete' : ''));\n const out = def && def.reinforcement && !sp.reinforcement ? { ...sp, reinforcement: { ...def.reinforcement } } : sp;\n // a concrete beam or pillar is made of blocks a shot or a blow knocks out where it lands, showing its bars there (MEMBER_CAGE of the structure package)\n if (out.reinforcement && !out.units && pc.material === 'concrete' && (pc.role === 'beam' || pc.role === 'column') && sp.shape.kind === 'box') {\n return { ...out, units: { size: [MEMBER_CAGE.unit, MEMBER_CAGE.unit, Math.min(...sp.shape.size)], bond: 'stack', mortar: 'concrete' } };\n }\n return out;\n }\n if (!pc.assembly) return sp;\n const [u0, v0, u1, v1] = pc.aabb, alongU = u1 - u0 >= v1 - v0;\n try {\n return assemblyPart(pc.assembly, { id: pc.id, width: alongU ? u1 - u0 : v1 - v0, height: pc.y1 - pc.y0, position: sp.position, ...(alongU ? {} : { rotation: [0, Math.PI / 2, 0] }), ...(sp.structure ? { structure: sp.structure } : {}), extra: { mass: sp.mass } });\n } catch (e) { return sp; } // an assembly the registry does not know stays a plain box\n });\n return spec;\n },\n };\n return structure;\n }\n Object.assign(K, { FRAGMENT_COLOR, FRAGMENT_GEO, FRAGMENT_MAT, fragmentMaterial, markGroups, assembleStructure });\n}\n","import { resolveSlabPanels, slabPanelView } from '@adatechnology/game-floorplan-structure';\n\nexport interface PanelView {\n /** The panels the slabs of the structure are cut into (as `toDestructibleSpec` names them), each with `slab`, the id of the slab it comes from. */\n panels: any[]\n /** Ids of the slabs that the spec no longer has (a panel for each room, or less, took their place). */\n replaced: string[]\n supports: any[]\n}\n\nconst NONE: PanelView = { panels: [], replaced: [], supports: [] };\nconst MEMO = new WeakMap<object, PanelView>();\n\n/**\n * The slab panels of the structure of a plan, for the pieces the house draws: the floor, the ceiling and the roof slab of each room are tagged with the\n * panel they belong to, so a panel that fails drops alone. Only a house bound to a destruction world (`enabled`) is drawn in panels: without a world the\n * floors are the tiles the Visor de casas 3D draws, bit for bit. The same for every build of the same plan (the structure is the key).\n */\nexport function panelViewOf(structure: any, enabled: boolean): PanelView {\n if (!enabled || !structure || !structure.parts) return NONE;\n let view = MEMO.get(structure);\n if (!view) {\n const options = resolveSlabPanels(true);\n view = options ? slabPanelView(structure, options) : NONE;\n MEMO.set(structure, view);\n }\n return view;\n}\n","import type { Kernel, Shared } from '../kernel-types.js'\n\n/** The pieces of a house the destruction renderer draws; the breach view reads them from the structure the house assembled. */\nexport interface BreachViewOptions {\n house: any\n structure: any\n /** The destructible spec the world was given (units and layers per part). */\n spec: () => any\n /** Repaint damaged walls from `flush` (once per wall per frame, within a time budget) instead of on every event. */\n deferPaint?: boolean\n /** Milliseconds `flush` may spend repainting walls (at least one wall is always repainted). Default `Infinity`: every damaged wall is painted at the flush. */\n paintBudgetMs?: number\n}\n\n/**\n * Collapses the vertices of a range of a merged mesh to one point (the piece vanishes) and returns what it overwrote. The range is listed in\n * `userData.collapsedRanges` and the mesh's first positions kept in `userData._p0`, so a renderer that rewrites the mesh (the destruction renderer's dents\n * and hidden parts) keeps it collapsed and puts back the right positions.\n */\nexport function collapseRange(mesh: any, v0: number, v1: number): Float32Array {\n const pos = mesh.geometry.attributes.position\n const a = pos.array as Float32Array\n const u = mesh.userData\n if (!u._p0) u._p0 = a.slice()\n const list: Array<[number, number]> = (u.collapsedRanges ??= [])\n if (!list.some((r) => r[0] === v0 && r[1] === v1)) list.push([v0, v1])\n const saved = a.slice(v0 * 3, v1 * 3)\n const x = a[v0 * 3], y = a[v0 * 3 + 1], z = a[v0 * 3 + 2]\n for (let k = v0; k < v1; k++) { a[k * 3] = x; a[k * 3 + 1] = y; a[k * 3 + 2] = z }\n pos.needsUpdate = true\n return saved\n}\n\n/** Puts back what `collapseRange` overwrote. */\nexport function restoreRange(mesh: any, v0: number, saved: Float32Array): void {\n const pos = mesh.geometry.attributes.position\n ;(pos.array as Float32Array).set(saved, v0 * 3)\n pos.needsUpdate = true\n const list: Array<[number, number]> | undefined = mesh.userData.collapsedRanges\n if (list) mesh.userData.collapsedRanges = list.filter((r) => r[0] !== v0)\n}\n\n/** Value noise in [0, 1] on a metric grid (`cell` metres), stable for a point: the ragged edge of the plaster around a hole. */\nfunction noise2(x: number, y: number, cell: number): number {\n const h = (i: number, j: number) => { const s = Math.sin(i * 127.1 + j * 311.7) * 43758.5453; return s - Math.floor(s) }\n const fx = x / cell, fy = y / cell, i = Math.floor(fx), j = Math.floor(fy), u = fx - i, v = fy - j\n const su = u * u * (3 - 2 * u), sv = v * v * (3 - 2 * v)\n return (h(i, j) * (1 - su) + h(i + 1, j) * su) * (1 - sv) + (h(i, j + 1) * (1 - su) + h(i + 1, j + 1) * su) * sv\n}\n\n/** Metres per texel of the mask that cuts a wall where its units came out. */\nconst MASK_TEXEL = 0.02\n/** Plaster (or concrete cover) that breaks off around a hole: the least and the extra a ragged edge adds, in metres. */\nconst SPALL_MIN = 0.025, SPALL_RAGGED = 0.045\n/** Depth of the plaster over the units: what is seen inside the edge of a hole is the units this far behind the face. */\nconst COVER = 0.015\n/** Patches of plaster off a wall a view keeps (the oldest goes). */\nconst MAX_FLAKES = 64\n\n/** A unit laid bare in a wall, a box in the house's space (centre and size) with its colour. */\ninterface UnitBox { x: number; y: number; z: number; sx: number; sy: number; sz: number; colour: number }\n\n/** The part of `unit` inside `box` (house space, `[minX, minY, minZ, maxX, maxY, maxZ]`), or null when nothing of it is. */\nexport function clipToBox(unit: UnitBox, box: readonly number[]): UnitBox | null {\n const lo = [Math.max(unit.x - unit.sx / 2, box[0]!), Math.max(unit.y - unit.sy / 2, box[1]!), Math.max(unit.z - unit.sz / 2, box[2]!)]\n const hi = [Math.min(unit.x + unit.sx / 2, box[3]!), Math.min(unit.y + unit.sy / 2, box[4]!), Math.min(unit.z + unit.sz / 2, box[5]!)]\n if (hi[0]! - lo[0]! <= 1e-4 || hi[1]! - lo[1]! <= 1e-4 || hi[2]! - lo[2]! <= 1e-4) return null\n return { x: (lo[0]! + hi[0]!) / 2, y: (lo[1]! + hi[1]!) / 2, z: (lo[2]! + hi[2]!) / 2, sx: hi[0]! - lo[0]!, sy: hi[1]! - lo[1]!, sz: hi[2]! - lo[2]!, colour: unit.colour }\n}\n\n/**\n * Damage of a masonry wall or a concrete member, drawn where it happened. At full detail (LOD 0) the first `chip` (a unit that came out, or a crater a\n * shot broke through one) or the opening of stage 2 moves the wall's range of the merged mesh to a mesh of its own with the same geometry, the same\n * paint and the same material, plus a mask in the plane of the wall: the face is cut only where units came out or were broken through, with a ragged\n * edge of plaster around them. Behind the cut the units next to the hole are drawn (brick with its mortar joints, or rough concrete), themselves cut\n * through where a shot broke them (an irregular crater; the rest of the unit stays), so a hole shows the bricks of the wall and goes through where\n * units are missing or broken. The rest of the wall stays exactly as the house painted it. At LOD 1 and 2 the wall goes back to its box (the\n * renderer's patch marks the damage). Fragments, spalling and the rebar cage belong to the destruction renderer.\n */\nexport function installDestructionBreach(K: Kernel, _shared: Shared): void {\n const { THREE, fragmentMaterial, invalidate, invalidateShadow } = K\n\n function createBreachView(opts: BreachViewOptions) {\n const { house, structure } = opts\n const views = new Map<string, any>()\n /** Walls whose damage changed and whose masks and units are repainted at the next `flush`. */\n const dirty = new Set<any>()\n const paintBudgetMs = opts.paintBudgetMs ?? Infinity\n /** Views of walls that broke or fell, whose ranges are still collapsed. */\n const dropped: any[] = []\n let lod = 0\n const unitGeometry = new THREE.BoxGeometry(1, 1, 1)\n const tmp = { m: new THREE.Matrix4(), q: new THREE.Quaternion(), p: new THREE.Vector3(), s: new THREE.Vector3(), c: new THREE.Color() }\n\n /** A world point in the house's own space (the space of the structure's parts). */\n const local = (p: number[]): number[] => {\n house.updateMatrixWorld(true)\n const v = house.worldToLocal(tmp.p.set(p[0], p[1], p[2]))\n return [v.x, v.y, v.z]\n }\n\n /** The units of a part: one cell per unit of its courses (running or stack bond), along the wall from `u0`/`v0` and up from `y0`. */\n function cells(part: any, units: any) {\n const [u0, v0, u1, v1] = part.aabb\n const alongU = u1 - u0 >= v1 - v0\n const len = alongU ? u1 - u0 : v1 - v0\n const [ul, uh] = units.size\n const rows = Math.max(1, Math.round((part.y1 - part.y0) / uh))\n const rowH = (part.y1 - part.y0) / rows\n const per = Math.max(1, Math.round(len / ul))\n const w = len / per\n const out: { a: number; b: number; y0: number; y1: number; r: number; i: number }[] = []\n for (let r = 0; r < rows; r++) {\n const shift = units.bond === 'running' && (r & 1) ? w / 2 : 0\n for (let i = 0; i < per + (shift ? 1 : 0); i++) {\n const a = Math.max(0, i * w - shift), b = Math.min(len, i * w - shift + w)\n if (b - a > 1e-3) out.push({ a, b, y0: part.y0 + r * rowH, y1: part.y0 + (r + 1) * rowH, r, i })\n }\n }\n return out\n }\n\n const specOf = (id: string) => opts.spec()?.parts?.find((q: any) => q.id === id)\n const same = (a: number[], b: number[]) => a.every((x, k) => Math.abs(x - b[k]) < 1e-3)\n\n /**\n * The part whose mesh draws `partId`: itself, or for a beam the house draws inside the wall under it (a bond beam behind the wall's plaster), that\n * wall.\n */\n function hostOf(partId: string): string | null {\n if (structure.meshesOf(partId).some((it: any) => it.mesh)) return partId\n const part = structure.byId.get(partId)\n if (!part) return null\n for (const q of structure.parts) {\n if (q.id !== partId && same(q.aabb, part.aabb) && Math.abs(q.y1 - part.y0) < 0.01 && structure.meshesOf(q.id).some((it: any) => it.mesh)) return q.id\n }\n return null\n }\n\n /** The beams with units the house draws inside the range of `hostId` (see `hostOf`). */\n const riders = (hostId: string): string[] =>\n structure.parts.filter((q: any) => q.id !== hostId && specOf(q.id)?.units && hostOf(q.id) === hostId && !structure.meshesOf(q.id).some((it: any) => it.mesh)).map((q: any) => q.id)\n\n /** The wall's range of the merged mesh as a mesh of its own, same transform, with a clone of its material that discards what the mask cuts. */\n function shell(it: any, mask: any) {\n const g0 = it.mesh.geometry, g = new THREE.BufferGeometry()\n const src = it.mesh.userData._p0 || g0.attributes.position.array\n for (const [name, attr] of Object.entries<any>(g0.attributes)) {\n const k = attr.itemSize\n g.setAttribute(name, new THREE.BufferAttribute((name === 'position' ? src : attr.array).slice(it.v0 * k, it.v1 * k), k))\n }\n if (g0.index) {\n const ix = g0.index.array.slice(it.i0, it.i1)\n for (let k = 0; k < ix.length; k++) ix[k] -= it.v0\n g.setIndex(new THREE.BufferAttribute(ix, 1))\n }\n g.computeBoundingBox(); g.computeBoundingSphere()\n const base = it.mesh.material\n const material = base.clone()\n const toHouse = { value: new THREE.Matrix4() }\n material.onBeforeCompile = (sh: any) => {\n base.onBeforeCompile?.(sh)\n sh.uniforms.uToHouse = toHouse\n sh.uniforms.uMask = { value: mask.texture }\n sh.uniforms.uMaskRect = { value: mask.rect }\n sh.uniforms.uMaskAlongX = { value: mask.alongU ? 1 : 0 }\n sh.vertexShader = sh.vertexShader\n .replace('void main() {', 'uniform mat4 uToHouse;\\nvarying vec3 vHousePos;\\nvoid main() {')\n .replace('#include <begin_vertex>', '#include <begin_vertex>\\nvHousePos = (uToHouse * vec4(transformed, 1.0)).xyz;')\n sh.fragmentShader = sh.fragmentShader\n .replace('void main() {', 'uniform sampler2D uMask;\\nuniform vec4 uMaskRect;\\nuniform float uMaskAlongX;\\nvarying vec3 vHousePos;\\nvoid main() {\\n'\n + ' vec2 mUv = vec2(((uMaskAlongX > 0.5 ? vHousePos.x : vHousePos.z) - uMaskRect.x) / uMaskRect.z, (vHousePos.y - uMaskRect.y) / uMaskRect.w);\\n'\n + ' if (mUv.x >= 0.0 && mUv.x <= 1.0 && mUv.y >= 0.0 && mUv.y <= 1.0 && texture2D(uMask, mUv).r > 0.5) discard;')\n }\n material.customProgramCacheKey = () => 'breachMask' + (base.customProgramCacheKey?.() ?? '')\n const mesh = new THREE.Mesh(g, material)\n mesh.name = 'breach-shell'\n mesh.userData.breachMask = mask\n // a mark that lands on the wall where it is cut goes on what is behind (the decals of the destruction renderer ask this)\n mesh.userData.cutAt = (p: { x: number; y: number; z: number }) => {\n const v = local([p.x, p.y, p.z])\n const i = Math.floor(((mask.alongU ? v[0] : v[2]) - mask.start) / mask.len * mask.w), j = Math.floor((v[1] - mask.y0) / mask.height * mask.h)\n return i >= 0 && i < mask.w && j >= 0 && j < mask.h && mask.data[j * mask.w + i] > 127\n }\n mesh.position.copy(it.mesh.position); mesh.quaternion.copy(it.mesh.quaternion); mesh.scale.copy(it.mesh.scale)\n mesh.castShadow = it.mesh.castShadow; mesh.receiveShadow = it.mesh.receiveShadow; mesh.renderOrder = it.mesh.renderOrder\n mesh.onBeforeRender = () => { house.updateMatrixWorld(); toHouse.value.copy(house.matrixWorld).invert().multiply(mesh.matrixWorld) }\n it.mesh.parent.add(mesh)\n mesh.updateMatrixWorld(true)\n toHouse.value.copy(house.matrixWorld).invert().multiply(mesh.matrixWorld)\n return mesh\n }\n\n /**\n * The material of the units laid bare in a wall: white lit by the colour of each instance, cut through where shots broke the units (`core`, a mask\n * like the wall's), and darker on the faces seen from inside a unit (the walls of a crater).\n */\n function unitsMaterial(core: any) {\n const material = new THREE.MeshLambertMaterial({ color: 0xffffff, side: THREE.DoubleSide })\n material.onBeforeCompile = (sh: any) => {\n sh.uniforms.uCore = { value: core.texture }\n sh.uniforms.uCoreRect = { value: core.rect }\n sh.uniforms.uCoreAlongX = { value: core.alongU ? 1 : 0 }\n sh.vertexShader = sh.vertexShader\n .replace('void main() {', 'varying vec3 vHousePos;\\nvoid main() {')\n .replace('#include <begin_vertex>', '#include <begin_vertex>\\n#ifdef USE_INSTANCING\\nvHousePos = (instanceMatrix * vec4(transformed, 1.0)).xyz;\\n#else\\nvHousePos = transformed;\\n#endif')\n sh.fragmentShader = sh.fragmentShader\n .replace('void main() {', 'uniform sampler2D uCore;\\nuniform vec4 uCoreRect;\\nuniform float uCoreAlongX;\\nvarying vec3 vHousePos;\\nvoid main() {\\n'\n + ' vec2 cUv = vec2(((uCoreAlongX > 0.5 ? vHousePos.x : vHousePos.z) - uCoreRect.x) / uCoreRect.z, (vHousePos.y - uCoreRect.y) / uCoreRect.w);\\n'\n + ' if (cUv.x >= 0.0 && cUv.x <= 1.0 && cUv.y >= 0.0 && cUv.y <= 1.0 && texture2D(uCore, cUv).r > 0.5) discard;')\n .replace('#include <color_fragment>', '#include <color_fragment>\\nif (!gl_FrontFacing) diffuseColor.rgb *= 0.55;')\n }\n material.customProgramCacheKey = () => 'breachCore'\n material.userData.breachCore = core\n return material\n }\n\n /** The box, in the house's space, of what the merged mesh draws of a wall (its ranges, as the house built them): no unit of its damage goes past it. */\n function drawnBounds(items: any[]): number[] {\n house.updateMatrixWorld(true)\n const box = new THREE.Box3(), toHouse = new THREE.Matrix4().copy(house.matrixWorld).invert()\n for (const it of items) {\n const a = it.mesh.userData._p0 || it.mesh.geometry.attributes.position.array\n tmp.m.multiplyMatrices(toHouse, it.mesh.matrixWorld)\n for (let k = it.v0; k < it.v1; k++) box.expandByPoint(tmp.p.set(a[k * 3], a[k * 3 + 1], a[k * 3 + 2]).applyMatrix4(tmp.m))\n }\n return [box.min.x, box.min.y, box.min.z, box.max.x, box.max.y, box.max.z]\n }\n\n /** The mask in the plane of the host wall (along the wall × height), spanning the host and the beams it draws. */\n function maskOf(hostId: string, parts: string[]) {\n const host = structure.byId.get(hostId)\n const [u0, v0, u1, v1] = host.aabb\n const alongU = u1 - u0 >= v1 - v0\n const y0 = Math.min(...parts.map((id) => structure.byId.get(id).y0)), y1 = Math.max(...parts.map((id) => structure.byId.get(id).y1))\n const len = alongU ? u1 - u0 : v1 - v0\n const w = Math.max(2, Math.min(2048, Math.ceil(len / MASK_TEXEL))), h = Math.max(2, Math.min(1024, Math.ceil((y1 - y0) / MASK_TEXEL)))\n const data = new Uint8Array(w * h)\n const texture = new THREE.DataTexture(data, w, h, THREE.RedFormat)\n texture.magFilter = THREE.LinearFilter; texture.minFilter = THREE.LinearFilter; texture.needsUpdate = true\n return { data, texture, w, h, alongU, start: alongU ? u0 : v0, len, y0, height: y1 - y0, rect: new THREE.Vector4(alongU ? u0 : v0, y0, len, y1 - y0) }\n }\n\n /** Distance from a point (along, y) to a box [a, b] × [c, d] (0 inside). */\n const boxDistance = (s: number, y: number, a: number, b: number, c: number, d: number) => Math.hypot(Math.max(a - s, 0, s - b), Math.max(c - y, 0, y - d))\n\n /** Distance outside the ellipse inscribed in a box (centre `cs`, `cy`, half sizes `rs`, `ry`), roughly in metres (negative inside). */\n const ellipseDistance = (s: number, y: number, cs: number, cy: number, rs: number, ry: number) =>\n (Math.hypot((s - cs) / Math.max(rs, 1e-4), (y - cy) / Math.max(ry, 1e-4)) - 1) * Math.min(rs, ry)\n\n /** Share of a cell [a, b] × [y0, y1] the boxes cover (overlaps between them counted once, on a coarse grid). */\n function covered(c: any, boxes: any[]): number {\n const n = 8\n let hit = 0\n for (let j = 0; j < n; j++) {\n const y = c.y0 + ((j + 0.5) / n) * (c.y1 - c.y0)\n for (let i = 0; i < n; i++) {\n const s = c.a + ((i + 0.5) / n) * (c.b - c.a)\n if (boxes.some((k) => s >= k.s0 && s <= k.s1 && y >= k.y0 && y <= k.y1)) hit++\n }\n }\n return hit / (n * n)\n }\n\n /**\n * The damage of the view, drawn again: which units of each part are gone, where shots broke through the units that stay (a crater: an irregular\n * hole through the unit, the plaster broken off around it), the masks (what is gone or broken through, plus a ragged edge of plaster around it,\n * and the opening) and the units seen inside the edge of the cut.\n */\n function paint(view: any) {\n const { mask, core } = view\n const along = (p: number[]) => (mask.alongU ? p[0] : p[2]) - mask.start\n const holes: { a: number; b: number; y0: number; y1: number }[] = []\n const pits: { s: number; y: number; rs: number; ry: number }[] = []\n const discs: { s: number; y: number; r: number }[] = []\n // where the plaster (or the cover) came off and the unit under it stayed: a patch of the face, ragged at the edge\n const flakes: { s: number; y: number; r: number }[] = []\n const shown: any[] = []\n for (const id of view.parts) {\n const part = structure.byId.get(id), units = specOf(id).units, chips = view.chips.get(id), opening = view.openings.get(id), spalls = view.spalls.get(id)\n const all = cells(part, units)\n const thick = mask.alongU ? part.aabb[3] - part.aabb[1] : part.aabb[2] - part.aabb[0]\n const mid = mask.alongU ? (part.aabb[1] + part.aabb[3]) / 2 : (part.aabb[0] + part.aabb[2]) / 2\n if (opening) discs.push({ s: along(opening.center), y: opening.center[1], r: opening.radius })\n for (const k of spalls) flakes.push({ s: along(k.center), y: k.center[1], r: k.radius })\n const boxes = chips.map((k: any) => ({ s0: along(k.center) - k.along, s1: along(k.center) + k.along, y0: k.center[1] - k.up, y1: k.center[1] + k.up }))\n const gone = (c: any) => covered(c, boxes.filter((k: any) => k.s1 > c.a && k.s0 < c.b && k.y1 > c.y0 && k.y0 < c.y1)) >= 0.9\n || (opening && Math.hypot((c.a + c.b) / 2 - along(opening.center), (c.y0 + c.y1) / 2 - opening.center[1]) < opening.radius)\n const kept = []\n for (const c of all) (gone(c) ? holes : kept).push(c)\n for (const c of kept) shown.push({ c, part, units, thick, mid })\n // the shots that broke a unit and left the rest of it: a crater in it\n for (const k of boxes) {\n if (holes.some((h) => k.s0 >= h.a - 1e-4 && k.s1 <= h.b + 1e-4 && k.y0 >= h.y0 - 1e-4 && k.y1 <= h.y1 + 1e-4)) continue\n pits.push({ s: (k.s0 + k.s1) / 2, y: (k.y0 + k.y1) / 2, rs: (k.s1 - k.s0) / 2, ry: (k.y1 - k.y0) / 2 })\n }\n }\n // the masks: what came out or was broken through goes through, the plaster breaks off around it with a ragged edge\n const reach = SPALL_MIN + SPALL_RAGGED\n const ragged = (s: number, y: number) => 0.6 * noise2(s, y, 0.03) + 0.4 * noise2(s + 7.3, y - 3.1, 0.011)\n mask.data.fill(0)\n core.data.fill(0)\n const stamp = (m: any, s0: number, s1: number, y0: number, y1: number, inside: (s: number, y: number) => boolean) => {\n const i0 = Math.max(0, Math.floor((s0 - reach) / m.len * m.w)), i1 = Math.min(m.w - 1, Math.ceil((s1 + reach) / m.len * m.w))\n const j0 = Math.max(0, Math.floor((y0 - reach - m.y0) / m.height * m.h)), j1 = Math.min(m.h - 1, Math.ceil((y1 + reach - m.y0) / m.height * m.h))\n for (let j = j0; j <= j1; j++) {\n const y = m.y0 + (j + 0.5) / m.h * m.height\n for (let i = i0; i <= i1; i++) {\n const s = (i + 0.5) / m.w * m.len\n if (inside(s, y)) m.data[j * m.w + i] = 255\n }\n }\n }\n const plaster = (d: number, s: number, y: number) => d <= SPALL_MIN + SPALL_RAGGED * ragged(s, y)\n for (const c of holes) stamp(mask, c.a, c.b, c.y0, c.y1, (s, y) => plaster(boxDistance(s, y, c.a, c.b, c.y0, c.y1), s, y))\n for (const d of discs) stamp(mask, d.s - d.r, d.s + d.r, d.y - d.r, d.y + d.r, (s, y) => plaster(Math.max(0, Math.hypot(s - d.s, y - d.y) - d.r), s, y))\n for (const f of flakes) {\n const rough = (s: number, y: number) => Math.hypot(s - f.s, y - f.y) - f.r * (0.65 + 0.7 * ragged(s * 2.3, y * 2.3))\n stamp(mask, f.s - 2 * f.r, f.s + 2 * f.r, f.y - 2 * f.r, f.y + 2 * f.r, (s, y) => rough(s, y) <= 0)\n }\n for (const p of pits) {\n stamp(mask, p.s - p.rs, p.s + p.rs, p.y - p.ry, p.y + p.ry, (s, y) => plaster(Math.max(0, ellipseDistance(s, y, p.s, p.y, p.rs, p.ry)), s, y))\n // the hole through the unit: a little inside the crater, with a broken edge\n stamp(core, p.s - p.rs, p.s + p.rs, p.y - p.ry, p.y + p.ry, (s, y) => ellipseDistance(s, y, p.s, p.y, p.rs, p.ry) <= -0.35 * Math.min(p.rs, p.ry) * noise2(s * 1.7, y * 1.3, 0.012))\n }\n mask.texture.needsUpdate = true\n core.texture.needsUpdate = true\n // the units the cut lays bare: those within reach of a hole or a crater\n const near = (c: any) => holes.some((h) => boxDistance((c.a + c.b) / 2, (c.y0 + c.y1) / 2, h.a - (c.b - c.a) / 2, h.b + (c.b - c.a) / 2, h.y0 - (c.y1 - c.y0) / 2, h.y1 + (c.y1 - c.y0) / 2) <= reach)\n || discs.some((d) => boxDistance(d.s, d.y, c.a, c.b, c.y0, c.y1) <= d.r + reach)\n || pits.some((p) => boxDistance(p.s, p.y, c.a, c.b, c.y0, c.y1) <= Math.max(p.rs, p.ry) + reach)\n || flakes.some((f) => boxDistance(f.s, f.y, c.a, c.b, c.y0, c.y1) <= 2 * f.r)\n const list: UnitBox[] = []\n const tone = (hex: number, k: number) => tmp.c.setHex(hex).multiplyScalar(k).getHex()\n for (const { c, part, units, thick, mid } of shown) {\n if (!near(c)) continue\n const centre = mask.start + (c.a + c.b) / 2, y = (c.y0 + c.y1) / 2, len = c.b - c.a, h = c.y1 - c.y0\n // the structure's part reaches past the drawn wall (half the thickness at each end, to close a corner): a unit is drawn only inside the wall drawn\n const at = (s: number, dy: number, d: number, colour: number) => {\n const unit = clipToBox({ x: mask.alongU ? centre : mid, y, z: mask.alongU ? mid : centre, sx: mask.alongU ? s : d, sy: dy, sz: mask.alongU ? d : s, colour }, view.bounds)\n if (unit) list.push(unit)\n }\n const base = fragmentMaterial(part.material).color.getHex()\n const n = noise2(centre * 3.1, y * 2.7, 0.07)\n if (units.mortar === 'concrete') {\n // cast concrete: one face with no joints (the cells only cut it where a shot went through), its grey a little uneven\n at(len, h, thick - 2 * COVER, tone(base, 0.9 + 0.04 * n))\n } else {\n // brick in its mortar: the joint behind, the unit a little smaller and standing out of it\n at(len, h, thick - 2 * COVER - 0.012, 0x9d978c)\n at(len - 0.012, h - 0.012, thick - 2 * COVER, tone(base, 0.8 + 0.35 * n))\n }\n }\n if (view.units) { view.units.removeFromParent(); view.units.dispose() }\n const units = new THREE.InstancedMesh(unitGeometry, view.unitMaterial, Math.max(1, list.length))\n units.name = 'breach:' + view.host\n list.forEach((u, i) => {\n tmp.m.compose(tmp.p.set(u.x, u.y, u.z), tmp.q.identity(), tmp.s.set(u.sx, u.sy, u.sz))\n units.setMatrixAt(i, tmp.m)\n units.setColorAt(i, tmp.c.setHex(u.colour))\n })\n units.count = list.length\n units.instanceMatrix.needsUpdate = true\n if (units.instanceColor) units.instanceColor.needsUpdate = true\n units.castShadow = true\n units.receiveShadow = true\n units.visible = lod === 0\n house.add(units)\n view.units = units\n view.gone = holes.length\n view.pits = pits.length\n view.flakes = flakes.length\n }\n\n /**\n * What a `chip` took out, in the house's space: its centre, and its half extents along the wall (`along`) and up (`up`) from its box in the part's\n * axes turned by its world rotation.\n */\n function chipBox(chip: { center: number[]; size: number[]; rotation: number[] }, alongU: boolean) {\n house.updateMatrixWorld(true)\n const q = tmp.q.set(chip.rotation[0], chip.rotation[1], chip.rotation[2], chip.rotation[3]).premultiply(house.getWorldQuaternion(new THREE.Quaternion()).invert())\n let a = 0, u = 0\n for (let k = 0; k < 3; k++) {\n const axis = tmp.p.set(k === 0 ? 1 : 0, k === 1 ? 1 : 0, k === 2 ? 1 : 0).applyQuaternion(q)\n a += Math.abs(alongU ? axis.x : axis.z) * chip.size[k] / 2\n u += Math.abs(axis.y) * chip.size[k] / 2\n }\n return { center: local(chip.center), along: a, up: u }\n }\n\n /** Takes out of the wall of `partId` (or of the wall that draws it) the units the change removed, and draws the damage again. */\n function draw(partId: string, change: { opening?: { center: number[]; radius: number }; chip?: { center: number[]; size: number[]; rotation: number[] }; spall?: { center: number[]; radius: number } }): boolean {\n if (lod !== 0) return false\n const hostId = hostOf(partId)\n if (!hostId || !specOf(partId)?.units) return false\n let view = views.get(hostId)\n if (!view) {\n const items = structure.meshesOf(hostId).filter((it: any) => it.mesh)\n if (!items.length) return false\n const parts = [hostId, ...riders(hostId)].filter((id) => structure.byId.get(id) && specOf(id)?.units)\n if (!parts.includes(partId)) return false\n const mask = maskOf(hostId, parts), core = maskOf(hostId, parts)\n view = {\n host: hostId, parts, items, mask, core, unitMaterial: unitsMaterial(core), shells: [], saved: null, units: null, gone: 0, pits: 0, bounds: drawnBounds(items),\n chips: new Map(parts.map((id) => [id, [] as any[]])), spalls: new Map(parts.map((id) => [id, [] as any[]])), openings: new Map(), flakes: 0,\n }\n }\n if (!view.chips.has(partId)) return false\n if (change.opening) {\n if (view.openings.has(partId)) return false\n view.openings.set(partId, { center: local(change.opening.center), radius: change.opening.radius })\n }\n if (change.chip) view.chips.get(partId).push(chipBox(change.chip, view.mask.alongU))\n if (change.spall) {\n const list = view.spalls.get(partId)\n list.push({ center: local(change.spall.center), radius: change.spall.radius })\n if (list.length > MAX_FLAKES) list.shift()\n }\n if (!view.saved) {\n view.shells = view.items.map((it: any) => shell(it, view.mask))\n // and what shows where it is cut: the units\n for (const m of view.shells) m.userData.behind = () => view.units\n view.saved = view.items.map((it: any) => ({ it, v0: it.v0, data: collapseRange(it.mesh, it.v0, it.v1) }))\n }\n views.set(hostId, view)\n // the hole a wall gets (an opening, a unit knocked out) shows at once; the plaster chipping around it fills in with the next flush\n if (opts.deferPaint && change.spall) dirty.add(view)\n else { dirty.delete(view); paint(view); invalidate(); invalidateShadow() }\n return true\n }\n\n function plain(view: any, shown: boolean) {\n for (const s of view.saved) {\n if (shown) restoreRange(s.it.mesh, s.v0, s.data)\n else s.data = collapseRange(s.it.mesh, s.v0, s.it.v1)\n }\n }\n\n /** Repaints the walls whose damage changed since the last call, until the budget is spent; the rest wait for the next call. Returns how many walls wait. */\n function flush(budgetMs: number = paintBudgetMs): number {\n if (dirty.size === 0) return 0\n const deadline = performance.now() + budgetMs\n for (const view of dirty) {\n dirty.delete(view)\n paint(view)\n if (performance.now() >= deadline) break\n }\n invalidate(); invalidateShadow()\n return dirty.size\n }\n\n function dispose(view: any) {\n dirty.delete(view)\n if (view.units) { view.units.removeFromParent(); view.units.dispose() }\n view.unitMaterial.dispose()\n for (const m of view.shells) { m.removeFromParent(); m.geometry.dispose(); m.material.dispose() }\n view.mask.texture.dispose(); view.core.texture.dispose()\n }\n\n return {\n /** Handles a `stage` event of the house's object. Returns true when the wall was cut. */\n stage(event: any): boolean { return event.stage === 2 && !!event.opening ? draw(event.part, { opening: event.opening }) : false },\n /**\n * Handles a `spall` of a wall of units: the coat comes off in a ragged patch and the units show under it, drawn by the house (the destruction\n * renderer leaves its flat patch out on the meshes `claim` marked). Returns true when the wall was cut.\n */\n spall(event: any): boolean {\n const r = Math.sqrt(Math.max(0, event.area) / Math.PI)\n return r > 0 ? draw(event.part, { spall: { center: event.point, radius: r } }) : false\n },\n /**\n * Marks the meshes that draw a wall of units as drawing its spalls itself (`userData.drawnSpalls`, the part ids): the destruction renderer then\n * throws the bits and leaves its patch out. Call it once the spec is known.\n */\n claim(): void {\n for (const q of opts.spec()?.parts ?? []) {\n if (!q.units) continue\n const host = hostOf(q.id)\n if (!host) continue\n for (const it of structure.meshesOf(host)) {\n if (!it.mesh) continue\n const list = (it.mesh.userData.drawnSpalls ??= [])\n if (!list.includes(q.id)) list.push(q.id)\n }\n }\n },\n /**\n * Handles a `chip` event: what came out (a unit, or a crater a shot broke through one) leaves a hole in the wall where it was; a `torn` chip (what a blow\n * tore off a face) leaves the marks the renderer drew. Returns true when the wall was cut.\n */\n chip(event: any): boolean {\n if (event.torn) return false\n return draw(event.part, { chip: { center: event.center, size: event.size ?? [0, 0, 0], rotation: event.rotation ?? [0, 0, 0, 1] } })\n },\n /** The part broke or fell: its damage goes (the plain range stays collapsed, the renderer hides the part). */\n drop(partId: string): void {\n const v = views.get(partId)\n if (!v) return\n dispose(v); views.delete(partId)\n // the range stays collapsed (the renderer hides the part); `restore` puts it back\n if (v.saved) dropped.push(v)\n },\n /** LOD 0 draws the cut wall; LOD 1 and 2 give the wall its box back. */\n setLod(level: number): void {\n flush(Infinity)\n const was = lod; lod = level\n if ((was === 0) === (level === 0)) return\n for (const v of views.values()) {\n v.units.visible = level === 0\n for (const m of v.shells) m.visible = level === 0\n plain(v, level !== 0)\n }\n invalidate(); invalidateShadow()\n },\n /** Everything back to what it was (after `world.reset`). */\n restore(): void {\n for (const v of views.values()) {\n dispose(v)\n if (lod === 0) plain(v, true)\n }\n views.clear()\n for (const v of dropped) plain(v, true)\n dropped.length = 0\n },\n flush,\n /** The wall has damage drawn. */\n has(partId: string): boolean { return views.has(partId) },\n /** Walls with damage drawn, units out of them, craters shots broke through units that stay, and units laid bare at the edge of the cuts. */\n statistics: () => (flush(Infinity), {\n walls: views.size,\n gone: [...views.values()].reduce((n, v) => n + v.gone, 0),\n craters: [...views.values()].reduce((n, v) => n + v.pits, 0),\n flakes: [...views.values()].reduce((n, v) => n + v.flakes, 0),\n units: [...views.values()].reduce((n, v) => n + v.units.count, 0),\n }),\n }\n }\n\n Object.assign(K, { createBreachView })\n}\n","import type { Kernel, Shared } from '../kernel-types.js';\n\n/** How long damage waits for the host's `update` of a followed object before it is painted anyway. */\nconst FOLLOW_FLUSH_FALLBACK_MS = 100;\n\nexport function installDestructionWorld(K: Kernel, shared: Shared): void {\n const { THREE, cfg, invalidateShadow, invalidate, rngString, FRAGMENT_GEO, fragmentMaterial, createBreachView } = K;\n function createHouseDestruction(root, house, structure, parts, colliders, water) {\n const D: any = { world: cfg.destruction || null, id: null, active: false }, hiddenPieces = new Set(), bodies = new Map(), frags = [], facets = new Map(); let flow = 0, off = null, inside = false;\n // cfg.destructionRenderer = createDestructionRenderer(THREE, { scene, world }) of @adatechnology/game-destruction-three: it draws fracture, collapse, fragments, spalls and the rebar cage on the vertex ranges this house binds. Without it the house draws its own (hide, fall, shards).\n const R = cfg.destructionRenderer || null, listeners = new Set<(e: any) => void>();\n D.renderer = R; D.spec = null;\n const breach = createBreachView({ house, structure, spec: () => D.spec, deferPaint: true, ...(cfg.breachPaintBudgetMs !== undefined ? { paintBudgetMs: cfg.breachPaintBudgetMs } : {}) }); D.breach = breach;\n D.onEvent = fn => { listeners.add(fn); return () => listeners.delete(fn); };\n const pieceId = p => (structure.byId.has(p.id) ? p.id : p.type === 'water_tank' && structure.byId.has('water_tank') ? 'water_tank' : null);\n for (const p of Object.values<any>(parts)) if (p.damageable) { const id = pieceId(p); if (id) { if (!facets.has(id)) facets.set(id, []); facets.get(id).push(p.damageable); } }\n for (const c of colliders) if (c.piece && c.damageable && structure.byId.has(c.piece)) { if (!facets.has(c.piece)) facets.set(c.piece, []); facets.get(c.piece).push(c.damageable); }\n const worldPoint = (it, v) => v.clone().applyMatrix4(it.matrixWorld);\n const hide = it => {\n if (it.obj) { it.obj.visible = false; return; } if (it.whole) { it.mesh.visible = false; return; }\n const pos = it.mesh.geometry.attributes.position, A = pos.array, u = it.mesh.userData; if (!u._p0) u._p0 = A.slice();\n const x = A[it.v0 * 3], y = A[it.v0 * 3 + 1], z = A[it.v0 * 3 + 2]; for (let k = it.v0; k < it.v1; k++) { A[k * 3] = x; A[k * 3 + 1] = y; A[k * 3 + 2] = z; } pos.needsUpdate = true;\n };\n const show = it => {\n if (it.obj) { it.obj.visible = true; return; } if (it.whole) { it.mesh.visible = true; return; }\n const u = it.mesh.userData; if (!u._p0) return; const pos = it.mesh.geometry.attributes.position; pos.array.set(u._p0.subarray(it.v0 * 3, it.v1 * 3), it.v0 * 3); pos.needsUpdate = true;\n };\n const extract = it => { // the piece's slice in a mesh of its own, with the origin at the centre (to fall and spin)\n const g0 = it.mesh.geometry, src = it.mesh.userData._p0 || g0.attributes.position.array, g = new THREE.BufferGeometry();\n const at = (name, k, arr?) => g.setAttribute(name, new THREE.BufferAttribute((arr || g0.attributes[name].array).slice(it.v0 * k, it.v1 * k), k));\n at('position', 3, src); at('normal', 3); at('color', 3); at('uv', 2);\n const ix = g0.index.array.slice(it.i0, it.i1); for (let k = 0; k < ix.length; k++) ix[k] -= it.v0; g.setIndex(new THREE.BufferAttribute(ix, 1));\n g.computeBoundingBox(); const c = g.boundingBox.getCenter(new THREE.Vector3()); g.translate(-c.x, -c.y, -c.z); g.computeBoundingSphere(); g.computeBoundingBox();\n const m = new THREE.Mesh(g, it.mesh.material); m.castShadow = it.mesh.castShadow; m.receiveShadow = true; m.renderOrder = it.mesh.renderOrder; m.position.copy(c); it.mesh.parent.add(m); return m;\n };\n D.hide = id => { if (hiddenPieces.has(id)) return; hiddenPieces.add(id); for (const it of structure.meshesOf(id)) hide(it); invalidateShadow(); };\n D.dropPiece = id => { // collapse: the piece leaves the house and falls\n if (hiddenPieces.has(id) || bodies.has(id)) return; const list = [], rr = rngString(id);\n for (const it of structure.meshesOf(id)) { if (it.obj) { hide(it); continue; } const m = extract(it); hide(it); const hy = (m.geometry.boundingBox.max.y - m.geometry.boundingBox.min.y) / 2; list.push({ mesh: m, vy: 0, hy, y0: m.position.y, rot: 0, w: [(rr() - 0.5) * 0.5, (rr() - 0.5) * 0.3, (rr() - 0.5) * 0.5], landing: false }); }\n hiddenPieces.add(id); if (list.length) bodies.set(id, list); invalidate(); invalidateShadow();\n };\n D.restore = () => { // everything goes back to what it was (after world.reset)\n breach.restore(); if (R && D.id && D.active) R.restore(D.id);\n for (const id of hiddenPieces) for (const it of structure.meshesOf(id)) show(it);\n hiddenPieces.clear(); for (const l of bodies.values()) for (const b of l) { b.mesh.removeFromParent(); b.mesh.geometry.dispose(); } bodies.clear();\n for (const f of frags) f.mesh.removeFromParent(); frags.length = 0; flow = 0; if (water.leak) water.leak(0);\n for (const l of facets.values()) for (const d of l) d.hp = d.hpMax; invalidate(); invalidateShadow();\n };\n const fragments = e => {\n const scene = root.parent; if (!scene || !e.fragments) return; const n = Math.min(e.fragments.length, 10);\n for (let k = 0; k < n; k++) { const f = e.fragments[k], m = new THREE.Mesh(FRAGMENT_GEO, fragmentMaterial(f.material)); m.scale.set(Math.max(0.03, f.size[0]), Math.max(0.03, f.size[1]), Math.max(0.03, f.size[2])); m.position.set(f.center[0], f.center[1], f.center[2]); m.quaternion.set(f.rotation[0], f.rotation[1], f.rotation[2], f.rotation[3]); scene.add(m); frags.push({ mesh: m, v: f.velocity.slice(), t: 0, still: false, h: m.scale.y / 2 }); }\n while (frags.length > 90) { const f = frags.shift(); f.mesh.removeFromParent(); }\n };\n const facetsOf = (id, fn) => { const l = facets.get(id); if (l) for (const d of l) fn(d); };\n const handleEvent = e => {\n if (e.object !== D.id) return;\n if (cfg.onWreck) { try { cfg.onWreck(e, house); } catch (x) { console.warn('onWreck', x); } }\n for (const fn of listeners) fn(e);\n switch (e.type) {\n case 'damage': { const ps = D.world.part(D.id, e.part); if (ps && ps.maxHp) facetsOf(e.part, d => { d.hp = Math.min(d.hp, Math.ceil(d.hpMax * Math.max(0, e.hp) / ps.maxHp)); }); break; }\n case 'fracture': {\n facetsOf(e.part, d => { const before = d.hp; d.hp = 0; if (before > 0 && !inside && cfg.onDamage) { const p = Object.values<any>(parts).find(q => q.damageable === d); if (p) cfg.onDamage(p, e.point ? { x: e.point[0], y: e.point[1], z: e.point[2] } : null, 'structure'); } });\n breach.drop(e.part); if (R) break;\n const c = bodies.get(e.part); if (c) { for (const b of c) { b.mesh.removeFromParent(); b.mesh.geometry.dispose(); } bodies.delete(e.part); } else D.hide(e.part);\n fragments(e); break; }\n case 'stage': breach.stage(e); break;\n case 'chip': breach.chip(e); break;\n case 'spall': breach.spall(e); break;\n case 'collapse': for (const id of e.parts) { breach.drop(id); if (!R && structure.meshesOf(id).length) D.dropPiece(id); } break;\n case 'leak': if (e.part === 'water_tank') { flow += e.rate; if (water.leak) water.leak(flow); } break;\n default: break;\n }\n };\n D.sync = () => { if (!D.active) return; house.updateMatrixWorld(true); const p = new THREE.Vector3(), q = new THREE.Quaternion(), sc = new THREE.Vector3(); house.matrixWorld.decompose(p, q, sc); D.world.setTransform(D.id, [p.x, p.y, p.z], [q.x, q.y, q.z, q.w]); };\n // part id -> what draws it: a loose group, a whole mesh, or the vertex range of a merged mesh (the renderer's bind option)\n const rangesOf = () => {\n const out: Record<string, any[]> = {};\n for (const id of structure.byId.keys()) {\n const items = structure.meshesOf(id).map(it => (it.obj ? it.obj : it.whole ? it.mesh : { mesh: it.mesh, range: [it.v0, it.v1] }));\n if (items.length) out[id] = items;\n }\n return out;\n };\n D.ranges = rangesOf;\n D.activate = (world, specOptions) => { // specOptions: options of house.structure.spec (e.g. {infill:true} = only pillars, beams, slab and roof carry)\n if (world) D.world = world; if (D.active || !D.world) return D; house.updateMatrixWorld(true);\n const p = new THREE.Vector3(), q = new THREE.Quaternion(), sc = new THREE.Vector3(); house.matrixWorld.decompose(p, q, sc);\n D.specOptions = specOptions || null; D.spec = structure.spec(specOptions); D.id = D.world.add(D.spec, { id: 'house3d:' + (++shared.destructionSeq), position: [p.x, p.y, p.z], rotation: [q.x, q.y, q.z, q.w] });\n breach.claim(); if (R) R.bind(D.id, house, { parts: rangesOf(), onFrame: () => breach.flush() });\n off = D.world.on('*', handleEvent); D.active = true; return D;\n };\n D.deactivate = () => { if (off) off(); off = null; D.restore(); if (R && D.id && D.active) R.unbind(D.id); if (D.active && D.world.has(D.id)) D.world.remove(D.id); D.active = false; };\n // follow: an object some other code added to the world with this house's spec (a free-standing wall in a test room) is drawn by its renderer; the house\n // keeps only what that renderer cannot draw on it, the units of a wall that come out (chips and breach). Returns what undoes it.\n D.follow = (world, id, spec) => {\n D.spec = spec; breach.claim();\n let fallback: ReturnType<typeof setTimeout> | null = null;\n const offFollow = world.on('*', e => {\n if (e.object !== id) return;\n switch (e.type) {\n case 'stage': breach.stage(e); break;\n case 'chip': breach.chip(e); break;\n case 'spall': breach.spall(e); break;\n case 'fracture': breach.drop(e.part); break;\n case 'collapse': for (const p of e.parts) breach.drop(p); break;\n default: break;\n }\n // a host that never calls `update` still gets the damage painted\n if (!fallback && typeof setTimeout === 'function') fallback = setTimeout(() => { fallback = null; breach.flush(Infinity); }, FOLLOW_FLUSH_FALLBACK_MS);\n });\n return { restore: () => breach.restore(), dispose: () => { offFollow(); breach.restore(); }, update: () => { breach.flush(); } };\n };\n D.piece = id => (D.active ? D.world.part(D.id, id) : null);\n D.state = () => (D.active ? D.world.state(D.id) : null);\n D.reset = () => { if (D.active) D.world.reset(D.id); D.restore(); };\n // hit: the legacy `damage` becomes a hit in the core (amount/hpMax of the damageable = fraction of the piece's hp). A shot with a point on the piece goes in as ballistic; with no hit, as blunt.\n D.strike = (pid, point, type, amount, d) => {\n if (!D.world || !structure.byId.has(pid)) return null; D.activate(); if (!D.active) return null; const ps = D.world.part(D.id, pid); if (!ps || ps.status === 'broken') return null;\n D.sync(); const fraction = d && d.hpMax ? (amount != null ? amount : 1) / d.hpMax : 0.25, energy = Math.max(1, fraction * ps.maxHp / 0.02);\n const pc = structure.byId.get(pid), c0 = point ? null : house.localToWorld(new THREE.Vector3((pc.aabb[0] + pc.aabb[2]) / 2, (pc.y0 + pc.y1) / 2, (pc.aabb[1] + pc.aabb[3]) / 2)), pt = point ? [point.x, point.y, point.z] : [c0.x, c0.y, c0.z]; let r = null; inside = true;\n try {\n if (type === 'fire') r = D.world.hitPart(D.id, pid, { type: 'fire', point: pt, temperature: 700, radius: 0.3, duration: 0.5 * (amount || 1) });\n else if (type === 'explosion') r = D.world.hitPart(D.id, pid, { type: 'explosive', point: pt, energy: energy, radius: 1.5 });\n else {\n if (type !== 'strike' && point) r = D.world.hitPart(D.id, pid, { type: 'ballistic', point: pt, direction: [0, 0, -1], energy: energy, caliber: 9 });\n if (!r || !(r.damage > 0)) r = D.world.hitPart(D.id, pid, { type: 'blunt', point: pt, energy: energy, radius: 0.35 });\n }\n } finally { inside = false; }\n return r;\n };\n D.animate = dt => {\n breach.flush(); // the damage of this frame's events is painted once, here, instead of once per event\n if (R) return; // the renderer steps fragments and loose pieces in its own update\n let moved = false;\n for (const [id, list] of bodies) {\n for (const b of list) { if (b.landing) continue; moved = true; b.vy -= 9.8 * dt; b.mesh.position.y += b.vy * dt; if (b.rot < 0.5) { b.mesh.rotation.x += b.w[0] * dt; b.mesh.rotation.y += b.w[1] * dt; b.mesh.rotation.z += b.w[2] * dt; b.rot += dt; } if (b.mesh.position.y <= b.hy) { b.mesh.position.y = b.hy; b.landing = true; } }\n if (!list.impacted && list.every(b => b.landing)) { // landed: the impact (mass x height) fractures the piece in the core\n list.impacted = true; const ps = D.active ? D.world.part(D.id, id) : null; const b = list[0];\n if (ps && ps.status !== 'broken') { const h = Math.max(0.5, b.y0 - b.hy), c = worldPoint(b.mesh.parent, b.mesh.position); D.world.hitPart(D.id, id, { type: 'blunt', point: [c.x, c.y, c.z], energy: ps.mass * 9.8 * h, radius: 0.5, source: 'fall' }); }\n }\n }\n const scene = root.parent, ground = scene ? root.getWorldPosition(new THREE.Vector3()).y : 0;\n for (let i = frags.length - 1; i >= 0; i--) {\n const f = frags[i]; f.t += dt; if (f.t > 14) { f.mesh.removeFromParent(); frags.splice(i, 1); moved = true; continue; }\n if (f.still) continue; moved = true; f.v[1] -= 9.8 * dt; f.mesh.position.x += f.v[0] * dt; f.mesh.position.y += f.v[1] * dt; f.mesh.position.z += f.v[2] * dt; f.mesh.rotation.x += f.v[0] * dt; f.mesh.rotation.z += f.v[2] * dt;\n if (f.mesh.position.y <= ground + f.h) { f.mesh.position.y = ground + f.h; if (Math.abs(f.v[1]) > 1.5) { f.v[1] *= -0.3; f.v[0] *= 0.6; f.v[2] *= 0.6; } else f.still = true; }\n }\n if (moved) invalidate();\n };\n D.statistics = () => ({ hiddenPieces: hiddenPieces.size, falling: bodies.size, fragments: frags.length, breached: breach.statistics() });\n return D;\n }\n Object.assign(K, { createHouseDestruction });\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars -- port of the team's closure: dead locals and shapes stay as delivered */\nimport { markKitOrigin } from '@adatechnology/game-contracts';\nimport { panelViewOf } from '../destruction/panels.js';\nimport type { Kernel, Shared } from '../kernel-types.js';\n\nexport function installBuildBuild(K: Kernel, shared: Shared): void {\n const { THREE, cfg, rectsOf, invalidateShadow, colliderChanged, VERSION, CARS, EPS, LIGHTS, MIRRORS, Y0, animateClotheslines, animateDoors, animateInteractive, applyLeaf, applyOutbuildings, applyPart, applyPiece, assembleInteractive, baseboardAndSidewalk, buildStairs, building, carModel, chooseMirror, closeScene, collideAt, createWater, cursor, doorText, doors, electricalStructure, elevator, floorsAndSlabs, gatesInteractive, houseItems, ivAssemble, ivBuild, ivDispose, ivParts, ivPublish, ivUpdate, lightOn, linkDoorLeaves, mailboxInteractive, newInteractiveState, newMirrorState, outbuildings, paths, perimeter, placeSwitches, roofs, roomAt, solar, targetOf, terrain, toggleDoor, toggleLight, walls, waterPipes, windows, props, TYPES, IVK, VEG, vegMaterials, markGroups, assembleStructure, createHouseDestruction, newState, enter, tagDamage } = K;\n function build(r0, opts) {\n opts = opts || {};\n const r = applyOutbuildings(r0); // R43: the outbuilding (res.outbuildings) enters the plan the SDK draws as a room, walls, door, windows and items; res.r stays the original plan\n const t0 = performance.now();\n const h: any = { ctx: { mv: props, types: TYPES }, inter: newInteractiveState(), state: opts.state || newState(), mirrors: newMirrorState(), quality: opts.quality === 'game' || opts.quality === 'high' ? opts.quality : (cfg.quality === 'game' ? 'game' : 'high'), lodCurrent: 0, lodMin: 0 };\n enter(h);\n cursor.accs.clear(); LIGHTS.length = 0;\n const pr = opts.building || {};\n shared.ctx.r = r; shared.ctx.colors = r.colors; shared.ctx.cut = !!opts.cut; shared.ctx.night = !!opts.night; shared.ctx.labels = []; shared.ctx.colliders = []; shared.ctx.stairs = []; shared.ctx.noTerrain = opts.terrain === false;\n shared.ctx.roomById = {}; for (const c of r.rooms) shared.ctx.roomById[c.id] = c;\n shared.ctx.pieces = new Map(); shared.ctx.pieceObjects = new Map(); shared.ctx.structureIndex = {}; for (const e of (r0.structure && r0.structure.parts) || []) shared.ctx.structureIndex[e.id] = e; { const view = shared.ctx.panelView = panelViewOf(r0.structure, !!cfg.destruction); shared.ctx.panelsOf = new Map(); for (const id of view.replaced) delete shared.ctx.structureIndex[id]; for (const e of view.panels) { shared.ctx.structureIndex[e.id] = e; const l = shared.ctx.panelsOf.get(e.slab); if (l) l.push(e); else shared.ctx.panelsOf.set(e.slab, [e]); } } shared.ctx.panes = (r0.roof && r0.roof.panes) || []; shared.ctx.noPiece = false;\n cursor.separate = opts.pieces === 'meshes'; cursor.pc = null;\n shared.ctx.apartment = r.template === 'apartment_modern'; shared.ctx.pa = Math.max(3, Math.min(20, pr.floors != null ? pr.floors : 5)); shared.ctx.pf = Math.max(1, Math.min(shared.ctx.pa, pr.floor != null ? pr.floor : 3)); shared.ctx.pu = Math.max(0, pr.unit != null ? pr.unit : 0);\n shared.ctx.showBuilding = shared.ctx.apartment && (pr.showIt == null ? true : !!pr.showIt);\n shared.ctx.limits = { x0: -2, z0: -2, x1: r.w + 2, z1: r.d + 2 };\n shared.ctx.veg = VEG ? { G: VEG.G, S: VEG.S, mats: vegMaterials, groups: new Map(), ok: new Map(), opts: shared.quality === 'game' ? { quality: 'game' } : { lod: 0, triangleBudget: 60000 } } : null; shared.ctx.vegInfo = null;\n terrain();\n if (r.lot) { if (!opts.noPerimeter) { perimeter(); gatesInteractive(); } paths(); } // GAME HOOK (stage 2): opts.noPerimeter:true does not draw the lot wall/fence/gates (the game has its own destructible wall on the Jardim Aurora lots)\n walls(); baseboardAndSidewalk(); shared.ctx.wallColliders = shared.ctx.colliders.length; doors(); windows(); floorsAndSlabs(); outbuildings(); buildStairs(); elevator();\n const water = createWater(r, h.state);\n shared.ctx.iv = null; h.IV = null;\n if (IVK) { try { h.IV = shared.ctx.iv = ivBuild(h, water); } catch (e) { console.warn('interactables', e); shared.ctx.iv = h.IV = null; } } // interactables kit: plans, draws and wires (see 75)\n const noModel = houseItems(); placeSwitches(); waterPipes(); electricalStructure();\n roofs(); solar();\n if (shared.ctx.showBuilding) building();\n for (const c of r.rooms) { if (c.type === 'void') continue; const [a, b, c2, d] = rectsOf(c)[0]; shared.ctx.labels.push({ pos: new THREE.Vector3((a + c2) / 2, Y0(c.floor) + 1.1, (b + d) / 2), text: c.name, group: 'f' + c.floor, type: 'room', floor: c.floor }); }\n const mirrorsCopy = MIRRORS.map((E, i) => Object.assign({ i }, E)), gs = closeScene(shared.mats);\n for (const fo of shared.ctx.leaves) { // door leaves: loose groups with the origin at the hinge, inside the floor group\n const parent = gs['f' + fo.floor] || (gs['f' + fo.floor] = new THREE.Group()); fo.gs = [];\n for (const gd of fo.groups) { const g = gs[gd.name]; if (!g) continue; delete gs[gd.name]; g.position.set(...gd.pos); parent.add(g); fo.gs.push(g); }\n applyLeaf(fo);\n }\n if (shared.ctx.iv) ivAssemble(shared.ctx.iv, gs);\n assembleInteractive(gs); linkDoorLeaves(); mailboxInteractive();\n const root = markKitOrigin(new THREE.Group(), { owner: 'game-floorplan-three', kind: 'structure', id: r.template }), house = new THREE.Group(); root.name = 'house3d'; root.add(house); shared.mirrors.house = house;\n if (shared.ctx.apartment) { const u = r.building.units[Math.min(shared.ctx.pu, r.building.units.length - 1)]; house.position.set(u.u, shared.ctx.showBuilding ? 0 : -r.floors[0].y0, u.v); house.rotation.y = u.ry; shared.ctx.unitRy = u.ry; }\n house.updateMatrixWorld(true); shared.ctx.unitInverse = house.matrixWorld.clone().invert();\n for (const [k, g] of Object.entries<any>(gs)) { g.name = k; (k === 'floor' || k === 'building' ? root : house).add(g); }\n h.groups = gs; h.root = root; h.house = house; h.houseGroup = house;\n shared.ctx.noModel = noModel;\n shared.ctx.lights = LIGHTS.filter(l => l.type !== 'lantern' && l.type !== 'candles' || shared.ctx.night).map(l => ({ ...l })); // real lights requested by the builders (at night)\n shared.ctx.animateDoorsOn = shared.ctx.animateDoorsOn || false;\n\n // ---- public colliders: walls/doors/walls of the lot/gates (aabb) and furniture (obb) ----\n for (const c of shared.ctx.colliders) { c.aabb = [c.x0, c.z0, c.x1, c.z1]; if (c.type === 'wall') c.damageable = tagDamage('masonry'); }\n const colliders = shared.ctx.colliders.concat(shared.inter.objs.map(o => ({ type: 'furniture', f: o.f, obb: { cx: o.cx, cz: o.cz, hw: o.hw, hd: o.hd, c: o.c, s: o.s }, item: o.type, off: false })));\n\n // ---- parts (id -> {group, type, opens(t), damageable}) ----\n const parts = {}, setOpen = (def, t) => { def.target = t; def.t = t; shared.partState.set(def.name, t); if (def.col) { def.col.off = t > 0.5; colliderChanged(def.col); } applyPiece(def); shared.inter.anim.delete(def); invalidateShadow(); };\n const mark = (o, id) => { if (o) o.userData.partId = id; };\n const PART_DAMAGE = { water_tank: 'water', shower_door: 'glass', gate_leaf: 'metal', mailbox_door: 'metal', mirror: 'glass', cooking_gas_cylinder: 'gas' };\n for (const [id, g] of Object.entries<any>(shared.ctx.parts || {})) {\n const tp = g.userData.part, dn = PART_DAMAGE[tp]; if (dn) g.userData.damageable = tagDamage(dn);\n mark(g, id);\n if (tp === 'wall_pipe') { parts[id] = { id, type: tp, group: g, damageable: null, hidden: true, run: g.userData.run, to: g.userData.to, opens: t => { g.visible = t > 0.5; invalidateShadow(); }, get t() { return g.visible ? 1 : 0; }, meta: g.userData }; continue; } // R69: pipe inside the wall: hidden until the destruction stage reveals it (opens(1))\n parts[id] = { id, type: tp, group: g, damageable: g.userData.damageable || null, opens: t => { applyPart(g, t); invalidateShadow(); }, get t() { return g.userData.t || 0; }, meta: g.userData };\n }\n for (const fo of shared.ctx.leaves) {\n const id = 'door:' + fo.id, dn = tagDamage(fo.type === 'steel' ? 'metal' : 'wood'); fo.damageable = dn; for (const g of fo.gs) mark(g, id);\n parts[id] = { id, type: fo.type === 'steel' ? 'garage_door' : 'door', group: fo.gs[0] || null, groups: fo.gs, floor: fo.floor, damageable: dn, opens: t => { fo.open = t > 0.5; fo.t = t; fo.phase = null; if (fo.col) { fo.col.off = fo.open; colliderChanged(fo.col); } shared.doorState.set(fo.id, fo.open); applyLeaf(fo); invalidateShadow(); }, get t() { return fo.t; }, leaf: fo };\n }\n for (const def of shared.inter.defs.values()) {\n if (!def.outer) continue; const cab = def.kind === 'swing' || def.kind === 'drawer', gate = /^gate/.test(def.kind);\n const dn = cab ? tagDamage('wood') : gate ? tagDamage('metal') : null; if (dn) def.damageable = dn;\n mark(def.outer, def.name); parts[def.name] = { id: def.name, type: gate ? 'gate' : def.kind, group: def.outer, internal: def.inner, damageable: dn, opens: t => setOpen(def, t), get t() { return def.t; }, def };\n }\n if (shared.ctx.iv) ivParts(shared.ctx.iv, parts, tagDamage);\n const cars = []; // lot/garage cars: the fleet's damageables (boxes in the car space) become virtual parts in the house space\n CARS.forEach((C, i) => {\n const mod = carModel(C.k, C.seed); if (!mod) return;\n const s = Math.min(1, C.d / mod.L, Math.max(0.5, C.w - 0.05) / mod.W), co = Math.cos(C.ry || 0), si = Math.sin(C.ry || 0), ids = [];\n (mod.damageables || []).forEach((d, j) => {\n const b = d.box; let x0 = 1e9, y0 = 1e9, z0 = 1e9, x1 = -1e9, y1 = -1e9, z1 = -1e9;\n for (const px of [b.min.x, b.max.x]) for (const pz of [b.min.z, b.max.z]) { const lx = (px - mod.off[0]) * s, lz = (pz - mod.off[2]) * s, wx = C.x + lx * co + lz * si, wz = C.z - lx * si + lz * co; x0 = Math.min(x0, wx); x1 = Math.max(x1, wx); z0 = Math.min(z0, wz); z1 = Math.max(z1, wz); }\n y0 = C.y + (b.min.y - mod.off[1]) * s; y1 = C.y + (b.max.y - mod.off[1]) * s;\n const id = 'car:' + i + ':' + d.zone + ':' + j; ids.push(id);\n parts[id] = { id, type: 'car', part: d.part, side: d.side, zone: d.zone, group: null, virtual: true, floor: -1, car: i, aabb: [x0, y0, z0, x1, y1, z1], damageable: tagDamage(d.type), opens: () => { }, t: 0 };\n });\n cars.push({ i, k: C.k, seed: C.seed, pos: [C.x, C.y, C.z], ry: C.ry || 0, scale: s, parts: ids });\n });\n const wallAt = (f, axis, L) => r.walls.find(w => w.floor === f && w.axis === axis && Math.abs((axis === 'u' ? w.v0 : w.u0) - L) < EPS);\n for (const j of r.windows) { // windows live inside the wall geometry (virtual): a box for the shot test; the separate glass joins at the damage stage\n const alongU = j.axis === 'u', y0 = Y0(j.floor), a = j.at - j.width / 2, b = j.at + j.width / 2, w = wallAt(j.floor, j.axis, j.pos), th = w ? w.thickness || 0.15 : 0.15, L = j.pos, id = 'window:' + j.id;\n parts[id] = { id, type: 'window', group: null, virtual: true, floor: j.floor, aabb: alongU ? [a, y0 + j.y0, L - th / 2, b, y0 + j.y1, L + th / 2] : [L - th / 2, y0 + j.y0, a, L + th / 2, y0 + j.y1, b], damageable: tagDamage('glass'), opens: () => { }, t: 0 };\n }\n for (const E of mirrorsCopy) { const id = 'mirror:' + E.i, ex = Math.abs(Math.cos(E.ry)) * E.w / 2 + 0.03, ez = Math.abs(Math.sin(E.ry)) * E.w / 2 + 0.03; parts[id] = { id, type: 'mirror', group: null, virtual: true, floor: E.floor, room: E.room, pos: [E.x, E.y, E.z], aabb: [E.x - ex, E.y - E.h / 2, E.z - ez, E.x + ex, E.y + E.h / 2, E.z + ez], damageable: tagDamage('glass'), opens: () => { }, t: 0 }; }\n\n // ---- interactables ----\n const interactables = [], usedMap = new Map();\n const actOn = (e, a?) => { enter(h); if (cfg.onInteract && cfg.onInteract(e, a) === false) return false; shared.inter.target = a || { target: e.ref, text: e.label, action: e._action }; e._action(); return true; };\n for (const fo of shared.ctx.leaves) { const e: any = { id: 'door:' + fo.id, type: fo.type === 'steel' ? 'garage_door' : 'door', floor: fo.floor, pos: [fo.cx, Y0(fo.floor) + 1.0, fo.cz], radius: 1.7, get label() { return doorText(fo); }, ref: fo, _action: () => toggleDoor(fo) }; e.act = () => actOn(e); interactables.push(e); }\n for (const it of shared.inter.items) { const k = it.type + ':' + it.id, n = usedMap.get(k) || 0; usedMap.set(k, n + 1); const e: any = { id: n ? k + '#' + n : k, type: it.type, floor: it.floor, pos: it.anchor.slice(), radius: it.range, angle: it.angle, get label() { return it.text(); }, ref: it, _action: it.action }; e.act = () => actOn(e); interactables.push(e); it.pub = e; }\n for (const fo of shared.ctx.leaves) fo.pub = interactables.find(e => e.ref === fo);\n\n // ---- LOD / draw statistics ----\n const lodObjects = [];\n for (const def of shared.inter.defs.values()) if (def.outer && /^(light|drawer|swing|curtain|light_switch|handle)$/.test(def.kind)) lodObjects.push(def.outer);\n for (const [id, g] of Object.entries<any>(shared.ctx.parts || {})) if (/^(handle|shower_door)$/.test(g.userData.part) && g.visible !== false) lodObjects.push(g);\n if (shared.ctx.iv) { for (const E of shared.ctx.iv.roots) lodObjects.push(E.root); }\n const countDraw = () => { let n = 0, t = 0; root.traverseVisible(o => { if (o.isMesh) { n++; t += (o.geometry.index ? o.geometry.index.count : o.geometry.attributes.position.count) / 3; } }); return { n, t: Math.round(t) }; };\n const s0 = countDraw(); for (const o of lodObjects) o.visible = false; const s1 = countDraw(); for (const o of lodObjects) o.visible = true;\n const budget = opts.drawCallBudget != null ? opts.drawCallBudget : cfg.drawCallBudget;\n const stats = { quality: h.quality, drawCalls: s0.n, drawCallsLOD1: s1.n, triangles: s0.t, trianglesLod1: s1.t, budget: budget || null, overBudget: !!budget && s0.n > budget, tBuild: performance.now() - t0 };\n shared.ctx.tBuild = stats.tBuild;\n const applyLod = n => { n = Math.max(0, Math.min(2, n | 0)); if (n === h.lodCurrent) return; h.lodCurrent = n; for (const o of lodObjects) o.visible = n < 1; root.visible = n < 2; if (h.destruction) h.destruction.breach.setLod(n); invalidateShadow(); };\n h.lodMin = stats.overBudget ? 1 : 0; if (h.lodMin) applyLod(h.lodMin);\n const bb = new THREE.Box3().setFromObject(house), localCenter = bb.getCenter(new THREE.Vector3());\n const center = () => { house.updateMatrixWorld(); return house.localToWorld(localCenter.clone()); };\n const distance = focus => center().distanceTo(focus instanceof THREE.Vector3 ? focus : new THREE.Vector3(focus.x, focus.y, focus.z));\n\n // ---- destruction: tags the loose groups, describes the structure and prepares the world adapter (cfg.destruction) ----\n markGroups(r, root, parts);\n const structure = assembleStructure(r0, root), destruction = createHouseDestruction(root, house, structure, parts, colliders, water); h.destruction = destruction; destruction.breach.setLod(h.lodCurrent);\n // legacy damage: `house.damage(id, point, type, amount)` still subtracts the damageable's hp (the game reads `hp`) and calls cfg.onDamage, and now also\n // becomes a hit in the core when there is a world (cfg.destruction): the piece really breaks, hides its mesh and drops what it carries. Once fractured, hp is zeroed.\n const strikePiece = (id, point, type, amount, d, before) => {\n if (!destruction.world) return;\n const pid = id && structure.byId.has(id) ? id : (parts[id] && parts[id].type === 'water_tank' && structure.byId.has('water_tank') ? 'water_tank' : null); if (!pid) return;\n destruction.strike(pid, point, type, amount, d);\n if (destruction.active && d.hp <= 0 && before > 0) { const ps = destruction.piece(pid); if (ps && ps.status !== 'broken') destruction.strike(pid, point, 'strike', 1e6, { hpMax: 1 }); }\n };\n const fire = (id, point, type, amount) => {\n const p = parts[id]; if (!p || !p.damageable) return null; const d = p.damageable, before = d.hp;\n d.hp = Math.max(0, d.hp - (amount != null ? amount : 1));\n if (p.type === 'water_tank' && d.hp < before && !destruction.world) water.leak(water.capacity * (1 - d.hp / d.hpMax) / 30); // R69: a shot at the tank opens a leak (empties in 30 s with the tank fully destroyed)\n if (destruction.world) strikePiece(id, point, type, amount, d, before);\n if (cfg.onDamage) cfg.onDamage(p, point, type || 'bullet');\n return { part: p, hp: d.hp, destroyed: d.hp <= 0 && before > 0 };\n };\n // walls: the wall collider carries `piece` (segment id); the game subtracts its hp and calls colliderDamage so the core receives the hit\n const colliderDamage = (c, point, type, amount) => {\n if (!c || !c.damageable) return null; const d = c.damageable, before = d.hp; d.hp = Math.max(0, d.hp - (amount != null ? amount : 1));\n if (destruction.world && c.piece) strikePiece(c.piece, point, type, amount, d, before);\n if (cfg.onDamage) cfg.onDamage({ type: 'wall', damageable: d, collider: c }, point, type || 'bullet');\n return { hp: d.hp, destroyed: d.hp <= 0 && before > 0 };\n };\n\n const res = {\n version: VERSION, r: r0, name: r.name, quality: h.quality, group: root, house, groups: gs,\n floors: r.floors.map((a, i) => gs['f' + i] || new THREE.Group()), ceilings: r.floors.map((a, i) => gs['t' + i] || null), roof: gs.roof || null, lot: gs.lot || null, ground: gs.ground || null, building: gs.building || null,\n waterTank: r.waterTank ? (() => { const pt = Object.values<any>(parts).find(p => p.type === 'water_tank') || null; return { part: pt, group: pt ? pt.group : null, pos: shared.ctx.waterTankPos || null, plant: r.waterTank }; })() : null,\n colliders, parts, cars, interactables, doors: shared.ctx.leaves, stairs: shared.ctx.stairs, labels: shared.ctx.labels, noModel,\n lights: (() => { const by = {}; for (const l of shared.ctx.lights) { const k = l.roomId != null ? l.roomId : l.room; (by[k] || (by[k] = [])).push(l); } return { list: shared.ctx.lights, byRoom: by }; })(),\n limits: shared.ctx.limits, apartment: shared.ctx.apartment, showBuilding: shared.ctx.showBuilding, buildingConfig: { floors: shared.ctx.pa, floor: shared.ctx.pf, unit: shared.ctx.pu }, unitRy: shared.ctx.unitRy || 0, night: shared.ctx.night, cut: shared.ctx.cut,\n interactives: h.IV ? ivPublish(h) : null,\n state: h.state, stats, vegetation: shared.ctx.vegInfo || null, solar: shared.ctx.solarInfo || null, water, electrical: shared.ctx.electricalInfo || null, gutters: shared.ctx.gutterInfo || null,\n // per frame: doors, parts, wind-blown laundry and (with a focus) distance LOD; dt in seconds, time in ms (rAF); focus = {x,y,z} in world coordinates\n update(dt, time, focus) {\n enter(h); animateDoors(dt); animateInteractive(dt); water.step(dt); if (destruction.active || destruction.statistics().falling || destruction.statistics().fragments) destruction.animate(dt); if (h.IV) ivUpdate(h, dt, time, focus); if (time != null) animateClotheslines(time); if (shared.vegMaterials) { shared.vegMaterials.update((time != null ? time : performance.now()) / 1000); shared.vegMaterials.setActors(focus ? [{ x: focus.x, y: focus.y, z: focus.z, radius: 0.9 }] : []); }\n if (focus && cfg.lod !== false) { const L = Object.assign({ interior: 45, hide: 220 }, cfg.lod), d = distance(focus), at = h.lodCurrent; let n = d > L.hide ? 2 : d > L.interior ? 1 : 0; if (n < at) n = d < (at === 2 ? L.hide : L.interior) * 0.92 ? n : at; applyLod(Math.max(n, h.lodMin)); }\n },\n show(o) { // visibility per floor: {floor: -1 all, cut: bool, lot: bool}\n enter(h); o = o || {}; const rr = shared.ctx.r, nA = rr.floors.length, a = o.floor == null ? -1 : o.floor, sel = a >= nA ? -1 : a, cut = !!o.cut;\n for (const [k, g] of Object.entries<any>(gs)) {\n let v = true;\n if (k[0] === 'f') v = sel < 0 || +k.slice(1) <= sel;\n else if (k[0] === 't') v = !cut && (sel < 0 || +k.slice(1) < sel);\n else if (k === 'roof') v = !cut && sel < 0 && (!shared.ctx.apartment || !shared.ctx.showBuilding || shared.ctx.pf === shared.ctx.pa);\n else if (k === 'attic_tank') v = (cut || sel >= 0) && (sel < 0 || nA - 1 <= sel); // attic water tank: only with the roof cut\n else if (k === 'lot') v = o.lot == null ? true : !!o.lot;\n g.visible = v;\n }\n },\n target(o, opt) { enter(h); return targetOf(o, opt); },\n interact(o, opt) { enter(h); const a = targetOf(o, opt); if (!a) return false; return actOn(a.target && a.target.pub ? a.target.pub : { id: a.target && a.target.id || a.text, type: a.target && a.target.kit ? a.target.type : 'door', label: a.text, ref: a.target, _action: a.action }, a); },\n message() { return shared.inter.msg && performance.now() < shared.inter.msg.until ? shared.inter.msg.text : null; },\n toggleDoor(fo) { enter(h); toggleDoor(typeof fo === 'string' ? shared.ctx.leaves.find(f => f.id === fo) : fo); },\n lightOn(roomId) { enter(h); return lightOn(roomId); },\n toggleLight(roomId) { enter(h); toggleLight(roomId); },\n collide(x, z, floor, opt) { enter(h); return collideAt(x, z, floor, opt); },\n roomAt(f, u, v) { enter(h); return roomAt(f, u, v); },\n y0(f) { enter(h); return Y0(f); },\n chooseMirror(camera) { enter(h); chooseMirror(camera); },\n // manual LOD: 0 full; 1 without the small interior pieces (lamps, drawers, furniture doors, curtains, switches, handles); 2 house hidden\n setLod(n) { enter(h); applyLod(Math.max(n, h.lodMin)); }, get lod() { return h.lodCurrent; },\n center, distance,\n // damage: the game calls it when a shot/fire hits a part; the SDK subtracts hp and notifies cfg.onDamage(part, point, type). Draws no damage (stage 3).\n damage: fire, colliderDamage,\n structure, destruction,\n partOf(obj) { for (let n = obj; n; n = n.parent) { const id = n.userData && n.userData.partId; if (id && parts[id]) return parts[id]; const pc = n.userData && n.userData.piece; if (pc && parts[pc.name]) return parts[pc.name]; } return null; },\n partAt(p, tol) { tol = tol || 0.05; let m = null; for (const k in parts) { const a = parts[k].aabb; if (a && p.x >= a[0] - tol && p.x <= a[3] + tol && p.y >= a[1] - tol && p.y <= a[4] + tol && p.z >= a[2] - tol && p.z <= a[5] + tol) { m = parts[k]; break; } } return m; },\n dispose() { enter(h); destruction.deactivate(); if (h.IV) ivDispose(h); root.traverse(o => { if (o.isMesh && o.geometry && !o.geometry.userData.shared) o.geometry.dispose(); if (o.type === 'Reflector' && o.dispose) o.dispose(); }); root.removeFromParent(); },\n internal: { h, ctx: shared.ctx, inter: shared.inter, partState: shared.partState, doorState: shared.doorState, mirrors: shared.mirrors },\n };\n return res;\n }\n Object.assign(K, { build });\n}\n","import type { Kernel, Shared } from '../kernel-types.js';\n\nexport function buildApi(K: Kernel, shared: Shared): any {\n const { cfg, VERSION, ATLAS, TEX, applyPart, carGroup, carModel, props, TYPES, roomLightMask, lighting, newState, build } = K;\n return {\n version: VERSION, build, newState, types: TYPES, mv: props, applyPart,\n // the kernel and the shared state, for recorders that run the team's builders into something else than the house (`furnitureSpec`, `tapSpec`): not a stable api\n internals: { K, shared },\n get materials() { return shared.mats; }, roomLightMask, lighting,\n setNight(n) { shared.mats.glass.emissive.set(n ? 0x8a5a20 : 0x000000); shared.mats.glass.opacity = n ? 0.4 : 0.24; },\n cars: { model: carModel, group: carGroup, info: (k, seed) => { const m = carModel(k, seed); return m && { parts: m.parts.length, tris: m.tris, L: m.L, W: m.W, H: m.H }; } },\n dispose() { if (shared.vegMaterials) { shared.vegMaterials.dispose(); shared.vegMaterials = null; } for (const m of Object.values<any>(shared.mats)) { if (m && m.dispose) m.dispose(); } for (const [k, t] of Object.entries<any>(TEX)) if (t && t.dispose && !(cfg.textures && cfg.textures[k])) t.dispose(); for (const t of Object.values<any>(ATLAS)) if (t && t.dispose) t.dispose(); },\n };\n}\n","/*\n * Floor navigator: walking on several floors of a house (stairs, banisters, path field, occlusion). Literal port of the team's AndaresSDK\n * (sdk/andares), with English names. Coordinates are the house's. The ground floor can keep using the game's own grid: `blocked` answers -1\n * (\"use the ground grid\") unless the house is registered with `own: true`.\n *\n * House: { id, floors: [{ y, h, solids: [[x0, z0, x1, z1], ...] }], stairs: [[x0, z0, x1, z1, from, to, axis], ...], groups: [obj | [obj] ...], roof }\n * - a stair climbs from x0/z0 to x1/z1 (x0 > x1 reverses); stairs with the same footprint become a U-turn (one lane for each flight).\n * - groups[f] = what is drawn of floor f (an Object3D with .visible, or a function show(bool)); roof the same.\n *\n * Additions over the team's code (spec 001, T2.4d): `openCells` and `closeCells` change the fine grid at run time, so a breach (stage 2) opens the\n * cells of a wall and a slab that collapses or fractures removes the cells of its floor (`bindNavigator`, ./bind.ts).\n */\n\n/** A rectangle `[x0, z0, x1, z1]` in the house's coordinates. */\nexport type NavRect = [number, number, number, number]\n/** `[x0, z0, x1, z1, from, to, axis]`: a flight from floor `from` to floor `to` along `axis`. */\nexport type NavStair = [number, number, number, number, number, number, 'x' | 'z']\n\nexport interface NavFloor {\n /** Absolute height of the floor level. */\n y: number\n /** Height of the storey. */\n h: number\n solids?: NavRect[]\n}\n\nexport interface NavHouseDef {\n id: string\n floors: NavFloor[]\n stairs?: NavStair[]\n groups?: unknown[]\n roof?: unknown\n /** The fine grid also rules the ground floor inside the house (default: the ground floor uses the game's grid, except stairs and banisters). */\n own?: boolean\n /** The house's rectangle (default: the union of its solids and stairs). */\n rect?: NavRect\n}\n\n/** A shape on the plan: a rectangle `[x0, z0, x1, z1]` or a circle `[cx, cz, radius]`. */\nexport type NavShape = { rect: NavRect } | { circle: [number, number, number] }\n\nexport interface NavResult {\n y: number\n floor: number\n dx: number\n dz: number\n t: number\n stair: NavFlight | null\n}\n\nexport interface NavFlight {\n x0: number; z0: number; x1: number; z1: number\n axis: 0 | 1\n from: number\n to: number\n group: any\n yFrom: number\n yTo: number\n dir: number\n lo: number\n len: number\n e: number\n}\n\nexport interface NavHouse {\n id: string\n own: boolean\n floors: NavFloor[]\n groups: unknown[]\n roof: unknown\n flights: NavFlight[]\n grids: Uint8Array[]\n fields: any[]\n /** Triples (floor, cell, previous value) of the run-time changes of the grid. */\n journal: number[]\n shown: number\n x0: number; z0: number; x1: number; z1: number\n ox: number; oz: number; nx: number; nz: number\n n: number\n}\n\nconst CELL = 0.1 // fine cell, 10 cm\nconst COARSE = 2 // coarse cell of the path field = 2 x 2 fine ones\nconst OPEN_END = 0.7 // at the ends, the side stays open for 0.7 m (entry/exit by the side)\nconst SLACK = 0.45 // flat stretch at the ends of a stair (m): there one can enter and leave by the sides\nconst SOLID = 1\nconst FREE = 2 // forced free (inside the stair)\nconst VOID = 4 // no floor (a collapsed slab)\nconst clamp = (v: number, a: number, b: number) => (v < a ? a : v > b ? b : v)\n\nexport function createFloorNavigator() {\n const N: any = { houses: [] as NavHouse[], x0: 1e9, z0: 1e9, x1: -1e9, z1: -1e9, currentHouse: null as NavHouse | null, currentFloor: 0, time: 0, result: { y: 0, floor: 0, dx: 0, dz: 0, t: 0, stair: null } as NavResult }\n\n // ----- fine grid of a floor: bit 1 solid, bit 2 forced free (inside the stair), bit 4 no floor -----\n function paint(c: NavHouse, g: Uint8Array, x0: number, z0: number, x1: number, z1: number, v: number) {\n const i0 = Math.max(0, Math.ceil((x0 - c.ox) / CELL - 0.5)), i1 = Math.min(c.nx - 1, Math.floor((x1 - c.ox) / CELL - 0.5))\n const j0 = Math.max(0, Math.ceil((z0 - c.oz) / CELL - 0.5)), j1 = Math.min(c.nz - 1, Math.floor((z1 - c.oz) / CELL - 0.5))\n for (let j = j0; j <= j1; j++) for (let i = i0; i <= i1; i++) { if (v === FREE) g[j * c.nx + i] = FREE; else g[j * c.nx + i] |= v }\n }\n\n function register(def: NavHouseDef): NavHouse {\n const c: NavHouse = { id: def.id, own: !!def.own, floors: def.floors, groups: def.groups || [], roof: def.roof || null, flights: [], grids: [], fields: [], journal: [], shown: -2, x0: 0, z0: 0, x1: 0, z1: 0, ox: 0, oz: 0, nx: 0, nz: 0, n: def.floors.length }\n // the house's rectangle: union of the solids and stairs of all floors (or the given one)\n let x0 = 1e9, z0 = 1e9, x1 = -1e9, z1 = -1e9\n const env = (r: any) => { x0 = Math.min(x0, r[0], r[2]); z0 = Math.min(z0, r[1], r[3]); x1 = Math.max(x1, r[0], r[2]); z1 = Math.max(z1, r[1], r[3]) }\n if (def.rect) env(def.rect); else { for (const a of def.floors) for (const s of a.solids || []) env(s); for (const e of def.stairs || []) env(e) }\n c.x0 = x0; c.z0 = z0; c.x1 = x1; c.z1 = z1\n c.ox = x0 - 0.5; c.oz = z0 - 0.5; c.nx = Math.ceil((x1 - x0 + 1) / CELL); c.nz = Math.ceil((z1 - z0 + 1) / CELL)\n // stairs: groups the ones with the same footprint; each flight takes a lane and the odd ones climb backwards (U-turn)\n const groups: any[] = []\n for (const e of def.stairs || []) {\n const r = [Math.min(e[0], e[2]), Math.min(e[1], e[3]), Math.max(e[0], e[2]), Math.max(e[1], e[3])], ax = e[6] === 'z' ? 1 : 0, inv = ax ? e[3] < e[1] : e[2] < e[0]\n let g = groups.find((q) => q.ax === ax && Math.abs(q.r[0] - r[0]) < 0.08 && Math.abs(q.r[1] - r[1]) < 0.08 && Math.abs(q.r[2] - r[2]) < 0.08 && Math.abs(q.r[3] - r[3]) < 0.08)\n if (!g) groups.push((g = { ax, r, m: [] }))\n g.m.push({ from: e[4], to: e[5], inv })\n }\n for (const g of groups) {\n g.m.sort((a: any, b: any) => a.from - b.from)\n const k = g.m.length, lat = g.ax ? 0 : 1 // lateral axis\n g.m.forEach((m: any, q: number) => {\n const r = g.r.slice(), l0 = g.r[lat], w = (g.r[lat + 2] - l0) / k\n r[lat] = l0 + w * q; r[lat + 2] = l0 + w * (q + 1)\n const s: NavFlight = { x0: r[0], z0: r[1], x1: r[2], z1: r[3], axis: g.ax, from: m.from, to: m.to, group: g, yFrom: def.floors[m.from].y, yTo: def.floors[m.to].y, dir: 0, lo: 0, len: 0, e: 0 }\n s.dir = q & 1 ? (m.inv ? 1 : -1) : m.inv ? -1 : 1 // direction of the axis when climbing\n s.lo = g.ax ? r[1] : r[0]; s.len = (g.ax ? r[3] : r[2]) - s.lo; s.e = Math.min(0.3, SLACK / s.len)\n c.flights.push(s)\n })\n }\n // fine grid per floor\n for (let a = 0; a < c.n; a++) {\n const g = new Uint8Array(c.nx * c.nz); c.grids.push(g)\n for (const s of def.floors[a].solids || []) paint(c, g, Math.min(s[0], s[2]), Math.min(s[1], s[3]), Math.max(s[0], s[2]), Math.max(s[1], s[3]), SOLID)\n }\n // banister: sides and caps closed, except at the open ends of that floor; inside of the stair free\n const T = 0.22\n for (const g of groups) {\n const [rx0, rz0, rx1, rz1] = g.r, ax = g.ax, lo = ax ? rz0 : rx0, hi = ax ? rz1 : rx1, len = hi - lo, f = Math.min(OPEN_END, len * 0.3)\n const pe = (a0: number, b0: number, a1: number, b1: number, grd: Uint8Array, v = SOLID) => (ax ? paint(c, grd, b0, a0, b1, a1, v) : paint(c, grd, a0, b0, a1, b1, v)) // (axis, lateral)\n const l0 = ax ? rx0 : rz0, l1 = ax ? rx1 : rz1\n const floors = new Set<number>(); for (const m of g.m) { floors.add(m.from); floors.add(m.to) }\n for (const a of floors) pe(lo, l0, hi, l1, c.grids[a], FREE) // inside of the stair free\n for (const a of floors) {\n const grd = c.grids[a]\n // open end on the axis: base (lowest coordinate) or top; depends on the direction of each flight\n let openLo = false, openHi = false\n for (const s of c.flights) if (s.group === g) {\n const baseLo = s.dir > 0 // the base is at the lowest coordinate\n if (s.from === a) { if (baseLo) openLo = true; else openHi = true }\n if (s.to === a) { if (baseLo) openHi = true; else openLo = true }\n }\n // outer sides and dividers between lanes, outside the open-end zones\n const ini = openLo ? lo + f : lo - T, fim = openHi ? hi - f : hi + T\n pe(ini, l0 - T, fim, l0, grd); pe(ini, l1, fim, l1 + T, grd)\n const k = g.m.length; for (let q = 1; q < k; q++) { const lm = l0 + ((l1 - l0) * q) / k; pe(lo + f, lm - 0.05, hi - f, lm + 0.05, grd) }\n if (!openLo) pe(lo - T, l0, lo, l1, grd)\n if (!openHi) pe(hi, l0, hi + T, l1, grd)\n }\n }\n N.houses.push(c); N.x0 = Math.min(N.x0, x0); N.z0 = Math.min(N.z0, z0); N.x1 = Math.max(N.x1, x1); N.z1 = Math.max(N.z1, z1)\n return c\n }\n\n const houseAt = (x: number, z: number): NavHouse | null => {\n if (x < N.x0 || x > N.x1 || z < N.z0 || z > N.z1) return null\n for (let k = 0; k < N.houses.length; k++) { const c = N.houses[k]; if (x >= c.x0 && x <= c.x1 && z >= c.z0 && z <= c.z1) return c }\n return null\n }\n // cell of the fine grid (value 0..7) or -1 outside the house\n const cell = (c: NavHouse, a: number, x: number, z: number): number => {\n const i = Math.floor((x - c.ox) / CELL), j = Math.floor((z - c.oz) / CELL)\n return i < 0 || j < 0 || i >= c.nx || j >= c.nz ? -1 : c.grids[a][j * c.nx + i]\n }\n // block per floor: 1 blocked, 0 free, -1 \"use the ground grid\" (floor 0 with nothing special there)\n function blocked(x: number, z: number, floor: number): number {\n const c = houseAt(x, z)\n if (!c) return floor > 0 ? 1 : -1\n if (floor >= c.n) return 1\n const v = cell(c, floor, x, z)\n if (v === FREE) return 0\n if (v >= 0 && v & VOID) return 1\n if (floor > 0 || c.own) return v < 0 || v & SOLID ? 1 : 0 // own: the fine grid of the house also rules the ground floor\n return v > 0 ? 1 : -1\n }\n // level: y and floor of the point, considering the stair. Returns true when it is on a stair (result in N.result)\n function level(x: number, z: number, floor: number): boolean {\n const r: NavResult = N.result, c = houseAt(x, z); r.stair = null\n if (!c) { r.floor = floor; r.y = 0; return false }\n for (let k = 0; k < c.flights.length; k++) {\n const s = c.flights[k]\n if ((floor !== s.from && floor !== s.to) || x < s.x0 || x > s.x1 || z < s.z0 || z > s.z1) continue\n let t = ((s.axis ? z : x) - s.lo) / s.len; if (s.dir < 0) t = 1 - t\n const u = clamp((t - s.e) / (1 - 2 * s.e), 0, 1)\n r.y = s.yFrom + (s.yTo - s.yFrom) * u; r.t = t; r.floor = t < 0.5 ? s.from : s.to; r.stair = s\n return true\n }\n r.floor = floor; r.y = c.floors[floor] ? c.floors[floor].y : 0\n return false\n }\n // point at an end of the stair, at the centre of the lane; inside > 0 towards the inside of the end, < 0 towards the outside\n function landing(s: NavFlight, top: boolean, inside: number, out: number[]): number[] {\n const lo = top ? s.dir < 0 : s.dir > 0, a = lo ? s.lo + inside : s.lo + s.len - inside, b = s.axis ? (s.x0 + s.x1) / 2 : (s.z0 + s.z1) / 2\n out[0] = s.axis ? b : a; out[1] = s.axis ? a : b\n return out\n }\n // stair that takes floor a to floor b (b > a climbs, b < a descends) in the house; null if there is none\n function stairTo(c: NavHouse, a: number, b: number): NavFlight | null {\n for (const s of c.flights) if (b > a ? s.from === a : s.to === a) return s\n return null\n }\n // ----- path field per floor (BFS on the coarse grid) to a point; recomputed only when the target changes cell -----\n function field(c: NavHouse, a: number) {\n const f = c.fields[a]; if (f) return f\n const gx = Math.ceil(c.nx / COARSE), gz = Math.ceil(c.nz / COARSE), free = new Uint8Array(gx * gz), g = c.grids[a]\n for (let j = 0; j < gz; j++) for (let i = 0; i < gx; i++) {\n let b = 0\n for (let q = 0; q < COARSE && !b; q++) for (let p = 0; p < COARSE; p++) {\n const ii = i * COARSE + p, jj = j * COARSE + q\n if (ii < c.nx && jj < c.nz) { const v = g[jj * c.nx + ii]; if (v === SOLID || v & VOID) { b = 1; break } }\n }\n free[j * gx + i] = b ? 0 : 1\n }\n return (c.fields[a] = { gx, gz, free, d: new Int16Array(gx * gz), q: new Int32Array(gx * gz), target: -1, t: -9 })\n }\n const DX = [1, -1, 0, 0, 1, 1, -1, -1], DZ = [0, 0, 1, -1, 1, -1, 1, -1]\n // direction (in N.result.dx/dz, unit) from (x,z) towards (tx,tz) walking on floor a; false if there is no path (go straight)\n function heading(c: NavHouse, a: number, x: number, z: number, tx: number, tz: number): boolean {\n const f = field(c, a), cs = CELL * COARSE\n const ci = clamp(Math.floor((tx - c.ox) / cs), 0, f.gx - 1), cj = clamp(Math.floor((tz - c.oz) / cs), 0, f.gz - 1), ca = cj * f.gx + ci\n if (ca !== f.target && N.time - f.t > 0.15) { // BFS from the target\n f.target = ca; f.t = N.time; f.d.fill(-1); let h = 0, e = 0; f.q[e++] = ca; f.d[ca] = 0\n while (h < e) {\n const k = f.q[h++], i = k % f.gx, j = (k / f.gx) | 0\n for (let n = 0; n < 8; n++) {\n const ni = i + DX[n], nj = j + DZ[n]; if (ni < 0 || nj < 0 || ni >= f.gx || nj >= f.gz) continue\n const nk = nj * f.gx + ni; if (f.d[nk] >= 0 || !f.free[nk]) continue\n if (n > 3 && (!f.free[j * f.gx + ni] || !f.free[nj * f.gx + i])) continue // a diagonal does not cut a corner\n f.d[nk] = f.d[k] + 1; f.q[e++] = nk\n }\n }\n }\n const i = Math.floor((x - c.ox) / cs), j = Math.floor((z - c.oz) / cs)\n if (i < 0 || j < 0 || i >= f.gx || j >= f.gz) return false\n const k0 = j * f.gx + i, r: NavResult = N.result\n let best = f.d[k0] >= 0 ? f.d[k0] : 1e9, bi = -1 // blocked cell (e.g. inside the stair): leaves by the neighbour closest to the target\n if (f.target < 0) return false\n for (let n = 0; n < 8; n++) {\n const ni = i + DX[n], nj = j + DZ[n]; if (ni < 0 || nj < 0 || ni >= f.gx || nj >= f.gz) continue\n const d = f.d[nj * f.gx + ni]; if (d < 0 || d >= best) continue\n if (n > 3 && (!f.free[j * f.gx + ni] || !f.free[nj * f.gx + i])) continue\n best = d; bi = n\n }\n if (bi < 0) return false\n const px = c.ox + (i + DX[bi] + 0.5) * cs, pz = c.oz + (j + DZ[bi] + 0.5) * cs, dx = px - x, dz = pz - z, l = Math.hypot(dx, dz) || 1\n r.dx = dx / l; r.dz = dz / l\n return true\n }\n // ceiling of a floor: the next floor's level minus the slab; on the last one, the storey height\n const ceilingOf = (c: NavHouse, a: number): number => (a + 1 < c.n ? c.floors[a + 1].y - 0.2 : c.floors[a].y + c.floors[a].h)\n // ray against the grids and the floor's ceiling: distance until it hits or -1\n function ray(c: NavHouse, a: number, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, max: number): number {\n const top = ceilingOf(c, a)\n for (let s = 0.1; s <= max; s += 0.1) {\n const x = ox + dx * s, y = oy + dy * s, z = oz + dz * s\n if (y > top || y < c.floors[a].y) return s\n const v = cell(c, a, x, z); if (v < 0 || v === SOLID) return s\n }\n return -1\n }\n function apply(c: NavHouse, floor: number) {\n if (c.shown === floor) return\n c.shown = floor\n const show = (o: any, v: boolean) => { if (!o) return; if (typeof o === 'function') o(v); else if (Array.isArray(o)) o.forEach((q) => show(q, v)); else o.visible = v }\n for (let a = 0; a < c.groups.length; a++) show(c.groups[a], floor < 0 || a <= floor)\n show(c.roof, floor < 0)\n }\n // occlusion: hides the floors above whoever is inside, and the roof; outside, shows everything\n function occlude(x: number, z: number, floor: number): NavHouse | null {\n const c = houseAt(x, z)\n if (c !== N.currentHouse && N.currentHouse) apply(N.currentHouse, -1)\n N.currentHouse = c; N.currentFloor = floor\n if (c) apply(c, floor)\n return c\n }\n\n // ----- run-time changes of the grid (destruction) -----\n const houseOf = (id: string): NavHouse | null => N.houses.find((h: NavHouse) => h.id === id) || null\n /** Visits the cells of the fine grid inside `shape` on `floor`. Returns how many it visited. */\n function each(c: NavHouse, floor: number, shape: NavShape, fn: (g: Uint8Array, k: number) => void): number {\n const g = c.grids[floor]; if (!g) return 0\n let x0: number, z0: number, x1: number, z1: number\n const circle = 'circle' in shape ? shape.circle : null\n if (circle) { x0 = circle[0] - circle[2]; z0 = circle[1] - circle[2]; x1 = circle[0] + circle[2]; z1 = circle[1] + circle[2] } else [x0, z0, x1, z1] = (shape as { rect: NavRect }).rect\n const i0 = Math.max(0, Math.ceil((Math.min(x0, x1) - c.ox) / CELL - 0.5)), i1 = Math.min(c.nx - 1, Math.floor((Math.max(x0, x1) - c.ox) / CELL - 0.5))\n const j0 = Math.max(0, Math.ceil((Math.min(z0, z1) - c.oz) / CELL - 0.5)), j1 = Math.min(c.nz - 1, Math.floor((Math.max(z0, z1) - c.oz) / CELL - 0.5))\n let n = 0\n for (let j = j0; j <= j1; j++) for (let i = i0; i <= i1; i++) {\n if (circle) { const dx = c.ox + (i + 0.5) * CELL - circle[0], dz = c.oz + (j + 0.5) * CELL - circle[1]; if (dx * dx + dz * dz > circle[2] * circle[2]) continue }\n fn(g, j * c.nx + i); n++\n }\n return n\n }\n /** A wall or a banister opened (breach, fracture): the solid cells inside `shape` on `floor` become free. Returns the cells it visited. */\n function openCells(houseId: string, floor: number, shape: NavShape): number {\n const c = houseOf(houseId); if (!c) return 0\n const n = each(c, floor, shape, (g, k) => { if (g[k] !== FREE && g[k] & SOLID) { c.journal.push(floor, k, g[k]); g[k] &= ~SOLID } })\n c.fields[floor] = null\n return n\n }\n /** A slab collapsed or fractured: the cells inside `shape` on `floor` have no floor any more (blocked, and the path field avoids them). */\n function closeCells(houseId: string, floor: number, shape: NavShape): number {\n const c = houseOf(houseId); if (!c) return 0\n const n = each(c, floor, shape, (g, k) => { if (!(g[k] & VOID)) { c.journal.push(floor, k, g[k]); g[k] = (g[k] === FREE ? 0 : g[k]) | VOID } })\n c.fields[floor] = null\n return n\n }\n /** Puts the grid of the house back to what it was (after a world reset): undoes every `openCells` and `closeCells`. */\n function undoChanges(houseId: string): void {\n const c = houseOf(houseId); if (!c) return\n const j = c.journal\n for (let k = j.length - 3; k >= 0; k -= 3) { c.grids[j[k]][j[k + 1]] = j[k + 2]; c.fields[j[k]] = null }\n j.length = 0\n }\n\n return Object.assign(N, { register, houseAt, blocked, level, landing, stairTo, heading, ray, ceilingOf, occlude, cell, apply, houseOf, openCells, closeCells, undoChanges }) as FloorNavigator\n}\n\nexport interface FloorNavigator {\n houses: NavHouse[]\n /** Frame time in seconds; the path field is recomputed at most every 0.15 s of it. */\n time: number\n currentHouse: NavHouse | null\n currentFloor: number\n /** Result of the last `level` and `heading` call (no allocation per query). */\n result: NavResult\n register(def: NavHouseDef): NavHouse\n houseAt(x: number, z: number): NavHouse | null\n blocked(x: number, z: number, floor: number): number\n level(x: number, z: number, floor: number): boolean\n landing(flight: NavFlight, top: boolean, inside: number, out: number[]): number[]\n stairTo(house: NavHouse, from: number, to: number): NavFlight | null\n heading(house: NavHouse, floor: number, x: number, z: number, tx: number, tz: number): boolean\n ray(house: NavHouse, floor: number, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, max: number): number\n ceilingOf(house: NavHouse, floor: number): number\n occlude(x: number, z: number, floor: number): NavHouse | null\n cell(house: NavHouse, floor: number, x: number, z: number): number\n apply(house: NavHouse, floor: number): void\n houseOf(id: string): NavHouse | null\n openCells(houseId: string, floor: number, shape: NavShape): number\n closeCells(houseId: string, floor: number, shape: NavShape): number\n undoChanges(houseId: string): void\n}\n","import type { NavHouseDef, NavRect, NavStair } from './floor-navigator.js'\n\n/** The parts of a built house (`create(THREE, options).build(...)`) the navigator reads. */\nexport interface NavigableHouse {\n name?: string\n r: { floors: { index: number; y0: number; ceiling: number }[] }\n colliders: { type: string; f: number; x0: number; z0: number; x1: number; z1: number }[]\n stairs: { m: { ry: number }; f: number; to: number; rect: NavRect }[]\n floors: unknown[]\n roof: unknown\n}\n\nexport interface NavigationDefOptions {\n /** Id the house registers with (default: the house's name). */\n id?: string\n /** Collider types that make a cell solid (default: walls and the boards of a barricade; the gaps of the doors stay free). */\n solids?: string[]\n /** The fine grid also rules the ground floor inside the house. */\n own?: boolean\n}\n\n/**\n * The registration of a built house in a floor navigator: heights from the plan's floors, solids from the house's wall colliders, one flight per\n * stair (its footprint, from the floor it leaves to the floor it reaches, along the axis the flight runs on) and the floor groups and roof to hide\n * by occlusion.\n */\nexport function navigationDefOf(house: NavigableHouse, options: NavigationDefOptions = {}): NavHouseDef {\n const types = new Set(options.solids ?? ['wall', 'board'])\n const floors = house.r.floors.map((floor) => ({\n y: floor.y0,\n h: floor.ceiling,\n solids: house.colliders.filter((c) => c.f === floor.index && types.has(c.type)).map((c): NavRect => [c.x0, c.z0, c.x1, c.z1]),\n }))\n // a flight climbs towards the local -z of its item (its bottom is at +z): in the world that is (-sin, -cos) of the rotation\n const stairs = house.stairs.map((stair): NavStair => {\n const c = Math.cos(stair.m.ry), s = Math.sin(stair.m.ry), [x0, z0, x1, z1] = stair.rect\n if (Math.abs(c) >= Math.abs(s)) return -c > 0 ? [x0, z0, x1, z1, stair.f, stair.to, 'z'] : [x0, z1, x1, z0, stair.f, stair.to, 'z']\n return -s > 0 ? [x0, z0, x1, z1, stair.f, stair.to, 'x'] : [x1, z0, x0, z1, stair.f, stair.to, 'x']\n })\n return { id: options.id ?? house.name ?? 'house', floors, stairs, groups: house.floors, roof: house.roof, own: options.own }\n}\n","import type { FloorNavigator, NavRect } from './floor-navigator.js'\n\n/** The parts of a built house the binding reads: its structure (parts by id), its floors and its destruction adapter. */\nexport interface DestructibleHouse {\n r: { floors: { index: number; y0: number }[] }\n structure: { byId: Map<string, { role: string; floor: number; aabb: NavRect; y1: number }> }\n destruction: { onEvent(listener: (event: any) => void): () => void; restore?: () => void }\n}\n\nexport interface NavigatorBinding {\n /** Stops listening. */\n off(): void\n /** Puts the grid back (after a world reset). */\n reset(): void\n}\n\nconst WALL_ROLES = new Set(['wall', 'partition'])\n\n/**\n * Connects a floor navigator to the destruction of a house, so the people walking in it follow what the world did to it:\n * - a wall that reaches stage 2 opens the cells inside its opening (a circle on its floor);\n * - a wall that fractures or collapses opens all the cells of its footprint;\n * - a slab that supports a floor and fractures or collapses removes the cells of that floor under it (they become blocked).\n * The house has to be registered in the navigator under `houseId` (`navigationDefOf`). Events arrive once the house's destruction is active.\n * Returns the binding; `reset()` undoes the changes.\n */\nexport function bindNavigator(navigator: FloorNavigator, houseId: string, house: DestructibleHouse): NavigatorBinding {\n const level = (floor: number) => house.r.floors.find((f) => f.index === floor)?.y0\n const gone = (id: string) => {\n const part = house.structure.byId.get(id)\n if (!part) return\n if (WALL_ROLES.has(part.role)) navigator.openCells(houseId, part.floor, { rect: part.aabb })\n else if (part.role === 'slab') {\n const y = level(part.floor)\n // only the slab a floor stands on: its top is the floor level (a roof slab is not a floor)\n if (y !== undefined && Math.abs(part.y1 - y) < 0.1) navigator.closeCells(houseId, part.floor, { rect: part.aabb })\n }\n }\n const off = house.destruction.onEvent((event) => {\n if (event.type === 'stage' && event.stage === 2 && event.opening) {\n const part = house.structure.byId.get(event.part)\n if (part && WALL_ROLES.has(part.role)) navigator.openCells(houseId, part.floor, { circle: [event.opening.center[0], event.opening.center[2], event.opening.radius] })\n } else if (event.type === 'fracture') gone(event.part)\n else if (event.type === 'collapse') for (const id of event.parts) gone(id)\n })\n return { off, reset: () => navigator.undoChanges(houseId) }\n}\n","export type AreaText = {\n group: string\n name: string\n controls: Record<'package' | 'template' | 'state' | 'seed' | 'quality' | 'lod' | 'houses' | 'budget' | 'floor_view' | 'hit', string>\n hints: Record<'template' | 'houses' | 'budget' | 'lod' | 'floor_view' | 'hit', string>\n actions: Record<'build' | 'enter' | 'up' | 'down' | 'door' | 'strike' | 'reset' | 'clear', string>\n options: {\n quality: Record<string, string>\n lod: Record<string, string>\n floor_view: Record<string, string>\n hit: Record<string, string>\n state: Record<string, string>\n }\n layers: Record<'roof' | 'lot' | 'night', string>\n metrics: Record<'houses' | 'parts' | 'standing' | 'broken' | 'holes' | 'draw_calls' | 'triangles' | 'lod' | 'floor' | 'doors_open' | 'target' | 'planned', string>\n sheet: { kicker: string; title: string; template: string; seed: string; state: string; floors: string; size: string; parts: string; look: string; none: string; no_engine: string }\n specimens: Record<string, string>\n scenarios: Record<string, string>\n steps: Record<'built' | 'no_engine' | 'entered' | 'floor' | 'no_floor' | 'door' | 'no_door' | 'strike' | 'no_aim' | 'cleared' | 'reset'\n | 'one_pillar_broke' | 'slabs_whole' | 'no_slab_fell' | 'two_slab_fell' | 'two_roof_fell' | 'partition_broke' | 'slab_stayed' | 'glass_hole' | 'glass_broke' | 'walls_whole' | 'tank_hole' | 'tank_leaked' | 'gas_exploded' | 'gas_damaged', string>\n}\n\nexport const TEXT: Record<string, AreaText> = {\n en: {\n group: 'Houses',\n name: 'Houses and buildings area',\n controls: { package: 'Package', template: 'Typology', state: 'State', seed: 'Seed', quality: 'Quality', lod: 'Level of detail', houses: 'Houses in the row', budget: 'Draw-call budget', floor_view: 'Floors shown', hit: 'Hit' },\n hints: {\n template: 'Builds the house with game-floorplan-three from the plan the engine draws for this typology and seed',\n houses: 'More than one: a row with neighbours of the next seeds; the planner shares the budget by distance (planLod)',\n budget: 'Draw calls the row may spend: the nearest houses stay complete, the far ones lose their interior or hide',\n lod: 'Auto follows the distance to the eye; 0 complete, 1 without the small pieces, 2 hidden',\n floor_view: 'Cuts the house to show its floors; all shows everything with the roof',\n hit: 'What the Hit button throws at the wall you are aiming at',\n },\n actions: { build: 'Build the house', enter: 'Go in', up: 'Floor up', down: 'Floor down', door: 'Open / close the door (E)', strike: 'Hit the aimed wall', reset: 'Rebuild the walls', clear: 'Take the houses away' },\n options: {\n quality: { high: 'High', game: 'Game' },\n lod: { auto: 'Auto', '0': '0 complete', '1': '1 no small pieces', '2': '2 hidden' },\n floor_view: { all: 'All', '0': 'Ground floor', '1': 'First floor', '2': 'Second floor' },\n hit: { burst_9mm: '9 mm burst', burst_762: '7.62 burst', sledge: 'Sledgehammer', c4: 'C4', rpg: 'RPG warhead' },\n state: { normal: 'Normal', fortified: 'Fortified', abandoned: 'Abandoned' },\n },\n layers: { roof: 'Roof', lot: 'Lot (ground, wall, gate)', night: 'Night (lit windows and lamps)' },\n metrics: { houses: 'Houses', parts: 'Parts', standing: 'Standing', broken: 'Broken', holes: 'Holes', draw_calls: 'Draw calls', triangles: 'Triangles', lod: 'Level of detail (nearest)', floor: 'Your floor', doors_open: 'Doors open', target: 'You aim at', planned: 'Planned draw calls' },\n sheet: { kicker: 'House', title: 'House of the bench', template: 'Typology', seed: 'Seed', state: 'State', floors: 'Floors', size: 'Size', parts: 'Structure parts', look: 'You aim at', none: 'nothing to use', no_engine: 'The page gave no floorplan engine' },\n specimens: {\n house_casa_portico: 'Single-storey house: frame, the walls only close',\n house_casa_inteira: 'Whole single-storey house (real structure, windows, water tank, gas bottle)',\n house_casa_wood_frame: 'Wood-frame house',\n house_casa_tronco: 'Log cabin',\n house_barraca: 'Camping tent',\n },\n scenarios: {\n house_one_pillar: 'destroy one corner pillar: the slab stays',\n house_two_pillars: 'destroy two pillars: the slab and what is above fall',\n house_partition: 'a partition falls alone, the slab stays',\n house_window_glass: 'a shot at the glass breaks the window',\n house_tank_leak: 'a punctured water tank leaks',\n house_gas_explodes: 'the gas bottle explodes and damages the wall',\n },\n steps: {\n built: 'House {template} (seed {seed}, {state}) built: {parts} parts, {floors} floors',\n no_engine: 'No floorplan engine was given to the module',\n entered: 'Inside the house, floor {floor}',\n floor: 'Floor {floor}',\n no_floor: 'No floor {floor} here',\n door: 'Door used: {text}',\n no_door: 'No door or fixture within reach',\n strike: '{hit} on {part}',\n no_aim: 'Nothing to hit where you aim',\n cleared: 'Houses taken away',\n reset: 'Walls rebuilt',\n one_pillar_broke: 'pillar {id} broke',\n slabs_whole: 'the slabs are still whole',\n no_slab_fell: 'no slab collapsed',\n two_slab_fell: 'the slab collapsed ({n} parts fell)',\n two_roof_fell: 'the roof above fell with it',\n partition_broke: 'partition {id} broke',\n slab_stayed: 'the slab stayed up',\n glass_hole: 'the first shot holed the glass',\n glass_broke: 'window {id} broke after {n} shots',\n walls_whole: 'the walls are intact',\n tank_hole: 'the tank has a hole',\n tank_leaked: 'leaked: {before} -> {after} L',\n gas_exploded: 'the bottle exploded',\n gas_damaged: 'the blast damaged {n} nearby parts',\n },\n },\n 'pt-BR': {\n group: 'Casas',\n name: 'Área de casas e prédios',\n controls: { package: 'Pacote', template: 'Tipologia', state: 'Estado', seed: 'Semente', quality: 'Qualidade', lod: 'Nível de detalhe', houses: 'Casas na fileira', budget: 'Orçamento de draw calls', floor_view: 'Andares à mostra', hit: 'Golpe' },\n hints: {\n template: 'Constrói a casa com o game-floorplan-three a partir da planta que o motor desenha para esta tipologia e semente',\n houses: 'Mais de uma: fileira com vizinhas das próximas sementes; o planejador reparte o orçamento pela distância (planLod)',\n budget: 'Draw calls que a fileira pode gastar: as casas mais perto ficam completas, as de longe perdem o interior ou somem',\n lod: 'Auto segue a distância até o olho; 0 completo, 1 sem as peças pequenas, 2 escondida',\n floor_view: 'Corta a casa para mostrar os andares; todos mostra tudo com o telhado',\n hit: 'O que o botão Golpe joga na parede para onde você mira',\n },\n actions: { build: 'Construir a casa', enter: 'Entrar', up: 'Subir um andar', down: 'Descer um andar', door: 'Abrir / fechar a porta (E)', strike: 'Golpear a parede mirada', reset: 'Refazer as paredes', clear: 'Tirar as casas' },\n options: {\n quality: { high: 'Alta', game: 'Jogo' },\n lod: { auto: 'Auto', '0': '0 completo', '1': '1 sem peças pequenas', '2': '2 escondida' },\n floor_view: { all: 'Todos', '0': 'Térreo', '1': 'Primeiro andar', '2': 'Segundo andar' },\n hit: { burst_9mm: 'Rajada de 9 mm', burst_762: 'Rajada de 7,62', sledge: 'Marreta', c4: 'C4', rpg: 'Ogiva de RPG' },\n state: { normal: 'Normal', fortified: 'Fortificada', abandoned: 'Abandonada' },\n },\n layers: { roof: 'Telhado', lot: 'Lote (chão, muro, portão)', night: 'Noite (janelas e lâmpadas acesas)' },\n metrics: { houses: 'Casas', parts: 'Peças', standing: 'De pé', broken: 'Quebradas', holes: 'Furos', draw_calls: 'Draw calls', triangles: 'Triângulos', lod: 'Nível de detalhe (a mais perto)', floor: 'Seu andar', doors_open: 'Portas abertas', target: 'Você mira em', planned: 'Draw calls planejados' },\n sheet: { kicker: 'Casa', title: 'Casa da bancada', template: 'Tipologia', seed: 'Semente', state: 'Estado', floors: 'Andares', size: 'Tamanho', parts: 'Peças da estrutura', look: 'Você mira em', none: 'nada para usar', no_engine: 'A página não deu o motor de plantas' },\n specimens: {\n house_casa_portico: 'Casa térrea em pórtico (as paredes só vedam)',\n house_casa_inteira: 'Casa térrea inteira (estrutura real, janelas, caixa d\\'água, botijão)',\n house_casa_wood_frame: 'Casa de madeira wood_frame',\n house_casa_tronco: 'Cabana de troncos',\n house_barraca: 'Barraca de camping',\n },\n scenarios: {\n house_one_pillar: 'destruir um pilar de canto: a laje fica',\n house_two_pillars: 'destruir dois pilares: a laje e o que está em cima caem',\n house_partition: 'parede de vedação cai sozinha, laje fica',\n house_window_glass: 'tiro no vidro quebra a janela',\n house_tank_leak: 'caixa d\\'água furada vaza',\n house_gas_explodes: 'botijão explode e danifica a parede',\n },\n steps: {\n built: 'Casa {template} (semente {seed}, {state}) construída: {parts} peças, {floors} andares',\n no_engine: 'O módulo não recebeu o motor de plantas',\n entered: 'Dentro da casa, andar {floor}',\n floor: 'Andar {floor}',\n no_floor: 'Não há o andar {floor} aqui',\n door: 'Porta usada: {text}',\n no_door: 'Nenhuma porta ou peça ao alcance',\n strike: '{hit} em {part}',\n no_aim: 'Nada para golpear onde você mira',\n cleared: 'Casas retiradas',\n reset: 'Paredes refeitas',\n one_pillar_broke: 'o pilar {id} quebrou',\n slabs_whole: 'as lajes continuam inteiras',\n no_slab_fell: 'nenhuma laje desabou',\n two_slab_fell: 'a laje desabou ({n} peças caíram)',\n two_roof_fell: 'o telhado que estava em cima caiu junto',\n partition_broke: 'a parede {id} quebrou',\n slab_stayed: 'a laje ficou de pé',\n glass_hole: 'o primeiro tiro furou o vidro',\n glass_broke: 'a janela {id} quebrou em {n} tiros',\n walls_whole: 'as paredes continuam inteiras',\n tank_hole: 'a caixa tem furo',\n tank_leaked: 'vazou: {before} -> {after} L',\n gas_exploded: 'o botijão explodiu',\n gas_damaged: 'a explosão danificou {n} peças ao redor',\n },\n },\n}\n\n/** Fills the `{name}` holes of a message. */\nexport function fill(message: string, vars: Record<string, string | number> = {}): string {\n return message.replace(/\\{(\\w+)\\}/g, (hole, key) => (key in vars ? String(vars[key]) : hole))\n}\n","import type { ModuleScenario } from '@adatechnology/game-contracts'\nimport { fill } from './text.js'\nimport type { AreaText } from './text.js'\n\n/** What the room hands a scenario (`ScenarioContext` of game-test-room), narrowed to what these use. */\nexport interface AreaContext {\n room: any\n step(seconds: number): void\n expect(condition: boolean, label: string, data?: Record<string, unknown>): void\n}\n\nexport type Vec3 = readonly [number, number, number]\n\n/** Where the team's page lays its specimens (the arena has 14 m of half width). */\nexport const SPECIMEN_AT: Vec3 = [-5, 0, -11]\n\n/**\n * The six structural scenarios of the team's house area (sala-de-testes/area-casas, L3833-3868), same ids and same checks, on the specimens the area builds: destroy a pillar, two pillars, a partition,\n * shoot a window, puncture the water tank, set the gas bottle on fire. The hits are the team's (3 MJ blunt on a pillar, 600 J 9 mm on the glass and the tank, 900 C fire on the bottle). A scenario\n * passes when every check holds; the names of the checks are in `text.steps`.\n */\nexport function createHouseScenarios(text: AreaText, at: Vec3 = SPECIMEN_AT): Array<ModuleScenario<AreaContext>> {\n const T = text.steps\n const spawn = (room: any, item: string): { oid: string; parts: any[]; centre: (part: string) => [number, number, number] } => {\n const so = room.spawn(item, [at[0], at[1], at[2]], 0)\n const parts: any[] = so.root.userData.floorplanSpec.parts\n const centre = (id: string): [number, number, number] => {\n const p = parts.find((x) => x.id === id)\n return [p.position[0] + at[0], p.position[1] + at[1], p.position[2] + at[2]]\n }\n return { oid: so.objectId, parts, centre }\n }\n const role = (p: any): string | undefined => p.structure && p.structure.role\n // listeners opened by `events` during a run; each scenario stops them when it ends, or every later event of the room piles up in a list nobody reads\n const listening: Array<() => void> = []\n const events = (room: any): any[] => {\n const list: any[] = []\n listening.push(room.world.on('*', (e: any) => list.push(e)))\n return list\n }\n const stopListening = (): void => {\n for (const off of listening.splice(0)) off?.()\n }\n const collapsed = (list: any[]): string[] => list.filter((e) => e.type === 'collapse').flatMap((e) => e.parts.map((p: any) => p.id || p))\n /** Standing: not broken, and not stripped to its rebar cage (reinforced concrete that fractured stays as a cage, stage 3). */\n const whole = (room: any, oid: string, pid: string): boolean => {\n const p = room.world.part(oid, pid)\n return !!p && p.status !== 'broken' && !p.stripped\n }\n const groundColumns = (parts: any[]): any[] => parts.filter((p) => role(p) === 'column' && p.position[1] < 2 && !/tank/.test(p.id))\n const slabs = (parts: any[]): string[] => parts.filter((p) => role(p) === 'slab').map((p) => p.id)\n const blunt = (room: any, oid: string, pid: string, point: [number, number, number], energy: number): void => {\n room.world.hitPart(oid, pid, { type: 'blunt', point, energy, radius: 0.05, source: 'teste' })\n }\n const bullet = (room: any, oid: string, pid: string, point: [number, number, number], energy: number): void => {\n room.world.hitPart(oid, pid, { type: 'ballistic', point, direction: [0, 0, -1], energy, caliber: 9 })\n }\n\n const scenarios: Array<ModuleScenario<AreaContext>> = [\n {\n id: 'house_one_pillar',\n name: text.scenarios.house_one_pillar as string,\n run({ room, step, expect }) {\n const { oid, parts, centre } = spawn(room, 'house_casa_portico')\n const list = events(room)\n const columns = groundColumns(parts)\n const laj = slabs(parts)\n blunt(room, oid, columns[0].id, centre(columns[0].id), 3e6)\n step(20)\n expect(!whole(room, oid, columns[0].id), fill(T.one_pillar_broke as string, { id: columns[0].id }))\n expect(laj.length > 0 && laj.every((id) => whole(room, oid, id)), T.slabs_whole as string)\n expect(!collapsed(list).some((id) => laj.includes(id)), T.no_slab_fell as string)\n },\n },\n {\n id: 'house_two_pillars',\n name: text.scenarios.house_two_pillars as string,\n run({ room, step, expect }) {\n const { oid, parts, centre } = spawn(room, 'house_casa_portico')\n const list = events(room)\n const columns = groundColumns(parts)\n const laj = slabs(parts)\n // the two pillars at the ends of one side of the frame: the beams of the frame carry the loss of one pillar (house_one_pillar), and a side that loses both ends is\n // left to the one pillar between them, so the slab and the roof come down on that side\n const first = columns[0]\n const mate = columns.slice(1).filter((p) => Math.abs(p.position[0] - first.position[0]) < 0.5).sort((a, b) => Math.abs(b.position[2] - first.position[2]) - Math.abs(a.position[2] - first.position[2]))[0] ?? columns[1]\n blunt(room, oid, first.id, centre(first.id), 3e6)\n blunt(room, oid, mate.id, centre(mate.id), 3e6)\n step(90)\n const fell = collapsed(list)\n expect(laj.some((id) => fell.includes(id)), fill(T.two_slab_fell as string, { n: fell.length }))\n expect(parts.filter((p) => role(p) === 'roof').some((p) => fell.includes(p.id)), T.two_roof_fell as string)\n },\n },\n {\n id: 'house_partition',\n name: text.scenarios.house_partition as string,\n run({ room, step, expect }) {\n const { oid, parts, centre } = spawn(room, 'house_casa_inteira')\n const list = events(room)\n const partition = parts.find((p) => role(p) === 'partition')\n const laj = slabs(parts)\n blunt(room, oid, partition.id, centre(partition.id), 3e6)\n step(20)\n expect(!whole(room, oid, partition.id), fill(T.partition_broke as string, { id: partition.id }))\n expect(laj.every((id) => whole(room, oid, id)) && !collapsed(list).some((id) => laj.includes(id)), T.slab_stayed as string)\n },\n },\n {\n id: 'house_window_glass',\n name: text.scenarios.house_window_glass as string,\n run({ room, step, expect }) {\n const { oid, parts, centre } = spawn(room, 'house_casa_inteira')\n const window = parts.find((p) => /glass/.test(p.material) && /^window:/.test(p.id))\n let shots = 0\n for (; shots < 12 && whole(room, oid, window.id); shots++) {\n bullet(room, oid, window.id, centre(window.id), 600)\n step(0.3)\n }\n const state = room.world.part(oid, window.id)\n expect((state ? state.holes.length : 0) > 0, T.glass_hole as string)\n expect(!whole(room, oid, window.id), fill(T.glass_broke as string, { id: window.id, n: shots }))\n expect(parts.filter((p) => role(p) === 'wall').every((p) => whole(room, oid, p.id)), T.walls_whole as string)\n },\n },\n {\n id: 'house_tank_leak',\n name: text.scenarios.house_tank_leak as string,\n run({ room, step, expect }) {\n const { oid, parts, centre } = spawn(room, 'house_casa_inteira')\n const tank = parts.find((p) => p.contains && p.contains.fluid === 'water')\n const before = (room.world.part(oid, tank.id) || {}).liters ?? 0\n bullet(room, oid, tank.id, centre(tank.id), 600)\n step(40)\n const state = room.world.part(oid, tank.id)\n expect((state ? state.holes.length : 0) > 0, T.tank_hole as string)\n expect(before > 0 && (state.liters ?? 0) < before, fill(T.tank_leaked as string, { before: Math.round(before), after: Math.round(state.liters ?? 0) }))\n },\n },\n {\n id: 'house_gas_explodes',\n name: text.scenarios.house_gas_explodes as string,\n run({ room, step, expect }) {\n const { oid, parts, centre } = spawn(room, 'house_casa_inteira')\n const list = events(room)\n const bottle = parts.find((p) => p.explodes)\n room.world.hitPart(oid, bottle.id, { type: 'fire', point: centre(bottle.id), temperature: 900, radius: 0.6, duration: 8 })\n step(12)\n expect(list.filter((e) => e.type === 'explode').length > 0, T.gas_exploded as string)\n const damage = list.filter((e) => e.type === 'damage' && e.part !== bottle.id && e.damageType === 'explosive')\n expect(damage.length > 0, fill(T.gas_damaged as string, { n: new Set(damage.map((e) => e.part)).size }))\n },\n },\n ]\n return scenarios.map((scenario) => ({\n ...scenario,\n run(context) {\n try {\n return scenario.run(context)\n } finally {\n stopListening()\n }\n },\n }))\n}\n","import { shapeGeometries } from '@adatechnology/game-shapes-three'\n\nimport { create } from '../create.js'\nimport type { HouseRendererOptions } from '../types.js'\nimport type { FloorplanEngineLike, SpecimenDef } from './types.js'\n\n/**\n * The five items of the team's house area (sala-de-testes/area-casas): a frame house, a whole house, a wood-frame house, a log cabin and a tent. The team's frame house is its single-storey house A; here it is the\n * two-storey townhouse, because the ceiling slab of the single-storey plan keeps standing on its bearing partitions when two pillars go (see evidence, T2.6). The frame house is a reinforced concrete frame (T10 §12): the slabs\n * are cut into panels on real beams, the pillars are sized (`sizing`) to carry the load of the ones lost, and the beams to carry the span the lost pillar leaves: one pillar lost and the slab stays,\n * the two ends of a side lost and that side comes down (owner, 2026-10-24: \"4 pilares e a sustentação é a soma dos 4\"; 2026-10-25: the real structure of the houses).\n */\nexport const DEFAULT_SPECIMENS: readonly SpecimenDef[] = [\n { id: 'house_casa_portico', template: 'townhouse', seed: 1, portico: true, sizing: { safety: 0.72, redundancy: 0.97 } },\n { id: 'house_casa_inteira', template: 'single_storey_a', seed: 1 },\n { id: 'house_casa_wood_frame', template: 'wood_frame_house', seed: 1 },\n { id: 'house_casa_tronco', template: 'log_cabin', seed: 1 },\n { id: 'house_barraca', template: 'campsite', seed: 1 },\n]\n\n/** Colour of each material in the specimens (the team's table). */\nconst COLOR: Record<string, number> = {\n brick: 0xa8553a, concrete: 0x9a9a96, plaster: 0xd8d4c8, ceramic: 0xb4623e, glass: 0xaecfd8, tempered_glass: 0xaecfd8, wood_soft: 0xb08a58, wood_hard: 0x7a5434, plywood: 0xb89a6a, mdf: 0xb89a6a,\n steel: 0x8a8e92, aluminium: 0xb8bcc0, plastic: 0x2f6aa8, copper: 0xb87333, stone: 0x8a8a84, fabric: 0xcfc4a8,\n}\n\n/** What the area keeps of a built specimen: the structure spec the house draws (what the destruction world is given) and the plan it came from. */\nexport interface SpecimenSpec {\n readonly spec: any\n readonly plan: any\n}\n\nconst cache = new WeakMap<object, Map<string, SpecimenSpec>>()\n\n/**\n * The structure spec of a specimen: the engine draws the plan, the house renderer draws the house, and the house describes its structure (`house.structure.spec`) with what the water tank holds and\n * what makes the gas bottle explode. The spec is cached per three.js namespace and specimen; each call hands out a copy.\n */\nexport function specimenSpec(THREE: any, engine: FloorplanEngineLike, def: SpecimenDef, houseOptions: Partial<HouseRendererOptions> = {}): SpecimenSpec {\n let byId = cache.get(THREE)\n if (!byId) cache.set(THREE, (byId = new Map()))\n const key = `${def.id}|${def.template}|${def.seed ?? 1}|${def.state ?? 'normal'}|${def.portico ? 'p' : ''}|${def.sizing ? JSON.stringify(def.sizing) : ''}`\n let made = byId.get(key)\n if (!made) {\n const plan = engine.generate(def.template, { seed: def.seed ?? 1, ...(def.state ? { state: def.state } : {}) })\n // no world: the house is drawn only to describe its structure and thrown away\n const house = create(THREE, { ...houseOptions, destruction: undefined, destructionRenderer: undefined, interactives: undefined, vegetation: undefined, fleet: null }).build(plan, { quality: 'game', terrain: false, noPerimeter: true })\n const spec = house.structure.spec({ wallDetail: 'coarse', ...(def.portico ? { portico: true } : {}), ...(def.sizing ?? {}) })\n house.dispose()\n made = { spec, plan }\n byId.set(key, made)\n }\n return { spec: JSON.parse(JSON.stringify(made.spec)), plan: made.plan }\n}\n\n/**\n * One box (or cylinder, sphere) per part, named by the part id and coloured by its material, in the space of the house (the origin at the corner of the plan): what the team's house area draws, so the\n * room binds each mesh to the part of the same name. The anchored terrain slab is left out (the room has a floor).\n */\nexport function buildSpecimenMeshes(THREE: any, spec: any): any {\n const G = shapeGeometries(THREE) as any\n const root = new THREE.Group()\n for (const part of spec.parts) {\n if (part.id === 'ground') continue\n const shape = part.shape\n const geometry = shape.kind === 'cylinder' ? new G.CylinderGeometry(shape.radius, shape.radius, shape.height, 14) : shape.kind === 'sphere' ? new G.SphereGeometry(shape.radius, 12, 8) : new G.BoxGeometry(shape.size[0], shape.size[1], shape.size[2])\n const glass = /glass/.test(part.material)\n const material = new THREE.MeshStandardMaterial({ color: COLOR[part.material] ?? 0x888888, roughness: 0.8, metalness: part.material === 'steel' || part.material === 'aluminium' ? 0.5 : 0, transparent: glass, opacity: glass ? 0.45 : 1 })\n const mesh = new THREE.Mesh(geometry, material)\n mesh.name = part.id\n mesh.position.set(part.position[0], part.position[1], part.position[2])\n if (part.rotation) mesh.rotation.set(part.rotation[0], part.rotation[1], part.rotation[2])\n mesh.castShadow = true\n mesh.receiveShadow = true\n root.add(mesh)\n }\n return root\n}\n","import type { BenchChange, ModuleArea, ModuleControl, ModuleHost, ModuleLayer, ModuleMetric, ModuleScenario, TestableItem, TestableModule } from '@adatechnology/game-contracts'\n\nimport { create } from '../create.js'\nimport { planLod } from '../statics.js'\nimport { createHouseScenarios, SPECIMEN_AT } from './scenarios.js'\nimport type { AreaContext } from './scenarios.js'\nimport { buildSpecimenMeshes, DEFAULT_SPECIMENS, specimenSpec } from './specimens.js'\nimport { fill, TEXT } from './text.js'\nimport type { AreaText } from './text.js'\nimport type { FloorplanTestOptions, SpecimenDef, TemplateGroup } from './types.js'\n\nexport const FLOORPLAN_AREA_ID = 'floorplan_area'\n\n/** What the Hit button throws at the aimed wall: burst (rounds of `energy` J, caliber), a blow, or a blast (energy, radius). Energies are those of the weapons package (9 mm 486 J, 7.62x51 3300 J, sledge 4 kg at 8 m/s, C4, PG-7V). */\nconst HITS: Record<string, { kind: 'burst' | 'blow' | 'blast'; rounds?: number; energy: number; caliber?: number; radius?: number }> = {\n burst_9mm: { kind: 'burst', rounds: 9, energy: 486, caliber: 9 },\n burst_762: { kind: 'burst', rounds: 6, energy: 3300, caliber: 7.62 },\n sledge: { kind: 'blow', energy: 128 },\n c4: { kind: 'blast', energy: 345600, radius: 18 },\n rpg: { kind: 'blast', energy: 200000, radius: 16 },\n}\nconst GAP = 4\nconst EYE = 1.7\n\n/** A template whose storey range starts at this many storeys is a skyscraper. */\nconst TALL_STOREYS = 10\n\ntype Placed = { house: any; plan: any; seed: number; width: number; depth: number }\n\nconst bounds = (plan: any): { width: number; depth: number } => ({ width: Number(plan.w) || 10, depth: Number(plan.d) || 10 })\n\n/**\n * The houses test area as a `TestableModule`: any typology of the content packs the page registered (residential, commercial, rural, post-apocalyptic) built with game-floorplan-three from a seed, laid\n * in the room, with the player able to walk in (walls and closed doors stop the walk), use the doors (E), go up and down the floors, see the level of detail (manual, by distance, or shared among a row\n * of houses by a draw-call budget), and hit the walls with what the room throws (its tools, or the bench's hit): the houses register in the room's destruction world, so shots, blows, blasts and fire\n * reach the structure and the room's renderer draws the fracture, the brick courses and the collapse. Dust and sparks are the room's own effects: this module draws no particles.\n * Everything that is a pack of content comes in by option: this package knows no game.\n */\nexport function createFloorplanTestModule(options: FloorplanTestOptions = {}): TestableModule<AreaContext> & { readonly houses: readonly Placed[]; build(): void; clear(): void; groups(): readonly TemplateGroup[] } {\n const locale = options.locale ?? 'pt-BR'\n const text: AreaText = TEXT[locale] ?? (TEXT['pt-BR'] as AreaText)\n const engine = options.engine\n const arenaSize = options.arenaSize ?? 14\n\n const known = new Set((engine?.listTemplates() ?? []).map((t) => t.id))\n const groups: TemplateGroup[] = (options.groups ?? [{ id: 'all', templates: [...known] }]).map((g) => ({ ...g, templates: g.templates.filter((id) => known.has(id)) })).filter((g) => g.templates.length > 0)\n const states = (options.states ?? engine?.listStates() ?? ['normal']).filter((id) => typeof id === 'string')\n const groupName = (g: TemplateGroup): string => g.name?.[locale] ?? g.name?.en ?? g.id\n const templateName = (id: string): string => (engine?.translate ? engine.translate('templates', id, locale) : id)\n const stateName = (id: string): string => text.options.state[id] ?? id\n const firstTemplate = options.template && known.has(options.template) ? options.template : (groups[0]?.templates[0] ?? '')\n const groupOf = (template: string): TemplateGroup | undefined => groups.find((g) => g.templates.includes(template))\n\n const settings = {\n group: groupOf(firstTemplate)?.id ?? groups[0]?.id ?? 'all',\n template: firstTemplate,\n state: states.includes('normal') ? 'normal' : (states[0] ?? 'normal'),\n seed: options.seed ?? 1,\n quality: 'game',\n lod: 'auto',\n houses: 1,\n budget: 400,\n floorView: 'all',\n hit: 'burst_9mm',\n }\n\n let host: ModuleHost | null = null\n let THREE: any = null\n let houseRenderer: any = null\n let houseRendererKey = ''\n const placed: Placed[] = []\n let time = 0\n let dirty = false\n let dirtyAt = 0\n let sinceSheet = 0\n let lastSheet = ''\n let planned = 0\n let lastPlan = 0\n let floorNow = 0\n let aimText = ''\n const removers: Array<() => void> = []\n\n const specimens: readonly SpecimenDef[] = (options.specimens ?? DEFAULT_SPECIMENS).filter((def) => known.has(def.template))\n const specimenItem = (def: SpecimenDef): TestableItem => ({\n id: def.id,\n name: def.name?.[locale] ?? text.specimens[def.id] ?? def.id,\n movable: false,\n build: (T: unknown) => {\n const { spec } = specimenSpec(T, engine as NonNullable<typeof engine>, def, options.house)\n const root = buildSpecimenMeshes(T, spec)\n root.userData.floorplanSpec = spec\n return root\n },\n spec: (root: unknown) => JSON.parse(JSON.stringify((root as any).userData.floorplanSpec)),\n })\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Houses\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const rendererFor = (): any => {\n const key = `${settings.quality}|${locale}`\n if (!houseRenderer || houseRendererKey !== key) {\n houseRenderer?.dispose?.()\n houseRenderer = create(THREE, {\n locale,\n lod: { interior: 10, hide: 40 },\n breachPaintBudgetMs: 4,\n ...options.house,\n quality: settings.quality as 'game',\n ...(options.world ? { destruction: options.world } : {}),\n ...(options.renderer ? { destructionRenderer: options.renderer } : {}),\n })\n houseRendererKey = key\n }\n return houseRenderer\n }\n\n const clearHouses = (): void => {\n for (const p of placed) p.house.dispose()\n placed.length = 0\n lastSheet = ''\n }\n\n const showAll = (): void => {\n const sel = settings.floorView === 'all' ? -1 : Number(settings.floorView)\n const roof = host?.bench?.layer('roof') ?? true\n const lot = host?.bench?.layer('lot') ?? false\n for (const p of placed) p.house.show({ floor: sel, cut: !roof, lot })\n }\n\n const applyLod = (): void => {\n if (settings.lod === 'auto') return\n for (const p of placed) p.house.setLod(Number(settings.lod))\n }\n\n const layout = (): void => {\n const total = placed.reduce((sum, p) => sum + p.width, 0) + GAP * Math.max(0, placed.length - 1)\n const depth = Math.max(...placed.map((p) => p.depth))\n // the houses face the player's side of the room (+z): turned half a circle, so the front of the plan looks at +z; x runs against u\n let x = total / 2\n for (const p of placed) {\n p.house.group.rotation.y = Math.PI\n p.house.group.position.set(x, 0, depth / 2)\n x -= p.width + GAP\n p.house.group.updateMatrixWorld(true)\n }\n }\n\n const build = (): void => {\n if (!host || !engine || !THREE) {\n host?.log(text.steps.no_engine as string)\n return\n }\n clearHouses()\n const renderer = rendererFor()\n const lot = host.bench?.layer('lot') ?? false\n const night = host.bench?.layer('night') ?? false\n const scene = host.scene as any\n for (let i = 0; i < settings.houses; i++) {\n const seed = settings.seed + i\n const plan = engine.generate(settings.template, { seed, state: settings.state })\n const house = renderer.build(plan, { quality: settings.quality, night, terrain: lot, noPerimeter: !lot })\n scene.add(house.group)\n placed.push({ house, plan, seed, ...bounds(plan) })\n }\n layout()\n for (const p of placed) if (options.world) p.house.destruction.activate()\n showAll()\n applyLod()\n floorNow = 0\n const first = placed[0] as Placed\n host.log(fill(text.steps.built as string, { template: templateName(settings.template), seed: settings.seed, state: stateName(settings.state), parts: first.house.structure.parts.length, floors: first.plan.floors.length }), { template: settings.template, seed: settings.seed, houses: placed.length })\n overview()\n }\n\n const overview = (): void => {\n if (!host?.bench || placed.length === 0) return\n const depth = Math.max(...placed.map((p) => p.depth))\n const span = placed.reduce((sum, p) => sum + p.width, 0) + GAP * (placed.length - 1)\n const back = Math.min(arenaSize - 0.7, depth / 2 + Math.max(10, span * 0.8))\n host.bench.look([0, 4.5, back], [0, 1.6, 0])\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // The player in the houses\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const cameraWorld = (): { x: number; y: number; z: number } => (host?.camera as any).position\n const floorOf = (p: Placed, y: number): number => {\n let floor = 0\n for (let f = 0; f < p.plan.floors.length; f++) if (p.house.y0(f) <= y - 0.9) floor = f\n return floor\n }\n const toLocal = (p: Placed, x: number, y: number, z: number): { x: number; y: number; z: number } => {\n const v = new THREE.Vector3(x, y, z)\n p.house.group.worldToLocal(v)\n return v\n }\n const nearest = (): Placed | null => {\n if (placed.length === 0 || !host) return null\n const c = cameraWorld()\n let best: Placed | null = null\n let bestD = Infinity\n for (const p of placed) {\n const d = p.house.distance({ x: c.x, y: c.y, z: c.z })\n if (d < bestD) {\n best = p\n bestD = d\n }\n }\n return best\n }\n const eyeOf = (p: Placed): any => {\n const camera = host?.camera as any\n const at = toLocal(p, camera.position.x, camera.position.y, camera.position.z)\n const forward = new THREE.Vector3(0, 0, -1).applyQuaternion(camera.quaternion).transformDirection(new THREE.Matrix4().copy(p.house.group.matrixWorld).invert())\n return { x: at.x, y: at.y, z: at.z, floor: floorOf(p, camera.position.y), yaw: Math.atan2(forward.x, forward.z), pitch: Math.asin(Math.max(-1, Math.min(1, forward.y))) }\n }\n const blocked = (x: number, z: number, radius: number): boolean => {\n for (const p of placed) {\n const c = toLocal(p, x, 0.5, z)\n const lot = host?.bench?.layer('lot') ?? false\n const pad = lot ? 12 : 1.5\n if (c.x < -pad || c.x > p.width + pad || c.z < -pad || c.z > p.depth + pad) continue\n if (p.house.collide(c.x, c.z, floorOf(p, cameraWorld().y), { radius })) return true\n }\n return false\n }\n const standAt = (p: Placed, u: number, v: number, floor: number, lookU: number, lookV: number): void => {\n if (!host?.bench) return\n const y = p.house.y0(floor) + EYE\n const eye = p.house.group.localToWorld(new THREE.Vector3(u, y, v))\n const target = p.house.group.localToWorld(new THREE.Vector3(lookU, y - 0.1, lookV))\n host.bench.look([eye.x, eye.y, eye.z], [target.x, target.y, target.z])\n floorNow = floor\n }\n const roomsOf = (p: Placed, floor: number): any[] => p.plan.rooms.filter((r: any) => r.floor === floor)\n const centreOf = (r: any): [number, number] => [(r.u0 + r.u1) / 2, (r.v0 + r.v1) / 2]\n const enter = (): void => {\n const p = placed[0]\n if (!p) return\n const door = p.plan.doors.find((d: any) => d.exterior && d.floor === 0) ?? p.plan.doors[0]\n const inside = door ? p.plan.rooms.find((r: any) => r.id === door.opensTo) : roomsOf(p, 0)[0]\n if (!inside) return\n const [u, v] = centreOf(inside)\n standAt(p, u, v, 0, door ? door.u : u, door ? door.v : v + 3)\n host?.log(fill(text.steps.entered as string, { floor: 0 }))\n }\n const goFloor = (delta: number): void => {\n const p = nearest()\n if (!p) return\n const next = floorNow + delta\n if (next < 0 || next >= p.plan.floors.length) {\n host?.log(fill(text.steps.no_floor as string, { floor: next }))\n return\n }\n const rooms = roomsOf(p, next).sort((a, b) => (b.u1 - b.u0) * (b.v1 - b.v0) - (a.u1 - a.u0) * (a.v1 - a.v0))\n const room = rooms[0]\n if (!room) return\n const [u, v] = centreOf(room)\n standAt(p, u, v, next, u, v + 3)\n host?.log(fill(text.steps.floor as string, { floor: next }))\n }\n const useNearest = (): void => {\n const p = nearest()\n if (!p) {\n host?.log(text.steps.no_door as string)\n return\n }\n const target = p.house.target(eyeOf(p))\n if (!target) {\n host?.log(text.steps.no_door as string)\n return\n }\n const fo = target.target\n const reach = fo && host?.reachFor && fo.type === 'swing' && fo.gs?.[0] && fo.handles?.[0] ? doorReach(p, fo) : null\n if (reach && host?.reachFor) {\n // the hand goes to the handle first; the door turns its handle and swings when the hand is on it\n host.reachFor({ ...reach, onGrip: () => void p.house.toggleDoor(fo) })\n } else p.house.interact(eyeOf(p))\n host?.log(fill(text.steps.door as string, { text: String(target.text) }))\n }\n /** The handle of a door leaf of the house in the world (on the player's side of the leaf), and whether opening brings it toward the player. */\n const doorReach = (p: Placed, fo: any): { handle: () => [number, number, number]; hinge: () => [number, number, number]; seconds: number; pull: boolean; locked: boolean } => {\n const g = fo.gs[0]\n const pivot = fo.handles[0].pivot as [number, number, number]\n const at = (angle: number): any => {\n const c = Math.cos(angle)\n const s = Math.sin(angle)\n const v = new THREE.Vector3(pivot[0] * c + pivot[2] * s, pivot[1], -pivot[0] * s + pivot[2] * c).add(g.position)\n return g.parent ? g.parent.localToWorld(v) : v\n }\n const camera = host?.camera as any\n const eye = new THREE.Vector3(camera.position.x, 0, camera.position.z)\n const flat = (v: any): number => Math.hypot(v.x - eye.x, v.z - eye.z)\n const closed = at(0)\n const open = at(fo.rot)\n const opening = !fo.open\n return {\n handle: () => {\n g.updateMatrixWorld(true)\n return g.localToWorld(new THREE.Vector3(pivot[0], pivot[1], pivot[2])).toArray() as [number, number, number]\n },\n hinge: () => g.getWorldPosition(new THREE.Vector3()).toArray() as [number, number, number],\n seconds: fo.locked || fo.blockedFlag ? 0.6 : 0.55,\n pull: opening ? flat(open) <= flat(closed) : flat(closed) <= flat(open),\n locked: !!(fo.locked || fo.blockedFlag),\n }\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Hitting the walls\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const strike = (): void => {\n const world = options.world\n if (!world || !host) return\n const camera = host.camera as any\n const origin = [camera.position.x, camera.position.y, camera.position.z] as [number, number, number]\n const f = new THREE.Vector3(0, 0, -1).applyQuaternion(camera.quaternion)\n const direction = [f.x, f.y, f.z] as [number, number, number]\n const hit = world.raycast(origin, direction, 80)\n if (!hit) {\n host.log(text.steps.no_aim as string)\n return\n }\n const preset = HITS[settings.hit] as (typeof HITS)[string]\n if (preset.kind === 'burst') for (let i = 0; i < (preset.rounds ?? 1); i++) world.hitPart(hit.object, hit.part, { type: 'ballistic', point: hit.point, direction, energy: preset.energy, caliber: preset.caliber ?? 9, source: 'bench' })\n else if (preset.kind === 'blow') world.hitPart(hit.object, hit.part, { type: 'blunt', point: hit.point, energy: preset.energy, radius: 0.05, source: 'bench' })\n else world.explode(hit.point, preset.energy, preset.radius ?? 10, 'bench')\n host.log(fill(text.steps.strike as string, { hit: text.options.hit[settings.hit] ?? settings.hit, part: hit.part }), { object: hit.object, part: hit.part })\n }\n const resetWalls = (): void => {\n for (const p of placed) p.house.destruction.reset()\n host?.log(text.steps.reset as string)\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Bench\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const geometryControls = new Set(['template', 'state', 'seed', 'quality', 'houses'])\n const onChange = (change: BenchChange): void => {\n if (change.kind === 'action') {\n switch (change.id) {\n case 'build': build(); break\n case 'enter': enter(); break\n case 'up': goFloor(1); break\n case 'down': goFloor(-1); break\n case 'door': useNearest(); break\n case 'strike': strike(); break\n case 'reset': resetWalls(); break\n case 'clear': clearHouses(); host?.log(text.steps.cleared as string); break\n default: break\n }\n return\n }\n if (change.kind === 'layer') {\n if (change.id === 'roof') showAll()\n else if (placed.length > 0) {\n dirty = true\n dirtyAt = time\n }\n return\n }\n const value = change.value\n switch (change.id) {\n case 'package': {\n settings.group = String(value)\n const group = groups.find((g) => g.id === settings.group)\n if (group) {\n settings.template = group.templates[0] as string\n host?.bench?.patch('template', { options: group.templates.map((id) => ({ id, name: templateName(id) })), value: settings.template })\n }\n break\n }\n case 'template': settings.template = String(value); break\n case 'state': settings.state = String(value); break\n case 'seed': settings.seed = Number(value); break\n case 'quality': settings.quality = String(value); break\n case 'houses': settings.houses = Number(value); break\n case 'budget': settings.budget = Number(value); break\n case 'lod': settings.lod = String(value); applyLod(); break\n case 'floor_view': settings.floorView = String(value); showAll(); break\n case 'hit': settings.hit = String(value); break\n default: break\n }\n if (geometryControls.has(change.id) && placed.length > 0) {\n dirty = true\n dirtyAt = time\n }\n }\n\n const choice = (id: keyof AreaText['controls'], ids: readonly string[], fallback: string, names?: Record<string, string>): ModuleControl => ({\n kind: 'choice',\n id,\n name: text.controls[id],\n options: ids.map((optionId) => ({ id: optionId, name: names?.[optionId] ?? optionId })),\n default: fallback,\n ...(id in text.hints ? { hint: text.hints[id as keyof AreaText['hints']] } : {}),\n })\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Metrics\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const stats = (): { parts: number; standing: number; broken: number; holes: number } => {\n const world = options.world\n let parts = 0\n let broken = 0\n let holes = 0\n if (world) {\n for (const p of placed) {\n const state = p.house.destruction.active ? world.state(p.house.destruction.id) : null\n for (const part of state?.parts ?? []) {\n parts++\n if (part.status === 'broken' || part.stripped) broken++\n holes += part.holes?.length ?? 0\n }\n }\n }\n return { parts, standing: parts - broken, broken, holes }\n }\n const sheetOf = (_p: Placed): string => `${settings.template}|${settings.seed}|${settings.state}|${aimText}|${floorNow}`\n const updateSheet = (): void => {\n const p = placed[0]\n if (!host?.bench?.sheet) return\n if (!p) {\n host.bench.sheet(null)\n return\n }\n const key = sheetOf(p)\n if (key === lastSheet) return\n lastSheet = key\n host.bench.sheet({\n kicker: text.sheet.kicker,\n title: templateName(settings.template),\n facts: [\n { label: text.sheet.seed, value: String(settings.seed) },\n { label: text.sheet.state, value: stateName(settings.state) },\n { label: text.sheet.floors, value: String(p.plan.floors.length) },\n { label: text.sheet.size, value: `${p.width} x ${p.depth} m` },\n { label: text.sheet.parts, value: String(p.house.structure.parts.length) },\n { label: text.sheet.look, value: aimText || text.sheet.none },\n ],\n })\n }\n\n const scenarios = createHouseScenarios(text, options.specimenAt ?? SPECIMEN_AT)\n const typologyScenario: ModuleScenario<AreaContext> = {\n id: 'floorplan_typologies',\n name: locale === 'en' ? 'every typology of every package builds, with structure and floors' : 'toda tipologia de todo pacote constrói, com estrutura e andares',\n run({ expect }) {\n const templates = engine?.listTemplates() ?? []\n // a skyscraper (20 storeys at least) is built at its lowest storey count: the scenario checks that the typology builds, not how tall it can get\n const shortest = (id: string): { floors?: number } => {\n const range = templates.find((t) => t.id === id)?.floorRange\n return range && range[0] >= TALL_STOREYS ? { floors: range[0] } : {}\n }\n for (const group of groups) {\n for (const id of group.templates) {\n const plan = (engine as NonNullable<typeof engine>).generate(id, { seed: 1, ...shortest(id) })\n const house = create(THREE ?? (host?.THREE as any), { locale, ...options.house, destruction: undefined, destructionRenderer: undefined, interactives: undefined, vegetation: undefined, fleet: null }).build(plan, { quality: 'game', terrain: false, noPerimeter: true })\n const ok = house.structure.parts.length > 0 && house.floors.length >= 1 && house.colliders.length > 0\n expect(ok, `${groupName(group)}: ${templateName(id)} (${house.structure.parts.length})`)\n house.dispose()\n }\n }\n },\n }\n\n return {\n id: FLOORPLAN_AREA_ID,\n name: text.name,\n ground: { surface: 'lawn' },\n group: text.group,\n get houses() {\n return placed\n },\n build,\n clear: clearHouses,\n groups: () => groups,\n items: (): TestableItem[] => (engine ? specimens.map(specimenItem) : []),\n // the houses are built by the bench; the specimens of the scenarios are spawned by them (or by hand, from the catalogue): nothing is laid here but the camera\n area: (): ModuleArea => ({ placements: [], view: { eye: [0, 7, Math.min(arenaSize - 0.7, 16)], target: [0, 1.5, 0] } }),\n controls: (): ModuleControl[] => {\n const group = groups.find((g) => g.id === settings.group) ?? groups[0]\n const controls: ModuleControl[] = []\n if (groups.length > 1) controls.push({ kind: 'choice', id: 'package', name: text.controls.package, options: groups.map((g) => ({ id: g.id, name: groupName(g) })), default: settings.group })\n controls.push(\n { kind: 'choice', id: 'template', name: text.controls.template, hint: text.hints.template, options: (group?.templates ?? []).map((id) => ({ id, name: templateName(id) })), default: settings.template },\n choice('state', states, settings.state, text.options.state),\n { kind: 'number', id: 'seed', name: text.controls.seed, min: 1, max: 999, step: 1, default: settings.seed },\n choice('quality', ['game', 'high'], 'game', text.options.quality),\n choice('lod', ['auto', '0', '1', '2'], 'auto', text.options.lod),\n { kind: 'number', id: 'houses', name: text.controls.houses, hint: text.hints.houses, min: 1, max: 5, step: 1, default: 1 },\n { kind: 'number', id: 'budget', name: text.controls.budget, hint: text.hints.budget, min: 60, max: 2000, step: 10, default: settings.budget },\n choice('floor_view', ['all', '0', '1', '2'], 'all', text.options.floor_view),\n choice('hit', Object.keys(HITS), 'burst_9mm', text.options.hit),\n { kind: 'action', id: 'build', name: text.actions.build, slow: true },\n { kind: 'action', id: 'enter', name: text.actions.enter },\n { kind: 'action', id: 'up', name: text.actions.up },\n { kind: 'action', id: 'down', name: text.actions.down },\n { kind: 'action', id: 'door', name: text.actions.door },\n { kind: 'action', id: 'strike', name: text.actions.strike },\n { kind: 'action', id: 'reset', name: text.actions.reset },\n { kind: 'action', id: 'clear', name: text.actions.clear },\n )\n return controls\n },\n layers: (): ModuleLayer[] => [\n { id: 'roof', name: text.layers.roof, default: true },\n { id: 'lot', name: text.layers.lot, default: false },\n { id: 'night', name: text.layers.night, default: false },\n ],\n metrics: (): ModuleMetric[] => [\n { id: 'houses_built', name: text.metrics.houses, read: () => placed.length },\n { id: 'parts', name: text.metrics.parts, read: () => stats().parts },\n { id: 'standing', name: text.metrics.standing, read: () => stats().standing },\n { id: 'broken', name: text.metrics.broken, read: () => stats().broken },\n { id: 'holes', name: text.metrics.holes, read: () => stats().holes },\n { id: 'draw_calls', name: text.metrics.draw_calls, max: 2000, read: () => placed.reduce((sum, p) => sum + (p.house.lod === 0 ? p.house.stats.drawCalls : p.house.lod === 1 ? p.house.stats.drawCallsLOD1 : 0), 0) },\n { id: 'triangles', name: text.metrics.triangles, read: () => placed.reduce((sum, p) => sum + (p.house.lod === 0 ? p.house.stats.triangles : p.house.lod === 1 ? p.house.stats.trianglesLod1 : 0), 0) },\n { id: 'lod_nearest', name: text.metrics.lod, read: () => nearest()?.house.lod ?? 0 },\n { id: 'floor', name: text.metrics.floor, read: () => floorNow },\n { id: 'doors_open', name: text.metrics.doors_open, read: () => placed.reduce((sum, p) => sum + p.house.doors.filter((d: any) => d.open).length, 0) },\n { id: 'target', name: text.metrics.target, read: () => aimText || text.sheet.none },\n { id: 'planned', name: text.metrics.planned, read: () => planned },\n ],\n scenarios: (): Array<ModuleScenario<AreaContext>> => [...scenarios, typologyScenario],\n attach(lent) {\n host = lent\n THREE = lent.THREE\n removers.push(lent.addBlocker?.(blocked) ?? (() => undefined))\n removers.push(lent.onClear?.(clearHouses) ?? (() => undefined))\n const stopChange = lent.bench?.onChange(onChange)\n const stopFrame = lent.onFrame((dt) => {\n time += dt\n if (dirty && time - dirtyAt > 0.4) {\n dirty = false\n // a rebuild takes a good part of a second: behind the host's loading indicator when it has one\n if (lent.loading) void lent.loading.busy(text.actions.build, () => build())\n else build()\n }\n const c = cameraWorld()\n const auto = settings.lod === 'auto'\n for (const p of placed) p.house.update(dt, time, auto && placed.length === 1 ? { x: c.x, y: c.y, z: c.z } : undefined)\n if (auto && placed.length > 1 && time - lastPlan > 0.25) {\n lastPlan = time\n planned = planLod(placed.map((p) => p.house), { x: c.x, y: c.y, z: c.z }, settings.budget).total\n }\n sinceSheet += dt\n if (sinceSheet > 0.25) {\n sinceSheet = 0\n const p = nearest()\n const target = p ? p.house.target(eyeOf(p)) : null\n aimText = target ? String(target.text) : ''\n updateSheet()\n }\n })\n // E uses the door or the fixture in reach, like the game\n const onKey = (event: KeyboardEvent): void => {\n if (event.code === 'KeyE' && !event.repeat && placed.length > 0) useNearest()\n }\n globalThis.addEventListener?.('keydown', onKey)\n return () => {\n stopChange?.()\n stopFrame()\n globalThis.removeEventListener?.('keydown', onKey)\n for (const remove of removers.splice(0)) remove()\n clearHouses()\n houseRenderer?.dispose?.()\n houseRenderer = null\n host = null\n }\n },\n }\n}\n","import { inferJoints } from '@adatechnology/game-destruction'\nimport { markKitOrigin } from '@adatechnology/game-contracts'\nimport type { DestructibleSpec, JointSpec, PartSpec } from '@adatechnology/game-contracts'\nimport { residentialItems } from '@adatechnology/game-floorplan-residential'\n\nimport { create } from '../create.js'\n\n/** What `furnitureSpec` reads of a catalogue entry (the items of `game-floorplan-residential` and the other packs have more). */\nexport interface FurnitureCatalogEntry {\n type: string\n w: number\n d: number\n h: number\n}\n\nexport interface FurnitureSpecOptions {\n /** Size in metres (default: the catalogue entry of the type). */\n w?: number\n d?: number\n h?: number\n /** Seed of the builder's random (the books of a shelf, the crates): same seed, same piece (default 1). */\n seed?: number\n /** Builder-level choices. */\n options?: {\n /** Material of the destruction world per builder material key (`wood`, `metal`, `plain`, `fabric`, `glass`...), overriding the defaults. */\n materials?: Record<string, string>\n /** Keep the chairs a table draws (default true). Chairs are drawn by the builder in a frame of their own, so this drops everything drawn in another frame than the piece's. */\n chairs?: boolean\n /** Colour roles of the builder (`wood`, `fabric_main`, `fabric_accent`, `metal`...) as `0xRRGGBB`. */\n palette?: Record<string, number>\n }\n /** Catalogue the default size is read from (default `residentialItems`). */\n catalog?: readonly FurnitureCatalogEntry[]\n /** The `document` the house renderer makes its textures with (default the global one). */\n document?: unknown\n}\n\nexport interface FurnitureSpecResult {\n /** One part per box or cylinder the builder drew, origin at the centre of the footprint on the floor. */\n spec: DestructibleSpec\n /** Draws the piece: one mesh per part, named by the part id, coloured as the builder coloured it. */\n build(THREE: any): any\n /** The widest high horizontal part and the height of its upper face (what loose things rest on), or null when the piece has none. */\n /** What loose things rest on. A solid top is boards: `parts` are all of them, `part` the one in the middle. */\n top: { part: string; y: number; parts?: string[] } | null\n /** Size the piece was drawn at. */\n size: { w: number; d: number; h: number }\n /** Where the water leaves the taps the builder drew (a sink, a tub), in the space of the spec; empty for furniture without a tap. */\n spouts: Array<[number, number, number]>\n}\n\ninterface Drawn {\n id: string\n key: string\n shape: PartSpec['shape']\n position: [number, number, number]\n rotation: [number, number, number] | null\n color: number\n min: [number, number, number]\n max: [number, number, number]\n}\n\nconst WOOD_THIN = 0.035\n/** A solid wooden top is boards glued edge to edge: thicker than this it is a block and stays whole; narrower than `BOARD_TOP_WIDTH` it is one board. */\nconst BOARD_TOP_THICK = 0.07\nconst BOARD_TOP_WIDTH = 0.5\nconst BOARD_WIDTH = 0.16\n/** A shelf falls when what holds it leaves it this many times its own length of span (one side gone: twice its length). */\nconst SHELF_SPAN = 1.5\n/** Types that are cases with shelves: their `plain` boxes are books and boxes, and they stand as a carcass. */\nconst SHELVING = /shelf|bookcase|rack/\n\n/**\n * The frame of a case piece (a bookcase, a shelf unit, a rack): the uprights stand on the floor and carry, each shelf rests on them and needs both\n * ends held (`structure.maxSpan`), and the back panel carries nothing. Break a side and the shelves it held fall with what is on them.\n */\nfunction carcass(parts: PartSpec[], drawn: Map<string, Drawn>): void {\n const all = [...drawn.values()]\n const width = Math.max(...all.map((p) => p.max[0])) - Math.min(...all.map((p) => p.min[0]))\n for (const part of parts) {\n if (LOOSE.has(part.material) || part.shape.kind !== 'box' || part.rotation) continue\n const [x, y, z] = part.shape.size\n if (y >= x && y >= z) {\n // upright: a side (thin across the width) carries; a back or front panel (thin in depth, as wide as the piece) does not\n if (z < x && x >= 0.6 * width) continue\n part.structure = { role: 'column' }\n } else if (y <= x && y <= z) part.structure = { role: 'beam', maxSpan: SHELF_SPAN * Math.max(x, z) }\n }\n}\n/** Each solid top of the drawing becomes its boards (`<id>_b<n>`), along its length, so that it breaks board by board where it is hit. Returns the boards of each top. */\nfunction splitTopsIntoBoards(drawn: Drawn[], materialOf: Record<string, string>, carcassed: boolean): Map<string, Drawn[]> {\n const tops = new Map<string, Drawn[]>()\n if (carcassed) return tops\n for (let i = drawn.length - 1; i >= 0; i--) {\n const p = drawn[i]\n if (p.key !== 'wood' || materialOf.wood !== 'wood_hard' || p.shape.kind !== 'box' || p.rotation) continue\n const [sx, sy, sz] = p.shape.size\n const across = sx < sz ? 0 : 2\n const width = Math.min(sx, sz)\n if (sy < WOOD_THIN || sy > BOARD_TOP_THICK || sy >= width || width < BOARD_TOP_WIDTH) continue\n const count = Math.round(width / BOARD_WIDTH)\n const boards: Drawn[] = []\n for (let b = 0; b < count; b++) {\n const size: [number, number, number] = [sx, sy, sz]\n size[across] = width / count\n const position: [number, number, number] = [...p.position]\n position[across] += (b + 0.5) * size[across] - width / 2\n const min: [number, number, number] = [...p.min]\n const max: [number, number, number] = [...p.max]\n min[across] = position[across] - size[across] / 2\n max[across] = position[across] + size[across] / 2\n boards.push({ ...p, id: `${p.id}_b${b}`, shape: { kind: 'box', size }, position, min, max, color: shadeBoard(p.color, b) })\n }\n drawn.splice(i, 1, ...boards)\n tops.set(p.id, boards)\n }\n return tops\n}\n\n/** Boards of one top are not cut from the same tree: each has its own tone. */\nfunction shadeBoard(color: number, board: number): number {\n const k = [1, 0.94, 1.05, 0.97, 1.03][board % 5]\n const channel = (shift: number): number => Math.min(255, Math.round(((color >> shift) & 255) * k)) << shift\n return channel(16) | channel(8) | channel(0)\n}\n\nconst FLOOR_TOUCH = 0.005\nconst LOOSE = new Set(['paper'])\nconst BASE_MATERIAL: Record<string, string> = {\n wood: 'wood_hard',\n metal: 'steel',\n fabric: 'fabric',\n glass: 'glass',\n plain: 'plastic',\n plant: 'foliage',\n picture: 'paper',\n emissive: 'glass',\n}\n\n// one house renderer per three.js namespace: it makes the type table the builders hang from\nconst renderers = new WeakMap<object, any>()\nfunction rendererOf(THREE: any, document: unknown): any {\n let r = renderers.get(THREE)\n if (!r) {\n r = create(THREE, document ? { document: document as never } : {})\n renderers.set(THREE, r)\n }\n return r\n}\n\ninterface RecordOptions {\n /** Destruction material per builder material key, over the defaults. */\n materials: Record<string, string>\n chairs?: boolean\n /** The piece is a case with shelves (`carcass`). */\n carcass?: boolean\n}\n\n/** Runs `run` with a recording stand-in for the drawing api and turns what it drew into a spec, a drawing and the top. `root` is the frame of the piece (the builder's `M`). */\nfunction recordSpec(THREE: any, name: string, root: any, run: (A: any) => void, opts: RecordOptions): { spec: DestructibleSpec; build: (T3: any) => any; top: FurnitureSpecResult['top'] } {\n const o = { chairs: opts.chairs }\n const materialOf = { ...BASE_MATERIAL, ...opts.materials }\n const drawn: Drawn[] = []\n const counters = new Map<string, number>()\n const q = new THREE.Quaternion()\n const eul = new THREE.Euler()\n const xyz = new THREE.Euler()\n const v = new THREE.Vector3()\n\n const loc = (M: any, lx: number, lz: number): [number, number] => {\n const c = Math.cos(M.ry)\n const s = Math.sin(M.ry)\n return [M.x + lx * c + lz * s, M.z - lx * s + lz * c]\n }\n const record = (M: any, key: string, shape: PartSpec['shape'], px: number, py: number, pz: number, rx: number, ry: number, rz: number, color: number): void => {\n if ((o.chairs === false && M !== root) || key === 'water') return // water is not a solid\n q.setFromEuler(eul.set(rx, ry, rz, 'YXZ'))\n const turned = rx !== 0 || ry !== 0 || rz !== 0\n const size: [number, number, number] = shape.kind === 'box' ? shape.size : shape.kind === 'cylinder' ? [shape.radius * 2, shape.height, shape.radius * 2] : [shape.radius * 2, shape.radius * 2, shape.radius * 2]\n const min: [number, number, number] = [Infinity, Infinity, Infinity]\n const max: [number, number, number] = [-Infinity, -Infinity, -Infinity]\n for (const sx of [-0.5, 0.5]) for (const sy of [-0.5, 0.5]) for (const sz of [-0.5, 0.5]) {\n v.set(sx * size[0], sy * size[1], sz * size[2]).applyQuaternion(q)\n const c = [v.x + px - root.x, v.y + py, v.z + pz - root.z]\n for (let k = 0; k < 3; k++) {\n min[k] = Math.min(min[k], c[k])\n max[k] = Math.max(max[k], c[k])\n }\n }\n const n = counters.get(key) ?? 0\n counters.set(key, n + 1)\n let rotation: [number, number, number] | null = null\n if (turned) {\n xyz.setFromQuaternion(q, 'XYZ')\n rotation = [xyz.x, xyz.y, xyz.z]\n }\n drawn.push({ id: `${key}_${n}`, key, shape, position: [px - root.x, py, pz - root.z], rotation, color, min, max })\n }\n\n const A = {\n box(M: any, mat: string, x: number, y: number, z: number, bw: number, bh: number, bd: number, color: number, ry = 0, rx = 0, rz = 0): void {\n const [px, pz] = loc(M, x, z)\n record(M, mat, { kind: 'box', size: [bw, bh, bd] }, px, M.base + y + bh / 2, pz, rx, M.ry + ry, rz, color)\n },\n cylinder(M: any, mat: string, x: number, y: number, z: number, r: number, ch: number, color: number, rx = 0, rz = 0): void {\n const [px, pz] = loc(M, x, z)\n record(M, mat, { kind: 'cylinder', radius: r, height: ch }, px, M.base + y + (rx || rz ? 0 : ch / 2), pz, rx || 0, M.ry, rz || 0, color)\n },\n leaf(): void {},\n plane(): void {},\n light(): void {},\n }\n run(A)\n if (!drawn.length) throw new Error(`game-floorplan-three: the builder of \"${name}\" drew no box or cylinder`)\n\n const boardsOf = splitTopsIntoBoards(drawn, materialOf, Boolean(opts.carcass))\n const parts: PartSpec[] = drawn.map((p) => {\n const thin = Math.min(...(p.shape.kind === 'box' ? p.shape.size : p.shape.kind === 'cylinder' ? [p.shape.radius * 2, p.shape.height] : [p.shape.radius * 2]))\n let material = materialOf[p.key] ?? 'plastic'\n // a case with shelves is MDF (as bought); elsewhere thin boards are pine and thick ones hardwood\n if (p.key === 'wood' && material === 'wood_hard' && opts.carcass && !opts.materials?.wood) material = 'mdf'\n else if (p.key === 'wood' && material === 'wood_hard' && thin < WOOD_THIN) material = 'wood_soft'\n const part: PartSpec = { id: p.id, material, shape: p.shape, position: p.position }\n if (p.rotation) part.rotation = p.rotation\n if (!LOOSE.has(material) && p.min[1] <= FLOOR_TOUCH) part.anchored = true\n return part\n })\n const byId = new Map(drawn.map((p) => [p.id, p]))\n\n const joints: JointSpec[] = []\n for (const j of inferJoints(parts, 0.01)) {\n const a = parts.find((p) => p.id === j.a)!\n const b = parts.find((p) => p.id === j.b)!\n const la = LOOSE.has(a.material)\n const lb = LOOSE.has(b.material)\n if (la && lb) continue\n if (la || lb) {\n // paper rests on what is under it: its lower face on the other's upper face\n const [loose, other] = la ? [a, b] : [b, a]\n if (Math.abs(byId.get(loose.id)!.min[1] - byId.get(other.id)!.max[1]) > 0.02) continue\n joints.push({ id: j.id, a: j.a, b: j.b, kind: 'resting' })\n continue\n }\n joints.push(j)\n }\n\n // the top: among the boxes that cover most of the footprint, the highest upper face (not fabric: a cloth lies on the top)\n const all = drawn.reduce(\n (m, p) => ({ x0: Math.min(m.x0, p.min[0]), x1: Math.max(m.x1, p.max[0]), z0: Math.min(m.z0, p.min[2]), z1: Math.max(m.z1, p.max[2]) }),\n { x0: Infinity, x1: -Infinity, z0: Infinity, z1: -Infinity },\n )\n const footprint = (all.x1 - all.x0) * (all.z1 - all.z0)\n let top: FurnitureSpecResult['top'] = null\n for (const p of drawn) {\n const part = parts.find((x) => x.id === p.id)!\n if (part.shape.kind === 'sphere' || part.rotation || part.material === 'fabric' || LOOSE.has(part.material)) continue\n const area = (p.max[0] - p.min[0]) * (p.max[2] - p.min[2])\n if (area < 0.6 * footprint || p.max[1] < 0.2) continue\n if (!top || p.max[1] > top.y + 1e-6) top = { part: p.id, y: p.max[1] }\n }\n for (const boards of boardsOf.values()) {\n if (top && boards[0].max[1] <= top.y - 1e-6) continue\n const mid = boards[boards.length >> 1]\n const min = [Math.min(...boards.map((b) => b.min[0])), Math.min(...boards.map((b) => b.min[2]))]\n const max = [Math.max(...boards.map((b) => b.max[0])), Math.max(...boards.map((b) => b.max[2]))]\n if ((max[0] - min[0]) * (max[1] - min[1]) >= 0.6 * footprint && mid.max[1] >= 0.2) top = { part: mid.id, y: mid.max[1], parts: boards.map((b) => b.id) }\n }\n\n if (opts.carcass) carcass(parts, byId)\n const spec: DestructibleSpec = { name, parts, joints, tags: ['furniture'] }\n const colors = new Map(drawn.map((p) => [p.id, p.color]))\n\n const build = (T3: any): any => {\n const group = markKitOrigin(new T3.Group(), { owner: 'game-floorplan-three', kind: 'furniture', id: name })\n group.name = name\n const mats = new Map<string, any>()\n for (const p of parts) {\n const color = colors.get(p.id) ?? 0x888888\n const metal = p.material === 'steel'\n const glass = p.material === 'glass'\n const key = `${color}:${metal}:${glass}`\n let mat = mats.get(key)\n if (!mat) {\n mat = new T3.MeshStandardMaterial({ color, roughness: metal ? 0.45 : 0.85, metalness: metal ? 0.7 : 0, transparent: glass, opacity: glass ? 0.4 : 1 })\n mats.set(key, mat)\n }\n const s = p.shape\n const geo = s.kind === 'box' ? new T3.BoxGeometry(s.size[0], s.size[1], s.size[2]) : s.kind === 'cylinder' ? new T3.CylinderGeometry(s.radius, s.radius, s.height, 14) : new T3.SphereGeometry(s.radius, 12, 8)\n const mesh = new T3.Mesh(geo, mat)\n mesh.name = p.id\n mesh.userData.destructionPart = p.id\n mesh.userData.destructionMaterial = p.material\n mesh.position.set(p.position[0], p.position[1], p.position[2])\n if (p.rotation) mesh.rotation.set(p.rotation[0], p.rotation[1], p.rotation[2], 'XYZ')\n mesh.castShadow = !glass\n mesh.receiveShadow = true\n group.add(mesh)\n }\n return group\n }\n\n return { spec, build, top }\n}\n\n/**\n * The team's furniture as a destructible spec. It runs the builder of `type` (`FURNITURE.shelf` for `bookcase`, `FURNITURE.table` for `dining_table`,\n * mapped in `furniture/type-table.ts`) unchanged, with a recording stand-in for the drawing api instead of the house's accumulators: every box and\n * cylinder it draws becomes a part, named `<material key>_<n>` in drawing order (`wood_0`, `plain_17`), with the colour the builder gave it.\n * Planes and leaves (flat, no volume) and water are left out.\n *\n * Materials: `wood` is `wood_hard`, and `wood_soft` for thin boards and panels (under 3.5 cm); `metal` is `steel`; `fabric`, `glass` and `plant` keep\n * their name; `plain` is `plastic`, or `paper` for shelves and racks (their books and boxes). Parts that touch the floor are anchored. Joints come from\n * `inferJoints` (screws between wood, welds or bolts between metal...), except that paper rests on what it lies on with a `resting` joint (weak: it falls when\n * the board breaks) and is not joined to its neighbours. Shelves and racks stand as a carcass: the sides carry, each shelf needs both of its ends\n * held, and the back panel carries nothing, so a broken side drops the shelves it held, with their books.\n *\n * @example\n * const { spec, build, top } = furnitureSpec(THREE, 'bookcase') // 1.2 x 0.35 x 2 m, boards and books\n */\nexport function furnitureSpec(THREE: any, type: string, opts: FurnitureSpecOptions = {}): FurnitureSpecResult {\n const renderer = rendererOf(THREE, opts.document)\n const ent = renderer.types[type]\n if (!ent) throw new Error(`game-floorplan-three: no builder for the furniture type \"${type}\"`)\n const entry = (opts.catalog ?? (residentialItems as unknown as readonly FurnitureCatalogEntry[])).find((i) => i.type === type)\n const w = opts.w ?? entry?.w\n const d = opts.d ?? entry?.d\n const h = opts.h ?? entry?.h\n if (w === undefined || d === undefined || h === undefined) throw new Error(`game-floorplan-three: furniture type \"${type}\" is not in the catalogue, so give w, d and h`)\n const o = opts.options ?? {}\n const seed = Math.round(opts.seed ?? 1)\n const plain = SHELVING.test(type) ? 'paper' : 'plastic'\n const root: any = { x: seed, z: 0, ry: 0, w, d, h, y: 0, base: 0, palette: o.palette, seed: `furniture_${type}_${seed}` }\n const { K, shared } = renderer.internals\n const before = K.PARTS.length\n const made = recordSpec(\n THREE,\n type,\n root,\n (A) => {\n const saved = { api0: shared.api0, ctx: shared.ctx }\n shared.api0 = A // the levers and taps that the kit draws as moving parts go through its own api\n shared.ctx = shared.ctx ?? {} // outside a house the builders read the style of the plan from here\n try {\n ent.f(root, A)\n } finally {\n shared.api0 = saved.api0\n shared.ctx = saved.ctx\n }\n },\n { materials: { plain, ...o.materials }, chairs: o.chairs, carcass: SHELVING.test(type) },\n )\n const spouts = K.PARTS.slice(before)\n .filter((p: any) => p.type === 'water_tap')\n .map((p: any): [number, number, number] => [p.pos[0] - root.x, p.pos[1], p.pos[2] - root.z])\n K.PARTS.length = before\n return { spec: made.spec, build: made.build, top: made.top, size: { w, d, h }, spouts }\n}\n\nexport interface TapSpecOptions {\n /** `counter` (default): the tap of a sink, standing on the counter; `wall`: the tap of a laundry tub or a garden, with its plate on the wall. */\n kind?: 'counter' | 'wall'\n /** How far the counter tap's spout reaches, metres (default 0.2: the kitchen sink's). */\n reach?: number\n /** The `document` the house renderer makes its textures with (default the global one). */\n document?: unknown\n}\n\nexport interface TapSpecResult {\n /** The tap as parts (base, column, spout, lever), origin on the counter under the column (`counter`) or on the wall plate's centre line at the floor (`wall`). */\n spec: DestructibleSpec\n /** Draws the tap: one mesh per part, named by the part id. */\n build(THREE: any): any\n /** Where the water leaves the spout, in the space of the spec. */\n spout: [number, number, number]\n}\n\n/**\n * The team's tap (`counterTap` of the sink, `wallTap` of the laundry tub: `furniture/taps.ts`) drawn by the same code into parts, with the lever at rest. `spout` is where its\n * water thread starts, so a host can put a tap of the fluids world there; the water thread itself is not drawn.\n */\nexport function tapSpec(THREE: any, opts: TapSpecOptions = {}): TapSpecResult {\n const renderer = rendererOf(THREE, opts.document)\n const { K, shared } = renderer.internals\n const kind = opts.kind ?? 'counter'\n const root: any = { x: 1, z: 0, ry: 0, w: 0.3, d: 0.3, h: 0.3, y: 0, base: 0, seed: `tap_${kind}` }\n const before = K.PARTS.length\n const made = recordSpec(THREE, kind === 'counter' ? 'tap' : 'wall_tap', root, (A) => {\n const kit = K.kit2(root, A)\n const saved = shared.api0\n shared.api0 = A // the lever and the water thread are parts that the kit draws through its own api\n try {\n if (kind === 'counter') K.counterTap(kit, 0, 0, 0, opts.reach ?? 0.2, 0.17, {})\n else K.wallTap(kit, 0, 0.3, 0, 1, 0.1, {})\n } finally {\n shared.api0 = saved\n }\n }, { materials: {} })\n const water = K.PARTS.slice(before).find((p: any) => p.type === 'water_tap')\n if (!water) throw new Error('game-floorplan-three: the tap drew no water thread')\n K.PARTS.length = before\n return { spec: made.spec, build: made.build, spout: [water.pos[0] - root.x, water.pos[1], water.pos[2] - root.z] }\n}\n","import { buildStructure, masonryConstruction } from '@adatechnology/game-floorplan-structure'\n\nimport { create } from './create.js'\nimport type { House, HouseRendererOptions } from './types.js'\n\n/** A free-standing wall built and drawn as the walls of the houses. */\nexport interface WallPieceOptions {\n /** Length and height in metres. */\n w: number\n h: number\n /** Default 0.15 m, the houses' wall. */\n thickness?: number\n /** Facade finish of the houses: `plaster` (default), `roughcast` or `exposed_block`. */\n finish?: string\n /** Paint colour of the plaster (default the light plaster of the houses' palette). */\n color?: number\n /** Options of the house renderer (`create`) that draws it. */\n house?: Partial<HouseRendererOptions>\n}\n\nexport interface WallPiece {\n /** The plan of the wall: one storey, one exterior wall, no rooms and no roof; its `structure` is the houses' load path. */\n readonly plan: any\n /** The destructible spec, as a house gives it (`house.structure.spec()`): the wall with its layers, units and breach on the ground, and the bond beam on it. */\n readonly spec: any\n /** Draws the wall with the house renderer: meshes carry `userData.destructionPart` of their part, in the space of the spec. */\n build(THREE: any): any\n /**\n * Once a drawing from `build` is in a destruction world as `objectId` (with this `spec`), the house renderer follows its events and draws on it what\n * a generic destruction renderer cannot: the bricks that shots and blows knock out (`chip`) and the opening of a breach, as gaps in the wall's\n * courses. `restore` puts the wall back (after `world.reset`), `dispose` stops following. `update` paints the damage of the events since the last call, once\n * per wall (call it every frame; without it the damage is painted 100 ms after the event).\n */\n follow(root: any, world: any, objectId: string): { restore(): void; dispose(): void; update(): void } | null\n}\n\nconst PLASTER = 0xe8e2d4\nconst WALL_ID = 'wall_0_0'\n\n/**\n * The plan of a free-standing wall along x, centred on the origin: a one-storey plan whose only wall is exterior on both sides, with the masonry construction of\n * the houses (brick, concrete bond beam, strip footing) and the structure `buildStructure` gives the houses, without a roof.\n */\nexport function wallPlan(options: WallPieceOptions): any {\n const { w, h, thickness = 0.15, finish = 'plaster', color = PLASTER } = options\n const facade = { finish, roof: 'none', floors: 1 }\n const wall = { id: WALL_ID, floor: 0, axis: 'u', u0: -w / 2, v0: 0, u1: w / 2, v1: 0, thickness, sides: ['outside', 'outside'], exterior: true, type: 'wall', h }\n const plan: any = {\n template: 'wall', name: 'wall', style: 'mid', state: 'normal', w, d: thickness,\n floors: [{ index: 0, y0: 0, ceiling: h }], rooms: [], walls: [wall], doors: [], windows: [], items: [], stateItems: [], openPairs: [], partyWalls: [], missing: [],\n facade, colors: { facade: color, wall: color }, lot: null, building: null, waterTank: null, outbuildings: [],\n }\n plan.construction = masonryConstruction({ ...plan, facade: { ...facade, roof: 'colonial' } })\n plan.structure = buildStructure(plan, { wallDetail: 'coarse', construction: plan.construction, roof: false })\n return plan\n}\n\nfunction draw(THREE: any, plan: any, options: Partial<HouseRendererOptions>): House {\n return create(THREE, { ...options, fleet: null }).build(plan, { quality: 'game', terrain: false, noPerimeter: true, pieces: 'meshes' })\n}\n\n/** The house each drawing of `build` came from (its root is the house's group). */\nconst houses = new WeakMap<object, House>()\n\n/** Labels the meshes of each structural piece with its part id, so a destruction renderer binds them by `userData.destructionPart`. */\nfunction label(house: House): any {\n houses.set(house.group, house)\n for (const [id, items] of Object.entries<any[]>(house.destruction.ranges())) {\n for (const item of items) {\n const object = item.isObject3D ? item : item.mesh\n object.userData.destructionPart = id\n }\n }\n return house.group\n}\n\n/**\n * A free-standing wall (a target wall, a garden wall) built and drawn exactly as the walls of the houses: the structure of `game-floorplan-structure` (the wall on\n * the strip footing, the bond beam on it, the assembly's layers, units and breach) and the house renderer's plaster, paint, baseboard and sidewalk.\n */\nexport function wallPiece(THREE: any, options: WallPieceOptions): WallPiece {\n const plan = wallPlan(options)\n const houseOptions = options.house ?? {}\n // no world: the wall is drawn once to describe its structure, as the houses' specimens are. The wall keeps the detail of the houses' walls (its\n // assembly's plaster, bricks and breach), so shots wear the brick they hit and knock it out\n const probe = draw(THREE, plan, { ...houseOptions, destruction: undefined, destructionRenderer: undefined })\n const spec = probe.structure.spec()\n probe.dispose()\n return {\n plan,\n spec,\n build: (T: any) => label(draw(T, plan, houseOptions)),\n follow: (root: any, world: any, objectId: string) => (houses.get(root) as any)?.destruction?.follow?.(world, objectId, spec) ?? null,\n }\n}\n"],"mappings":"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","names":["houses","c","OPEN_ROOM_TYPES","rectsOf","w","rectsOf","c","rectsOf","c","K","rectsOf","rectsOf","draw","run","g","en","t","K","K","z0","K","K","K","lst","sd","t","rectsOf","houses","i","j","units","draw","rectsOf","VERSION","VERSION","i","j","shapeGeometries","shapeGeometries","markKitOrigin","document","markKitOrigin"]}
|
|
1
|
+
{"version":3,"sources":["../src/navigation/floor-navigator.ts","../src/navigation/from-house.ts","../src/navigation/bind.ts","../src/furniture/spec.ts","../src/wall.ts"],"sourcesContent":["/*\n * Floor navigator: walking on several floors of a house (stairs, banisters, path field, occlusion). Literal port of the team's AndaresSDK\n * (sdk/andares), with English names. Coordinates are the house's. The ground floor can keep using the game's own grid: `blocked` answers -1\n * (\"use the ground grid\") unless the house is registered with `own: true`.\n *\n * House: { id, floors: [{ y, h, solids: [[x0, z0, x1, z1], ...] }], stairs: [[x0, z0, x1, z1, from, to, axis], ...], groups: [obj | [obj] ...], roof }\n * - a stair climbs from x0/z0 to x1/z1 (x0 > x1 reverses); stairs with the same footprint become a U-turn (one lane for each flight).\n * - groups[f] = what is drawn of floor f (an Object3D with .visible, or a function show(bool)); roof the same.\n *\n * Additions over the team's code (spec 001, T2.4d): `openCells` and `closeCells` change the fine grid at run time, so a breach (stage 2) opens the\n * cells of a wall and a slab that collapses or fractures removes the cells of its floor (`bindNavigator`, ./bind.ts).\n */\n\n/** A rectangle `[x0, z0, x1, z1]` in the house's coordinates. */\nexport type NavRect = [number, number, number, number]\n/** `[x0, z0, x1, z1, from, to, axis]`: a flight from floor `from` to floor `to` along `axis`. */\nexport type NavStair = [number, number, number, number, number, number, 'x' | 'z']\n\nexport interface NavFloor {\n /** Absolute height of the floor level. */\n y: number\n /** Height of the storey. */\n h: number\n solids?: NavRect[]\n}\n\nexport interface NavHouseDef {\n id: string\n floors: NavFloor[]\n stairs?: NavStair[]\n groups?: unknown[]\n roof?: unknown\n /** The fine grid also rules the ground floor inside the house (default: the ground floor uses the game's grid, except stairs and banisters). */\n own?: boolean\n /** The house's rectangle (default: the union of its solids and stairs). */\n rect?: NavRect\n}\n\n/** A shape on the plan: a rectangle `[x0, z0, x1, z1]` or a circle `[cx, cz, radius]`. */\nexport type NavShape = { rect: NavRect } | { circle: [number, number, number] }\n\nexport interface NavResult {\n y: number\n floor: number\n dx: number\n dz: number\n t: number\n stair: NavFlight | null\n}\n\nexport interface NavFlight {\n x0: number; z0: number; x1: number; z1: number\n axis: 0 | 1\n from: number\n to: number\n group: any\n yFrom: number\n yTo: number\n dir: number\n lo: number\n len: number\n e: number\n}\n\nexport interface NavHouse {\n id: string\n own: boolean\n floors: NavFloor[]\n groups: unknown[]\n roof: unknown\n flights: NavFlight[]\n grids: Uint8Array[]\n fields: any[]\n /** Triples (floor, cell, previous value) of the run-time changes of the grid. */\n journal: number[]\n shown: number\n x0: number; z0: number; x1: number; z1: number\n ox: number; oz: number; nx: number; nz: number\n n: number\n}\n\nconst CELL = 0.1 // fine cell, 10 cm\nconst COARSE = 2 // coarse cell of the path field = 2 x 2 fine ones\nconst OPEN_END = 0.7 // at the ends, the side stays open for 0.7 m (entry/exit by the side)\nconst SLACK = 0.45 // flat stretch at the ends of a stair (m): there one can enter and leave by the sides\nconst SOLID = 1\nconst FREE = 2 // forced free (inside the stair)\nconst VOID = 4 // no floor (a collapsed slab)\nconst clamp = (v: number, a: number, b: number) => (v < a ? a : v > b ? b : v)\n\nexport function createFloorNavigator() {\n const N: any = { houses: [] as NavHouse[], x0: 1e9, z0: 1e9, x1: -1e9, z1: -1e9, currentHouse: null as NavHouse | null, currentFloor: 0, time: 0, result: { y: 0, floor: 0, dx: 0, dz: 0, t: 0, stair: null } as NavResult }\n\n // ----- fine grid of a floor: bit 1 solid, bit 2 forced free (inside the stair), bit 4 no floor -----\n function paint(c: NavHouse, g: Uint8Array, x0: number, z0: number, x1: number, z1: number, v: number) {\n const i0 = Math.max(0, Math.ceil((x0 - c.ox) / CELL - 0.5)), i1 = Math.min(c.nx - 1, Math.floor((x1 - c.ox) / CELL - 0.5))\n const j0 = Math.max(0, Math.ceil((z0 - c.oz) / CELL - 0.5)), j1 = Math.min(c.nz - 1, Math.floor((z1 - c.oz) / CELL - 0.5))\n for (let j = j0; j <= j1; j++) for (let i = i0; i <= i1; i++) { if (v === FREE) g[j * c.nx + i] = FREE; else g[j * c.nx + i] |= v }\n }\n\n function register(def: NavHouseDef): NavHouse {\n const c: NavHouse = { id: def.id, own: !!def.own, floors: def.floors, groups: def.groups || [], roof: def.roof || null, flights: [], grids: [], fields: [], journal: [], shown: -2, x0: 0, z0: 0, x1: 0, z1: 0, ox: 0, oz: 0, nx: 0, nz: 0, n: def.floors.length }\n // the house's rectangle: union of the solids and stairs of all floors (or the given one)\n let x0 = 1e9, z0 = 1e9, x1 = -1e9, z1 = -1e9\n const env = (r: any) => { x0 = Math.min(x0, r[0], r[2]); z0 = Math.min(z0, r[1], r[3]); x1 = Math.max(x1, r[0], r[2]); z1 = Math.max(z1, r[1], r[3]) }\n if (def.rect) env(def.rect); else { for (const a of def.floors) for (const s of a.solids || []) env(s); for (const e of def.stairs || []) env(e) }\n c.x0 = x0; c.z0 = z0; c.x1 = x1; c.z1 = z1\n c.ox = x0 - 0.5; c.oz = z0 - 0.5; c.nx = Math.ceil((x1 - x0 + 1) / CELL); c.nz = Math.ceil((z1 - z0 + 1) / CELL)\n // stairs: groups the ones with the same footprint; each flight takes a lane and the odd ones climb backwards (U-turn)\n const groups: any[] = []\n for (const e of def.stairs || []) {\n const r = [Math.min(e[0], e[2]), Math.min(e[1], e[3]), Math.max(e[0], e[2]), Math.max(e[1], e[3])], ax = e[6] === 'z' ? 1 : 0, inv = ax ? e[3] < e[1] : e[2] < e[0]\n let g = groups.find((q) => q.ax === ax && Math.abs(q.r[0] - r[0]) < 0.08 && Math.abs(q.r[1] - r[1]) < 0.08 && Math.abs(q.r[2] - r[2]) < 0.08 && Math.abs(q.r[3] - r[3]) < 0.08)\n if (!g) groups.push((g = { ax, r, m: [] }))\n g.m.push({ from: e[4], to: e[5], inv })\n }\n for (const g of groups) {\n g.m.sort((a: any, b: any) => a.from - b.from)\n const k = g.m.length, lat = g.ax ? 0 : 1 // lateral axis\n g.m.forEach((m: any, q: number) => {\n const r = g.r.slice(), l0 = g.r[lat], w = (g.r[lat + 2] - l0) / k\n r[lat] = l0 + w * q; r[lat + 2] = l0 + w * (q + 1)\n const s: NavFlight = { x0: r[0], z0: r[1], x1: r[2], z1: r[3], axis: g.ax, from: m.from, to: m.to, group: g, yFrom: def.floors[m.from].y, yTo: def.floors[m.to].y, dir: 0, lo: 0, len: 0, e: 0 }\n s.dir = q & 1 ? (m.inv ? 1 : -1) : m.inv ? -1 : 1 // direction of the axis when climbing\n s.lo = g.ax ? r[1] : r[0]; s.len = (g.ax ? r[3] : r[2]) - s.lo; s.e = Math.min(0.3, SLACK / s.len)\n c.flights.push(s)\n })\n }\n // fine grid per floor\n for (let a = 0; a < c.n; a++) {\n const g = new Uint8Array(c.nx * c.nz); c.grids.push(g)\n for (const s of def.floors[a].solids || []) paint(c, g, Math.min(s[0], s[2]), Math.min(s[1], s[3]), Math.max(s[0], s[2]), Math.max(s[1], s[3]), SOLID)\n }\n // banister: sides and caps closed, except at the open ends of that floor; inside of the stair free\n const T = 0.22\n for (const g of groups) {\n const [rx0, rz0, rx1, rz1] = g.r, ax = g.ax, lo = ax ? rz0 : rx0, hi = ax ? rz1 : rx1, len = hi - lo, f = Math.min(OPEN_END, len * 0.3)\n const pe = (a0: number, b0: number, a1: number, b1: number, grd: Uint8Array, v = SOLID) => (ax ? paint(c, grd, b0, a0, b1, a1, v) : paint(c, grd, a0, b0, a1, b1, v)) // (axis, lateral)\n const l0 = ax ? rx0 : rz0, l1 = ax ? rx1 : rz1\n const floors = new Set<number>(); for (const m of g.m) { floors.add(m.from); floors.add(m.to) }\n for (const a of floors) pe(lo, l0, hi, l1, c.grids[a], FREE) // inside of the stair free\n for (const a of floors) {\n const grd = c.grids[a]\n // open end on the axis: base (lowest coordinate) or top; depends on the direction of each flight\n let openLo = false, openHi = false\n for (const s of c.flights) if (s.group === g) {\n const baseLo = s.dir > 0 // the base is at the lowest coordinate\n if (s.from === a) { if (baseLo) openLo = true; else openHi = true }\n if (s.to === a) { if (baseLo) openHi = true; else openLo = true }\n }\n // outer sides and dividers between lanes, outside the open-end zones\n const ini = openLo ? lo + f : lo - T, fim = openHi ? hi - f : hi + T\n pe(ini, l0 - T, fim, l0, grd); pe(ini, l1, fim, l1 + T, grd)\n const k = g.m.length; for (let q = 1; q < k; q++) { const lm = l0 + ((l1 - l0) * q) / k; pe(lo + f, lm - 0.05, hi - f, lm + 0.05, grd) }\n if (!openLo) pe(lo - T, l0, lo, l1, grd)\n if (!openHi) pe(hi, l0, hi + T, l1, grd)\n }\n }\n N.houses.push(c); N.x0 = Math.min(N.x0, x0); N.z0 = Math.min(N.z0, z0); N.x1 = Math.max(N.x1, x1); N.z1 = Math.max(N.z1, z1)\n return c\n }\n\n const houseAt = (x: number, z: number): NavHouse | null => {\n if (x < N.x0 || x > N.x1 || z < N.z0 || z > N.z1) return null\n for (let k = 0; k < N.houses.length; k++) { const c = N.houses[k]; if (x >= c.x0 && x <= c.x1 && z >= c.z0 && z <= c.z1) return c }\n return null\n }\n // cell of the fine grid (value 0..7) or -1 outside the house\n const cell = (c: NavHouse, a: number, x: number, z: number): number => {\n const i = Math.floor((x - c.ox) / CELL), j = Math.floor((z - c.oz) / CELL)\n return i < 0 || j < 0 || i >= c.nx || j >= c.nz ? -1 : c.grids[a][j * c.nx + i]\n }\n // block per floor: 1 blocked, 0 free, -1 \"use the ground grid\" (floor 0 with nothing special there)\n function blocked(x: number, z: number, floor: number): number {\n const c = houseAt(x, z)\n if (!c) return floor > 0 ? 1 : -1\n if (floor >= c.n) return 1\n const v = cell(c, floor, x, z)\n if (v === FREE) return 0\n if (v >= 0 && v & VOID) return 1\n if (floor > 0 || c.own) return v < 0 || v & SOLID ? 1 : 0 // own: the fine grid of the house also rules the ground floor\n return v > 0 ? 1 : -1\n }\n // level: y and floor of the point, considering the stair. Returns true when it is on a stair (result in N.result)\n function level(x: number, z: number, floor: number): boolean {\n const r: NavResult = N.result, c = houseAt(x, z); r.stair = null\n if (!c) { r.floor = floor; r.y = 0; return false }\n for (let k = 0; k < c.flights.length; k++) {\n const s = c.flights[k]\n if ((floor !== s.from && floor !== s.to) || x < s.x0 || x > s.x1 || z < s.z0 || z > s.z1) continue\n let t = ((s.axis ? z : x) - s.lo) / s.len; if (s.dir < 0) t = 1 - t\n const u = clamp((t - s.e) / (1 - 2 * s.e), 0, 1)\n r.y = s.yFrom + (s.yTo - s.yFrom) * u; r.t = t; r.floor = t < 0.5 ? s.from : s.to; r.stair = s\n return true\n }\n r.floor = floor; r.y = c.floors[floor] ? c.floors[floor].y : 0\n return false\n }\n // point at an end of the stair, at the centre of the lane; inside > 0 towards the inside of the end, < 0 towards the outside\n function landing(s: NavFlight, top: boolean, inside: number, out: number[]): number[] {\n const lo = top ? s.dir < 0 : s.dir > 0, a = lo ? s.lo + inside : s.lo + s.len - inside, b = s.axis ? (s.x0 + s.x1) / 2 : (s.z0 + s.z1) / 2\n out[0] = s.axis ? b : a; out[1] = s.axis ? a : b\n return out\n }\n // stair that takes floor a to floor b (b > a climbs, b < a descends) in the house; null if there is none\n function stairTo(c: NavHouse, a: number, b: number): NavFlight | null {\n for (const s of c.flights) if (b > a ? s.from === a : s.to === a) return s\n return null\n }\n // ----- path field per floor (BFS on the coarse grid) to a point; recomputed only when the target changes cell -----\n function field(c: NavHouse, a: number) {\n const f = c.fields[a]; if (f) return f\n const gx = Math.ceil(c.nx / COARSE), gz = Math.ceil(c.nz / COARSE), free = new Uint8Array(gx * gz), g = c.grids[a]\n for (let j = 0; j < gz; j++) for (let i = 0; i < gx; i++) {\n let b = 0\n for (let q = 0; q < COARSE && !b; q++) for (let p = 0; p < COARSE; p++) {\n const ii = i * COARSE + p, jj = j * COARSE + q\n if (ii < c.nx && jj < c.nz) { const v = g[jj * c.nx + ii]; if (v === SOLID || v & VOID) { b = 1; break } }\n }\n free[j * gx + i] = b ? 0 : 1\n }\n return (c.fields[a] = { gx, gz, free, d: new Int16Array(gx * gz), q: new Int32Array(gx * gz), target: -1, t: -9 })\n }\n const DX = [1, -1, 0, 0, 1, 1, -1, -1], DZ = [0, 0, 1, -1, 1, -1, 1, -1]\n // direction (in N.result.dx/dz, unit) from (x,z) towards (tx,tz) walking on floor a; false if there is no path (go straight)\n function heading(c: NavHouse, a: number, x: number, z: number, tx: number, tz: number): boolean {\n const f = field(c, a), cs = CELL * COARSE\n const ci = clamp(Math.floor((tx - c.ox) / cs), 0, f.gx - 1), cj = clamp(Math.floor((tz - c.oz) / cs), 0, f.gz - 1), ca = cj * f.gx + ci\n if (ca !== f.target && N.time - f.t > 0.15) { // BFS from the target\n f.target = ca; f.t = N.time; f.d.fill(-1); let h = 0, e = 0; f.q[e++] = ca; f.d[ca] = 0\n while (h < e) {\n const k = f.q[h++], i = k % f.gx, j = (k / f.gx) | 0\n for (let n = 0; n < 8; n++) {\n const ni = i + DX[n], nj = j + DZ[n]; if (ni < 0 || nj < 0 || ni >= f.gx || nj >= f.gz) continue\n const nk = nj * f.gx + ni; if (f.d[nk] >= 0 || !f.free[nk]) continue\n if (n > 3 && (!f.free[j * f.gx + ni] || !f.free[nj * f.gx + i])) continue // a diagonal does not cut a corner\n f.d[nk] = f.d[k] + 1; f.q[e++] = nk\n }\n }\n }\n const i = Math.floor((x - c.ox) / cs), j = Math.floor((z - c.oz) / cs)\n if (i < 0 || j < 0 || i >= f.gx || j >= f.gz) return false\n const k0 = j * f.gx + i, r: NavResult = N.result\n let best = f.d[k0] >= 0 ? f.d[k0] : 1e9, bi = -1 // blocked cell (e.g. inside the stair): leaves by the neighbour closest to the target\n if (f.target < 0) return false\n for (let n = 0; n < 8; n++) {\n const ni = i + DX[n], nj = j + DZ[n]; if (ni < 0 || nj < 0 || ni >= f.gx || nj >= f.gz) continue\n const d = f.d[nj * f.gx + ni]; if (d < 0 || d >= best) continue\n if (n > 3 && (!f.free[j * f.gx + ni] || !f.free[nj * f.gx + i])) continue\n best = d; bi = n\n }\n if (bi < 0) return false\n const px = c.ox + (i + DX[bi] + 0.5) * cs, pz = c.oz + (j + DZ[bi] + 0.5) * cs, dx = px - x, dz = pz - z, l = Math.hypot(dx, dz) || 1\n r.dx = dx / l; r.dz = dz / l\n return true\n }\n // ceiling of a floor: the next floor's level minus the slab; on the last one, the storey height\n const ceilingOf = (c: NavHouse, a: number): number => (a + 1 < c.n ? c.floors[a + 1].y - 0.2 : c.floors[a].y + c.floors[a].h)\n // ray against the grids and the floor's ceiling: distance until it hits or -1\n function ray(c: NavHouse, a: number, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, max: number): number {\n const top = ceilingOf(c, a)\n for (let s = 0.1; s <= max; s += 0.1) {\n const x = ox + dx * s, y = oy + dy * s, z = oz + dz * s\n if (y > top || y < c.floors[a].y) return s\n const v = cell(c, a, x, z); if (v < 0 || v === SOLID) return s\n }\n return -1\n }\n function apply(c: NavHouse, floor: number) {\n if (c.shown === floor) return\n c.shown = floor\n const show = (o: any, v: boolean) => { if (!o) return; if (typeof o === 'function') o(v); else if (Array.isArray(o)) o.forEach((q) => show(q, v)); else o.visible = v }\n for (let a = 0; a < c.groups.length; a++) show(c.groups[a], floor < 0 || a <= floor)\n show(c.roof, floor < 0)\n }\n // occlusion: hides the floors above whoever is inside, and the roof; outside, shows everything\n function occlude(x: number, z: number, floor: number): NavHouse | null {\n const c = houseAt(x, z)\n if (c !== N.currentHouse && N.currentHouse) apply(N.currentHouse, -1)\n N.currentHouse = c; N.currentFloor = floor\n if (c) apply(c, floor)\n return c\n }\n\n // ----- run-time changes of the grid (destruction) -----\n const houseOf = (id: string): NavHouse | null => N.houses.find((h: NavHouse) => h.id === id) || null\n /** Visits the cells of the fine grid inside `shape` on `floor`. Returns how many it visited. */\n function each(c: NavHouse, floor: number, shape: NavShape, fn: (g: Uint8Array, k: number) => void): number {\n const g = c.grids[floor]; if (!g) return 0\n let x0: number, z0: number, x1: number, z1: number\n const circle = 'circle' in shape ? shape.circle : null\n if (circle) { x0 = circle[0] - circle[2]; z0 = circle[1] - circle[2]; x1 = circle[0] + circle[2]; z1 = circle[1] + circle[2] } else [x0, z0, x1, z1] = (shape as { rect: NavRect }).rect\n const i0 = Math.max(0, Math.ceil((Math.min(x0, x1) - c.ox) / CELL - 0.5)), i1 = Math.min(c.nx - 1, Math.floor((Math.max(x0, x1) - c.ox) / CELL - 0.5))\n const j0 = Math.max(0, Math.ceil((Math.min(z0, z1) - c.oz) / CELL - 0.5)), j1 = Math.min(c.nz - 1, Math.floor((Math.max(z0, z1) - c.oz) / CELL - 0.5))\n let n = 0\n for (let j = j0; j <= j1; j++) for (let i = i0; i <= i1; i++) {\n if (circle) { const dx = c.ox + (i + 0.5) * CELL - circle[0], dz = c.oz + (j + 0.5) * CELL - circle[1]; if (dx * dx + dz * dz > circle[2] * circle[2]) continue }\n fn(g, j * c.nx + i); n++\n }\n return n\n }\n /** A wall or a banister opened (breach, fracture): the solid cells inside `shape` on `floor` become free. Returns the cells it visited. */\n function openCells(houseId: string, floor: number, shape: NavShape): number {\n const c = houseOf(houseId); if (!c) return 0\n const n = each(c, floor, shape, (g, k) => { if (g[k] !== FREE && g[k] & SOLID) { c.journal.push(floor, k, g[k]); g[k] &= ~SOLID } })\n c.fields[floor] = null\n return n\n }\n /** A slab collapsed or fractured: the cells inside `shape` on `floor` have no floor any more (blocked, and the path field avoids them). */\n function closeCells(houseId: string, floor: number, shape: NavShape): number {\n const c = houseOf(houseId); if (!c) return 0\n const n = each(c, floor, shape, (g, k) => { if (!(g[k] & VOID)) { c.journal.push(floor, k, g[k]); g[k] = (g[k] === FREE ? 0 : g[k]) | VOID } })\n c.fields[floor] = null\n return n\n }\n /** Puts the grid of the house back to what it was (after a world reset): undoes every `openCells` and `closeCells`. */\n function undoChanges(houseId: string): void {\n const c = houseOf(houseId); if (!c) return\n const j = c.journal\n for (let k = j.length - 3; k >= 0; k -= 3) { c.grids[j[k]][j[k + 1]] = j[k + 2]; c.fields[j[k]] = null }\n j.length = 0\n }\n\n return Object.assign(N, { register, houseAt, blocked, level, landing, stairTo, heading, ray, ceilingOf, occlude, cell, apply, houseOf, openCells, closeCells, undoChanges }) as FloorNavigator\n}\n\nexport interface FloorNavigator {\n houses: NavHouse[]\n /** Frame time in seconds; the path field is recomputed at most every 0.15 s of it. */\n time: number\n currentHouse: NavHouse | null\n currentFloor: number\n /** Result of the last `level` and `heading` call (no allocation per query). */\n result: NavResult\n register(def: NavHouseDef): NavHouse\n houseAt(x: number, z: number): NavHouse | null\n blocked(x: number, z: number, floor: number): number\n level(x: number, z: number, floor: number): boolean\n landing(flight: NavFlight, top: boolean, inside: number, out: number[]): number[]\n stairTo(house: NavHouse, from: number, to: number): NavFlight | null\n heading(house: NavHouse, floor: number, x: number, z: number, tx: number, tz: number): boolean\n ray(house: NavHouse, floor: number, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, max: number): number\n ceilingOf(house: NavHouse, floor: number): number\n occlude(x: number, z: number, floor: number): NavHouse | null\n cell(house: NavHouse, floor: number, x: number, z: number): number\n apply(house: NavHouse, floor: number): void\n houseOf(id: string): NavHouse | null\n openCells(houseId: string, floor: number, shape: NavShape): number\n closeCells(houseId: string, floor: number, shape: NavShape): number\n undoChanges(houseId: string): void\n}\n","import type { NavHouseDef, NavRect, NavStair } from './floor-navigator.js'\n\n/** The parts of a built house (`create(THREE, options).build(...)`) the navigator reads. */\nexport interface NavigableHouse {\n name?: string\n r: { floors: { index: number; y0: number; ceiling: number }[] }\n colliders: { type: string; f: number; x0: number; z0: number; x1: number; z1: number }[]\n stairs: { m: { ry: number }; f: number; to: number; rect: NavRect }[]\n floors: unknown[]\n roof: unknown\n}\n\nexport interface NavigationDefOptions {\n /** Id the house registers with (default: the house's name). */\n id?: string\n /** Collider types that make a cell solid (default: walls and the boards of a barricade; the gaps of the doors stay free). */\n solids?: string[]\n /** The fine grid also rules the ground floor inside the house. */\n own?: boolean\n}\n\n/**\n * The registration of a built house in a floor navigator: heights from the plan's floors, solids from the house's wall colliders, one flight per\n * stair (its footprint, from the floor it leaves to the floor it reaches, along the axis the flight runs on) and the floor groups and roof to hide\n * by occlusion.\n */\nexport function navigationDefOf(house: NavigableHouse, options: NavigationDefOptions = {}): NavHouseDef {\n const types = new Set(options.solids ?? ['wall', 'board'])\n const floors = house.r.floors.map((floor) => ({\n y: floor.y0,\n h: floor.ceiling,\n solids: house.colliders.filter((c) => c.f === floor.index && types.has(c.type)).map((c): NavRect => [c.x0, c.z0, c.x1, c.z1]),\n }))\n // a flight climbs towards the local -z of its item (its bottom is at +z): in the world that is (-sin, -cos) of the rotation\n const stairs = house.stairs.map((stair): NavStair => {\n const c = Math.cos(stair.m.ry), s = Math.sin(stair.m.ry), [x0, z0, x1, z1] = stair.rect\n if (Math.abs(c) >= Math.abs(s)) return -c > 0 ? [x0, z0, x1, z1, stair.f, stair.to, 'z'] : [x0, z1, x1, z0, stair.f, stair.to, 'z']\n return -s > 0 ? [x0, z0, x1, z1, stair.f, stair.to, 'x'] : [x1, z0, x0, z1, stair.f, stair.to, 'x']\n })\n return { id: options.id ?? house.name ?? 'house', floors, stairs, groups: house.floors, roof: house.roof, own: options.own }\n}\n","import type { FloorNavigator, NavRect } from './floor-navigator.js'\n\n/** The parts of a built house the binding reads: its structure (parts by id), its floors and its destruction adapter. */\nexport interface DestructibleHouse {\n r: { floors: { index: number; y0: number }[] }\n structure: { byId: Map<string, { role: string; floor: number; aabb: NavRect; y1: number }> }\n destruction: { onEvent(listener: (event: any) => void): () => void; restore?: () => void }\n}\n\nexport interface NavigatorBinding {\n /** Stops listening. */\n off(): void\n /** Puts the grid back (after a world reset). */\n reset(): void\n}\n\nconst WALL_ROLES = new Set(['wall', 'partition'])\n\n/**\n * Connects a floor navigator to the destruction of a house, so the people walking in it follow what the world did to it:\n * - a wall that reaches stage 2 opens the cells inside its opening (a circle on its floor);\n * - a wall that fractures or collapses opens all the cells of its footprint;\n * - a slab that supports a floor and fractures or collapses removes the cells of that floor under it (they become blocked).\n * The house has to be registered in the navigator under `houseId` (`navigationDefOf`). Events arrive once the house's destruction is active.\n * Returns the binding; `reset()` undoes the changes.\n */\nexport function bindNavigator(navigator: FloorNavigator, houseId: string, house: DestructibleHouse): NavigatorBinding {\n const level = (floor: number) => house.r.floors.find((f) => f.index === floor)?.y0\n const gone = (id: string) => {\n const part = house.structure.byId.get(id)\n if (!part) return\n if (WALL_ROLES.has(part.role)) navigator.openCells(houseId, part.floor, { rect: part.aabb })\n else if (part.role === 'slab') {\n const y = level(part.floor)\n // only the slab a floor stands on: its top is the floor level (a roof slab is not a floor)\n if (y !== undefined && Math.abs(part.y1 - y) < 0.1) navigator.closeCells(houseId, part.floor, { rect: part.aabb })\n }\n }\n const off = house.destruction.onEvent((event) => {\n if (event.type === 'stage' && event.stage === 2 && event.opening) {\n const part = house.structure.byId.get(event.part)\n if (part && WALL_ROLES.has(part.role)) navigator.openCells(houseId, part.floor, { circle: [event.opening.center[0], event.opening.center[2], event.opening.radius] })\n } else if (event.type === 'fracture') gone(event.part)\n else if (event.type === 'collapse') for (const id of event.parts) gone(id)\n })\n return { off, reset: () => navigator.undoChanges(houseId) }\n}\n","import { inferJoints } from '@adatechnology/game-destruction'\nimport { markKitOrigin } from '@adatechnology/game-contracts'\nimport type { DestructibleSpec, JointSpec, PartSpec } from '@adatechnology/game-contracts'\n\nimport { residentialItems } from '@adatechnology/game-floorplan-residential'\n\nimport { create } from '../create.js'\n\n/** What `furnitureSpec` reads of a catalogue entry (the items of `game-floorplan-residential` and the other packs have more). */\nexport interface FurnitureCatalogEntry {\n type: string\n w: number\n d: number\n h: number\n}\n\nexport interface FurnitureSpecOptions {\n /** Size in metres (default: the catalogue entry of the type). */\n w?: number\n d?: number\n h?: number\n /** Seed of the builder's random (the books of a shelf, the crates): same seed, same piece (default 1). */\n seed?: number\n /** Builder-level choices. */\n options?: {\n /** Material of the destruction world per builder material key (`wood`, `metal`, `plain`, `fabric`, `glass`...), overriding the defaults. */\n materials?: Record<string, string>\n /** Keep the chairs a table draws (default true). Chairs are drawn by the builder in a frame of their own, so this drops everything drawn in another frame than the piece's. */\n chairs?: boolean\n /** Colour roles of the builder (`wood`, `fabric_main`, `fabric_accent`, `metal`...) as `0xRRGGBB`. */\n palette?: Record<string, number>\n }\n /** Catalogue the default size is read from (`defaultFurnitureCatalog()` of `game-kit-defaults`, or the game's own). Default `residentialItems`, which is deprecated: pass the catalogue. */\n catalog?: readonly FurnitureCatalogEntry[]\n /** The `document` the house renderer makes its textures with (default the global one). */\n document?: unknown\n}\n\nexport interface FurnitureSpecResult {\n /** One part per box or cylinder the builder drew, origin at the centre of the footprint on the floor. */\n spec: DestructibleSpec\n /** Draws the piece: one mesh per part, named by the part id, coloured as the builder coloured it. */\n build(THREE: any): any\n /** The widest high horizontal part and the height of its upper face (what loose things rest on), or null when the piece has none. */\n /** What loose things rest on. A solid top is boards: `parts` are all of them, `part` the one in the middle. */\n top: { part: string; y: number; parts?: string[] } | null\n /** Size the piece was drawn at. */\n size: { w: number; d: number; h: number }\n /** Where the water leaves the taps the builder drew (a sink, a tub), in the space of the spec; empty for furniture without a tap. */\n spouts: Array<[number, number, number]>\n}\n\ninterface Drawn {\n id: string\n key: string\n shape: PartSpec['shape']\n position: [number, number, number]\n rotation: [number, number, number] | null\n color: number\n min: [number, number, number]\n max: [number, number, number]\n}\n\nconst WOOD_THIN = 0.035\n/** A solid wooden top is boards glued edge to edge: thicker than this it is a block and stays whole; narrower than `BOARD_TOP_WIDTH` it is one board. */\nconst BOARD_TOP_THICK = 0.07\nconst BOARD_TOP_WIDTH = 0.5\nconst BOARD_WIDTH = 0.16\n/** A shelf falls when what holds it leaves it this many times its own length of span (one side gone: twice its length). */\nconst SHELF_SPAN = 1.5\n/** Types that are cases with shelves: their `plain` boxes are books and boxes, and they stand as a carcass. */\nconst SHELVING = /shelf|bookcase|rack/\n\n/**\n * The frame of a case piece (a bookcase, a shelf unit, a rack): the uprights stand on the floor and carry, each shelf rests on them and needs both\n * ends held (`structure.maxSpan`), and the back panel carries nothing. Break a side and the shelves it held fall with what is on them.\n */\nfunction carcass(parts: PartSpec[], drawn: Map<string, Drawn>): void {\n const all = [...drawn.values()]\n const width = Math.max(...all.map((p) => p.max[0])) - Math.min(...all.map((p) => p.min[0]))\n for (const part of parts) {\n if (LOOSE.has(part.material) || part.shape.kind !== 'box' || part.rotation) continue\n const [x, y, z] = part.shape.size\n if (y >= x && y >= z) {\n // upright: a side (thin across the width) carries; a back or front panel (thin in depth, as wide as the piece) does not\n if (z < x && x >= 0.6 * width) continue\n part.structure = { role: 'column' }\n } else if (y <= x && y <= z) part.structure = { role: 'beam', maxSpan: SHELF_SPAN * Math.max(x, z) }\n }\n}\n/** Each solid top of the drawing becomes its boards (`<id>_b<n>`), along its length, so that it breaks board by board where it is hit. Returns the boards of each top. */\nfunction splitTopsIntoBoards(drawn: Drawn[], materialOf: Record<string, string>, carcassed: boolean): Map<string, Drawn[]> {\n const tops = new Map<string, Drawn[]>()\n if (carcassed) return tops\n for (let i = drawn.length - 1; i >= 0; i--) {\n const p = drawn[i]\n if (p.key !== 'wood' || materialOf.wood !== 'wood_hard' || p.shape.kind !== 'box' || p.rotation) continue\n const [sx, sy, sz] = p.shape.size\n const across = sx < sz ? 0 : 2\n const width = Math.min(sx, sz)\n if (sy < WOOD_THIN || sy > BOARD_TOP_THICK || sy >= width || width < BOARD_TOP_WIDTH) continue\n const count = Math.round(width / BOARD_WIDTH)\n const boards: Drawn[] = []\n for (let b = 0; b < count; b++) {\n const size: [number, number, number] = [sx, sy, sz]\n size[across] = width / count\n const position: [number, number, number] = [...p.position]\n position[across] += (b + 0.5) * size[across] - width / 2\n const min: [number, number, number] = [...p.min]\n const max: [number, number, number] = [...p.max]\n min[across] = position[across] - size[across] / 2\n max[across] = position[across] + size[across] / 2\n boards.push({ ...p, id: `${p.id}_b${b}`, shape: { kind: 'box', size }, position, min, max, color: shadeBoard(p.color, b) })\n }\n drawn.splice(i, 1, ...boards)\n tops.set(p.id, boards)\n }\n return tops\n}\n\n/** Boards of one top are not cut from the same tree: each has its own tone. */\nfunction shadeBoard(color: number, board: number): number {\n const k = [1, 0.94, 1.05, 0.97, 1.03][board % 5]\n const channel = (shift: number): number => Math.min(255, Math.round(((color >> shift) & 255) * k)) << shift\n return channel(16) | channel(8) | channel(0)\n}\n\nconst FLOOR_TOUCH = 0.005\nconst LOOSE = new Set(['paper'])\nconst BASE_MATERIAL: Record<string, string> = {\n wood: 'wood_hard',\n metal: 'steel',\n fabric: 'fabric',\n glass: 'glass',\n plain: 'plastic',\n plant: 'foliage',\n picture: 'paper',\n emissive: 'glass',\n}\n\n// one house renderer per three.js namespace: it makes the type table the builders hang from\nconst renderers = new WeakMap<object, any>()\nfunction rendererOf(THREE: any, document: unknown): any {\n let r = renderers.get(THREE)\n if (!r) {\n r = create(THREE, document ? { document: document as never } : {})\n renderers.set(THREE, r)\n }\n return r\n}\n\ninterface RecordOptions {\n /** Destruction material per builder material key, over the defaults. */\n materials: Record<string, string>\n chairs?: boolean\n /** The piece is a case with shelves (`carcass`). */\n carcass?: boolean\n}\n\n/** Runs `run` with a recording stand-in for the drawing api and turns what it drew into a spec, a drawing and the top. `root` is the frame of the piece (the builder's `M`). */\nfunction recordSpec(THREE: any, name: string, root: any, run: (A: any) => void, opts: RecordOptions): { spec: DestructibleSpec; build: (T3: any) => any; top: FurnitureSpecResult['top'] } {\n const o = { chairs: opts.chairs }\n const materialOf = { ...BASE_MATERIAL, ...opts.materials }\n const drawn: Drawn[] = []\n const counters = new Map<string, number>()\n const q = new THREE.Quaternion()\n const eul = new THREE.Euler()\n const xyz = new THREE.Euler()\n const v = new THREE.Vector3()\n\n const loc = (M: any, lx: number, lz: number): [number, number] => {\n const c = Math.cos(M.ry)\n const s = Math.sin(M.ry)\n return [M.x + lx * c + lz * s, M.z - lx * s + lz * c]\n }\n const record = (M: any, key: string, shape: PartSpec['shape'], px: number, py: number, pz: number, rx: number, ry: number, rz: number, color: number): void => {\n if ((o.chairs === false && M !== root) || key === 'water') return // water is not a solid\n q.setFromEuler(eul.set(rx, ry, rz, 'YXZ'))\n const turned = rx !== 0 || ry !== 0 || rz !== 0\n const size: [number, number, number] = shape.kind === 'box' ? shape.size : shape.kind === 'cylinder' ? [shape.radius * 2, shape.height, shape.radius * 2] : [shape.radius * 2, shape.radius * 2, shape.radius * 2]\n const min: [number, number, number] = [Infinity, Infinity, Infinity]\n const max: [number, number, number] = [-Infinity, -Infinity, -Infinity]\n for (const sx of [-0.5, 0.5]) for (const sy of [-0.5, 0.5]) for (const sz of [-0.5, 0.5]) {\n v.set(sx * size[0], sy * size[1], sz * size[2]).applyQuaternion(q)\n const c = [v.x + px - root.x, v.y + py, v.z + pz - root.z]\n for (let k = 0; k < 3; k++) {\n min[k] = Math.min(min[k], c[k])\n max[k] = Math.max(max[k], c[k])\n }\n }\n const n = counters.get(key) ?? 0\n counters.set(key, n + 1)\n let rotation: [number, number, number] | null = null\n if (turned) {\n xyz.setFromQuaternion(q, 'XYZ')\n rotation = [xyz.x, xyz.y, xyz.z]\n }\n drawn.push({ id: `${key}_${n}`, key, shape, position: [px - root.x, py, pz - root.z], rotation, color, min, max })\n }\n\n const A = {\n box(M: any, mat: string, x: number, y: number, z: number, bw: number, bh: number, bd: number, color: number, ry = 0, rx = 0, rz = 0): void {\n const [px, pz] = loc(M, x, z)\n record(M, mat, { kind: 'box', size: [bw, bh, bd] }, px, M.base + y + bh / 2, pz, rx, M.ry + ry, rz, color)\n },\n cylinder(M: any, mat: string, x: number, y: number, z: number, r: number, ch: number, color: number, rx = 0, rz = 0): void {\n const [px, pz] = loc(M, x, z)\n record(M, mat, { kind: 'cylinder', radius: r, height: ch }, px, M.base + y + (rx || rz ? 0 : ch / 2), pz, rx || 0, M.ry, rz || 0, color)\n },\n leaf(): void {},\n plane(): void {},\n light(): void {},\n }\n run(A)\n if (!drawn.length) throw new Error(`game-floorplan-three: the builder of \"${name}\" drew no box or cylinder`)\n\n const boardsOf = splitTopsIntoBoards(drawn, materialOf, Boolean(opts.carcass))\n const parts: PartSpec[] = drawn.map((p) => {\n const thin = Math.min(...(p.shape.kind === 'box' ? p.shape.size : p.shape.kind === 'cylinder' ? [p.shape.radius * 2, p.shape.height] : [p.shape.radius * 2]))\n let material = materialOf[p.key] ?? 'plastic'\n // a case with shelves is MDF (as bought); elsewhere thin boards are pine and thick ones hardwood\n if (p.key === 'wood' && material === 'wood_hard' && opts.carcass && !opts.materials?.wood) material = 'mdf'\n else if (p.key === 'wood' && material === 'wood_hard' && thin < WOOD_THIN) material = 'wood_soft'\n const part: PartSpec = { id: p.id, material, shape: p.shape, position: p.position }\n if (p.rotation) part.rotation = p.rotation\n if (!LOOSE.has(material) && p.min[1] <= FLOOR_TOUCH) part.anchored = true\n return part\n })\n const byId = new Map(drawn.map((p) => [p.id, p]))\n\n const joints: JointSpec[] = []\n for (const j of inferJoints(parts, 0.01)) {\n const a = parts.find((p) => p.id === j.a)!\n const b = parts.find((p) => p.id === j.b)!\n const la = LOOSE.has(a.material)\n const lb = LOOSE.has(b.material)\n if (la && lb) continue\n if (la || lb) {\n // paper rests on what is under it: its lower face on the other's upper face\n const [loose, other] = la ? [a, b] : [b, a]\n if (Math.abs(byId.get(loose.id)!.min[1] - byId.get(other.id)!.max[1]) > 0.02) continue\n joints.push({ id: j.id, a: j.a, b: j.b, kind: 'resting' })\n continue\n }\n joints.push(j)\n }\n\n // the top: among the boxes that cover most of the footprint, the highest upper face (not fabric: a cloth lies on the top)\n const all = drawn.reduce(\n (m, p) => ({ x0: Math.min(m.x0, p.min[0]), x1: Math.max(m.x1, p.max[0]), z0: Math.min(m.z0, p.min[2]), z1: Math.max(m.z1, p.max[2]) }),\n { x0: Infinity, x1: -Infinity, z0: Infinity, z1: -Infinity },\n )\n const footprint = (all.x1 - all.x0) * (all.z1 - all.z0)\n let top: FurnitureSpecResult['top'] = null\n for (const p of drawn) {\n const part = parts.find((x) => x.id === p.id)!\n if (part.shape.kind === 'sphere' || part.rotation || part.material === 'fabric' || LOOSE.has(part.material)) continue\n const area = (p.max[0] - p.min[0]) * (p.max[2] - p.min[2])\n if (area < 0.6 * footprint || p.max[1] < 0.2) continue\n if (!top || p.max[1] > top.y + 1e-6) top = { part: p.id, y: p.max[1] }\n }\n for (const boards of boardsOf.values()) {\n if (top && boards[0].max[1] <= top.y - 1e-6) continue\n const mid = boards[boards.length >> 1]\n const min = [Math.min(...boards.map((b) => b.min[0])), Math.min(...boards.map((b) => b.min[2]))]\n const max = [Math.max(...boards.map((b) => b.max[0])), Math.max(...boards.map((b) => b.max[2]))]\n if ((max[0] - min[0]) * (max[1] - min[1]) >= 0.6 * footprint && mid.max[1] >= 0.2) top = { part: mid.id, y: mid.max[1], parts: boards.map((b) => b.id) }\n }\n\n if (opts.carcass) carcass(parts, byId)\n const spec: DestructibleSpec = { name, parts, joints, tags: ['furniture'] }\n const colors = new Map(drawn.map((p) => [p.id, p.color]))\n\n const build = (T3: any): any => {\n const group = markKitOrigin(new T3.Group(), { owner: 'game-floorplan-three', kind: 'furniture', id: name })\n group.name = name\n const mats = new Map<string, any>()\n for (const p of parts) {\n const color = colors.get(p.id) ?? 0x888888\n const metal = p.material === 'steel'\n const glass = p.material === 'glass'\n const key = `${color}:${metal}:${glass}`\n let mat = mats.get(key)\n if (!mat) {\n mat = new T3.MeshStandardMaterial({ color, roughness: metal ? 0.45 : 0.85, metalness: metal ? 0.7 : 0, transparent: glass, opacity: glass ? 0.4 : 1 })\n mats.set(key, mat)\n }\n const s = p.shape\n const geo = s.kind === 'box' ? new T3.BoxGeometry(s.size[0], s.size[1], s.size[2]) : s.kind === 'cylinder' ? new T3.CylinderGeometry(s.radius, s.radius, s.height, 14) : new T3.SphereGeometry(s.radius, 12, 8)\n const mesh = new T3.Mesh(geo, mat)\n mesh.name = p.id\n mesh.userData.destructionPart = p.id\n mesh.userData.destructionMaterial = p.material\n mesh.position.set(p.position[0], p.position[1], p.position[2])\n if (p.rotation) mesh.rotation.set(p.rotation[0], p.rotation[1], p.rotation[2], 'XYZ')\n mesh.castShadow = !glass\n mesh.receiveShadow = true\n group.add(mesh)\n }\n return group\n }\n\n return { spec, build, top }\n}\n\n/**\n * The team's furniture as a destructible spec. It runs the builder of `type` (`FURNITURE.shelf` for `bookcase`, `FURNITURE.table` for `dining_table`,\n * mapped in `furniture/type-table.ts`) unchanged, with a recording stand-in for the drawing api instead of the house's accumulators: every box and\n * cylinder it draws becomes a part, named `<material key>_<n>` in drawing order (`wood_0`, `plain_17`), with the colour the builder gave it.\n * Planes and leaves (flat, no volume) and water are left out.\n *\n * Materials: `wood` is `wood_hard`, and `wood_soft` for thin boards and panels (under 3.5 cm); `metal` is `steel`; `fabric`, `glass` and `plant` keep\n * their name; `plain` is `plastic`, or `paper` for shelves and racks (their books and boxes). Parts that touch the floor are anchored. Joints come from\n * `inferJoints` (screws between wood, welds or bolts between metal...), except that paper rests on what it lies on with a `resting` joint (weak: it falls when\n * the board breaks) and is not joined to its neighbours. Shelves and racks stand as a carcass: the sides carry, each shelf needs both of its ends\n * held, and the back panel carries nothing, so a broken side drops the shelves it held, with their books.\n *\n * @example\n * const { spec, build, top } = furnitureSpec(THREE, 'bookcase') // 1.2 x 0.35 x 2 m, boards and books\n */\nexport function furnitureSpec(THREE: any, type: string, opts: FurnitureSpecOptions = {}): FurnitureSpecResult {\n const renderer = rendererOf(THREE, opts.document)\n const ent = renderer.types[type]\n if (!ent) throw new Error(`game-floorplan-three: no builder for the furniture type \"${type}\"`)\n const entry = (opts.catalog ?? (residentialItems as unknown as readonly FurnitureCatalogEntry[])).find((i) => i.type === type)\n const w = opts.w ?? entry?.w\n const d = opts.d ?? entry?.d\n const h = opts.h ?? entry?.h\n if (w === undefined || d === undefined || h === undefined) throw new Error(`game-floorplan-three: furniture type \"${type}\" is not in the catalogue, so give w, d and h`)\n const o = opts.options ?? {}\n const seed = Math.round(opts.seed ?? 1)\n const plain = SHELVING.test(type) ? 'paper' : 'plastic'\n const root: any = { x: seed, z: 0, ry: 0, w, d, h, y: 0, base: 0, palette: o.palette, seed: `furniture_${type}_${seed}` }\n const { K, shared } = renderer.internals\n const before = K.PARTS.length\n const made = recordSpec(\n THREE,\n type,\n root,\n (A) => {\n const saved = { api0: shared.api0, ctx: shared.ctx }\n shared.api0 = A // the levers and taps that the kit draws as moving parts go through its own api\n shared.ctx = shared.ctx ?? {} // outside a house the builders read the style of the plan from here\n try {\n ent.f(root, A)\n } finally {\n shared.api0 = saved.api0\n shared.ctx = saved.ctx\n }\n },\n { materials: { plain, ...o.materials }, chairs: o.chairs, carcass: SHELVING.test(type) },\n )\n const spouts = K.PARTS.slice(before)\n .filter((p: any) => p.type === 'water_tap')\n .map((p: any): [number, number, number] => [p.pos[0] - root.x, p.pos[1], p.pos[2] - root.z])\n K.PARTS.length = before\n return { spec: made.spec, build: made.build, top: made.top, size: { w, d, h }, spouts }\n}\n\nexport interface TapSpecOptions {\n /** `counter` (default): the tap of a sink, standing on the counter; `wall`: the tap of a laundry tub or a garden, with its plate on the wall. */\n kind?: 'counter' | 'wall'\n /** How far the counter tap's spout reaches, metres (default 0.2: the kitchen sink's). */\n reach?: number\n /** The `document` the house renderer makes its textures with (default the global one). */\n document?: unknown\n}\n\nexport interface TapSpecResult {\n /** The tap as parts (base, column, spout, lever), origin on the counter under the column (`counter`) or on the wall plate's centre line at the floor (`wall`). */\n spec: DestructibleSpec\n /** Draws the tap: one mesh per part, named by the part id. */\n build(THREE: any): any\n /** Where the water leaves the spout, in the space of the spec. */\n spout: [number, number, number]\n}\n\n/**\n * The team's tap (`counterTap` of the sink, `wallTap` of the laundry tub: `furniture/taps.ts`) drawn by the same code into parts, with the lever at rest. `spout` is where its\n * water thread starts, so a host can put a tap of the fluids world there; the water thread itself is not drawn.\n */\nexport function tapSpec(THREE: any, opts: TapSpecOptions = {}): TapSpecResult {\n const renderer = rendererOf(THREE, opts.document)\n const { K, shared } = renderer.internals\n const kind = opts.kind ?? 'counter'\n const root: any = { x: 1, z: 0, ry: 0, w: 0.3, d: 0.3, h: 0.3, y: 0, base: 0, seed: `tap_${kind}` }\n const before = K.PARTS.length\n const made = recordSpec(THREE, kind === 'counter' ? 'tap' : 'wall_tap', root, (A) => {\n const kit = K.kit2(root, A)\n const saved = shared.api0\n shared.api0 = A // the lever and the water thread are parts that the kit draws through its own api\n try {\n if (kind === 'counter') K.counterTap(kit, 0, 0, 0, opts.reach ?? 0.2, 0.17, {})\n else K.wallTap(kit, 0, 0.3, 0, 1, 0.1, {})\n } finally {\n shared.api0 = saved\n }\n }, { materials: {} })\n const water = K.PARTS.slice(before).find((p: any) => p.type === 'water_tap')\n if (!water) throw new Error('game-floorplan-three: the tap drew no water thread')\n K.PARTS.length = before\n return { spec: made.spec, build: made.build, spout: [water.pos[0] - root.x, water.pos[1], water.pos[2] - root.z] }\n}\n","import { buildStructure, masonryConstruction } from '@adatechnology/game-floorplan-structure'\n\nimport { create } from './create.js'\nimport type { House, HouseRendererOptions } from './types.js'\n\n/** A free-standing wall built and drawn as the walls of the houses. */\nexport interface WallPieceOptions {\n /** Length and height in metres. */\n w: number\n h: number\n /** Default 0.15 m, the houses' wall. */\n thickness?: number\n /** Facade finish of the houses: `plaster` (default), `roughcast` or `exposed_block`. */\n finish?: string\n /** Paint colour of the plaster (default the light plaster of the houses' palette). */\n color?: number\n /** Options of the house renderer (`create`) that draws it. */\n house?: Partial<HouseRendererOptions>\n}\n\nexport interface WallPiece {\n /** The plan of the wall: one storey, one exterior wall, no rooms and no roof; its `structure` is the houses' load path. */\n readonly plan: any\n /** The destructible spec, as a house gives it (`house.structure.spec()`): the wall with its layers, units and breach on the ground, and the bond beam on it. */\n readonly spec: any\n /** Draws the wall with the house renderer: meshes carry `userData.destructionPart` of their part, in the space of the spec. */\n build(THREE: any): any\n /**\n * Once a drawing from `build` is in a destruction world as `objectId` (with this `spec`), the house renderer follows its events and draws on it what\n * a generic destruction renderer cannot: the bricks that shots and blows knock out (`chip`) and the opening of a breach, as gaps in the wall's\n * courses. `restore` puts the wall back (after `world.reset`), `dispose` stops following. `update` paints the damage of the events since the last call, once\n * per wall (call it every frame; without it the damage is painted 100 ms after the event).\n */\n follow(root: any, world: any, objectId: string): { restore(): void; dispose(): void; update(): void } | null\n}\n\nconst PLASTER = 0xe8e2d4\nconst WALL_ID = 'wall_0_0'\n\n/**\n * The plan of a free-standing wall along x, centred on the origin: a one-storey plan whose only wall is exterior on both sides, with the masonry construction of\n * the houses (brick, concrete bond beam, strip footing) and the structure `buildStructure` gives the houses, without a roof.\n */\nexport function wallPlan(options: WallPieceOptions): any {\n const { w, h, thickness = 0.15, finish = 'plaster', color = PLASTER } = options\n const facade = { finish, roof: 'none', floors: 1 }\n const wall = { id: WALL_ID, floor: 0, axis: 'u', u0: -w / 2, v0: 0, u1: w / 2, v1: 0, thickness, sides: ['outside', 'outside'], exterior: true, type: 'wall', h }\n const plan: any = {\n template: 'wall', name: 'wall', style: 'mid', state: 'normal', w, d: thickness,\n floors: [{ index: 0, y0: 0, ceiling: h }], rooms: [], walls: [wall], doors: [], windows: [], items: [], stateItems: [], openPairs: [], partyWalls: [], missing: [],\n facade, colors: { facade: color, wall: color }, lot: null, building: null, waterTank: null, outbuildings: [],\n }\n plan.construction = masonryConstruction({ ...plan, facade: { ...facade, roof: 'colonial' } })\n plan.structure = buildStructure(plan, { wallDetail: 'coarse', construction: plan.construction, roof: false })\n return plan\n}\n\nfunction draw(THREE: any, plan: any, options: Partial<HouseRendererOptions>): House {\n return create(THREE, { ...options, fleet: null }).build(plan, { quality: 'game', terrain: false, noPerimeter: true, pieces: 'meshes' })\n}\n\n/** The house each drawing of `build` came from (its root is the house's group). */\nconst houses = new WeakMap<object, House>()\n\n/** Labels the meshes of each structural piece with its part id, so a destruction renderer binds them by `userData.destructionPart`. */\nfunction label(house: House): any {\n houses.set(house.group, house)\n for (const [id, items] of Object.entries<any[]>(house.destruction.ranges())) {\n for (const item of items) {\n const object = item.isObject3D ? item : item.mesh\n object.userData.destructionPart = id\n }\n }\n return house.group\n}\n\n/**\n * A free-standing wall (a target wall, a garden wall) built and drawn exactly as the walls of the houses: the structure of `game-floorplan-structure` (the wall on\n * the strip footing, the bond beam on it, the assembly's layers, units and breach) and the house renderer's plaster, paint, baseboard and sidewalk.\n */\nexport function wallPiece(THREE: any, options: WallPieceOptions): WallPiece {\n const plan = wallPlan(options)\n const houseOptions = options.house ?? {}\n // no world: the wall is drawn once to describe its structure, as the houses' specimens are. The wall keeps the detail of the houses' walls (its\n // assembly's plaster, bricks and breach), so shots wear the brick they hit and knock it out\n const probe = draw(THREE, plan, { ...houseOptions, destruction: undefined, destructionRenderer: undefined })\n const spec = probe.structure.spec()\n probe.dispose()\n return {\n plan,\n spec,\n build: (T: any) => label(draw(T, plan, houseOptions)),\n follow: (root: any, world: any, objectId: string) => (houses.get(root) as any)?.destruction?.follow?.(world, objectId, spec) ?? null,\n }\n}\n"],"mappings":"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","names":["i","j"]}
|