@pascal-app/viewer 1.0.7 → 1.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.
Files changed (67) hide show
  1. package/README.md +54 -21
  2. package/dist/components/viewer/glb-replace-instances.d.ts +6 -3
  3. package/dist/components/viewer/glb-replace-instances.d.ts.map +1 -1
  4. package/dist/components/viewer/glb-replace-instances.js +5 -4
  5. package/dist/components/viewer/glb-scene.d.ts +3 -1
  6. package/dist/components/viewer/glb-scene.d.ts.map +1 -1
  7. package/dist/components/viewer/glb-scene.js +2 -1
  8. package/dist/components/viewer/index.d.ts.map +1 -1
  9. package/dist/components/viewer/index.js +8 -4
  10. package/dist/components/viewer/registered-systems.d.ts.map +1 -1
  11. package/dist/components/viewer/registered-systems.js +2 -2
  12. package/dist/components/viewer/unsupported-gpu-fallback.d.ts.map +1 -1
  13. package/dist/components/viewer/unsupported-gpu-fallback.js +21 -1
  14. package/dist/components/viewer/use-daylight-rooms.d.ts.map +1 -1
  15. package/dist/components/viewer/use-daylight-rooms.js +75 -33
  16. package/dist/hooks/use-gltf-ktx2.d.ts.map +1 -1
  17. package/dist/hooks/use-gltf-ktx2.js +2 -1
  18. package/dist/index.d.ts +5 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +5 -1
  21. package/dist/lib/asset-url.d.ts +0 -1
  22. package/dist/lib/asset-url.d.ts.map +1 -1
  23. package/dist/lib/asset-url.js +3 -3
  24. package/dist/lib/daylight/room-context.d.ts.map +1 -1
  25. package/dist/lib/daylight/room-context.js +3 -2
  26. package/dist/lib/daylight/room-map.d.ts +124 -0
  27. package/dist/lib/daylight/room-map.d.ts.map +1 -0
  28. package/dist/lib/daylight/room-map.js +630 -0
  29. package/dist/lib/daylight/room-scene.d.ts +4 -2
  30. package/dist/lib/daylight/room-scene.d.ts.map +1 -1
  31. package/dist/lib/daylight/room-scene.js +72 -37
  32. package/dist/lib/daylight/rooms.d.ts +60 -30
  33. package/dist/lib/daylight/rooms.d.ts.map +1 -1
  34. package/dist/lib/daylight/rooms.js +331 -286
  35. package/dist/lib/ktx2-loader.d.ts.map +1 -1
  36. package/dist/lib/ktx2-loader.js +2 -1
  37. package/dist/lib/measurement-label.d.ts +4 -0
  38. package/dist/lib/measurement-label.d.ts.map +1 -0
  39. package/dist/lib/measurement-label.js +54 -0
  40. package/dist/lib/measurement-presentation.d.ts +5 -0
  41. package/dist/lib/measurement-presentation.d.ts.map +1 -0
  42. package/dist/lib/measurement-presentation.js +8 -0
  43. package/dist/lib/pointer-events.d.ts.map +1 -1
  44. package/dist/lib/pointer-events.js +3 -3
  45. package/dist/lib/texture-reference.d.ts.map +1 -1
  46. package/dist/lib/texture-reference.js +4 -3
  47. package/dist/lib/viewer-config.d.ts +21 -0
  48. package/dist/lib/viewer-config.d.ts.map +1 -0
  49. package/dist/lib/viewer-config.js +21 -0
  50. package/dist/lib/viewer-preference-storage.d.ts +7 -0
  51. package/dist/lib/viewer-preference-storage.d.ts.map +1 -0
  52. package/dist/lib/viewer-preference-storage.js +23 -0
  53. package/dist/store/use-viewer.d.ts +2 -56
  54. package/dist/store/use-viewer.d.ts.map +1 -1
  55. package/dist/store/use-viewer.js +3 -1
  56. package/dist/systems/elevator/elevator-interaction-system.d.ts +16 -2
  57. package/dist/systems/elevator/elevator-interaction-system.d.ts.map +1 -1
  58. package/dist/systems/elevator/elevator-interaction-system.js +41 -8
  59. package/dist/systems/geometry/geometry-status.d.ts +8 -0
  60. package/dist/systems/geometry/geometry-status.d.ts.map +1 -0
  61. package/dist/systems/geometry/geometry-status.js +24 -0
  62. package/dist/systems/roof/roof-system.d.ts.map +1 -1
  63. package/dist/systems/roof/roof-system.js +107 -65
  64. package/dist/systems/wall/wall-system.d.ts +11 -0
  65. package/dist/systems/wall/wall-system.d.ts.map +1 -1
  66. package/dist/systems/wall/wall-system.js +56 -10
  67. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -31,7 +31,7 @@ export { useAssetUrl } from './hooks/use-asset-url';
