@adatechnology/game-floorplan-three 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,533 @@
1
+ import { ModuleScenario, TestableModule } from '@adatechnology/game-contracts';
2
+
3
+ /** Texts the house shows to the player (interaction prompts, messages, outbuilding labels), by locale. */
4
+ type Messages = Record<string, string>;
5
+ declare const en: Messages;
6
+ declare const ptBR: Messages;
7
+ declare const locales: Record<string, Messages>;
8
+ type Translate = (key: string, params?: Record<string, string | number>) => string;
9
+ /**
10
+ * Translator for a locale id ('en', 'pt-BR'), or for a partial table that overrides the English one.
11
+ * A missing key falls back to English and then to the key itself.
12
+ */
13
+ declare function createTranslator(locale?: string | Partial<Messages>): Translate;
14
+
15
+ /** A part of the house a hit can damage (door, window, glass, tank...): the game reads `hp`. */
16
+ interface Damageable {
17
+ type: string;
18
+ hp: number;
19
+ hpMax: number;
20
+ }
21
+ /** What `create(THREE, options)` reads. Everything is optional; the three.js namespace is the first argument. */
22
+ interface HouseRendererOptions {
23
+ /** Document used to draw the procedural textures on a canvas (default: the page's). */
24
+ document?: any;
25
+ /** `'game'` merges more and draws less than `'high'`. */
26
+ quality?: 'high' | 'game';
27
+ /** Locale of the texts the house shows (`en`, `pt-BR`) or a table of messages. */
28
+ locale?: string | Partial<Messages>;
29
+ /** `@adatechnology/game-props3d` (default: the package's own dependency). */
30
+ props?: any;
31
+ /** `THREE.Reflector` (three/examples/jsm/objects/Reflector.js); without it the mirrors use only the environment map. */
32
+ reflector?: any;
33
+ /** Cars of the lot and garage: `build(kind, { quality, seed })` -> `{ group, damageable, release() }`. Without it there are no cars. */
34
+ fleet?: {
35
+ build(kind: string, options: {
36
+ quality: string;
37
+ seed: number;
38
+ }): any;
39
+ } | null;
40
+ /** Car kinds (fleet ids) per lot style (`budget`, `mid`, `high`); replaces the list of a style. */
41
+ carKinds?: Record<string, string[]>;
42
+ /** Hit points per damage class (glass, wood, water, metal, masonry, rubber, fuel, gas). */
43
+ hp?: Record<string, number>;
44
+ /** Textures from the app that replace the procedural ones. */
45
+ textures?: Record<string, any>;
46
+ atlas?: Record<string, any>;
47
+ /** Materials the game swaps (a material or a function of the default one). */
48
+ materials?: Record<string, any>;
49
+ /** The world of `@adatechnology/game-destruction`; the house registers itself in it on first need. */
50
+ destruction?: any;
51
+ /** `createDestructionRenderer(THREE, { scene, world })` of `@adatechnology/game-destruction-three`: draws fracture, collapse, fragments, spalls and the rebar cage on the house's meshes. */
52
+ destructionRenderer?: any;
53
+ /** The interactables kit, injected: `{ GameInteractables, GameInteractablesHousehold, GameInteractablesThree, adapter, locale, region, items, effects, camera, onEvent, onSeat }`. */
54
+ interactives?: any;
55
+ /** The vegetation packages, injected: `{ GameVegetation, GameVegetationSpecies }`. */
56
+ vegetation?: any;
57
+ /** Maps an id of the plan to the key its seeded random draws use, to reproduce a scene drawn with other ids (golden tests). */
58
+ seedKey?: (id: string) => string | null | undefined;
59
+ /** Distance (m) beyond which the interior (`interior`) and the house (`hide`) are drawn no more, or `false` to switch distance LOD off. */
60
+ lod?: false | {
61
+ interior?: number;
62
+ hide?: number;
63
+ };
64
+ drawCallBudget?: number;
65
+ onChange?: (change: {
66
+ shadow: boolean;
67
+ }) => void;
68
+ onCollider?: (collider: any) => void;
69
+ onDamage?: (part: any, point: {
70
+ x: number;
71
+ y: number;
72
+ z: number;
73
+ } | null, type: string) => void;
74
+ onWreck?: (event: any, house: any) => void;
75
+ onInteract?: (target: any, action: any) => boolean | void;
76
+ onLight?: (light: any) => void;
77
+ onMessage?: (text: string) => void;
78
+ }
79
+ interface BuildOptions {
80
+ /** `'high'` (default) or `'game'`. */
81
+ quality?: 'high' | 'game';
82
+ /** Night: lit windows and room lamps. */
83
+ night?: boolean;
84
+ /** Roof cut off and floors above hidden, to look into the plan. */
85
+ cut?: boolean;
86
+ /** A state returned by `newState()`: pass the same one to rebuild without closing every door. */
87
+ state?: any;
88
+ /** `false`: the app already has ground, street and lawn. */
89
+ terrain?: boolean;
90
+ /** `true`: no lot wall, fence or gates (the game has its own). */
91
+ noPerimeter?: boolean;
92
+ /** `'meshes'`: one mesh per structural piece instead of one per group and material. */
93
+ pieces?: 'meshes';
94
+ drawCallBudget?: number;
95
+ building?: {
96
+ floors?: number;
97
+ floor?: number;
98
+ unit?: number;
99
+ showBuilding?: boolean;
100
+ };
101
+ }
102
+ /** The house the renderer built. The three.js groups are ready to add to a scene. */
103
+ interface House {
104
+ version: string;
105
+ r: any;
106
+ name: string;
107
+ quality: string;
108
+ group: any;
109
+ house: any;
110
+ groups: Record<string, any>;
111
+ floors: any[];
112
+ ceilings: any[];
113
+ roof: any;
114
+ lot: any;
115
+ ground: any;
116
+ building: any;
117
+ /** Public colliders: walls, doors, lot walls and gates (aabb) and furniture (obb). */
118
+ colliders: any[];
119
+ /** Parts that move or take damage: id -> `{ group, type, opens(t), damageable }`. */
120
+ parts: Record<string, any>;
121
+ doors: any[];
122
+ stairs: any[];
123
+ labels: any[];
124
+ /** The real lights the builders asked for (at night) in `list`, and the same grouped by room id in `byRoom`. */
125
+ lights: {
126
+ list: any[];
127
+ byRoom: Record<string, any[]>;
128
+ };
129
+ stats: any;
130
+ structure: any;
131
+ destruction: any;
132
+ interactives: any;
133
+ update(dt: number, time?: number, focus?: {
134
+ x: number;
135
+ y: number;
136
+ z: number;
137
+ }): void;
138
+ show(options: {
139
+ floor?: number;
140
+ cut?: boolean;
141
+ lot?: boolean;
142
+ }): void;
143
+ target(eye: any, options?: any): any;
144
+ interact(target: any): any;
145
+ toggleDoor(id: string): any;
146
+ toggleLight(room?: string): any;
147
+ lightOn(room: string): boolean;
148
+ collide(x: number, z: number, floor: number, options?: any): any;
149
+ roomAt(floor: number, x: number, z: number): any;
150
+ setLod(level: number): void;
151
+ readonly lod: number;
152
+ damage(id: string, point?: any, type?: string, amount?: number): void;
153
+ colliderDamage(collider: any, point?: any, type?: string, amount?: number): void;
154
+ /** The part (door, window, furniture piece...) an object belongs to, found by going up its parents. */
155
+ partOf(object: any): any | null;
156
+ /** The first part whose box holds the point (with a tolerance, default 5 cm). */
157
+ partAt(point: {
158
+ x: number;
159
+ y: number;
160
+ z: number;
161
+ }, tolerance?: number): any | null;
162
+ dispose(): void;
163
+ [extra: string]: any;
164
+ }
165
+ /** The renderer `create(THREE, options)` returns. */
166
+ interface HouseRenderer {
167
+ version: string;
168
+ build(result: any, options?: BuildOptions): House;
169
+ newState(): any;
170
+ types: Record<string, any>;
171
+ mv: any;
172
+ applyPart(group: any, t: number): void;
173
+ materials: Record<string, any>;
174
+ roomLightMask(material: any): void;
175
+ lighting(options?: any): any;
176
+ setNight(night: boolean): void;
177
+ cars: {
178
+ model(kind: string, seed?: number): any;
179
+ group(...args: any[]): any;
180
+ info(kind: string, seed?: number): any;
181
+ };
182
+ dispose(): void;
183
+ }
184
+
185
+ declare const OPEN_ROOM_TYPES: Set<string>;
186
+ declare const rectsOf: (c: any) => any;
187
+ declare const isOpenArea: (c: any) => boolean;
188
+ declare function planLod(houses: any, focus: any, budget: any): {
189
+ total: any;
190
+ levels: any;
191
+ houses: any;
192
+ };
193
+
194
+ declare const VERSION = "1.0.0";
195
+
196
+ /**
197
+ * Creates a house renderer: `create(THREE, options).build(result, { quality, night })` turns the result of `@adatechnology/game-floorplan`
198
+ * (plus the structure of `@adatechnology/game-floorplan-structure`) into a three.js group. Port of the team's Casa3DSDK.
199
+ */
200
+ declare function create(THREE: any, options?: HouseRendererOptions): HouseRenderer;
201
+
202
+ /** A rectangle `[x0, z0, x1, z1]` in the house's coordinates. */
203
+ type NavRect = [number, number, number, number];
204
+ /** `[x0, z0, x1, z1, from, to, axis]`: a flight from floor `from` to floor `to` along `axis`. */
205
+ type NavStair = [number, number, number, number, number, number, 'x' | 'z'];
206
+ interface NavFloor {
207
+ /** Absolute height of the floor level. */
208
+ y: number;
209
+ /** Height of the storey. */
210
+ h: number;
211
+ solids?: NavRect[];
212
+ }
213
+ interface NavHouseDef {
214
+ id: string;
215
+ floors: NavFloor[];
216
+ stairs?: NavStair[];
217
+ groups?: unknown[];
218
+ roof?: unknown;
219
+ /** The fine grid also rules the ground floor inside the house (default: the ground floor uses the game's grid, except stairs and banisters). */
220
+ own?: boolean;
221
+ /** The house's rectangle (default: the union of its solids and stairs). */
222
+ rect?: NavRect;
223
+ }
224
+ /** A shape on the plan: a rectangle `[x0, z0, x1, z1]` or a circle `[cx, cz, radius]`. */
225
+ type NavShape = {
226
+ rect: NavRect;
227
+ } | {
228
+ circle: [number, number, number];
229
+ };
230
+ interface NavResult {
231
+ y: number;
232
+ floor: number;
233
+ dx: number;
234
+ dz: number;
235
+ t: number;
236
+ stair: NavFlight | null;
237
+ }
238
+ interface NavFlight {
239
+ x0: number;
240
+ z0: number;
241
+ x1: number;
242
+ z1: number;
243
+ axis: 0 | 1;
244
+ from: number;
245
+ to: number;
246
+ group: any;
247
+ yFrom: number;
248
+ yTo: number;
249
+ dir: number;
250
+ lo: number;
251
+ len: number;
252
+ e: number;
253
+ }
254
+ interface NavHouse {
255
+ id: string;
256
+ own: boolean;
257
+ floors: NavFloor[];
258
+ groups: unknown[];
259
+ roof: unknown;
260
+ flights: NavFlight[];
261
+ grids: Uint8Array[];
262
+ fields: any[];
263
+ /** Triples (floor, cell, previous value) of the run-time changes of the grid. */
264
+ journal: number[];
265
+ shown: number;
266
+ x0: number;
267
+ z0: number;
268
+ x1: number;
269
+ z1: number;
270
+ ox: number;
271
+ oz: number;
272
+ nx: number;
273
+ nz: number;
274
+ n: number;
275
+ }
276
+ declare function createFloorNavigator(): FloorNavigator;
277
+ interface FloorNavigator {
278
+ houses: NavHouse[];
279
+ /** Frame time in seconds; the path field is recomputed at most every 0.15 s of it. */
280
+ time: number;
281
+ currentHouse: NavHouse | null;
282
+ currentFloor: number;
283
+ /** Result of the last `level` and `heading` call (no allocation per query). */
284
+ result: NavResult;
285
+ register(def: NavHouseDef): NavHouse;
286
+ houseAt(x: number, z: number): NavHouse | null;
287
+ blocked(x: number, z: number, floor: number): number;
288
+ level(x: number, z: number, floor: number): boolean;
289
+ landing(flight: NavFlight, top: boolean, inside: number, out: number[]): number[];
290
+ stairTo(house: NavHouse, from: number, to: number): NavFlight | null;
291
+ heading(house: NavHouse, floor: number, x: number, z: number, tx: number, tz: number): boolean;
292
+ ray(house: NavHouse, floor: number, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, max: number): number;
293
+ ceilingOf(house: NavHouse, floor: number): number;
294
+ occlude(x: number, z: number, floor: number): NavHouse | null;
295
+ cell(house: NavHouse, floor: number, x: number, z: number): number;
296
+ apply(house: NavHouse, floor: number): void;
297
+ houseOf(id: string): NavHouse | null;
298
+ openCells(houseId: string, floor: number, shape: NavShape): number;
299
+ closeCells(houseId: string, floor: number, shape: NavShape): number;
300
+ undoChanges(houseId: string): void;
301
+ }
302
+
303
+ /** The parts of a built house (`create(THREE, options).build(...)`) the navigator reads. */
304
+ interface NavigableHouse {
305
+ name?: string;
306
+ r: {
307
+ floors: {
308
+ index: number;
309
+ y0: number;
310
+ ceiling: number;
311
+ }[];
312
+ };
313
+ colliders: {
314
+ type: string;
315
+ f: number;
316
+ x0: number;
317
+ z0: number;
318
+ x1: number;
319
+ z1: number;
320
+ }[];
321
+ stairs: {
322
+ m: {
323
+ ry: number;
324
+ };
325
+ f: number;
326
+ to: number;
327
+ rect: NavRect;
328
+ }[];
329
+ floors: unknown[];
330
+ roof: unknown;
331
+ }
332
+ interface NavigationDefOptions {
333
+ /** Id the house registers with (default: the house's name). */
334
+ id?: string;
335
+ /** Collider types that make a cell solid (default: walls and the boards of a barricade; the gaps of the doors stay free). */
336
+ solids?: string[];
337
+ /** The fine grid also rules the ground floor inside the house. */
338
+ own?: boolean;
339
+ }
340
+ /**
341
+ * 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
342
+ * 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
343
+ * by occlusion.
344
+ */
345
+ declare function navigationDefOf(house: NavigableHouse, options?: NavigationDefOptions): NavHouseDef;
346
+
347
+ /** The parts of a built house the binding reads: its structure (parts by id), its floors and its destruction adapter. */
348
+ interface DestructibleHouse {
349
+ r: {
350
+ floors: {
351
+ index: number;
352
+ y0: number;
353
+ }[];
354
+ };
355
+ structure: {
356
+ byId: Map<string, {
357
+ role: string;
358
+ floor: number;
359
+ aabb: NavRect;
360
+ y1: number;
361
+ }>;
362
+ };
363
+ destruction: {
364
+ onEvent(listener: (event: any) => void): () => void;
365
+ restore?: () => void;
366
+ };
367
+ }
368
+ interface NavigatorBinding {
369
+ /** Stops listening. */
370
+ off(): void;
371
+ /** Puts the grid back (after a world reset). */
372
+ reset(): void;
373
+ }
374
+ /**
375
+ * Connects a floor navigator to the destruction of a house, so the people walking in it follow what the world did to it:
376
+ * - a wall that reaches stage 2 opens the cells inside its opening (a circle on its floor);
377
+ * - a wall that fractures or collapses opens all the cells of its footprint;
378
+ * - a slab that supports a floor and fractures or collapses removes the cells of that floor under it (they become blocked).
379
+ * The house has to be registered in the navigator under `houseId` (`navigationDefOf`). Events arrive once the house's destruction is active.
380
+ * Returns the binding; `reset()` undoes the changes.
381
+ */
382
+ declare function bindNavigator(navigator: FloorNavigator, houseId: string, house: DestructibleHouse): NavigatorBinding;
383
+
384
+ type AreaText = {
385
+ group: string;
386
+ name: string;
387
+ controls: Record<'package' | 'template' | 'state' | 'seed' | 'quality' | 'lod' | 'houses' | 'budget' | 'floor_view' | 'hit', string>;
388
+ hints: Record<'template' | 'houses' | 'budget' | 'lod' | 'floor_view' | 'hit', string>;
389
+ actions: Record<'build' | 'enter' | 'up' | 'down' | 'door' | 'strike' | 'reset' | 'clear', string>;
390
+ options: {
391
+ quality: Record<string, string>;
392
+ lod: Record<string, string>;
393
+ floor_view: Record<string, string>;
394
+ hit: Record<string, string>;
395
+ state: Record<string, string>;
396
+ };
397
+ layers: Record<'roof' | 'lot' | 'night', string>;
398
+ metrics: Record<'houses' | 'parts' | 'standing' | 'broken' | 'holes' | 'draw_calls' | 'triangles' | 'lod' | 'floor' | 'doors_open' | 'target' | 'planned', string>;
399
+ sheet: {
400
+ kicker: string;
401
+ title: string;
402
+ template: string;
403
+ seed: string;
404
+ state: string;
405
+ floors: string;
406
+ size: string;
407
+ parts: string;
408
+ look: string;
409
+ none: string;
410
+ no_engine: string;
411
+ };
412
+ specimens: Record<string, string>;
413
+ scenarios: Record<string, string>;
414
+ steps: Record<'built' | 'no_engine' | 'entered' | 'floor' | 'no_floor' | 'door' | 'no_door' | 'strike' | 'no_aim' | 'cleared' | 'reset' | '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>;
415
+ };
416
+
417
+ /** What the room hands a scenario (`ScenarioContext` of game-test-room), narrowed to what these use. */
418
+ interface AreaContext {
419
+ room: any;
420
+ step(seconds: number): void;
421
+ expect(condition: boolean, label: string, data?: Record<string, unknown>): void;
422
+ }
423
+ type Vec3 = readonly [number, number, number];
424
+ /** Where the team's page lays its specimens (the arena has 14 m of half width). */
425
+ declare const SPECIMEN_AT: Vec3;
426
+ /**
427
+ * 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,
428
+ * 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
429
+ * passes when every check holds; the names of the checks are in `text.steps`.
430
+ */
431
+ declare function createHouseScenarios(text: AreaText, at?: Vec3): Array<ModuleScenario<AreaContext>>;
432
+
433
+ /** The part of the floorplan engine (`engine` of `@adatechnology/game-floorplan`, with the content packs the page registered) the test area reads. */
434
+ interface FloorplanEngineLike {
435
+ generate(template: string, options?: {
436
+ seed?: number;
437
+ state?: string;
438
+ }): any;
439
+ listTemplates(): Array<{
440
+ id: string;
441
+ name?: string;
442
+ floors?: number;
443
+ }>;
444
+ listStates(): string[];
445
+ translate?(namespace: any, key: string, locale?: string, vars?: Record<string, string | number>): string;
446
+ }
447
+ /** A pack of templates the bench lists together (residential, commercial, rural, post-apocalyptic). Ids the engine does not know are left out. */
448
+ interface TemplateGroup {
449
+ id: string;
450
+ /** Name by locale (`en`, `pt-BR`); the id when absent. */
451
+ name?: Record<string, string>;
452
+ templates: readonly string[];
453
+ }
454
+ /** A small house the area lays out for the structural scenarios: the structure spec of a template, drawn as boxes named by part (the team's HouseArea items). */
455
+ interface SpecimenDef {
456
+ /** Item id (`house_casa_portico`): the scenarios and the golden name them. */
457
+ id: string;
458
+ template: string;
459
+ seed?: number;
460
+ state?: string;
461
+ /** The bearing walls only close: a frame of pillars and beams carries the building. */
462
+ portico?: boolean;
463
+ /** Name by locale; the text of the area when absent. */
464
+ name?: Record<string, string>;
465
+ }
466
+ interface FloorplanTestOptions {
467
+ locale?: string;
468
+ /** The engine with the packs registered. Without it the module has no houses to build. */
469
+ engine?: FloorplanEngineLike;
470
+ /** The packs the bench lists, in order. Default: every template of the engine in one group. */
471
+ groups?: readonly TemplateGroup[];
472
+ /** The states the bench offers (`normal`, `fortified`, `abandoned`). Default: the engine's. */
473
+ states?: readonly string[];
474
+ /** The room's destruction world and renderer (`room.world`, `room.renderer`): the houses built here register in them, so every shot, blast and fire of the room reaches the walls. */
475
+ world?: any;
476
+ renderer?: any;
477
+ /** Passed to the house renderer: `fleet`, `reflector`, `interactives`, `vegetation`, `props`, `textures`... */
478
+ house?: Partial<HouseRendererOptions>;
479
+ /** Template and seed the bench starts with. */
480
+ template?: string;
481
+ seed?: number;
482
+ /** Specimens of the structural scenarios; default the five of the team's house area, those whose template the engine has. */
483
+ specimens?: readonly SpecimenDef[];
484
+ /** Half size of the room's arena (`createTestRoom({ arenaSize })`), 14 by default: where the houses are laid. */
485
+ arenaSize?: number;
486
+ /** Where the specimens stand for the scenarios (the team's page: `[-5, 0, -11]`). */
487
+ specimenAt?: readonly [number, number, number];
488
+ }
489
+
490
+ declare const FLOORPLAN_AREA_ID = "floorplan_area";
491
+ type Placed = {
492
+ house: any;
493
+ plan: any;
494
+ seed: number;
495
+ width: number;
496
+ depth: number;
497
+ };
498
+ /**
499
+ * 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
500
+ * 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
501
+ * 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
502
+ * 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.
503
+ * Everything that is a pack of content comes in by option: this package knows no game.
504
+ */
505
+ declare function createFloorplanTestModule(options?: FloorplanTestOptions): TestableModule<AreaContext> & {
506
+ readonly houses: readonly Placed[];
507
+ build(): void;
508
+ clear(): void;
509
+ groups(): readonly TemplateGroup[];
510
+ };
511
+
512
+ /**
513
+ * 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
514
+ * 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).
515
+ */
516
+ declare const DEFAULT_SPECIMENS: readonly SpecimenDef[];
517
+ /** 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. */
518
+ interface SpecimenSpec {
519
+ readonly spec: any;
520
+ readonly plan: any;
521
+ }
522
+ /**
523
+ * 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
524
+ * what makes the gas bottle explode. The spec is cached per three.js namespace and specimen; each call hands out a copy.
525
+ */
526
+ declare function specimenSpec(THREE: any, engine: FloorplanEngineLike, def: SpecimenDef, houseOptions?: Partial<HouseRendererOptions>): SpecimenSpec;
527
+ /**
528
+ * 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
529
+ * room binds each mesh to the part of the same name. The anchored terrain slab is left out (the room has a floor).
530
+ */
531
+ declare function buildSpecimenMeshes(THREE: any, spec: any): any;
532
+
533
+ export { type AreaContext, type BuildOptions, DEFAULT_SPECIMENS, type Damageable, type DestructibleHouse, FLOORPLAN_AREA_ID, type FloorNavigator, type FloorplanEngineLike, type FloorplanTestOptions, type House, type HouseRenderer, type HouseRendererOptions, type Messages, type NavFlight, type NavFloor, type NavHouse, type NavHouseDef, type NavRect, type NavResult, type NavShape, type NavStair, type NavigableHouse, type NavigationDefOptions, type NavigatorBinding, OPEN_ROOM_TYPES, SPECIMEN_AT, type SpecimenDef, type TemplateGroup, type Translate, VERSION, bindNavigator, buildSpecimenMeshes, create, createFloorNavigator, createFloorplanTestModule, create as createHouseRenderer, createHouseScenarios, createTranslator, en, isOpenArea, locales, navigationDefOf, planLod, ptBR, rectsOf, specimenSpec };