@pascal-app/core 0.5.1 → 0.7.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.
Files changed (134) hide show
  1. package/dist/events/bus.d.ts +74 -4
  2. package/dist/events/bus.d.ts.map +1 -1
  3. package/dist/events/bus.js +1 -1
  4. package/dist/hooks/scene-registry/scene-registry.d.ts +2 -0
  5. package/dist/hooks/scene-registry/scene-registry.d.ts.map +1 -1
  6. package/dist/hooks/scene-registry/scene-registry.js +2 -0
  7. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  8. package/dist/hooks/spatial-grid/spatial-grid-manager.js +164 -6
  9. package/dist/hooks/spatial-grid/spatial-grid.d.ts +2 -0
  10. package/dist/hooks/spatial-grid/spatial-grid.d.ts.map +1 -1
  11. package/dist/hooks/spatial-grid/spatial-grid.js +43 -20
  12. package/dist/index.d.ts +9 -13
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +7 -11
  15. package/dist/lib/door-operation.d.ts +7 -0
  16. package/dist/lib/door-operation.d.ts.map +1 -0
  17. package/dist/lib/door-operation.js +25 -0
  18. package/dist/lib/polygon-geometry.d.ts +3 -0
  19. package/dist/lib/polygon-geometry.d.ts.map +1 -0
  20. package/dist/lib/polygon-geometry.js +90 -0
  21. package/dist/lib/slab-polygon.d.ts +3 -0
  22. package/dist/lib/slab-polygon.d.ts.map +1 -0
  23. package/dist/lib/slab-polygon.js +58 -0
  24. package/dist/lib/space-detection.d.ts +10 -17
  25. package/dist/lib/space-detection.d.ts.map +1 -1
  26. package/dist/lib/space-detection.js +666 -453
  27. package/dist/material-library.d.ts +20 -0
  28. package/dist/material-library.d.ts.map +1 -0
  29. package/dist/material-library.js +580 -0
  30. package/dist/schema/asset-url.d.ts +34 -0
  31. package/dist/schema/asset-url.d.ts.map +1 -0
  32. package/dist/schema/asset-url.js +79 -0
  33. package/dist/schema/asset-url.test.d.ts +2 -0
  34. package/dist/schema/asset-url.test.d.ts.map +1 -0
  35. package/dist/schema/asset-url.test.js +138 -0
  36. package/dist/schema/index.d.ts +14 -7
  37. package/dist/schema/index.d.ts.map +1 -1
  38. package/dist/schema/index.js +10 -7
  39. package/dist/schema/material.d.ts +112 -2
  40. package/dist/schema/material.d.ts.map +1 -1
  41. package/dist/schema/material.js +55 -1
  42. package/dist/schema/nodes/ceiling.d.ts +11 -1
  43. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  44. package/dist/schema/nodes/ceiling.js +6 -0
  45. package/dist/schema/nodes/column.d.ts +520 -0
  46. package/dist/schema/nodes/column.d.ts.map +1 -0
  47. package/dist/schema/nodes/column.js +385 -0
  48. package/dist/schema/nodes/door.d.ts +74 -1
  49. package/dist/schema/nodes/door.d.ts.map +1 -1
  50. package/dist/schema/nodes/door.js +39 -2
  51. package/dist/schema/nodes/fence.d.ts +34 -0
  52. package/dist/schema/nodes/fence.d.ts.map +1 -1
  53. package/dist/schema/nodes/fence.js +5 -0
  54. package/dist/schema/nodes/guide.d.ts +17 -0
  55. package/dist/schema/nodes/guide.d.ts.map +1 -1
  56. package/dist/schema/nodes/guide.js +11 -1
  57. package/dist/schema/nodes/item.d.ts +10 -2
  58. package/dist/schema/nodes/item.d.ts.map +1 -1
  59. package/dist/schema/nodes/item.js +18 -1
  60. package/dist/schema/nodes/level.d.ts +1 -1
  61. package/dist/schema/nodes/level.d.ts.map +1 -1
  62. package/dist/schema/nodes/level.js +6 -0
  63. package/dist/schema/nodes/roof-segment.d.ts +3 -1
  64. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  65. package/dist/schema/nodes/roof-segment.js +1 -0
  66. package/dist/schema/nodes/roof.d.ts +108 -0
  67. package/dist/schema/nodes/roof.d.ts.map +1 -1
  68. package/dist/schema/nodes/roof.js +58 -2
  69. package/dist/schema/nodes/scan.d.ts.map +1 -1
  70. package/dist/schema/nodes/scan.js +2 -1
  71. package/dist/schema/nodes/site.d.ts +2 -1
  72. package/dist/schema/nodes/site.d.ts.map +1 -1
  73. package/dist/schema/nodes/slab.d.ts +11 -1
  74. package/dist/schema/nodes/slab.d.ts.map +1 -1
  75. package/dist/schema/nodes/slab.js +7 -0
  76. package/dist/schema/nodes/spawn.d.ts +24 -0
  77. package/dist/schema/nodes/spawn.d.ts.map +1 -0
  78. package/dist/schema/nodes/spawn.js +8 -0
  79. package/dist/schema/nodes/stair-segment.d.ts +3 -1
  80. package/dist/schema/nodes/stair-segment.d.ts.map +1 -1
  81. package/dist/schema/nodes/stair-segment.js +1 -0
  82. package/dist/schema/nodes/stair.d.ts +122 -2
  83. package/dist/schema/nodes/stair.d.ts.map +1 -1
  84. package/dist/schema/nodes/stair.js +72 -2
  85. package/dist/schema/nodes/surface-hole-metadata.d.ts +10 -0
  86. package/dist/schema/nodes/surface-hole-metadata.d.ts.map +1 -0
  87. package/dist/schema/nodes/surface-hole-metadata.js +5 -0
  88. package/dist/schema/nodes/wall.d.ts +87 -1
  89. package/dist/schema/nodes/wall.d.ts.map +1 -1
  90. package/dist/schema/nodes/wall.js +45 -4
  91. package/dist/schema/nodes/window.d.ts +57 -1
  92. package/dist/schema/nodes/window.d.ts.map +1 -1
  93. package/dist/schema/nodes/window.js +29 -0
  94. package/dist/schema/types.d.ts +653 -12
  95. package/dist/schema/types.d.ts.map +1 -1
  96. package/dist/schema/types.js +4 -0
  97. package/dist/store/actions/node-actions.d.ts +1 -1
  98. package/dist/store/actions/node-actions.d.ts.map +1 -1
  99. package/dist/store/actions/node-actions.js +181 -5
  100. package/dist/store/history-control.d.ts +14 -0
  101. package/dist/store/history-control.d.ts.map +1 -0
  102. package/dist/store/history-control.js +22 -0
  103. package/dist/store/use-interactive.d.ts +43 -0
  104. package/dist/store/use-interactive.d.ts.map +1 -1
  105. package/dist/store/use-interactive.js +66 -0
  106. package/dist/store/use-scene.d.ts.map +1 -1
  107. package/dist/store/use-scene.js +307 -3
  108. package/dist/systems/ceiling/ceiling-system.d.ts.map +1 -1
  109. package/dist/systems/ceiling/ceiling-system.js +7 -0
  110. package/dist/systems/fence/fence-system.d.ts.map +1 -1
  111. package/dist/systems/fence/fence-system.js +106 -39
  112. package/dist/systems/roof/roof-system.d.ts.map +1 -1
  113. package/dist/systems/roof/roof-system.js +31 -1
  114. package/dist/systems/slab/slab-system.d.ts.map +1 -1
  115. package/dist/systems/slab/slab-system.js +45 -8
  116. package/dist/systems/stair/stair-opening-sync.d.ts +6 -0
  117. package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -0
  118. package/dist/systems/stair/stair-opening-sync.js +576 -0
  119. package/dist/systems/stair/stair-opening-sync.test.d.ts +2 -0
  120. package/dist/systems/stair/stair-opening-sync.test.d.ts.map +1 -0
  121. package/dist/systems/stair/stair-opening-sync.test.js +65 -0
  122. package/dist/systems/stair/stair-system.d.ts.map +1 -1
  123. package/dist/systems/stair/stair-system.js +119 -2
  124. package/dist/systems/wall/wall-curve.d.ts +43 -0
  125. package/dist/systems/wall/wall-curve.d.ts.map +1 -0
  126. package/dist/systems/wall/wall-curve.js +176 -0
  127. package/dist/systems/wall/wall-footprint.d.ts.map +1 -1
  128. package/dist/systems/wall/wall-footprint.js +16 -2
  129. package/dist/systems/wall/wall-mitering.d.ts +7 -0
  130. package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
  131. package/dist/systems/wall/wall-mitering.js +76 -3
  132. package/dist/systems/wall/wall-system.d.ts.map +1 -1
  133. package/dist/systems/wall/wall-system.js +202 -2
  134. package/package.json +33 -5