31
31
  export { useGLTFKTX2 } from './hooks/use-gltf-ktx2';
32
32
  export { useLibraryMaterialsVersion } from './hooks/use-library-materials-version';
33
33
  export { useNodeEvents } from './hooks/use-node-events';
34
- export { ASSETS_CDN_URL, resolveAssetUrl, resolveCdnUrl } from './lib/asset-url';
34
+ export { resolveAssetUrl, resolveCdnUrl } from './lib/asset-url';
35
35
  export { backdropColors, backdropGradient, deepSkyColor, horizonHazeColor } from './lib/backdrop';
36
36
  export { applyWorldScaleBoxUVs } from './lib/box-uv';
37
37
  // CSG primitives — used by chimney's roof-trim and other kinds whose
@@ -58,6 +58,8 @@ export { LayerPassIndex } from './lib/layer-pass';
58
58
  export { BATCHED_LAYER, GRID_LAYER, OVERLAY_LAYER, SCENE_LAYER, SHADOW_ONLY_LAYER, setSurfaceRaycastLayers, ZONE_LAYER, } from './lib/layers';
59
59
  export { holdLiveFrame } from './lib/live-frame-hold';
60
60
  export { applyMaterialPresetToMaterials, BLUEPRINT_PALETTE, baseMaterial, CLAY_PALETTE, clearMaterialCache, createDefaultMaterial, createMaterial, createMaterialFromPreset, createMaterialFromPresetRef, createSurfaceRoleMaterial, DEFAULT_CEILING_MATERIAL, DEFAULT_DOOR_MATERIAL, DEFAULT_ROOF_MATERIAL, DEFAULT_SHELF_MATERIAL, DEFAULT_SLAB_MATERIAL, DEFAULT_STAIR_MATERIAL, DEFAULT_WALL_MATERIAL, DEFAULT_WINDOW_MATERIAL, disposeMaterial, getMaterialTextureVersion, glassMaterial, MONO_PALETTE, materialCastsShadow, materialTextureLoadState, PRESET_PALETTES, registerMaterialCacheCleanup, resolveMaterialRef, resolveSlotDefaultMaterial, resolveSurfaceColor, setSlotDefaultOverrides, WHITE_PALETTE, } from './lib/materials';
61
+ export * from './lib/measurement-label';
62
+ export * from './lib/measurement-presentation';
61
63
  export { mergedOutline } from './lib/merged-outline-node';
62
64
  export { createNodeTopSurfaceHeightSampler } from './lib/node-top-surface-height';
63
65
  export * from './lib/perf-actions';
@@ -79,6 +81,7 @@ export { buildTerrainPerimeterFillGeometry, } from './lib/terrain-perimeter-fill
79
81
  export { getPascalTextureRef, stampPascalTextureRef, textureMapForSlot, } from './lib/texture-reference';
80
82
  export { packNormalToRGB, unpackRGBToNormal } from './lib/tsl-compat';
81
83
  export { AMBIANCE_SECONDS, ambianceNow, ambianceTarget, easeAmbiance, eyeUnderTheGround, FADE_SECONDS, groundHoleOpenNode, groundHoleOpenNow, stepAmbianceProgress, temporarilyWithoutAmbiance, UNDERGROUND_RIM, undergroundAmbianceNode, } from './lib/underground-ambiance';
84
+ export { ASSETS_CDN_URL, configureViewer, getViewerConfig, } from './lib/viewer-config';
82
85
  export { createZoneShape, createZoneWallGeometry } from './lib/zone-geometry';
83
86
  export { catalogLightSource, useItemLightPool } from './store/use-item-light-pool';
84
87
  export { applyCountryUnitDefault, DEFAULT_UNDERGROUND_LOOK, default as useViewer, groundVeiled, siteGroundShown, } from './store/use-viewer';
@@ -93,6 +96,7 @@ export { ElevatorInteractionSystem } from './systems/elevator/elevator-interacti
93
96
  // elevation under its footprint. Replaces the per-kind elevation block
94
97
  // that used to live inside `ItemSystem`.
95
98
  export { FloorElevationSystem } from './systems/floor-elevation/floor-elevation-system';
99
+ export { setGeometryFailure, useGeometryStatus, } from './systems/geometry/geometry-status';
96
100
  export { GuideSystem } from './systems/guide/guide-system';
97
101
  export { InteractiveSystem } from './systems/interactive/interactive-system';
98
102
  export { openingSettled, proceduralSettled } from './systems/interactive/opening-settled';
