@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.
- package/README.md +54 -21
- package/dist/components/viewer/glb-replace-instances.d.ts +6 -3
- package/dist/components/viewer/glb-replace-instances.d.ts.map +1 -1
- package/dist/components/viewer/glb-replace-instances.js +5 -4
- package/dist/components/viewer/glb-scene.d.ts +3 -1
- package/dist/components/viewer/glb-scene.d.ts.map +1 -1
- package/dist/components/viewer/glb-scene.js +2 -1
- package/dist/components/viewer/index.d.ts.map +1 -1
- package/dist/components/viewer/index.js +8 -4
- package/dist/components/viewer/registered-systems.d.ts.map +1 -1
- package/dist/components/viewer/registered-systems.js +2 -2
- package/dist/components/viewer/unsupported-gpu-fallback.d.ts.map +1 -1
- package/dist/components/viewer/unsupported-gpu-fallback.js +21 -1
- package/dist/components/viewer/use-daylight-rooms.d.ts.map +1 -1
- package/dist/components/viewer/use-daylight-rooms.js +75 -33
- package/dist/hooks/use-gltf-ktx2.d.ts.map +1 -1
- package/dist/hooks/use-gltf-ktx2.js +2 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/lib/asset-url.d.ts +0 -1
- package/dist/lib/asset-url.d.ts.map +1 -1
- package/dist/lib/asset-url.js +3 -3
- package/dist/lib/daylight/room-context.d.ts.map +1 -1
- package/dist/lib/daylight/room-context.js +3 -2
- package/dist/lib/daylight/room-map.d.ts +124 -0
- package/dist/lib/daylight/room-map.d.ts.map +1 -0
- package/dist/lib/daylight/room-map.js +630 -0
- package/dist/lib/daylight/room-scene.d.ts +4 -2
- package/dist/lib/daylight/room-scene.d.ts.map +1 -1
- package/dist/lib/daylight/room-scene.js +72 -37
- package/dist/lib/daylight/rooms.d.ts +60 -30
- package/dist/lib/daylight/rooms.d.ts.map +1 -1
- package/dist/lib/daylight/rooms.js +331 -286
- package/dist/lib/ktx2-loader.d.ts.map +1 -1
- package/dist/lib/ktx2-loader.js +2 -1
- package/dist/lib/measurement-label.d.ts +4 -0
- package/dist/lib/measurement-label.d.ts.map +1 -0
- package/dist/lib/measurement-label.js +54 -0
- package/dist/lib/measurement-presentation.d.ts +5 -0
- package/dist/lib/measurement-presentation.d.ts.map +1 -0
- package/dist/lib/measurement-presentation.js +8 -0
- package/dist/lib/pointer-events.d.ts.map +1 -1
- package/dist/lib/pointer-events.js +3 -3
- package/dist/lib/texture-reference.d.ts.map +1 -1
- package/dist/lib/texture-reference.js +4 -3
- package/dist/lib/viewer-config.d.ts +21 -0
- package/dist/lib/viewer-config.d.ts.map +1 -0
- package/dist/lib/viewer-config.js +21 -0
- package/dist/lib/viewer-preference-storage.d.ts +7 -0
- package/dist/lib/viewer-preference-storage.d.ts.map +1 -0
- package/dist/lib/viewer-preference-storage.js +23 -0
- package/dist/store/use-viewer.d.ts +2 -56
- package/dist/store/use-viewer.d.ts.map +1 -1
- package/dist/store/use-viewer.js +3 -1
- package/dist/systems/elevator/elevator-interaction-system.d.ts +16 -2
- package/dist/systems/elevator/elevator-interaction-system.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-interaction-system.js +41 -8
- package/dist/systems/geometry/geometry-status.d.ts +8 -0
- package/dist/systems/geometry/geometry-status.d.ts.map +1 -0
- package/dist/systems/geometry/geometry-status.js +24 -0
- package/dist/systems/roof/roof-system.d.ts.map +1 -1
- package/dist/systems/roof/roof-system.js +107 -65
- package/dist/systems/wall/wall-system.d.ts +11 -0
- package/dist/systems/wall/wall-system.d.ts.map +1 -1
- package/dist/systems/wall/wall-system.js +56 -10
- 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 {
|
|
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';
|
package/dist/lib/asset-url.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-url.d.ts","sourceRoot":"","sources":["../../src/lib/asset-url.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/lib/asset-url.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { loadAssetUrl, resolveArtifactUrl } from '@pascal-app/core';
|
|
2
|
-
|
|
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 `${
|
|
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 `${
|
|
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,
|
|
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
|
|
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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"}
|