@pascal-app/core 0.8.0 → 0.9.1
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/events/bus.d.ts +39 -13
- package/dist/events/bus.d.ts.map +1 -1
- package/dist/hooks/scene-registry/scene-registry.d.ts +6 -22
- package/dist/hooks/scene-registry/scene-registry.d.ts.map +1 -1
- package/dist/hooks/scene-registry/scene-registry.js +33 -26
- package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts +14 -0
- package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -0
- package/dist/hooks/spatial-grid/floor-placed-elevation.js +51 -0
- package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts +2 -0
- package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts.map +1 -0
- package/dist/hooks/spatial-grid/floor-placed-elevation.test.js +273 -0
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +13 -2
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-manager.js +95 -9
- package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +28 -1
- package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-sync.js +91 -18
- package/dist/index.d.ts +22 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -2
- package/dist/lib/polygon-relations.d.ts +10 -0
- package/dist/lib/polygon-relations.d.ts.map +1 -0
- package/dist/lib/polygon-relations.js +73 -0
- package/dist/lib/space-detection-pause.test.d.ts +2 -0
- package/dist/lib/space-detection-pause.test.d.ts.map +1 -0
- package/dist/lib/space-detection-pause.test.js +42 -0
- package/dist/lib/space-detection.d.ts +30 -1
- package/dist/lib/space-detection.d.ts.map +1 -1
- package/dist/lib/space-detection.js +215 -36
- package/dist/lib/space-detection.test.d.ts +2 -0
- package/dist/lib/space-detection.test.d.ts.map +1 -0
- package/dist/lib/space-detection.test.js +77 -0
- package/dist/material-library.d.ts +1 -1
- package/dist/material-library.d.ts.map +1 -1
- package/dist/material-library.js +1940 -143
- package/dist/registry/__bench__/relations-resolver.bench.d.ts +15 -0
- package/dist/registry/__bench__/relations-resolver.bench.d.ts.map +1 -0
- package/dist/registry/__bench__/relations-resolver.bench.js +170 -0
- package/dist/registry/handles.d.ts +321 -0
- package/dist/registry/handles.d.ts.map +1 -0
- package/dist/registry/handles.js +24 -0
- package/dist/registry/index.d.ts +7 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +4 -0
- package/dist/registry/registry.d.ts +93 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +201 -0
- package/dist/registry/registry.test.d.ts +2 -0
- package/dist/registry/registry.test.d.ts.map +1 -0
- package/dist/registry/registry.test.js +183 -0
- package/dist/registry/relations-resolver.d.ts +42 -0
- package/dist/registry/relations-resolver.d.ts.map +1 -0
- package/dist/registry/relations-resolver.js +77 -0
- package/dist/registry/relations-resolver.test.d.ts +2 -0
- package/dist/registry/relations-resolver.test.d.ts.map +1 -0
- package/dist/registry/relations-resolver.test.js +183 -0
- package/dist/registry/scene-api.d.ts +44 -0
- package/dist/registry/scene-api.d.ts.map +1 -0
- package/dist/registry/scene-api.js +111 -0
- package/dist/registry/scene-api.test.d.ts +2 -0
- package/dist/registry/scene-api.test.d.ts.map +1 -0
- package/dist/registry/scene-api.test.js +183 -0
- package/dist/registry/subtree.d.ts +67 -0
- package/dist/registry/subtree.d.ts.map +1 -0
- package/dist/registry/subtree.js +119 -0
- package/dist/registry/subtree.test.d.ts +2 -0
- package/dist/registry/subtree.test.d.ts.map +1 -0
- package/dist/registry/subtree.test.js +133 -0
- package/dist/registry/types.d.ts +1420 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +1 -0
- package/dist/schema/index.d.ts +17 -2
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +17 -3
- package/dist/schema/material.d.ts +10 -0
- package/dist/schema/material.d.ts.map +1 -1
- package/dist/schema/material.js +10 -0
- package/dist/schema/nodes/box-vent.d.ts +74 -0
- package/dist/schema/nodes/box-vent.d.ts.map +1 -0
- package/dist/schema/nodes/box-vent.js +63 -0
- package/dist/schema/nodes/building.d.ts +1 -1
- package/dist/schema/nodes/building.d.ts.map +1 -1
- package/dist/schema/nodes/building.js +3 -2
- package/dist/schema/nodes/ceiling.d.ts +2 -0
- package/dist/schema/nodes/ceiling.d.ts.map +1 -1
- package/dist/schema/nodes/ceiling.js +1 -1
- package/dist/schema/nodes/chimney.d.ts +158 -0
- package/dist/schema/nodes/chimney.d.ts.map +1 -0
- package/dist/schema/nodes/chimney.js +67 -0
- package/dist/schema/nodes/column.d.ts +597 -5
- package/dist/schema/nodes/column.d.ts.map +1 -1
- package/dist/schema/nodes/column.js +586 -6
- package/dist/schema/nodes/cupola.d.ts +66 -0
- package/dist/schema/nodes/cupola.d.ts.map +1 -0
- package/dist/schema/nodes/cupola.js +28 -0
- package/dist/schema/nodes/dormer.d.ts +228 -0
- package/dist/schema/nodes/dormer.d.ts.map +1 -0
- package/dist/schema/nodes/dormer.js +119 -0
- package/dist/schema/nodes/downspout.d.ts +75 -0
- package/dist/schema/nodes/downspout.d.ts.map +1 -0
- package/dist/schema/nodes/downspout.js +63 -0
- package/dist/schema/nodes/elevator.d.ts +105 -0
- package/dist/schema/nodes/elevator.d.ts.map +1 -0
- package/dist/schema/nodes/elevator.js +54 -0
- package/dist/schema/nodes/eyebrow-vent.d.ts +68 -0
- package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -0
- package/dist/schema/nodes/eyebrow-vent.js +40 -0
- package/dist/schema/nodes/fence.d.ts +1 -0
- package/dist/schema/nodes/fence.d.ts.map +1 -1
- package/dist/schema/nodes/fence.js +2 -0
- package/dist/schema/nodes/gutter.d.ts +84 -0
- package/dist/schema/nodes/gutter.d.ts.map +1 -0
- package/dist/schema/nodes/gutter.js +76 -0
- package/dist/schema/nodes/item.d.ts +4 -0
- package/dist/schema/nodes/item.d.ts.map +1 -1
- package/dist/schema/nodes/item.js +9 -0
- package/dist/schema/nodes/level.d.ts +1 -1
- package/dist/schema/nodes/level.d.ts.map +1 -1
- package/dist/schema/nodes/level.js +2 -0
- package/dist/schema/nodes/ridge-vent.d.ts +67 -0
- package/dist/schema/nodes/ridge-vent.d.ts.map +1 -0
- package/dist/schema/nodes/ridge-vent.js +30 -0
- package/dist/schema/nodes/roof-segment.d.ts +195 -1
- package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
- package/dist/schema/nodes/roof-segment.js +254 -3
- package/dist/schema/nodes/roof.d.ts.map +1 -1
- package/dist/schema/nodes/roof.js +4 -16
- package/dist/schema/nodes/shelf.d.ts +105 -0
- package/dist/schema/nodes/shelf.d.ts.map +1 -0
- package/dist/schema/nodes/shelf.js +84 -0
- package/dist/schema/nodes/site.d.ts +1 -122
- package/dist/schema/nodes/site.d.ts.map +1 -1
- package/dist/schema/nodes/site.js +2 -6
- package/dist/schema/nodes/skylight.d.ts +279 -0
- package/dist/schema/nodes/skylight.d.ts.map +1 -0
- package/dist/schema/nodes/skylight.js +152 -0
- package/dist/schema/nodes/slab.d.ts +2 -0
- package/dist/schema/nodes/slab.d.ts.map +1 -1
- package/dist/schema/nodes/slab.js +1 -1
- package/dist/schema/nodes/solar-panel.d.ts +117 -0
- package/dist/schema/nodes/solar-panel.d.ts.map +1 -0
- package/dist/schema/nodes/solar-panel.js +47 -0
- package/dist/schema/nodes/surface-hole-metadata.d.ts +2 -0
- package/dist/schema/nodes/surface-hole-metadata.d.ts.map +1 -1
- package/dist/schema/nodes/surface-hole-metadata.js +3 -1
- package/dist/schema/nodes/turbine-vent.d.ts +68 -0
- package/dist/schema/nodes/turbine-vent.d.ts.map +1 -0
- package/dist/schema/nodes/turbine-vent.js +41 -0
- package/dist/schema/types.d.ts +1325 -125
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/types.js +26 -0
- package/dist/services/alignment-anchors.d.ts +100 -0
- package/dist/services/alignment-anchors.d.ts.map +1 -0
- package/dist/services/alignment-anchors.js +283 -0
- package/dist/services/alignment-anchors.test.d.ts +2 -0
- package/dist/services/alignment-anchors.test.d.ts.map +1 -0
- package/dist/services/alignment-anchors.test.js +383 -0
- package/dist/services/alignment.d.ts +126 -0
- package/dist/services/alignment.d.ts.map +1 -0
- package/dist/services/alignment.js +169 -0
- package/dist/services/alignment.test.d.ts +2 -0
- package/dist/services/alignment.test.d.ts.map +1 -0
- package/dist/services/alignment.test.js +92 -0
- package/dist/services/drag-session.d.ts +47 -0
- package/dist/services/drag-session.d.ts.map +1 -0
- package/dist/services/drag-session.js +100 -0
- package/dist/services/drag-session.test.d.ts +2 -0
- package/dist/services/drag-session.test.d.ts.map +1 -0
- package/dist/services/drag-session.test.js +219 -0
- package/dist/services/hosting.d.ts +80 -0
- package/dist/services/hosting.d.ts.map +1 -0
- package/dist/services/hosting.js +122 -0
- package/dist/services/hosting.test.d.ts +2 -0
- package/dist/services/hosting.test.d.ts.map +1 -0
- package/dist/services/hosting.test.js +199 -0
- package/dist/services/index.d.ts +7 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +6 -0
- package/dist/services/movement.d.ts +48 -0
- package/dist/services/movement.d.ts.map +1 -0
- package/dist/services/movement.js +65 -0
- package/dist/services/movement.test.d.ts +2 -0
- package/dist/services/movement.test.d.ts.map +1 -0
- package/dist/services/movement.test.js +133 -0
- package/dist/services/single-undo-dance.test.d.ts +2 -0
- package/dist/services/single-undo-dance.test.d.ts.map +1 -0
- package/dist/services/single-undo-dance.test.js +210 -0
- package/dist/services/snap.d.ts +72 -0
- package/dist/services/snap.d.ts.map +1 -0
- package/dist/services/snap.js +120 -0
- package/dist/services/snap.test.d.ts +2 -0
- package/dist/services/snap.test.d.ts.map +1 -0
- package/dist/services/snap.test.js +95 -0
- package/dist/solar-panel-presets.d.ts +17 -0
- package/dist/solar-panel-presets.d.ts.map +1 -0
- package/dist/solar-panel-presets.js +43 -0
- package/dist/store/actions/node-actions.d.ts +14 -2
- package/dist/store/actions/node-actions.d.ts.map +1 -1
- package/dist/store/actions/node-actions.js +492 -15
- package/dist/store/actions/node-mutation-sanitize.test.d.ts +2 -0
- package/dist/store/actions/node-mutation-sanitize.test.d.ts.map +1 -0
- package/dist/store/actions/node-mutation-sanitize.test.js +147 -0
- package/dist/store/actions/reparent.test.d.ts +2 -0
- package/dist/store/actions/reparent.test.d.ts.map +1 -0
- package/dist/store/actions/reparent.test.js +212 -0
- package/dist/store/use-interactive.d.ts +39 -0
- package/dist/store/use-interactive.d.ts.map +1 -1
- package/dist/store/use-interactive.js +75 -0
- package/dist/store/use-live-node-overrides.d.ts +22 -0
- package/dist/store/use-live-node-overrides.d.ts.map +1 -0
- package/dist/store/use-live-node-overrides.js +59 -0
- package/dist/store/use-scene-elevator-migration.test.d.ts +2 -0
- package/dist/store/use-scene-elevator-migration.test.d.ts.map +1 -0
- package/dist/store/use-scene-elevator-migration.test.js +109 -0
- package/dist/store/use-scene.d.ts +11 -0
- package/dist/store/use-scene.d.ts.map +1 -1
- package/dist/store/use-scene.js +196 -6
- package/dist/systems/elevator/elevator-dispatch.d.ts +12 -0
- package/dist/systems/elevator/elevator-dispatch.d.ts.map +1 -0
- package/dist/systems/elevator/elevator-dispatch.js +57 -0
- package/dist/systems/elevator/elevator-geometry.d.ts +15 -0
- package/dist/systems/elevator/elevator-geometry.d.ts.map +1 -0
- package/dist/systems/elevator/elevator-geometry.js +50 -0
- package/dist/systems/elevator/elevator-opening-sync.d.ts +6 -0
- package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -0
- package/dist/systems/elevator/elevator-opening-sync.js +218 -0
- package/dist/systems/elevator/elevator-opening-sync.test.d.ts +2 -0
- package/dist/systems/elevator/elevator-opening-sync.test.d.ts.map +1 -0
- package/dist/systems/elevator/elevator-opening-sync.test.js +146 -0
- package/dist/systems/elevator/elevator-opening-system.d.ts +2 -0
- package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -0
- package/dist/systems/elevator/elevator-opening-system.js +48 -0
- package/dist/systems/elevator/elevator-runtime-system.d.ts +2 -0
- package/dist/systems/elevator/elevator-runtime-system.d.ts.map +1 -0
- package/dist/systems/elevator/elevator-runtime-system.js +8 -0
- package/dist/systems/elevator/elevator-runtime.d.ts +18 -0
- package/dist/systems/elevator/elevator-runtime.d.ts.map +1 -0
- package/dist/systems/elevator/elevator-runtime.js +225 -0
- package/dist/systems/elevator/elevator-runtime.test.d.ts +2 -0
- package/dist/systems/elevator/elevator-runtime.test.d.ts.map +1 -0
- package/dist/systems/elevator/elevator-runtime.test.js +64 -0
- package/dist/systems/elevator/elevator-service.d.ts +19 -0
- package/dist/systems/elevator/elevator-service.d.ts.map +1 -0
- package/dist/systems/elevator/elevator-service.js +111 -0
- package/dist/systems/stair/stair-footprint.d.ts +44 -0
- package/dist/systems/stair/stair-footprint.d.ts.map +1 -0
- package/dist/systems/stair/stair-footprint.js +168 -0
- package/dist/systems/stair/stair-opening-preview.d.ts +1777 -0
- package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -0
- package/dist/systems/stair/stair-opening-preview.js +93 -0
- package/dist/systems/stair/stair-opening-preview.test.d.ts +2 -0
- package/dist/systems/stair/stair-opening-preview.test.d.ts.map +1 -0
- package/dist/systems/stair/stair-opening-preview.test.js +80 -0
- package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-sync.js +172 -147
- package/dist/systems/stair/stair-opening-sync.test.js +385 -2
- package/dist/systems/stair/stair-opening-system.d.ts +2 -0
- package/dist/systems/stair/stair-opening-system.d.ts.map +1 -0
- package/dist/systems/stair/stair-opening-system.js +104 -0
- package/dist/systems/wall/wall-move.d.ts +48 -0
- package/dist/systems/wall/wall-move.d.ts.map +1 -0
- package/dist/systems/wall/wall-move.js +193 -0
- package/dist/utils/clone-scene-graph.d.ts +6 -4
- package/dist/utils/clone-scene-graph.d.ts.map +1 -1
- package/dist/utils/clone-scene-graph.js +6 -4
- package/dist/utils/clone-scene-graph.test.d.ts +2 -0
- package/dist/utils/clone-scene-graph.test.d.ts.map +1 -0
- package/dist/utils/clone-scene-graph.test.js +59 -0
- package/dist/validation/validate-build-json.d.ts +43 -0
- package/dist/validation/validate-build-json.d.ts.map +1 -0
- package/dist/validation/validate-build-json.js +227 -0
- package/package.json +9 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cupola.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/cupola.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6BtB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import dedent from 'dedent';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { BaseNode, nodeType, objectId } from '../base';
|
|
4
|
+
import { MaterialSchema } from '../material';
|
|
5
|
+
export const CupolaNode = BaseNode.extend({
|
|
6
|
+
id: objectId('cupola'),
|
|
7
|
+
type: nodeType('cupola'),
|
|
8
|
+
material: MaterialSchema.optional(),
|
|
9
|
+
// Default to the white preset so a freshly-placed cupola reads as clean
|
|
10
|
+
// painted metal and the paint inspector shows "White" (matches box-vent).
|
|
11
|
+
materialPreset: z.string().default('preset-white'),
|
|
12
|
+
roofSegmentId: z.string().optional(),
|
|
13
|
+
position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
|
|
14
|
+
rotation: z.number().default(0),
|
|
15
|
+
// Cupolas are larger than the other vents — a roof lantern, not a cap.
|
|
16
|
+
width: z.number().default(0.8),
|
|
17
|
+
depth: z.number().default(0.8),
|
|
18
|
+
height: z.number().default(1.0),
|
|
19
|
+
// Roof cap shape: `dome` (round) or `pyramid` (four-sided point).
|
|
20
|
+
roofStyle: z.enum(['dome', 'pyramid']).default('dome'),
|
|
21
|
+
// Decorative post + ball at the apex.
|
|
22
|
+
finial: z.boolean().default(true),
|
|
23
|
+
}).describe(dedent `
|
|
24
|
+
Cupola — a louvered roof lantern that sits astride a roof ridge or slope:
|
|
25
|
+
a louvered body topped by a dome or pyramid roof, optionally crowned with
|
|
26
|
+
a finial. Parented to a roof-segment; position is segment-local. Rotation
|
|
27
|
+
is around the segment's vertical axis (post-slope tilt).
|
|
28
|
+
`);
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { MaterialSchema } from '../material';
|
|
3
|
+
export type DormerSurfaceMaterialRole = 'top' | 'side' | 'wall';
|
|
4
|
+
export type DormerSurfaceMaterialSpec = {
|
|
5
|
+
material?: z.infer<typeof MaterialSchema>;
|
|
6
|
+
materialPreset?: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Default dormer dimensions and window controls. Values match the
|
|
10
|
+
* legacy archive so existing scenes don't shift visually.
|
|
11
|
+
*/
|
|
12
|
+
export declare const DORMER_DEFAULTS: {
|
|
13
|
+
readonly WIDTH: 1.21;
|
|
14
|
+
readonly DEPTH: 1.55;
|
|
15
|
+
readonly WALL_HEIGHT: 0;
|
|
16
|
+
readonly ROOF_HEIGHT: 0.49;
|
|
17
|
+
readonly WALL_SKIRT_HEIGHT: 2.73;
|
|
18
|
+
readonly WINDOW_WIDTH: 0.76;
|
|
19
|
+
readonly WINDOW_HEIGHT: 0.68;
|
|
20
|
+
readonly WINDOW_OFFSET_X: 0.02;
|
|
21
|
+
readonly WINDOW_OFFSET_Y: 0.99;
|
|
22
|
+
readonly WINDOW_FRAME_THICKNESS: 0.05;
|
|
23
|
+
readonly WINDOW_FRAME_DEPTH: 0.06;
|
|
24
|
+
readonly WINDOW_COLUMNS: 3;
|
|
25
|
+
readonly WINDOW_ROWS: 3;
|
|
26
|
+
readonly WINDOW_DIVIDER_THICKNESS: 0.02;
|
|
27
|
+
readonly WINDOW_ARCH_HEIGHT: 0.35;
|
|
28
|
+
readonly WINDOW_CORNER_RADIUS: 0.15;
|
|
29
|
+
readonly WINDOW_SILL_DEPTH: 0.08;
|
|
30
|
+
readonly WINDOW_SILL_THICKNESS: 0.03;
|
|
31
|
+
};
|
|
32
|
+
export declare const DormerNode: z.ZodObject<{
|
|
33
|
+
object: z.ZodDefault<z.ZodLiteral<"node">>;
|
|
34
|
+
name: z.ZodOptional<z.ZodString>;
|
|
35
|
+
parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
36
|
+
visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
37
|
+
camera: z.ZodOptional<z.ZodObject<{
|
|
38
|
+
position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
|
|
39
|
+
target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
|
|
40
|
+
mode: z.ZodDefault<z.ZodEnum<{
|
|
41
|
+
perspective: "perspective";
|
|
42
|
+
orthographic: "orthographic";
|
|
43
|
+
}>>;
|
|
44
|
+
fov: z.ZodOptional<z.ZodNumber>;
|
|
45
|
+
zoom: z.ZodOptional<z.ZodNumber>;
|
|
46
|
+
}, z.core.$strip>>;
|
|
47
|
+
metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
|
|
48
|
+
id: z.ZodDefault<z.ZodTemplateLiteral<`dormer_${string}`>>;
|
|
49
|
+
type: z.ZodDefault<z.ZodLiteral<"dormer">>;
|
|
50
|
+
material: z.ZodOptional<z.ZodObject<{
|
|
51
|
+
id: z.ZodOptional<z.ZodString>;
|
|
52
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
53
|
+
custom: "custom";
|
|
54
|
+
white: "white";
|
|
55
|
+
brick: "brick";
|
|
56
|
+
concrete: "concrete";
|
|
57
|
+
wood: "wood";
|
|
58
|
+
glass: "glass";
|
|
59
|
+
metal: "metal";
|
|
60
|
+
plaster: "plaster";
|
|
61
|
+
tile: "tile";
|
|
62
|
+
marble: "marble";
|
|
63
|
+
}>>;
|
|
64
|
+
properties: z.ZodOptional<z.ZodObject<{
|
|
65
|
+
color: z.ZodDefault<z.ZodString>;
|
|
66
|
+
roughness: z.ZodDefault<z.ZodNumber>;
|
|
67
|
+
metalness: z.ZodDefault<z.ZodNumber>;
|
|
68
|
+
opacity: z.ZodDefault<z.ZodNumber>;
|
|
69
|
+
transparent: z.ZodDefault<z.ZodBoolean>;
|
|
70
|
+
side: z.ZodDefault<z.ZodEnum<{
|
|
71
|
+
front: "front";
|
|
72
|
+
back: "back";
|
|
73
|
+
double: "double";
|
|
74
|
+
}>>;
|
|
75
|
+
}, z.core.$strip>>;
|
|
76
|
+
texture: z.ZodOptional<z.ZodObject<{
|
|
77
|
+
url: z.ZodString;
|
|
78
|
+
repeat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
|
|
79
|
+
scale: z.ZodOptional<z.ZodNumber>;
|
|
80
|
+
}, z.core.$strip>>;
|
|
81
|
+
}, z.core.$strip>>;
|
|
82
|
+
materialPreset: z.ZodOptional<z.ZodString>;
|
|
83
|
+
topMaterial: z.ZodOptional<z.ZodObject<{
|
|
84
|
+
id: z.ZodOptional<z.ZodString>;
|
|
85
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
86
|
+
custom: "custom";
|
|
87
|
+
white: "white";
|
|
88
|
+
brick: "brick";
|
|
89
|
+
concrete: "concrete";
|
|
90
|
+
wood: "wood";
|
|
91
|
+
glass: "glass";
|
|
92
|
+
metal: "metal";
|
|
93
|
+
plaster: "plaster";
|
|
94
|
+
tile: "tile";
|
|
95
|
+
marble: "marble";
|
|
96
|
+
}>>;
|
|
97
|
+
properties: z.ZodOptional<z.ZodObject<{
|
|
98
|
+
color: z.ZodDefault<z.ZodString>;
|
|
99
|
+
roughness: z.ZodDefault<z.ZodNumber>;
|
|
100
|
+
metalness: z.ZodDefault<z.ZodNumber>;
|
|
101
|
+
opacity: z.ZodDefault<z.ZodNumber>;
|
|
102
|
+
transparent: z.ZodDefault<z.ZodBoolean>;
|
|
103
|
+
side: z.ZodDefault<z.ZodEnum<{
|
|
104
|
+
front: "front";
|
|
105
|
+
back: "back";
|
|
106
|
+
double: "double";
|
|
107
|
+
}>>;
|
|
108
|
+
}, z.core.$strip>>;
|
|
109
|
+
texture: z.ZodOptional<z.ZodObject<{
|
|
110
|
+
url: z.ZodString;
|
|
111
|
+
repeat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
|
|
112
|
+
scale: z.ZodOptional<z.ZodNumber>;
|
|
113
|
+
}, z.core.$strip>>;
|
|
114
|
+
}, z.core.$strip>>;
|
|
115
|
+
topMaterialPreset: z.ZodOptional<z.ZodString>;
|
|
116
|
+
sideMaterial: z.ZodOptional<z.ZodObject<{
|
|
117
|
+
id: z.ZodOptional<z.ZodString>;
|
|
118
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
119
|
+
custom: "custom";
|
|
120
|
+
white: "white";
|
|
121
|
+
brick: "brick";
|
|
122
|
+
concrete: "concrete";
|
|
123
|
+
wood: "wood";
|
|
124
|
+
glass: "glass";
|
|
125
|
+
metal: "metal";
|
|
126
|
+
plaster: "plaster";
|
|
127
|
+
tile: "tile";
|
|
128
|
+
marble: "marble";
|
|
129
|
+
}>>;
|
|
130
|
+
properties: z.ZodOptional<z.ZodObject<{
|
|
131
|
+
color: z.ZodDefault<z.ZodString>;
|
|
132
|
+
roughness: z.ZodDefault<z.ZodNumber>;
|
|
133
|
+
metalness: z.ZodDefault<z.ZodNumber>;
|
|
134
|
+
opacity: z.ZodDefault<z.ZodNumber>;
|
|
135
|
+
transparent: z.ZodDefault<z.ZodBoolean>;
|
|
136
|
+
side: z.ZodDefault<z.ZodEnum<{
|
|
137
|
+
front: "front";
|
|
138
|
+
back: "back";
|
|
139
|
+
double: "double";
|
|
140
|
+
}>>;
|
|
141
|
+
}, z.core.$strip>>;
|
|
142
|
+
texture: z.ZodOptional<z.ZodObject<{
|
|
143
|
+
url: z.ZodString;
|
|
144
|
+
repeat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
|
|
145
|
+
scale: z.ZodOptional<z.ZodNumber>;
|
|
146
|
+
}, z.core.$strip>>;
|
|
147
|
+
}, z.core.$strip>>;
|
|
148
|
+
sideMaterialPreset: z.ZodOptional<z.ZodString>;
|
|
149
|
+
wallMaterial: z.ZodOptional<z.ZodObject<{
|
|
150
|
+
id: z.ZodOptional<z.ZodString>;
|
|
151
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
152
|
+
custom: "custom";
|
|
153
|
+
white: "white";
|
|
154
|
+
brick: "brick";
|
|
155
|
+
concrete: "concrete";
|
|
156
|
+
wood: "wood";
|
|
157
|
+
glass: "glass";
|
|
158
|
+
metal: "metal";
|
|
159
|
+
plaster: "plaster";
|
|
160
|
+
tile: "tile";
|
|
161
|
+
marble: "marble";
|
|
162
|
+
}>>;
|
|
163
|
+
properties: z.ZodOptional<z.ZodObject<{
|
|
164
|
+
color: z.ZodDefault<z.ZodString>;
|
|
165
|
+
roughness: z.ZodDefault<z.ZodNumber>;
|
|
166
|
+
metalness: z.ZodDefault<z.ZodNumber>;
|
|
167
|
+
opacity: z.ZodDefault<z.ZodNumber>;
|
|
168
|
+
transparent: z.ZodDefault<z.ZodBoolean>;
|
|
169
|
+
side: z.ZodDefault<z.ZodEnum<{
|
|
170
|
+
front: "front";
|
|
171
|
+
back: "back";
|
|
172
|
+
double: "double";
|
|
173
|
+
}>>;
|
|
174
|
+
}, z.core.$strip>>;
|
|
175
|
+
texture: z.ZodOptional<z.ZodObject<{
|
|
176
|
+
url: z.ZodString;
|
|
177
|
+
repeat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
|
|
178
|
+
scale: z.ZodOptional<z.ZodNumber>;
|
|
179
|
+
}, z.core.$strip>>;
|
|
180
|
+
}, z.core.$strip>>;
|
|
181
|
+
wallMaterialPreset: z.ZodOptional<z.ZodString>;
|
|
182
|
+
roofSegmentId: z.ZodOptional<z.ZodString>;
|
|
183
|
+
position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
|
|
184
|
+
rotation: z.ZodDefault<z.ZodNumber>;
|
|
185
|
+
width: z.ZodDefault<z.ZodNumber>;
|
|
186
|
+
depth: z.ZodDefault<z.ZodNumber>;
|
|
187
|
+
height: z.ZodDefault<z.ZodNumber>;
|
|
188
|
+
roofType: z.ZodDefault<z.ZodEnum<{
|
|
189
|
+
flat: "flat";
|
|
190
|
+
hip: "hip";
|
|
191
|
+
gable: "gable";
|
|
192
|
+
shed: "shed";
|
|
193
|
+
gambrel: "gambrel";
|
|
194
|
+
dutch: "dutch";
|
|
195
|
+
mansard: "mansard";
|
|
196
|
+
}>>;
|
|
197
|
+
roofHeight: z.ZodDefault<z.ZodNumber>;
|
|
198
|
+
wallSkirtHeight: z.ZodDefault<z.ZodNumber>;
|
|
199
|
+
windowWidth: z.ZodDefault<z.ZodNumber>;
|
|
200
|
+
windowHeight: z.ZodDefault<z.ZodNumber>;
|
|
201
|
+
windowOffsetX: z.ZodDefault<z.ZodNumber>;
|
|
202
|
+
windowOffsetY: z.ZodDefault<z.ZodNumber>;
|
|
203
|
+
windowFrameThickness: z.ZodDefault<z.ZodNumber>;
|
|
204
|
+
windowFrameDepth: z.ZodDefault<z.ZodNumber>;
|
|
205
|
+
windowColumns: z.ZodDefault<z.ZodNumber>;
|
|
206
|
+
windowRows: z.ZodDefault<z.ZodNumber>;
|
|
207
|
+
windowDividerThickness: z.ZodDefault<z.ZodNumber>;
|
|
208
|
+
windowShape: z.ZodDefault<z.ZodEnum<{
|
|
209
|
+
rectangle: "rectangle";
|
|
210
|
+
rounded: "rounded";
|
|
211
|
+
arch: "arch";
|
|
212
|
+
}>>;
|
|
213
|
+
windowArchHeight: z.ZodDefault<z.ZodNumber>;
|
|
214
|
+
windowCornerRadii: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
|
|
215
|
+
windowSill: z.ZodDefault<z.ZodBoolean>;
|
|
216
|
+
windowSillDepth: z.ZodDefault<z.ZodNumber>;
|
|
217
|
+
windowSillThickness: z.ZodDefault<z.ZodNumber>;
|
|
218
|
+
}, z.core.$strip>;
|
|
219
|
+
export type DormerNode = z.infer<typeof DormerNode>;
|
|
220
|
+
/**
|
|
221
|
+
* Per-surface material resolution. Fall-through order:
|
|
222
|
+
* top → topMaterial[Preset] → legacy
|
|
223
|
+
* side → sideMaterial[Preset] → wallMaterial[Preset] → legacy
|
|
224
|
+
* wall → wallMaterial[Preset] → sideMaterial[Preset] → legacy
|
|
225
|
+
* where legacy is `node.material` / `node.materialPreset`.
|
|
226
|
+
*/
|
|
227
|
+
export declare function getEffectiveDormerSurfaceMaterial(node: DormerNode, role: DormerSurfaceMaterialRole): DormerSurfaceMaterialSpec;
|
|
228
|
+
//# sourceMappingURL=dormer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dormer.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/dormer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAG5C,MAAM,MAAM,yBAAyB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAC/D,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;IACzC,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;CAmBlB,CAAA;AASV,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4DtB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,yBAAyB,GAC9B,yBAAyB,CAuB3B"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import dedent from 'dedent';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { BaseNode, nodeType, objectId } from '../base';
|
|
4
|
+
import { MaterialSchema } from '../material';
|
|
5
|
+
import { RoofType } from './roof-segment';
|
|
6
|
+
/**
|
|
7
|
+
* Default dormer dimensions and window controls. Values match the
|
|
8
|
+
* legacy archive so existing scenes don't shift visually.
|
|
9
|
+
*/
|
|
10
|
+
export const DORMER_DEFAULTS = {
|
|
11
|
+
WIDTH: 1.21,
|
|
12
|
+
DEPTH: 1.55,
|
|
13
|
+
WALL_HEIGHT: 0,
|
|
14
|
+
ROOF_HEIGHT: 0.49,
|
|
15
|
+
WALL_SKIRT_HEIGHT: 2.73,
|
|
16
|
+
WINDOW_WIDTH: 0.76,
|
|
17
|
+
WINDOW_HEIGHT: 0.68,
|
|
18
|
+
WINDOW_OFFSET_X: 0.02,
|
|
19
|
+
WINDOW_OFFSET_Y: 0.99,
|
|
20
|
+
WINDOW_FRAME_THICKNESS: 0.05,
|
|
21
|
+
WINDOW_FRAME_DEPTH: 0.06,
|
|
22
|
+
WINDOW_COLUMNS: 3,
|
|
23
|
+
WINDOW_ROWS: 3,
|
|
24
|
+
WINDOW_DIVIDER_THICKNESS: 0.02,
|
|
25
|
+
WINDOW_ARCH_HEIGHT: 0.35,
|
|
26
|
+
WINDOW_CORNER_RADIUS: 0.15,
|
|
27
|
+
WINDOW_SILL_DEPTH: 0.08,
|
|
28
|
+
WINDOW_SILL_THICKNESS: 0.03,
|
|
29
|
+
};
|
|
30
|
+
const DEFAULT_CORNER_RADII = [
|
|
31
|
+
DORMER_DEFAULTS.WINDOW_CORNER_RADIUS,
|
|
32
|
+
DORMER_DEFAULTS.WINDOW_CORNER_RADIUS,
|
|
33
|
+
DORMER_DEFAULTS.WINDOW_CORNER_RADIUS,
|
|
34
|
+
DORMER_DEFAULTS.WINDOW_CORNER_RADIUS,
|
|
35
|
+
];
|
|
36
|
+
export const DormerNode = BaseNode.extend({
|
|
37
|
+
id: objectId('dormer'),
|
|
38
|
+
type: nodeType('dormer'),
|
|
39
|
+
material: MaterialSchema.optional(),
|
|
40
|
+
materialPreset: z.string().optional(),
|
|
41
|
+
topMaterial: MaterialSchema.optional(),
|
|
42
|
+
topMaterialPreset: z.string().optional(),
|
|
43
|
+
sideMaterial: MaterialSchema.optional(),
|
|
44
|
+
sideMaterialPreset: z.string().optional(),
|
|
45
|
+
wallMaterial: MaterialSchema.optional(),
|
|
46
|
+
wallMaterialPreset: z.string().optional(),
|
|
47
|
+
roofSegmentId: z.string().optional(),
|
|
48
|
+
position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
|
|
49
|
+
rotation: z.number().default(0),
|
|
50
|
+
width: z.number().default(DORMER_DEFAULTS.WIDTH),
|
|
51
|
+
depth: z.number().default(DORMER_DEFAULTS.DEPTH),
|
|
52
|
+
height: z.number().default(DORMER_DEFAULTS.WALL_HEIGHT),
|
|
53
|
+
roofType: RoofType.default('gable'),
|
|
54
|
+
roofHeight: z.number().default(DORMER_DEFAULTS.ROOF_HEIGHT),
|
|
55
|
+
// Height of the hung wall (the "skirt") that extends below the eave
|
|
56
|
+
// into the host roof — this is the wall area the window opening is
|
|
57
|
+
// cut through. Larger values let the dormer host taller windows.
|
|
58
|
+
wallSkirtHeight: z.number().default(DORMER_DEFAULTS.WALL_SKIRT_HEIGHT),
|
|
59
|
+
// Window is rendered as parametric geometry on the dormer's front
|
|
60
|
+
// face — not a child node. The fields below mirror the legacy panel
|
|
61
|
+
// controls; geometry beyond the simple opening box is deferred.
|
|
62
|
+
windowWidth: z.number().default(DORMER_DEFAULTS.WINDOW_WIDTH),
|
|
63
|
+
windowHeight: z.number().default(DORMER_DEFAULTS.WINDOW_HEIGHT),
|
|
64
|
+
windowOffsetX: z.number().default(DORMER_DEFAULTS.WINDOW_OFFSET_X),
|
|
65
|
+
windowOffsetY: z.number().default(DORMER_DEFAULTS.WINDOW_OFFSET_Y),
|
|
66
|
+
windowFrameThickness: z.number().default(DORMER_DEFAULTS.WINDOW_FRAME_THICKNESS),
|
|
67
|
+
windowFrameDepth: z.number().default(DORMER_DEFAULTS.WINDOW_FRAME_DEPTH),
|
|
68
|
+
windowColumns: z.number().int().min(1).max(8).default(DORMER_DEFAULTS.WINDOW_COLUMNS),
|
|
69
|
+
windowRows: z.number().int().min(1).max(8).default(DORMER_DEFAULTS.WINDOW_ROWS),
|
|
70
|
+
windowDividerThickness: z.number().default(DORMER_DEFAULTS.WINDOW_DIVIDER_THICKNESS),
|
|
71
|
+
windowShape: z.enum(['rectangle', 'rounded', 'arch']).default('rectangle'),
|
|
72
|
+
windowArchHeight: z.number().default(DORMER_DEFAULTS.WINDOW_ARCH_HEIGHT),
|
|
73
|
+
// Single source of truth for the rounded-shape corner radii. Tuple is
|
|
74
|
+
// [topLeft, topRight, bottomRight, bottomLeft]. "All vs Individual"
|
|
75
|
+
// is a UI-only view mode derived from whether the tuple is uniform.
|
|
76
|
+
windowCornerRadii: z
|
|
77
|
+
.tuple([z.number(), z.number(), z.number(), z.number()])
|
|
78
|
+
.default(DEFAULT_CORNER_RADII),
|
|
79
|
+
windowSill: z.boolean().default(true),
|
|
80
|
+
windowSillDepth: z.number().default(DORMER_DEFAULTS.WINDOW_SILL_DEPTH),
|
|
81
|
+
windowSillThickness: z.number().default(DORMER_DEFAULTS.WINDOW_SILL_THICKNESS),
|
|
82
|
+
}).describe(dedent `
|
|
83
|
+
Dormer — a small house-shaped protrusion sitting on top of a roof
|
|
84
|
+
segment. width × depth × height defines the box base; roofType and
|
|
85
|
+
roofHeight define the dormer's own roof shape. The window opening
|
|
86
|
+
is parametric geometry on the dormer's front face, not a hosted
|
|
87
|
+
child node.
|
|
88
|
+
`);
|
|
89
|
+
/**
|
|
90
|
+
* Per-surface material resolution. Fall-through order:
|
|
91
|
+
* top → topMaterial[Preset] → legacy
|
|
92
|
+
* side → sideMaterial[Preset] → wallMaterial[Preset] → legacy
|
|
93
|
+
* wall → wallMaterial[Preset] → sideMaterial[Preset] → legacy
|
|
94
|
+
* where legacy is `node.material` / `node.materialPreset`.
|
|
95
|
+
*/
|
|
96
|
+
export function getEffectiveDormerSurfaceMaterial(node, role) {
|
|
97
|
+
const top = {
|
|
98
|
+
material: node.topMaterial,
|
|
99
|
+
materialPreset: node.topMaterialPreset,
|
|
100
|
+
};
|
|
101
|
+
const side = {
|
|
102
|
+
material: node.sideMaterial,
|
|
103
|
+
materialPreset: node.sideMaterialPreset,
|
|
104
|
+
};
|
|
105
|
+
const wall = {
|
|
106
|
+
material: node.wallMaterial,
|
|
107
|
+
materialPreset: node.wallMaterialPreset,
|
|
108
|
+
};
|
|
109
|
+
const legacy = {
|
|
110
|
+
material: node.material,
|
|
111
|
+
materialPreset: node.materialPreset,
|
|
112
|
+
};
|
|
113
|
+
const has = (spec) => spec.material !== undefined || typeof spec.materialPreset === 'string';
|
|
114
|
+
if (role === 'top')
|
|
115
|
+
return has(top) ? top : legacy;
|
|
116
|
+
if (role === 'side')
|
|
117
|
+
return has(side) ? side : has(wall) ? wall : legacy;
|
|
118
|
+
return has(wall) ? wall : has(side) ? side : legacy;
|
|
119
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const DownspoutNode: z.ZodObject<{
|
|
3
|
+
object: z.ZodDefault<z.ZodLiteral<"node">>;
|
|
4
|
+
name: z.ZodOptional<z.ZodString>;
|
|
5
|
+
parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
6
|
+
visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
7
|
+
camera: z.ZodOptional<z.ZodObject<{
|
|
8
|
+
position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
|
|
9
|
+
target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
|
|
10
|
+
mode: z.ZodDefault<z.ZodEnum<{
|
|
11
|
+
perspective: "perspective";
|
|
12
|
+
orthographic: "orthographic";
|
|
13
|
+
}>>;
|
|
14
|
+
fov: z.ZodOptional<z.ZodNumber>;
|
|
15
|
+
zoom: z.ZodOptional<z.ZodNumber>;
|
|
16
|
+
}, z.core.$strip>>;
|
|
17
|
+
metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
|
|
18
|
+
id: z.ZodDefault<z.ZodTemplateLiteral<`downspout_${string}`>>;
|
|
19
|
+
type: z.ZodDefault<z.ZodLiteral<"downspout">>;
|
|
20
|
+
material: z.ZodOptional<z.ZodObject<{
|
|
21
|
+
id: z.ZodOptional<z.ZodString>;
|
|
22
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
23
|
+
custom: "custom";
|
|
24
|
+
white: "white";
|
|
25
|
+
brick: "brick";
|
|
26
|
+
concrete: "concrete";
|
|
27
|
+
wood: "wood";
|
|
28
|
+
glass: "glass";
|
|
29
|
+
metal: "metal";
|
|
30
|
+
plaster: "plaster";
|
|
31
|
+
tile: "tile";
|
|
32
|
+
marble: "marble";
|
|
33
|
+
}>>;
|
|
34
|
+
properties: z.ZodOptional<z.ZodObject<{
|
|
35
|
+
color: z.ZodDefault<z.ZodString>;
|
|
36
|
+
roughness: z.ZodDefault<z.ZodNumber>;
|
|
37
|
+
metalness: z.ZodDefault<z.ZodNumber>;
|
|
38
|
+
opacity: z.ZodDefault<z.ZodNumber>;
|
|
39
|
+
transparent: z.ZodDefault<z.ZodBoolean>;
|
|
40
|
+
side: z.ZodDefault<z.ZodEnum<{
|
|
41
|
+
front: "front";
|
|
42
|
+
back: "back";
|
|
43
|
+
double: "double";
|
|
44
|
+
}>>;
|
|
45
|
+
}, z.core.$strip>>;
|
|
46
|
+
texture: z.ZodOptional<z.ZodObject<{
|
|
47
|
+
url: z.ZodString;
|
|
48
|
+
repeat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
|
|
49
|
+
scale: z.ZodOptional<z.ZodNumber>;
|
|
50
|
+
}, z.core.$strip>>;
|
|
51
|
+
}, z.core.$strip>>;
|
|
52
|
+
materialPreset: z.ZodDefault<z.ZodString>;
|
|
53
|
+
gutterId: z.ZodOptional<z.ZodString>;
|
|
54
|
+
outletId: z.ZodOptional<z.ZodString>;
|
|
55
|
+
length: z.ZodDefault<z.ZodNumber>;
|
|
56
|
+
diameter: z.ZodDefault<z.ZodNumber>;
|
|
57
|
+
standoff: z.ZodDefault<z.ZodNumber>;
|
|
58
|
+
shape: z.ZodDefault<z.ZodEnum<{
|
|
59
|
+
round: "round";
|
|
60
|
+
auto: "auto";
|
|
61
|
+
rect: "rect";
|
|
62
|
+
}>>;
|
|
63
|
+
strapStyle: z.ZodDefault<z.ZodEnum<{
|
|
64
|
+
none: "none";
|
|
65
|
+
band: "band";
|
|
66
|
+
}>>;
|
|
67
|
+
strapSpacing: z.ZodDefault<z.ZodNumber>;
|
|
68
|
+
terminal: z.ZodDefault<z.ZodEnum<{
|
|
69
|
+
straight: "straight";
|
|
70
|
+
splash: "splash";
|
|
71
|
+
kickout: "kickout";
|
|
72
|
+
}>>;
|
|
73
|
+
}, z.core.$strip>;
|
|
74
|
+
export type DownspoutNode = z.infer<typeof DownspoutNode>;
|
|
75
|
+
//# sourceMappingURL=downspout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downspout.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/downspout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkEzB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import dedent from 'dedent';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { BaseNode, nodeType, objectId } from '../base';
|
|
4
|
+
import { MaterialSchema } from '../material';
|
|
5
|
+
export const DownspoutNode = BaseNode.extend({
|
|
6
|
+
id: objectId('downspout'),
|
|
7
|
+
type: nodeType('downspout'),
|
|
8
|
+
material: MaterialSchema.optional(),
|
|
9
|
+
// Match the gutter family default — paint inspector reads "White"
|
|
10
|
+
// instead of "no material" on a freshly placed downspout.
|
|
11
|
+
materialPreset: z.string().default('preset-white'),
|
|
12
|
+
// Logical attachment: the gutter this downspout drains. Scene-graph
|
|
13
|
+
// parent is the same roof-segment that hosts the gutter, so the
|
|
14
|
+
// renderer can be reached through the segment's children list (like
|
|
15
|
+
// every other roof accessory). gutterId then drives the LOOKUP of
|
|
16
|
+
// outlet X/Z/diameter — the downspout's actual mount position is
|
|
17
|
+
// derived from the gutter, not stored.
|
|
18
|
+
gutterId: z.string().optional(),
|
|
19
|
+
// Which of the host gutter's `outlets` this downspout drains, by the
|
|
20
|
+
// outlet's `id`. The mount position, bore, and cross-section shape are
|
|
21
|
+
// looked up from that outlet — so several downspouts on one gutter no
|
|
22
|
+
// longer stack on a single drop.
|
|
23
|
+
outletId: z.string().optional(),
|
|
24
|
+
// Length the pipe extends DOWN from the gutter outlet, in metres.
|
|
25
|
+
// Default 2.5 m covers a typical residential storey; the placement
|
|
26
|
+
// tool can default to the gutter's eave-Y minus building floor on
|
|
27
|
+
// commit so the user doesn't have to set it on every drop.
|
|
28
|
+
length: z.number().default(2.5),
|
|
29
|
+
// Bore diameter, default 0.07 m ≈ 3″ to match the gutter outlet
|
|
30
|
+
// default. Larger downspouts are common on commercial gutters.
|
|
31
|
+
diameter: z.number().default(0.07),
|
|
32
|
+
// Gap between the pipe's wall-facing surface and the wall face, in
|
|
33
|
+
// metres. The downspout's offset elbows step it back from the eave
|
|
34
|
+
// overhang to the wall; this controls how far proud of the wall it
|
|
35
|
+
// sits (real downspouts mount on standoff brackets ~1–2 cm off the
|
|
36
|
+
// wall). Larger values pull the run back OUT toward the eave — the
|
|
37
|
+
// escape hatch when the auto-routed wall position doesn't match the
|
|
38
|
+
// actual wall (overshoots into it). Default 0.02 m.
|
|
39
|
+
standoff: z.number().default(0.02),
|
|
40
|
+
// Cross-section shape. 'auto' follows the host gutter's profile (round
|
|
41
|
+
// on half-round, rectangular on k-style / box); 'round' / 'rect'
|
|
42
|
+
// override it for a mixed look.
|
|
43
|
+
shape: z.enum(['auto', 'round', 'rect']).default('auto'),
|
|
44
|
+
// Wall straps clamping the run to the wall. 'band' renders periodic
|
|
45
|
+
// bands; 'none' hides them. Spacing is metres between bands.
|
|
46
|
+
strapStyle: z.enum(['band', 'none']).default('band'),
|
|
47
|
+
strapSpacing: z.number().default(1.8),
|
|
48
|
+
// What happens at the bottom of the run:
|
|
49
|
+
// - 'splash': kickout elbow + a splash block on the ground (default)
|
|
50
|
+
// - 'kickout': kickout elbow only (e.g. into a drain pipe)
|
|
51
|
+
// - 'straight': no kick — runs straight down (into a grade drain)
|
|
52
|
+
terminal: z.enum(['splash', 'kickout', 'straight']).default('splash'),
|
|
53
|
+
}).describe(dedent `
|
|
54
|
+
Downspout — a vertical pipe that takes water from a gutter outlet
|
|
55
|
+
down to ground level. Parented to a roof-segment (scene-graph),
|
|
56
|
+
linked to a specific gutter via gutterId for outlet position.
|
|
57
|
+
- length: vertical pipe length below the gutter outlet
|
|
58
|
+
- diameter: bore diameter; should match the host gutter's outletDiameter
|
|
59
|
+
- standoff: gap the pipe sits proud of the wall (pulls the run out toward the eave)
|
|
60
|
+
- shape: cross-section (auto follows the gutter profile, or force round / rect)
|
|
61
|
+
- strapStyle / strapSpacing: wall straps clamping the run
|
|
62
|
+
- terminal: bottom treatment (splash block, kickout only, or straight down)
|
|
63
|
+
`);
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const ElevatorDoorStyle: z.ZodEnum<{
|
|
3
|
+
"center-opening": "center-opening";
|
|
4
|
+
"single-left": "single-left";
|
|
5
|
+
"single-right": "single-right";
|
|
6
|
+
}>;
|
|
7
|
+
export declare const ElevatorDoorPanelStyle: z.ZodEnum<{
|
|
8
|
+
"glass-frame": "glass-frame";
|
|
9
|
+
"solid-panel": "solid-panel";
|
|
10
|
+
"segmented-panel": "segmented-panel";
|
|
11
|
+
}>;
|
|
12
|
+
export declare const ElevatorShaftStyle: z.ZodEnum<{
|
|
13
|
+
glass: "glass";
|
|
14
|
+
solid: "solid";
|
|
15
|
+
}>;
|
|
16
|
+
export type ElevatorDoorPanelStyle = z.infer<typeof ElevatorDoorPanelStyle>;
|
|
17
|
+
export type ElevatorDoorStyle = z.infer<typeof ElevatorDoorStyle>;
|
|
18
|
+
export type ElevatorShaftStyle = z.infer<typeof ElevatorShaftStyle>;
|
|
19
|
+
export declare const ElevatorNode: z.ZodObject<{
|
|
20
|
+
object: z.ZodDefault<z.ZodLiteral<"node">>;
|
|
21
|
+
name: z.ZodOptional<z.ZodString>;
|
|
22
|
+
parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
23
|
+
visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
24
|
+
camera: z.ZodOptional<z.ZodObject<{
|
|
25
|
+
position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
|
|
26
|
+
target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
|
|
27
|
+
mode: z.ZodDefault<z.ZodEnum<{
|
|
28
|
+
perspective: "perspective";
|
|
29
|
+
orthographic: "orthographic";
|
|
30
|
+
}>>;
|
|
31
|
+
fov: z.ZodOptional<z.ZodNumber>;
|
|
32
|
+
zoom: z.ZodOptional<z.ZodNumber>;
|
|
33
|
+
}, z.core.$strip>>;
|
|
34
|
+
metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
|
|
35
|
+
id: z.ZodDefault<z.ZodTemplateLiteral<`elevator_${string}`>>;
|
|
36
|
+
type: z.ZodDefault<z.ZodLiteral<"elevator">>;
|
|
37
|
+
material: z.ZodOptional<z.ZodObject<{
|
|
38
|
+
id: z.ZodOptional<z.ZodString>;
|
|
39
|
+
preset: z.ZodOptional<z.ZodEnum<{
|
|
40
|
+
custom: "custom";
|
|
41
|
+
white: "white";
|
|
42
|
+
brick: "brick";
|
|
43
|
+
concrete: "concrete";
|
|
44
|
+
wood: "wood";
|
|
45
|
+
glass: "glass";
|
|
46
|
+
metal: "metal";
|
|
47
|
+
plaster: "plaster";
|
|
48
|
+
tile: "tile";
|
|
49
|
+
marble: "marble";
|
|
50
|
+
}>>;
|
|
51
|
+
properties: z.ZodOptional<z.ZodObject<{
|
|
52
|
+
color: z.ZodDefault<z.ZodString>;
|
|
53
|
+
roughness: z.ZodDefault<z.ZodNumber>;
|
|
54
|
+
metalness: z.ZodDefault<z.ZodNumber>;
|
|
55
|
+
opacity: z.ZodDefault<z.ZodNumber>;
|
|
56
|
+
transparent: z.ZodDefault<z.ZodBoolean>;
|
|
57
|
+
side: z.ZodDefault<z.ZodEnum<{
|
|
58
|
+
front: "front";
|
|
59
|
+
back: "back";
|
|
60
|
+
double: "double";
|
|
61
|
+
}>>;
|
|
62
|
+
}, z.core.$strip>>;
|
|
63
|
+
texture: z.ZodOptional<z.ZodObject<{
|
|
64
|
+
url: z.ZodString;
|
|
65
|
+
repeat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
|
|
66
|
+
scale: z.ZodOptional<z.ZodNumber>;
|
|
67
|
+
}, z.core.$strip>>;
|
|
68
|
+
}, z.core.$strip>>;
|
|
69
|
+
materialPreset: z.ZodOptional<z.ZodString>;
|
|
70
|
+
position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
|
|
71
|
+
rotation: z.ZodDefault<z.ZodNumber>;
|
|
72
|
+
width: z.ZodDefault<z.ZodNumber>;
|
|
73
|
+
depth: z.ZodDefault<z.ZodNumber>;
|
|
74
|
+
shaftWidth: z.ZodOptional<z.ZodNumber>;
|
|
75
|
+
shaftDepth: z.ZodOptional<z.ZodNumber>;
|
|
76
|
+
shaftWallThickness: z.ZodDefault<z.ZodNumber>;
|
|
77
|
+
shaftStyle: z.ZodDefault<z.ZodEnum<{
|
|
78
|
+
glass: "glass";
|
|
79
|
+
solid: "solid";
|
|
80
|
+
}>>;
|
|
81
|
+
cabHeight: z.ZodDefault<z.ZodNumber>;
|
|
82
|
+
doorWidth: z.ZodDefault<z.ZodNumber>;
|
|
83
|
+
doorHeight: z.ZodDefault<z.ZodNumber>;
|
|
84
|
+
doorStyle: z.ZodDefault<z.ZodEnum<{
|
|
85
|
+
"center-opening": "center-opening";
|
|
86
|
+
"single-left": "single-left";
|
|
87
|
+
"single-right": "single-right";
|
|
88
|
+
}>>;
|
|
89
|
+
doorPanelStyle: z.ZodDefault<z.ZodEnum<{
|
|
90
|
+
"glass-frame": "glass-frame";
|
|
91
|
+
"solid-panel": "solid-panel";
|
|
92
|
+
"segmented-panel": "segmented-panel";
|
|
93
|
+
}>>;
|
|
94
|
+
fromLevelId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
95
|
+
toLevelId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
96
|
+
servedLevelIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
97
|
+
disabledLevelIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
98
|
+
serviceOnlyLevelIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
99
|
+
defaultLevelId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
100
|
+
speed: z.ZodDefault<z.ZodNumber>;
|
|
101
|
+
doorDurationMs: z.ZodDefault<z.ZodNumber>;
|
|
102
|
+
dwellMs: z.ZodDefault<z.ZodNumber>;
|
|
103
|
+
}, z.core.$strip>;
|
|
104
|
+
export type ElevatorNode = z.infer<typeof ElevatorNode>;
|
|
105
|
+
//# sourceMappingURL=elevator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elevator.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/elevator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,iBAAiB;;;;EAA4D,CAAA;AAC1F,eAAO,MAAM,sBAAsB;;;;EAA4D,CAAA;AAC/F,eAAO,MAAM,kBAAkB;;;EAA6B,CAAA;AAE5D,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAC3E,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AACjE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEnE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgDxB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA"}
|