@@ -1,4 +1,3 @@
1
- export declare const ASSETS_CDN_URL: string;
2
1
  /**
3
2
  * Resolves an asset URL to the appropriate format:
4
3
  * - If URL starts with http:// or https://, return as-is (external URL)
@@ -1 +1 @@
1
- {"version":3,"file":"asset-url.d.ts","sourceRoot":"","sources":["../../src/lib/asset-url.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,QAAwE,CAAA;AAEnG;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkB5F;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAoB3E"}
1
+ {"version":3,"file":"asset-url.d.ts","sourceRoot":"","sources":["../../src/lib/asset-url.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkB5F;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAoB3E"}
@@ -1,5 +1,5 @@
1
1
  import { loadAssetUrl, resolveArtifactUrl } from '@pascal-app/core';
2
- export const ASSETS_CDN_URL = process.env.NEXT_PUBLIC_ASSETS_CDN_URL || 'https://editor.pascal.app';
2
+ import { getViewerConfig } from './viewer-config';
3
3
  /**
4
4
  * Resolves an asset URL to the appropriate format:
5
5
  * - If URL starts with http:// or https://, return as-is (external URL)
@@ -22,7 +22,7 @@ export async function resolveAssetUrl(url) {
22
22
  }
23
23
  // Absolute or relative path - prepend CDN URL
24
24
  const normalizedPath = url.startsWith('/') ? url : `/${url}`;
25
- return `${ASSETS_CDN_URL}${normalizedPath}`;
25
+ return `${getViewerConfig().assetsBaseUrl.replace(/\/$/, '')}${normalizedPath}`;
26
26
  }
27
27
  /**
28
28
  * Synchronous version for URLs that don't need IndexedDB resolution
@@ -46,5 +46,5 @@ export function resolveCdnUrl(url) {
46
46
  }
47
47
  // Absolute or relative path - prepend CDN URL
48
48
  const normalizedPath = url.startsWith('/') ? url : `/${url}`;
49
- return `${ASSETS_CDN_URL}${normalizedPath}`;
49
+ return `${getViewerConfig().assetsBaseUrl.replace(/\/$/, '')}${normalizedPath}`;
50
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"room-context.d.ts","sourceRoot":"","sources":["../../../src/lib/daylight/room-context.ts"],"names":[],"mappings":"AAaA,KAAK,CAAC,GAAG,GAAG,CAAA;AAKZ;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,IAAI,CAAC,CAoCvC"}
1
+ {"version":3,"file":"room-context.d.ts","sourceRoot":"","sources":["../../../src/lib/daylight/room-context.ts"],"names":[],"mappings":"AAaA,KAAK,CAAC,GAAG,GAAG,CAAA;AAKZ;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,IAAI,CAAC,CAqCvC"}
@@ -12,9 +12,10 @@ const spillAlbedoFloor = uniform(0.35);
12
12
  */