@@ -1,11 +1,21 @@
1
1
  import { z } from 'zod';
2
+ import { AssetUrl } from '../asset-url';
2
3
  import { BaseNode, nodeType, objectId } from '../base';
4
+ export const GuideScaleReference = z.object({
5
+ start: z.tuple([z.number(), z.number()]),
6
+ end: z.tuple([z.number(), z.number()]),
7
+ realLengthMeters: z.number().positive(),
8
+ measuredLengthUnits: z.number().positive(),
9
+ metersPerUnit: z.number().positive(),
10
+ label: z.string(),
11
+ });
3
12
  export const GuideNode = BaseNode.extend({
4
13
  id: objectId('guide'),
5
14
  type: nodeType('guide'),
6
- url: z.string(),
15
+ url: AssetUrl,
7
16
  position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
8
17
  rotation: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
9
18
  scale: z.number().default(1),
10
19
  opacity: z.number().min(0).max(100).default(50),
20
+ scaleReference: GuideScaleReference.nullable().default(null),
11
21
  });
@@ -143,12 +143,13 @@ declare const assetSchema: z.ZodObject<{
143
143
  category: z.ZodString;
144
144
  name: z.ZodString;
145
145
  thumbnail: z.ZodString;
146
+ floorPlanUrl: z.ZodOptional<z.ZodString>;
146
147
  src: z.ZodString;
147
148
  dimensions: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
148
149
  attachTo: z.ZodOptional<z.ZodEnum<{
149
150
  wall: "wall";
150
- "wall-side": "wall-side";
151
151
  ceiling: "ceiling";
152
+ "wall-side": "wall-side";
152
153
  }>>;
153
154
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
154
155
  offset: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
@@ -238,12 +239,13 @@ export declare const ItemNode: z.ZodObject<{
238
239
  category: z.ZodString;
239
240
  name: z.ZodString;
240
241
  thumbnail: z.ZodString;
242
+ floorPlanUrl: z.ZodOptional<z.ZodString>;
241
243
  src: z.ZodString;
242
244
  dimensions: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
243
245
  attachTo: z.ZodOptional<z.ZodEnum<{
244
246
  wall: "wall";
245
- "wall-side": "wall-side";
246
247
  ceiling: "ceiling";
248
+ "wall-side": "wall-side";
247
249
  }>>;
248
250
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
249
251
  offset: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
@@ -299,6 +301,12 @@ export declare const ItemNode: z.ZodObject<{
299
301
  }, z.core.$strip>;
300
302
  }, z.core.$strip>;
301
303
  export type ItemNode = z.infer<typeof ItemNode>;
304
+ export declare const LOW_PROFILE_ITEM_SURFACE_MAX_HEIGHT = 0.1;
305
+ /**
306
+ * Low, floor-resting items like rugs and parking mats can receive items visually,
307
+ * but should not become item parents or block normal floor placement.
308
+ */
309
+ export declare function isLowProfileItemSurface(item: ItemNode): boolean;
302
310
  /**
303
311
  * Returns the effective world-space dimensions of an item after applying its scale.
304
312
  * Use this everywhere item.asset.dimensions is used for spatial calculations.
@@ -1 +1 @@
1
- {"version":3,"file":"item.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/item.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB,QAAA,MAAM,mBAAmB;;;;iBAIvB,CAAA;AAEF,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;iBASvB,CAAA;AAEF,QAAA,MAAM,wBAAwB;;;;;;;;;;iBAO5B,CAAA;AAEF,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAIjB,CAAA;AAIF,QAAA,MAAM,qBAAqB;;;;;;;iBAOzB,CAAA;AAEF,QAAA,MAAM,iBAAiB;;;;;;iBAMrB,CAAA;AAEF,QAAA,MAAM,YAAY;;;;;;;;;;;;;2BAA2E,CAAA;AAI7F,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGrB,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAC/D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAC/D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AACzE,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AACnD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AACnE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAC3D,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AACjD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE3D,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBf,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AACpD,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAE/C,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6BnB,CAAA;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAE/C;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAI5E"}
1
+ {"version":3,"file":"item.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/item.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAOvB,QAAA,MAAM,mBAAmB;;;;iBAIvB,CAAA;AAEF,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;iBASvB,CAAA;AAEF,QAAA,MAAM,wBAAwB;;;;;;;;;;iBAO5B,CAAA;AAEF,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAIjB,CAAA;AAIF,QAAA,MAAM,qBAAqB;;;;;;;iBAOzB,CAAA;AAEF,QAAA,MAAM,iBAAiB;;;;;;iBAMrB,CAAA;AAEF,QAAA,MAAM,YAAY;;;;;;;;;;;;;2BAA2E,CAAA;AAI7F,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGrB,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAC/D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAC/D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AACzE,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AACnD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AACnE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAC3D,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AACjD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE3D,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsBf,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AACpD,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAE/C,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6BnB,CAAA;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAE/C,eAAO,MAAM,mCAAmC,MAAM,CAAA;AAEtD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAM/D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAI5E"}
@@ -1,5 +1,6 @@
1
1
  import dedent from 'dedent';
2
2
  import { z } from 'zod';
3
+ import { AssetUrl } from '../asset-url';
3
4
  import { BaseNode, nodeType, objectId } from '../base';
4
5
  // --- Control descriptors ---
5
6
  const toggleControlSchema = z.object({
@@ -57,7 +58,10 @@ const assetSchema = z.object({
57
58
  category: z.string(),
58
59
  name: z.string(),
59
60
  thumbnail: z.string(),
60
- src: z.string(),
61
+ // Optional top-down 2D image shown inside the item's footprint on the
62
+ // floor plan. When present, replaces the default diagonal-cross marker.
63
+ floorPlanUrl: z.string().optional(),
64
+ src: AssetUrl,
61
65
  dimensions: z.tuple([z.number(), z.number(), z.number()]).default([1, 1, 1]), // [w, h, d]
62
66
  attachTo: z.enum(['wall', 'wall-side', 'ceiling']).optional(),
63
67
  tags: z.array(z.string()).optional(),
@@ -99,6 +103,19 @@ export const ItemNode = BaseNode.extend({
99
103
  - scale: corrective scale for the model
100
104
  - tags: tags associated with the item
101
105
  `);
106
+ export const LOW_PROFILE_ITEM_SURFACE_MAX_HEIGHT = 0.1;
107
+ /**
108
+ * Low, floor-resting items like rugs and parking mats can receive items visually,
109
+ * but should not become item parents or block normal floor placement.
110
+ */
111
+ export function isLowProfileItemSurface(item) {
112
+ if (item.asset.attachTo)
113
+ return false;
114
+ const surfaceHeight = item.asset.surface
115
+ ? item.asset.surface.height * item.scale[1]
116
+ : getScaledDimensions(item)[1];
117
+ return surfaceHeight <= LOW_PROFILE_ITEM_SURFACE_MAX_HEIGHT;
118
+ }
102
119
  /**
103
120
  * Returns the effective world-space dimensions of an item after applying its scale.
104
121
  * Use this everywhere item.asset.dimensions is used for spatial calculations.
@@ -17,7 +17,7 @@ export declare const LevelNode: z.ZodObject<{
17
17
  metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
18
18
  id: z.ZodDefault<z.ZodTemplateLiteral<`level_${string}`>>;
19
19
  type: z.ZodDefault<z.ZodLiteral<"level">>;
20
- children: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodDefault<z.ZodTemplateLiteral<`wall_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`fence_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`zone_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`slab_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`ceiling_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`roof_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`stair_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`scan_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`guide_${string}`>>]>>>;
20
+ children: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodDefault<z.ZodTemplateLiteral<`wall_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`fence_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`column_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`item_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`zone_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`slab_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`ceiling_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`roof_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`stair_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`scan_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`guide_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`spawn_${string}`>>]>>>;
21
21
  level: z.ZodDefault<z.ZodNumber>;
22
22
  }, z.core.$strip>;
23
23
  export type LevelNode = z.infer<typeof LevelNode>;
@@ -1 +1 @@
1
- {"version":3,"file":"level.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/level.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAYvB,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;iBA0BrB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA"}
1
+ {"version":3,"file":"level.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/level.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAevB,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;iBA6BrB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA"}
@@ -2,11 +2,14 @@ import dedent from 'dedent';
2
2
  import { z } from 'zod';
3
3
  import { BaseNode, nodeType, objectId } from '../base';
4
4
  import { CeilingNode } from './ceiling';
5
+ import { ColumnNode } from './column';
5
6
  import { FenceNode } from './fence';
6
7
  import { GuideNode } from './guide';
8
+ import { ItemNode } from './item';
7
9
  import { RoofNode } from './roof';
8
10
  import { ScanNode } from './scan';
9
11
  import { SlabNode } from './slab';
12
+ import { SpawnNode } from './spawn';
10
13
  import { StairNode } from './stair';
11
14
  import { WallNode } from './wall';
12
15
  import { ZoneNode } from './zone';
@@ -17,6 +20,8 @@ export const LevelNode = BaseNode.extend({
17
20
  .array(z.union([
18
21
  WallNode.shape.id,
19
22
  FenceNode.shape.id,
23
+ ColumnNode.shape.id,
24
+ ItemNode.shape.id,
20
25
  ZoneNode.shape.id,
21
26
  SlabNode.shape.id,
22
27
  CeilingNode.shape.id,
@@ -24,6 +29,7 @@ export const LevelNode = BaseNode.extend({
24
29
  StairNode.shape.id,
25
30
  ScanNode.shape.id,
26
31
  GuideNode.shape.id,
32
+ SpawnNode.shape.id,
27
33
  ]))
28
34
  .default([]),
29
35
  // Specific props
@@ -28,8 +28,8 @@ export declare const RoofSegmentNode: z.ZodObject<{
28
28
  id: z.ZodDefault<z.ZodTemplateLiteral<`rseg_${string}`>>;
29
29
  type: z.ZodDefault<z.ZodLiteral<"roof-segment">>;
30
30
  material: z.ZodOptional<z.ZodObject<{
31
+ id: z.ZodOptional<z.ZodString>;
31
32
  preset: z.ZodOptional<z.ZodEnum<{
32
- custom: "custom";
33
33
  white: "white";
34
34
  brick: "brick";
35
35
  concrete: "concrete";
@@ -39,6 +39,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
39
39
  plaster: "plaster";
40
40
  tile: "tile";
41
41
  marble: "marble";
42
+ custom: "custom";
42
43
  }>>;
43
44
  properties: z.ZodOptional<z.ZodObject<{
44
45
  color: z.ZodDefault<z.ZodString>;
@@ -58,6 +59,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
58
59
  scale: z.ZodOptional<z.ZodNumber>;
59
60
  }, z.core.$strip>>;
60
61
  }, z.core.$strip>>;
62
+ materialPreset: z.ZodOptional<z.ZodString>;
61
63
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
62
64
  rotation: z.ZodDefault<z.ZodNumber>;
63
65
  roofType: z.ZodDefault<z.ZodEnum<{
@@ -1 +1 @@
1
- {"version":3,"file":"roof-segment.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof-segment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,QAAQ;;;;;;;;EAA0E,CAAA;AAE/F,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAE/C,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiC3B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA"}
1
+ {"version":3,"file":"roof-segment.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof-segment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,QAAQ;;;;;;;;EAA0E,CAAA;AAE/F,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAE/C,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkC3B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA"}
@@ -7,6 +7,7 @@ export const RoofSegmentNode = BaseNode.extend({
7
7
  id: objectId('rseg'),
8
8
  type: nodeType('roof-segment'),
9
9
  material: MaterialSchema.optional(),
10
+ materialPreset: z.string().optional(),
10
11
  position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
11
12
  // Rotation around Y axis in radians
12
13
  rotation: z.number().default(0),
@@ -1,4 +1,10 @@
1
1
  import { z } from 'zod';
2
+ import { type MaterialSchema } from '../material';
3
+ export type RoofSurfaceMaterialRole = 'top' | 'edge' | 'wall';
4
+ export type RoofSurfaceMaterialSpec = {
5
+ material?: MaterialSchema;
6
+ materialPreset?: string;
7
+ };
2
8
  export declare const RoofNode: z.ZodObject<{
3
9
  object: z.ZodDefault<z.ZodLiteral<"node">>;
4
10
  name: z.ZodOptional<z.ZodString>;
@@ -18,8 +24,107 @@ export declare const RoofNode: z.ZodObject<{
18
24
  id: z.ZodDefault<z.ZodTemplateLiteral<`roof_${string}`>>;
19
25
  type: z.ZodDefault<z.ZodLiteral<"roof">>;
20
26
  material: z.ZodOptional<z.ZodObject<{
27
+ id: z.ZodOptional<z.ZodString>;
21
28
  preset: z.ZodOptional<z.ZodEnum<{
29
+ white: "white";
30
+ brick: "brick";
31
+ concrete: "concrete";
32
+ wood: "wood";
33
+ glass: "glass";
34
+ metal: "metal";
35
+ plaster: "plaster";
36
+ tile: "tile";
37
+ marble: "marble";
38
+ custom: "custom";
39
+ }>>;
40
+ properties: z.ZodOptional<z.ZodObject<{
41
+ color: z.ZodDefault<z.ZodString>;
42
+ roughness: z.ZodDefault<z.ZodNumber>;
43
+ metalness: z.ZodDefault<z.ZodNumber>;
44
+ opacity: z.ZodDefault<z.ZodNumber>;
45
+ transparent: z.ZodDefault<z.ZodBoolean>;
46
+ side: z.ZodDefault<z.ZodEnum<{
47
+ front: "front";
48
+ back: "back";
49
+ double: "double";
50
+ }>>;
51
+ }, z.core.$strip>>;
52
+ texture: z.ZodOptional<z.ZodObject<{
53
+ url: z.ZodString;
54
+ repeat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
55
+ scale: z.ZodOptional<z.ZodNumber>;
56
+ }, z.core.$strip>>;
57
+ }, z.core.$strip>>;
58
+ materialPreset: z.ZodOptional<z.ZodString>;
59
+ topMaterial: z.ZodOptional<z.ZodObject<{
60
+ id: z.ZodOptional<z.ZodString>;
61
+ preset: z.ZodOptional<z.ZodEnum<{
62
+ white: "white";
63
+ brick: "brick";
64
+ concrete: "concrete";
65
+ wood: "wood";
66
+ glass: "glass";
67
+ metal: "metal";
68
+ plaster: "plaster";
69
+ tile: "tile";
70
+ marble: "marble";
71
+ custom: "custom";
72
+ }>>;
73
+ properties: z.ZodOptional<z.ZodObject<{
74
+ color: z.ZodDefault<z.ZodString>;
75
+ roughness: z.ZodDefault<z.ZodNumber>;
76
+ metalness: z.ZodDefault<z.ZodNumber>;
77
+ opacity: z.ZodDefault<z.ZodNumber>;
78
+ transparent: z.ZodDefault<z.ZodBoolean>;
79
+ side: z.ZodDefault<z.ZodEnum<{
80
+ front: "front";
81
+ back: "back";
82
+ double: "double";
83
+ }>>;
84
+ }, z.core.$strip>>;
85
+ texture: z.ZodOptional<z.ZodObject<{
86
+ url: z.ZodString;
87
+ repeat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
88
+ scale: z.ZodOptional<z.ZodNumber>;
89
+ }, z.core.$strip>>;
90
+ }, z.core.$strip>>;
91
+ topMaterialPreset: z.ZodOptional<z.ZodString>;
92
+ edgeMaterial: z.ZodOptional<z.ZodObject<{
93
+ id: z.ZodOptional<z.ZodString>;
94
+ preset: z.ZodOptional<z.ZodEnum<{
95
+ white: "white";
96
+ brick: "brick";
97
+ concrete: "concrete";
98
+ wood: "wood";
99
+ glass: "glass";
100
+ metal: "metal";
101
+ plaster: "plaster";
102
+ tile: "tile";
103
+ marble: "marble";
22
104
  custom: "custom";
105
+ }>>;
106
+ properties: z.ZodOptional<z.ZodObject<{
107
+ color: z.ZodDefault<z.ZodString>;
108
+ roughness: z.ZodDefault<z.ZodNumber>;
109
+ metalness: z.ZodDefault<z.ZodNumber>;
110
+ opacity: z.ZodDefault<z.ZodNumber>;
111
+ transparent: z.ZodDefault<z.ZodBoolean>;
112
+ side: z.ZodDefault<z.ZodEnum<{
113
+ front: "front";
114
+ back: "back";
115
+ double: "double";
116
+ }>>;
117
+ }, z.core.$strip>>;
118
+ texture: z.ZodOptional<z.ZodObject<{
119
+ url: z.ZodString;
120
+ repeat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
121
+ scale: z.ZodOptional<z.ZodNumber>;
122
+ }, z.core.$strip>>;
123
+ }, z.core.$strip>>;
124
+ edgeMaterialPreset: z.ZodOptional<z.ZodString>;
125
+ wallMaterial: z.ZodOptional<z.ZodObject<{
126
+ id: z.ZodOptional<z.ZodString>;
127
+ preset: z.ZodOptional<z.ZodEnum<{
23
128
  white: "white";
24
129
  brick: "brick";
25
130
  concrete: "concrete";
@@ -29,6 +134,7 @@ export declare const RoofNode: z.ZodObject<{
29
134
  plaster: "plaster";
30
135
  tile: "tile";
31
136
  marble: "marble";
137
+ custom: "custom";
32
138
  }>>;
33
139
  properties: z.ZodOptional<z.ZodObject<{
34
140
  color: z.ZodDefault<z.ZodString>;
@@ -48,9 +154,11 @@ export declare const RoofNode: z.ZodObject<{
48
154
  scale: z.ZodOptional<z.ZodNumber>;
49
155
  }, z.core.$strip>>;
50
156
  }, z.core.$strip>>;
157
+ wallMaterialPreset: z.ZodOptional<z.ZodString>;
51
158
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
52
159
  rotation: z.ZodDefault<z.ZodNumber>;
53
160
  children: z.ZodDefault<z.ZodArray<z.ZodDefault<z.ZodTemplateLiteral<`rseg_${string}`>>>>;
54
161
  }, z.core.$strip>;
55
162
  export type RoofNode = z.infer<typeof RoofNode>;
163
+ export declare function getEffectiveRoofSurfaceMaterial(node: RoofNode, role: RoofSurfaceMaterialRole): RoofSurfaceMaterialSpec;
56
164
  //# sourceMappingURL=roof.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"roof.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkBpB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
1
+ {"version":3,"file":"roof.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,KAAK,cAAc,EAA0C,MAAM,aAAa,CAAA;AAGzF,MAAM,MAAM,uBAAuB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAC7D,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyBpB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAS/C,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,uBAAuB,GAC5B,uBAAuB,CAmDzB"}
@@ -1,12 +1,19 @@
1
1
  import dedent from 'dedent';
2
2
  import { z } from 'zod';
3
3
  import { BaseNode, nodeType, objectId } from '../base';
4
- import { MaterialSchema } from '../material';
4
+ import { MaterialSchema as MaterialSchemaSchema } from '../material';
5
5
  import { RoofSegmentNode } from './roof-segment';
6
6
  export const RoofNode = BaseNode.extend({
7
7
  id: objectId('roof'),
8
8
  type: nodeType('roof'),
9
- material: MaterialSchema.optional(),
9
+ material: MaterialSchemaSchema.optional(),
10
+ materialPreset: z.string().optional(),
11
+ topMaterial: MaterialSchemaSchema.optional(),
12
+ topMaterialPreset: z.string().optional(),
13
+ edgeMaterial: MaterialSchemaSchema.optional(),
14
+ edgeMaterialPreset: z.string().optional(),
15
+ wallMaterial: MaterialSchemaSchema.optional(),
16
+ wallMaterialPreset: z.string().optional(),
10
17
  position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
11
18
  // Rotation around Y axis in radians
12
19
  rotation: z.number().default(0),
@@ -20,3 +27,52 @@ export const RoofNode = BaseNode.extend({
20
27
  - rotation: rotation around Y axis
21
28
  - children: array of RoofSegmentNode IDs
22
29
  `);
30
+ function getLegacyRoofSurfaceMaterial(node) {
31
+ return {
32
+ material: node.material,
33
+ materialPreset: node.materialPreset,
34
+ };
35
+ }
36
+ export function getEffectiveRoofSurfaceMaterial(node, role) {
37
+ if (role === 'top') {
38
+ if (node.topMaterial !== undefined || typeof node.topMaterialPreset === 'string') {
39
+ return {
40
+ material: node.topMaterial,
41
+ materialPreset: typeof node.topMaterialPreset === 'string' ? node.topMaterialPreset : undefined,
42
+ };
43
+ }
44
+ }
45
+ if (role === 'edge') {
46
+ if (node.edgeMaterial !== undefined || typeof node.edgeMaterialPreset === 'string') {
47
+ return {
48
+ material: node.edgeMaterial,
49
+ materialPreset: typeof node.edgeMaterialPreset === 'string' ? node.edgeMaterialPreset : undefined,
50
+ };
51
+ }
52
+ }
53
+ if (role === 'wall') {
54
+ if (node.wallMaterial !== undefined || typeof node.wallMaterialPreset === 'string') {
55
+ return {
56
+ material: node.wallMaterial,
57
+ materialPreset: typeof node.wallMaterialPreset === 'string' ? node.wallMaterialPreset : undefined,
58
+ };
59
+ }
60
+ }
61
+ if (role === 'edge') {
62
+ if (node.wallMaterial !== undefined || typeof node.wallMaterialPreset === 'string') {
63
+ return {
64
+ material: node.wallMaterial,
65
+ materialPreset: typeof node.wallMaterialPreset === 'string' ? node.wallMaterialPreset : undefined,
66
+ };
67
+ }
68
+ }
69
+ if (role === 'wall') {
70
+ if (node.edgeMaterial !== undefined || typeof node.edgeMaterialPreset === 'string') {
71
+ return {
72
+ material: node.edgeMaterial,
73
+ materialPreset: typeof node.edgeMaterialPreset === 'string' ? node.edgeMaterialPreset : undefined,
74
+ };
75
+ }
76
+ }
77
+ return getLegacyRoofSurfaceMaterial(node);
78
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;iBAQnB,CAAA;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;iBAQnB,CAAA;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
@@ -1,9 +1,10 @@
1
1
  import { z } from 'zod';
2
+ import { AssetUrl } from '../asset-url';
2
3
  import { BaseNode, nodeType, objectId } from '../base';
3
4
  export const ScanNode = BaseNode.extend({
4
5
  id: objectId('scan'),
5
6
  type: nodeType('scan'),
6
- url: z.string(),
7
+ url: AssetUrl,
7
8
  position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
8
9
  rotation: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
9
10
  scale: z.number().default(1),
@@ -76,12 +76,13 @@ export declare const SiteNode: z.ZodObject<{
76
76
  category: z.ZodString;
77
77
  name: z.ZodString;
78
78
  thumbnail: z.ZodString;
79
+ floorPlanUrl: z.ZodOptional<z.ZodString>;
79
80
  src: z.ZodString;
80
81
  dimensions: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
81
82
  attachTo: z.ZodOptional<z.ZodEnum<{
82
83
  wall: "wall";
83
- "wall-side": "wall-side";
84
84
  ceiling: "ceiling";
85
+ "wall-side": "wall-side";
85
86
  }>>;
86
87
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
87
88
  offset: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
@@ -1 +1 @@
1
- {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/site.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAiBvB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwBpB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
1
+ {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/site.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAiBvB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwBpB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
@@ -18,8 +18,8 @@ export declare const SlabNode: z.ZodObject<{
18
18
  id: z.ZodDefault<z.ZodTemplateLiteral<`slab_${string}`>>;
19
19
  type: z.ZodDefault<z.ZodLiteral<"slab">>;
20
20
  material: z.ZodOptional<z.ZodObject<{
21
+ id: z.ZodOptional<z.ZodString>;
21
22
  preset: z.ZodOptional<z.ZodEnum<{
22
- custom: "custom";
23
23
  white: "white";
24
24
  brick: "brick";
25
25
  concrete: "concrete";
@@ -29,6 +29,7 @@ export declare const SlabNode: z.ZodObject<{
29
29
  plaster: "plaster";
30
30
  tile: "tile";
31
31
  marble: "marble";
32
+ custom: "custom";
32
33
  }>>;
33
34
  properties: z.ZodOptional<z.ZodObject<{
34
35
  color: z.ZodDefault<z.ZodString>;
@@ -48,9 +49,18 @@ export declare const SlabNode: z.ZodObject<{
48
49
  scale: z.ZodOptional<z.ZodNumber>;
49
50
  }, z.core.$strip>>;
50
51
  }, z.core.$strip>>;
52
+ materialPreset: z.ZodOptional<z.ZodString>;
51
53
  polygon: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
52
54
  holes: z.ZodDefault<z.ZodArray<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>>>;
55
+ holeMetadata: z.ZodDefault<z.ZodArray<z.ZodObject<{
56
+ source: z.ZodDefault<z.ZodEnum<{
57
+ stair: "stair";
58
+ manual: "manual";
59
+ }>>;
60
+ stairId: z.ZodOptional<z.ZodString>;
61
+ }, z.core.$strip>>>;
53
62
  elevation: z.ZodDefault<z.ZodNumber>;
63
+ autoFromWalls: z.ZodDefault<z.ZodBoolean>;
54
64
  }, z.core.$strip>;
55
65
  export type SlabNode = z.infer<typeof SlabNode>;
56
66
  //# sourceMappingURL=slab.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"slab.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/slab.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAapB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
1
+ {"version":3,"file":"slab.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/slab.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBpB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
@@ -2,15 +2,22 @@ import dedent from 'dedent';
2
2
  import { z } from 'zod';
3
3
  import { BaseNode, nodeType, objectId } from '../base';
4
4
  import { MaterialSchema } from '../material';
5
+ import { SurfaceHoleMetadata } from './surface-hole-metadata';
5
6
  export const SlabNode = BaseNode.extend({
6
7
  id: objectId('slab'),
7
8
  type: nodeType('slab'),
8
9
  material: MaterialSchema.optional(),
10
+ materialPreset: z.string().optional(),
9
11
  polygon: z.array(z.tuple([z.number(), z.number()])),
10
12
  holes: z.array(z.array(z.tuple([z.number(), z.number()]))).default([]),
13
+ holeMetadata: z.array(SurfaceHoleMetadata).default([]),
11
14
  elevation: z.number().default(0.05), // Elevation in meters
15
+ autoFromWalls: z.boolean().default(false),
12
16
  }).describe(dedent `
13
17
  Slab node - used to represent a slab/floor in the building
14
18
  - polygon: array of [x, z] points defining the slab boundary
19
+ - holes: array of [x, z] polygons representing cutouts in the slab
20
+ - holeMetadata: metadata parallel to holes, used to preserve manual and stair-managed cutouts
15
21
  - elevation: elevation in meters
22
+ - autoFromWalls: whether the slab is automatically generated from a closed wall loop
16
23
  `);
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ export declare const SpawnNode: 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<`spawn_${string}`>>;
19
+ type: z.ZodDefault<z.ZodLiteral<"spawn">>;
20
+ position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
21
+ rotation: z.ZodDefault<z.ZodNumber>;
22
+ }, z.core.$strip>;
23
+ export type SpawnNode = z.infer<typeof SpawnNode>;
24
+ //# sourceMappingURL=spawn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;iBAKpB,CAAA;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod';
2
+ import { BaseNode, nodeType, objectId } from '../base';
3
+ export const SpawnNode = BaseNode.extend({
4
+ id: objectId('spawn'),
5
+ type: nodeType('spawn'),
6
+ position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
7
+ rotation: z.number().default(0),
8
+ });
@@ -29,8 +29,8 @@ export declare const StairSegmentNode: z.ZodObject<{
29
29
  id: z.ZodDefault<z.ZodTemplateLiteral<`sseg_${string}`>>;
30
30
  type: z.ZodDefault<z.ZodLiteral<"stair-segment">>;
31
31
  material: z.ZodOptional<z.ZodObject<{
32
+ id: z.ZodOptional<z.ZodString>;
32
33
  preset: z.ZodOptional<z.ZodEnum<{
33
- custom: "custom";
34
34
  white: "white";
35
35
  brick: "brick";
36
36
  concrete: "concrete";
@@ -40,6 +40,7 @@ export declare const StairSegmentNode: z.ZodObject<{
40
40
  plaster: "plaster";
41
41
  tile: "tile";
42
42
  marble: "marble";
43
+ custom: "custom";
43
44
  }>>;
44
45
  properties: z.ZodOptional<z.ZodObject<{
45
46
  color: z.ZodDefault<z.ZodString>;
@@ -59,6 +60,7 @@ export declare const StairSegmentNode: z.ZodObject<{
59
60
  scale: z.ZodOptional<z.ZodNumber>;
60
61
  }, z.core.$strip>>;
61
62
  }, z.core.$strip>>;
63
+ materialPreset: z.ZodOptional<z.ZodString>;
62
64
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
63
65
  rotation: z.ZodDefault<z.ZodNumber>;
64
66
  segmentType: z.ZodDefault<z.ZodEnum<{
@@ -1 +1 @@
1
- {"version":3,"file":"stair-segment.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/stair-segment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,gBAAgB;;;EAA+B,CAAA;AAE5D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE/D,eAAO,MAAM,cAAc;;;;EAAqC,CAAA;AAEhE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqC5B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA"}
1
+ {"version":3,"file":"stair-segment.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/stair-segment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,gBAAgB;;;EAA+B,CAAA;AAE5D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE/D,eAAO,MAAM,cAAc;;;;EAAqC,CAAA;AAEhE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsC5B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA"}
@@ -8,6 +8,7 @@ export const StairSegmentNode = BaseNode.extend({
8
8
  id: objectId('sseg'),
9
9
  type: nodeType('stair-segment'),
10
10
  material: MaterialSchema.optional(),
11
+ materialPreset: z.string().optional(),
11
12
  position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
12
13
  // Rotation around Y axis in radians
13
14
  rotation: z.number().default(0),