@adatechnology/game-floorplan-three 0.8.1 → 0.8.3

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/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 const events = (room: any): any[] => {\n const list: any[] = []\n room.world.on('*', (e: any) => list.push(e))\n return list\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 return [\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}\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/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"]}