13
13
  export function daylightRoomContext() {
14
14
  const rooms = daylightRooms;
15
- const roomNode = rooms.lightingNode();
15
+ const room = rooms.probeRoomNode();
16
+ const roomNode = rooms.lightingNode(room);
16
17
  const enclosure = roomNode.w;
17
- const outsideMask = rooms.exteriorMaskNode();
18
+ const outsideMask = rooms.exteriorMaskNode(room);
18
19
  // GI is later × albedo, so near-black paving would swallow the pools: lift dark receivers for
19
20
  // the spill term only (like a light decal).
20
21
  const lum = diffuseColor.rgb.dot(vec3(0.2126, 0.7152, 0.0722)).max(1e-3);
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Which room a point is in, at any scale: a sparse, tiled room-id map.
3
+ *
4
+ * Every level keeps its own map of 10 cm cells, cut into square tiles. A tile entirely inside one
5
+ * room (or outside every room) is a single value; only tiles a room edge crosses keep their cells,
6
+ * packed into one shared atlas. A level's rooms are grouped into clusters, each with its own tile
7
+ * rect, so open ground between distant rooms costs nothing. Memory then follows the length of the
8
+ * walls, not the site's area, and no texture grows with the number of floors. Tiles are built one
9
+ * at a time, so neither does the build.
10
+ *
11
+ * A point finds its level by height within its own building (a coarse directory lists the
12
+ * buildings near it), so neighbouring buildings with different floor heights, or a 40-storey
13
+ * tower, each keep their floors. Within a building, levels sorted by height stay sorted when they
14
+ * explode apart, so the search runs on live heights.
15
+ */
16
+ type N = any;
17
+ export declare const CELL = 0.1;
18
+ /** Cells per tile side. */
19
+ export declare const TILE = 16;
20
+ /** Room ids are stored as two bytes (id + 1). */
21
+ export declare const MAX_ROOMS = 65535;
22
+ /** WebGPU guarantees 8192 texels a side; the renderer asks for no more. */
23
+ export declare const DEFAULT_TEXTURE_LIMIT = 8192;
24
+ export type MapLevel = {
25
+ /** World Y of the level's floor, assembled (not exploded). */
26
+ y: number;
27
+ /** Index of the level's building; levels of one building stack. */
28
+ building: number;
29
+ };
30
+ export type MapRoom = {
31
+ level: number;
32
+ /** World XZ. */
33
+ polygon: [number, number][];
34
+ holes?: [number, number][][];
35
+ };
36
+ /** One tile while it is being built, inside its row's dilated cells (with a margin all round). */
37
+ export type TileCells = {
38
+ level: number;
39
+ /** Site cell index of `cells[0]`. */
40
+ ci0: number;
41
+ cj0: number;
42
+ /** World XZ of `cells[0]`'s lower corner. */
43
+ x0: number;
44
+ z0: number;
45
+ /** Cells per buffer row. */
46
+ stride: number;
47
+ /** The tile's first cell in the buffer. */
48
+ i0: number;
49
+ j0: number;
50
+ /** Room index + 1 per cell, 0 outside. */
51
+ cells: Uint16Array;
52
+ /** Every cell of the tile itself holds the same value (no edge inside). */
53
+ uniform: boolean;
54
+ };
55
+ export declare class RoomMap {
56
+ /** The device's largest 2D texture side; set before `build`. */
57
+ textureLimit: number;
58
+ private levels;
59
+ /** Level indices sorted by building, then height: the order the GPU searches in. */
60
+ private order;
61
+ private position;
62
+ /** Per building: its range in `order`. */
63
+ private buildingRange;
64
+ private originX;
65
+ private originZ;
66
+ private dirTiles;
67
+ private dirW;
68
+ private dirH;
69
+ /** Per directory cell: the buildings whose rooms reach it. */
70
+ private dirLists;
71
+ private atlas;
72
+ private atlasTilesW;
73
+ private atlasTiles;
74
+ private indexBytes;
75
+ private warnedOverflow;
76
+ readonly u: {
77
+ origin: N;
78
+ dirTiles: import("three/webgpu").UniformNode<"int", number>;
79
+ dirW: import("three/webgpu").UniformNode<"int", number>;
80
+ dirH: import("three/webgpu").UniformNode<"int", number>;
81
+ /** One building: its level range is the only candidate (no directory reads). */
82
+ single: import("three/webgpu").UniformNode<"int", number>;
83
+ singleCount: import("three/webgpu").UniformNode<"int", number>;
84
+ /** Binary-search steps for the tallest building. */
85
+ searchSteps: import("three/webgpu").UniformNode<"int", number>;
86
+ atlasTilesW: import("three/webgpu").UniformNode<"int", number>;
87
+ indexW: import("three/webgpu").UniformNode<"int", number>;
88
+ index: N;
89
+ levels: N;
90
+ atlas: N;
91
+ };
92
+ private levelData;
93
+ /** Rebuild from rooms. `onTile` sees every built tile (the doorway search walks room edges). */
94
+ build(levels: MapLevel[], rooms: MapRoom[], onTile?: (tile: TileCells) => void): void;
95
+ /** CPU lookup in assembled space (same rule as the shader). */
96
+ roomAt(x: number, y: number, z: number): number;
97
+ /** A level's room at a point; clusters' rects can overlap (a wing around a courtyard pavilion). */
98
+ private levelRoomAt;
99
+ /** The level stacked right above `level` in its building, or −1. */
100
+ levelAbove(level: number): number;
101
+ /** Index the GPU uses for `level` (rooms store it). */
102
+ gpuLevel(level: number): number;
103
+ /**
104
+ * Live presentation per level (input order): explode offset, whether it is shown, and whether
105
+ * the levels over it are hidden (its rooms open to the sky from above).
106
+ */
107
+ setPresentation(offsets: number[], shown: boolean[], focused: boolean[]): void;
108
+ memoryBytes(): number;
109
+ get stats(): {
110
+ atlasTiles: number;
111
+ dirW: number;
112
+ dirH: number;
113
+ };
114
+ private upload;
115
+ private indexTexel;
116
+ /** [liveY, clusterStart, clusterCount, 0] of the level at GPU position `pos`. */
117
+ levelTexel0(pos: N): N;
118
+ /** [0, 0, offset, flags] of the level at GPU position `pos`. */
119
+ levelTexel1(pos: N): N;
120
+ /** Room index (−1 outside) at a world-space position (live heights). */
121
+ roomAtNode: import("three/tsl").FnNode<[any], import("three/webgpu").VarNode<"int", import("three/webgpu").ConstNode<"int", number>>>;
122
+ }
123
+ export {};
124
+ //# sourceMappingURL=room-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-map.d.ts","sourceRoot":"","sources":["../../../src/lib/daylight/room-map.ts"],"names":[],"mappings":"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"}