@pascal-app/viewer 1.0.1 → 1.0.4
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/components/renderers/node-renderer.d.ts.map +1 -1
- package/dist/components/renderers/node-renderer.js +8 -3
- package/dist/components/viewer/frame-limiter.d.ts +1 -0
- package/dist/components/viewer/frame-limiter.d.ts.map +1 -1
- package/dist/components/viewer/frame-limiter.js +22 -3
- package/dist/components/viewer/glb-interactive.d.ts +25 -1
- package/dist/components/viewer/glb-interactive.d.ts.map +1 -1
- package/dist/components/viewer/glb-interactive.js +252 -85
- package/dist/components/viewer/glb-mechanisms.d.ts +10 -0
- package/dist/components/viewer/glb-mechanisms.d.ts.map +1 -0
- package/dist/components/viewer/glb-mechanisms.js +19 -0
- package/dist/components/viewer/glb-scene.d.ts +45 -27
- package/dist/components/viewer/glb-scene.d.ts.map +1 -1
- package/dist/components/viewer/glb-scene.js +420 -506
- package/dist/components/viewer/glb-walkthrough-controller.d.ts +1 -1
- package/dist/components/viewer/glb-walkthrough-controller.d.ts.map +1 -1
- package/dist/components/viewer/glb-walkthrough-controller.js +12 -1
- package/dist/components/viewer/index.d.ts +26 -0
- package/dist/components/viewer/index.d.ts.map +1 -1
- package/dist/components/viewer/index.js +108 -29
- package/dist/components/viewer/lights.d.ts.map +1 -1
- package/dist/components/viewer/lights.js +6 -1
- package/dist/components/viewer/perf-monitor.d.ts.map +1 -1
- package/dist/components/viewer/perf-monitor.js +6 -0
- package/dist/components/viewer/post-processing.d.ts.map +1 -1
- package/dist/components/viewer/post-processing.js +8 -3
- package/dist/components/viewer/registered-systems.d.ts.map +1 -1
- package/dist/components/viewer/registered-systems.js +16 -2
- package/dist/components/viewer/render-error.d.ts +18 -0
- package/dist/components/viewer/render-error.d.ts.map +1 -0
- package/dist/components/viewer/render-error.js +29 -0
- package/dist/components/viewer/scene-ground-replacement.d.ts +6 -0
- package/dist/components/viewer/scene-ground-replacement.d.ts.map +1 -1
- package/dist/components/viewer/scene-ground-replacement.js +15 -0
- package/dist/components/viewer/selection-manager.d.ts.map +1 -1
- package/dist/components/viewer/selection-manager.js +10 -0
- package/dist/components/viewer/viewer-camera.d.ts +19 -1
- package/dist/components/viewer/viewer-camera.d.ts.map +1 -1
- package/dist/components/viewer/viewer-camera.js +53 -5
- package/dist/index.d.ts +28 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -18
- package/dist/lib/asset-url.d.ts.map +1 -1
- package/dist/lib/asset-url.js +7 -1
- package/dist/lib/csg-utils.d.ts +1 -1
- package/dist/lib/csg-utils.d.ts.map +1 -1
- package/dist/lib/csg-utils.js +1 -1
- package/dist/lib/display-state.d.ts +25 -0
- package/dist/lib/display-state.d.ts.map +1 -0
- package/dist/lib/display-state.js +1 -0
- package/dist/lib/hero-pose.d.ts +12 -2
- package/dist/lib/hero-pose.d.ts.map +1 -1
- package/dist/lib/hero-pose.js +72 -5
- package/dist/lib/ink-edges.d.ts +4 -2
- package/dist/lib/ink-edges.d.ts.map +1 -1
- package/dist/lib/ink-edges.js +17 -7
- package/dist/lib/key-light-override.d.ts +11 -0
- package/dist/lib/key-light-override.d.ts.map +1 -0
- package/dist/lib/key-light-override.js +14 -0
- package/dist/lib/live-frame-hold.d.ts +14 -0
- package/dist/lib/live-frame-hold.d.ts.map +1 -0
- package/dist/lib/live-frame-hold.js +28 -0
- package/dist/lib/materials.d.ts +14 -7
- package/dist/lib/materials.d.ts.map +1 -1
- package/dist/lib/materials.js +31 -5
- package/dist/lib/node-top-surface-height.d.ts +6 -0
- package/dist/lib/node-top-surface-height.d.ts.map +1 -0
- package/dist/lib/node-top-surface-height.js +74 -0
- package/dist/lib/perf-probe-state.d.ts +39 -0
- package/dist/lib/perf-probe-state.d.ts.map +1 -0
- package/dist/lib/perf-probe-state.js +17 -0
- package/dist/lib/pointer-events.d.ts +8 -0
- package/dist/lib/pointer-events.d.ts.map +1 -1
- package/dist/lib/pointer-events.js +27 -4
- package/dist/lib/procedural-emission.d.ts +7 -0
- package/dist/lib/procedural-emission.d.ts.map +1 -0
- package/dist/lib/procedural-emission.js +54 -0
- package/dist/lib/renderer-capability.d.ts +2 -1
- package/dist/lib/renderer-capability.d.ts.map +1 -1
- package/dist/lib/renderer-capability.js +2 -2
- package/dist/lib/scene-support-height.d.ts +4 -0
- package/dist/lib/scene-support-height.d.ts.map +1 -0
- package/dist/lib/scene-support-height.js +34 -0
- package/dist/lib/scene-visibility.d.ts +6 -0
- package/dist/lib/scene-visibility.d.ts.map +1 -1
- package/dist/lib/scene-visibility.js +15 -3
- package/dist/lib/scripted-opening.d.ts +11 -0
- package/dist/lib/scripted-opening.d.ts.map +1 -0
- package/dist/lib/scripted-opening.js +20 -0
- package/dist/lib/snapshot-pipeline.d.ts +32 -2
- package/dist/lib/snapshot-pipeline.d.ts.map +1 -1
- package/dist/lib/snapshot-pipeline.js +215 -105
- package/dist/lib/terrain-perimeter-fill.d.ts.map +1 -1
- package/dist/lib/terrain-perimeter-fill.js +22 -14
- package/dist/lib/zone-geometry.d.ts +11 -0
- package/dist/lib/zone-geometry.d.ts.map +1 -0
- package/dist/lib/zone-geometry.js +46 -0
- package/dist/store/use-item-light-pool.d.ts +14 -10
- package/dist/store/use-item-light-pool.d.ts.map +1 -1
- package/dist/store/use-item-light-pool.js +52 -26
- package/dist/store/use-viewer.d.ts +11 -0
- package/dist/store/use-viewer.d.ts.map +1 -1
- package/dist/store/use-viewer.js +13 -6
- package/dist/systems/ceiling/ceiling-system.d.ts +15 -1
- package/dist/systems/ceiling/ceiling-system.d.ts.map +1 -1
- package/dist/systems/ceiling/ceiling-system.js +86 -6
- package/dist/systems/door/door-system.d.ts.map +1 -1
- package/dist/systems/door/door-system.js +73 -22
- package/dist/systems/floor-elevation/floor-elevation-system.d.ts +3 -1
- package/dist/systems/floor-elevation/floor-elevation-system.d.ts.map +1 -1
- package/dist/systems/floor-elevation/floor-elevation-system.js +148 -5
- package/dist/systems/geometry/geometry-system.d.ts.map +1 -1
- package/dist/systems/geometry/geometry-system.js +71 -11
- package/dist/systems/interactive/interactive-system.d.ts.map +1 -1
- package/dist/systems/interactive/interactive-system.js +40 -15
- package/dist/systems/interactive/procedural-controls.d.ts +13 -0
- package/dist/systems/interactive/procedural-controls.d.ts.map +1 -0
- package/dist/systems/interactive/procedural-controls.js +17 -0
- package/dist/systems/interactive/scripted-clips.d.ts +19 -0
- package/dist/systems/interactive/scripted-clips.d.ts.map +1 -0
- package/dist/systems/interactive/scripted-clips.js +134 -0
- package/dist/systems/item/item-system.d.ts.map +1 -1
- package/dist/systems/item/item-system.js +9 -3
- package/dist/systems/item/object-cut-invalidation.d.ts +3 -0
- package/dist/systems/item/object-cut-invalidation.d.ts.map +1 -0
- package/dist/systems/item/object-cut-invalidation.js +68 -0
- package/dist/systems/item-light/item-light-system.d.ts +1 -1
- package/dist/systems/item-light/item-light-system.d.ts.map +1 -1
- package/dist/systems/item-light/item-light-system.js +47 -52
- package/dist/systems/level/level-system.d.ts.map +1 -1
- package/dist/systems/level/level-system.js +17 -19
- package/dist/systems/level/level-utils.d.ts +28 -1
- package/dist/systems/level/level-utils.d.ts.map +1 -1
- package/dist/systems/level/level-utils.js +36 -4
- package/dist/systems/level/shadow-only-levels.d.ts +9 -0
- package/dist/systems/level/shadow-only-levels.d.ts.map +1 -0
- package/dist/systems/level/shadow-only-levels.js +7 -0
- package/dist/systems/roof/roof-materials.d.ts +14 -2
- package/dist/systems/roof/roof-materials.d.ts.map +1 -1
- package/dist/systems/roof/roof-materials.js +54 -15
- package/dist/systems/roof/roof-system.d.ts +13 -3
- package/dist/systems/roof/roof-system.d.ts.map +1 -1
- package/dist/systems/roof/roof-system.js +188 -13
- package/dist/systems/slab/slab-system.d.ts +1 -1
- package/dist/systems/slab/slab-system.d.ts.map +1 -1
- package/dist/systems/slab/slab-system.js +49 -19
- package/dist/systems/stair/stair-system.d.ts.map +1 -1
- package/dist/systems/stair/stair-system.js +133 -354
- package/dist/systems/wall/wall-cutout-cache.d.ts +11 -1
- package/dist/systems/wall/wall-cutout-cache.d.ts.map +1 -1
- package/dist/systems/wall/wall-cutout-cache.js +58 -20
- package/dist/systems/wall/wall-cutout.d.ts +9 -1
- package/dist/systems/wall/wall-cutout.d.ts.map +1 -1
- package/dist/systems/wall/wall-cutout.js +46 -32
- package/dist/systems/wall/wall-finish-data.d.ts +22 -0
- package/dist/systems/wall/wall-finish-data.d.ts.map +1 -0
- package/dist/systems/wall/wall-finish-data.js +17 -0
- package/dist/systems/wall/wall-materials.d.ts +17 -3
- package/dist/systems/wall/wall-materials.d.ts.map +1 -1
- package/dist/systems/wall/wall-materials.js +109 -156
- package/dist/systems/wall/wall-system.d.ts +43 -4
- package/dist/systems/wall/wall-system.d.ts.map +1 -1
- package/dist/systems/wall/wall-system.js +601 -163
- package/dist/systems/window/window-system.d.ts +1 -1
- package/dist/systems/window/window-system.d.ts.map +1 -1
- package/dist/systems/window/window-system.js +44 -24
- package/dist/xr/presentation-context.d.ts +7 -0
- package/dist/xr/presentation-context.d.ts.map +1 -0
- package/dist/xr/presentation-context.js +10 -0
- package/package.json +6 -6
- package/dist/systems/fence/fence-system.d.ts +0 -22
- package/dist/systems/fence/fence-system.d.ts.map +0 -1
- package/dist/systems/fence/fence-system.js +0 -357
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export function cloneWithProceduralEmission(material, color, on) {
|
|
2
|
+
const clone = material.clone();
|
|
3
|
+
clone.userData = { ...clone.userData, __pascalCachedMaterial: false };
|
|
4
|
+
if (clone.emissive)
|
|
5
|
+
clone.emissive.set(color);
|
|
6
|
+
if ('emissiveIntensity' in clone)
|
|
7
|
+
clone.emissiveIntensity = on ? 1 : 0;
|
|
8
|
+
if ('emissiveMap' in clone)
|
|
9
|
+
clone.emissiveMap = null;
|
|
10
|
+
clone.needsUpdate = true;
|
|
11
|
+
return clone;
|
|
12
|
+
}
|
|
13
|
+
export function setProceduralEmission(material, on) {
|
|
14
|
+
const controlled = material;
|
|
15
|
+
if ('emissiveIntensity' in controlled)
|
|
16
|
+
controlled.emissiveIntensity = on ? 1 : 0;
|
|
17
|
+
}
|
|
18
|
+
export function proceduralSlotMeshes(root, slots) {
|
|
19
|
+
const meshes = [];
|
|
20
|
+
const owner = root.userData.pascalId;
|
|
21
|
+
const visit = (object) => {
|
|
22
|
+
if (object !== root && object.userData.pascalId && object.userData.pascalId !== owner)
|
|
23
|
+
return;
|
|
24
|
+
const mesh = object;
|
|
25
|
+
if (mesh.isMesh && slots.has(mesh.userData.slotId))
|
|
26
|
+
meshes.push(mesh);
|
|
27
|
+
for (const child of object.children)
|
|
28
|
+
visit(child);
|
|
29
|
+
};
|
|
30
|
+
visit(root);
|
|
31
|
+
return meshes;
|
|
32
|
+
}
|
|
33
|
+
export function decorateProceduralEmission(root, lights, on) {
|
|
34
|
+
const colors = new Map(lights.flatMap((light) => light.emissiveSlot ? [[light.emissiveSlot, light.color]] : []));
|
|
35
|
+
const restores = [];
|
|
36
|
+
for (const mesh of proceduralSlotMeshes(root, new Set(colors.keys()))) {
|
|
37
|
+
const slot = mesh.userData.slotId;
|
|
38
|
+
const color = colors.get(slot);
|
|
39
|
+
if (!color)
|
|
40
|
+
continue;
|
|
41
|
+
const previous = mesh.material;
|
|
42
|
+
const clones = (Array.isArray(previous) ? previous : [previous]).map((material) => cloneWithProceduralEmission(material, color, on));
|
|
43
|
+
mesh.material = Array.isArray(previous) ? clones : clones[0];
|
|
44
|
+
restores.push(() => {
|
|
45
|
+
mesh.material = previous;
|
|
46
|
+
for (const clone of clones)
|
|
47
|
+
clone.dispose();
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return () => {
|
|
51
|
+
for (const restore of restores)
|
|
52
|
+
restore();
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -45,8 +45,9 @@ export declare function detectRendererCapability({ canvas, gpu, powerPreference,
|
|
|
45
45
|
powerPreference?: RendererPowerPreference;
|
|
46
46
|
webgpuTimeoutMs?: number;
|
|
47
47
|
}): Promise<RendererCapability>;
|
|
48
|
-
export declare function initializeGpuRenderer<Renderer extends InitializableRenderer>({ createRenderer, gpu, powerPreference, probeCanvas, webgpuTimeoutMs, }: {
|
|
48
|
+
export declare function initializeGpuRenderer<Renderer extends InitializableRenderer>({ createRenderer, forceWebGL, gpu, powerPreference, probeCanvas, webgpuTimeoutMs, }: {
|
|
49
49
|
createRenderer: (parameters: RendererBackendParameters) => Renderer;
|
|
50
|
+
forceWebGL?: boolean;
|
|
50
51
|
gpu?: RendererGpu | null;
|
|
51
52
|
powerPreference?: RendererPowerPreference;
|
|
52
53
|
probeCanvas?: RendererCapabilityCanvas | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-capability.d.ts","sourceRoot":"","sources":["../../src/lib/renderer-capability.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAA;CACzC,CAAA;AAED,oGAAoG;AACpG,MAAM,MAAM,uBAAuB,GAAG,kBAAkB,GAAG,WAAW,CAAA;AAEtE,KAAK,kBAAkB,GAAG;IACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC3B,aAAa,CAAC,UAAU,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9E,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAA;CACtF,CAAA;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,OAAO,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GAC3D;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACzC;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAA;AAE9C,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,KAAK,qBAAqB,GAAG;IAC3B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,4BAA4B,CAAC,QAAQ,IAC7C;IAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACpE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAA;AAiD9C,wBAAsB,wBAAwB,CAAC,EAC7C,MAAwB,EACxB,GAAkB,EAClB,eAAe,EACf,eAAkD,GACnD,GAAE;IACD,MAAM,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAA;IACxC,GAAG,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IACxB,eAAe,CAAC,EAAE,uBAAuB,CAAA;IACzC,eAAe,CAAC,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2BnC;AAED,wBAAsB,qBAAqB,CAAC,QAAQ,SAAS,qBAAqB,EAAE,EAClF,cAAc,EACd,GAAG,EACH,eAAe,EACf,WAA6B,EAC7B,eAAkD,GACnD,EAAE;IACD,cAAc,EAAE,CAAC,UAAU,EAAE,yBAAyB,KAAK,QAAQ,CAAA;IACnE,GAAG,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IACxB,eAAe,CAAC,EAAE,uBAAuB,CAAA;IACzC,WAAW,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAA;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,GAAG,OAAO,CAAC,4BAA4B,CAAC,QAAQ,CAAC,CAAC,CAyClD"}
|
|
1
|
+
{"version":3,"file":"renderer-capability.d.ts","sourceRoot":"","sources":["../../src/lib/renderer-capability.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAA;CACzC,CAAA;AAED,oGAAoG;AACpG,MAAM,MAAM,uBAAuB,GAAG,kBAAkB,GAAG,WAAW,CAAA;AAEtE,KAAK,kBAAkB,GAAG;IACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC3B,aAAa,CAAC,UAAU,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9E,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAA;CACtF,CAAA;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,OAAO,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GAC3D;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACzC;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAA;AAE9C,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,KAAK,qBAAqB,GAAG;IAC3B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,4BAA4B,CAAC,QAAQ,IAC7C;IAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACpE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAA;AAiD9C,wBAAsB,wBAAwB,CAAC,EAC7C,MAAwB,EACxB,GAAkB,EAClB,eAAe,EACf,eAAkD,GACnD,GAAE;IACD,MAAM,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAA;IACxC,GAAG,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IACxB,eAAe,CAAC,EAAE,uBAAuB,CAAA;IACzC,eAAe,CAAC,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2BnC;AAED,wBAAsB,qBAAqB,CAAC,QAAQ,SAAS,qBAAqB,EAAE,EAClF,cAAc,EACd,UAAkB,EAClB,GAAG,EACH,eAAe,EACf,WAA6B,EAC7B,eAAkD,GACnD,EAAE;IACD,cAAc,EAAE,CAAC,UAAU,EAAE,yBAAyB,KAAK,QAAQ,CAAA;IACnE,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,GAAG,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IACxB,eAAe,CAAC,EAAE,uBAAuB,CAAA;IACzC,WAAW,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAA;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,GAAG,OAAO,CAAC,4BAA4B,CAAC,QAAQ,CAAC,CAAC,CAyClD"}
|
|
@@ -71,10 +71,10 @@ export async function detectRendererCapability({ canvas = browserCanvas(), gpu =
|
|
|
71
71
|
}
|
|
72
72
|
return { error: capabilityError, status: 'unsupported' };
|
|
73
73
|
}
|
|
74
|
-
export async function initializeGpuRenderer({ createRenderer, gpu, powerPreference, probeCanvas = browserCanvas(), webgpuTimeoutMs = WEBGPU_INITIALIZATION_TIMEOUT_MS, }) {
|
|
74
|
+
export async function initializeGpuRenderer({ createRenderer, forceWebGL = false, gpu, powerPreference, probeCanvas = browserCanvas(), webgpuTimeoutMs = WEBGPU_INITIALIZATION_TIMEOUT_MS, }) {
|
|
75
75
|
const capability = await detectRendererCapability({
|
|
76
76
|
canvas: probeCanvas,
|
|
77
|
-
gpu,
|
|
77
|
+
gpu: forceWebGL ? null : gpu,
|
|
78
78
|
powerPreference,
|
|
79
79
|
webgpuTimeoutMs,
|
|
80
80
|
});
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type AnyNode, type AnyNodeId } from '@pascal-app/core';
|
|
2
|
+
/** The highest walkable surface at a level-local point, including rendered shaped tops. */
|
|
3
|
+
export declare function createSceneSupportHeightSampler(nodes: Readonly<Record<AnyNodeId, AnyNode>>, levelId: AnyNodeId, selectedHostId?: AnyNodeId): (x: number, z: number) => number;
|
|
4
|
+
//# sourceMappingURL=scene-support-height.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-support-height.d.ts","sourceRoot":"","sources":["../../src/lib/scene-support-height.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EAIf,MAAM,kBAAkB,CAAA;AAGzB,2FAA2F;AAC3F,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,EAC3C,OAAO,EAAE,SAAS,EAClB,cAAc,CAAC,EAAE,SAAS,GACzB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAiClC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { findLevelAncestorId, levelBaseElevationAt, nodeRegistry, } from '@pascal-app/core';
|
|
2
|
+
import { createNodeTopSurfaceHeightSampler } from './node-top-surface-height';
|
|
3
|
+
/** The highest walkable surface at a level-local point, including rendered shaped tops. */
|
|
4
|
+
export function createSceneSupportHeightSampler(nodes, levelId, selectedHostId) {
|
|
5
|
+
const supports = Object.values(nodes)
|
|
6
|
+
.filter((node) => node.visible !== false &&
|
|
7
|
+
(!selectedHostId || node.id === selectedHostId) &&
|
|
8
|
+
findLevelAncestorId(node.id, nodes) === levelId &&
|
|
9
|
+
!!nodeRegistry.get(node.type)?.capabilities.surfaces?.top)
|
|
10
|
+
.map((node) => {
|
|
11
|
+
const top = nodeRegistry.get(node.type)?.capabilities.surfaces?.top;
|
|
12
|
+
const resolveSupportHeight = top?.supportHeight;
|
|
13
|
+
return {
|
|
14
|
+
node,
|
|
15
|
+
resolveDataHeight: resolveSupportHeight
|
|
16
|
+
? (x, z) => resolveSupportHeight(node, x, z, { nodes })
|
|
17
|
+
: null,
|
|
18
|
+
sampleRenderedHeight: resolveSupportHeight
|
|
19
|
+
? null
|
|
20
|
+
: createNodeTopSurfaceHeightSampler(node.id, levelId),
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
return (x, z) => {
|
|
24
|
+
let height = levelBaseElevationAt(nodes, levelId, x, z);
|
|
25
|
+
for (const support of supports) {
|
|
26
|
+
const top = support.resolveDataHeight
|
|
27
|
+
? support.resolveDataHeight(x, z)
|
|
28
|
+
: (support.sampleRenderedHeight?.(x, z) ?? null);
|
|
29
|
+
if (top !== null)
|
|
30
|
+
height = Math.max(height, top);
|
|
31
|
+
}
|
|
32
|
+
return height;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -12,4 +12,10 @@ export declare function hideFromScene(obj: Object3D, reason: HiddenReason): void
|
|
|
12
12
|
/** Drops `reason`, restoring the mask `obj` had before the first one arrived. */
|
|
13
13
|
export declare function showInScene(obj: Object3D, reason: HiddenReason): void;
|
|
14
14
|
export declare function temporarilyShowShadowOnly(root: Object3D): () => void;
|
|
15
|
+
/**
|
|
16
|
+
* Lifts what the user's view holds back under `root` — solo's shadow-only
|
|
17
|
+
* levels and isolation — for one capture: an interior view shows its floor
|
|
18
|
+
* whole, whatever the user isolated.
|
|
19
|
+
*/
|
|
20
|
+
export declare function temporarilyShowPresentation(root: Object3D): () => void;
|
|
15
21
|
//# sourceMappingURL=scene-visibility.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-visibility.d.ts","sourceRoot":"","sources":["../../src/lib/scene-visibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGrC;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,cAAc,CAAA;AAmBlF,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAMvE;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAarE;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"scene-visibility.d.ts","sourceRoot":"","sources":["../../src/lib/scene-visibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGrC;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,cAAc,CAAA;AAmBlF,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAMvE;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAarE;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,IAAI,CAEpE;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,IAAI,CAEtE"}
|
|
@@ -34,16 +34,28 @@ export function showInScene(obj, reason) {
|
|
|
34
34
|
delete holder[HOLD];
|
|
35
35
|
}
|
|
36
36
|
export function temporarilyShowShadowOnly(root) {
|
|
37
|
+
return temporarilyShowHeld(root, ['shadow-only']);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Lifts what the user's view holds back under `root` — solo's shadow-only
|
|
41
|
+
* levels and isolation — for one capture: an interior view shows its floor
|
|
42
|
+
* whole, whatever the user isolated.
|
|
43
|
+
*/
|
|
44
|
+
export function temporarilyShowPresentation(root) {
|
|
45
|
+
return temporarilyShowHeld(root, ['shadow-only', 'isolated']);
|
|
46
|
+
}
|
|
47
|
+
function temporarilyShowHeld(root, lifted) {
|
|
37
48
|
const masks = new Map();
|
|
38
49
|
root.traverse((obj) => {
|
|
39
50
|
const hold = obj[HOLD];
|
|
40
|
-
if (!hold
|
|
51
|
+
if (!hold || !lifted.some((reason) => hold.reasons.has(reason)))
|
|
41
52
|
return;
|
|
42
53
|
masks.set(obj, obj.layers.mask);
|
|
43
54
|
const reasons = new Set(hold.reasons);
|
|
44
|
-
|
|
55
|
+
for (const reason of lifted)
|
|
56
|
+
reasons.delete(reason);
|
|
45
57
|
// A capture needs the original scene geometry, while editor overlays and
|
|
46
|
-
//
|
|
58
|
+
// the reasons not lifted (batching) must retain their own masks.
|
|
47
59
|
if (reasons.size === 0)
|
|
48
60
|
obj.layers.mask = hold.original;
|
|
49
61
|
else
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type * as THREE from 'three';
|
|
2
|
+
/** The group a scripted window or door renders its artifact into; the opening's system leaves it alone. */
|
|
3
|
+
export declare const SCRIPTED_MODEL_FLAG = "scriptedModel";
|
|
4
|
+
/**
|
|
5
|
+
* A window or door built from a script renders its artifact, not the
|
|
6
|
+
* parametric frame: drop what an earlier parametric build left under the
|
|
7
|
+
* mesh, and report whether the artifact has loaded (until then the node
|
|
8
|
+
* stays dirty, so scene-ready and bakes wait for it, as for items).
|
|
9
|
+
*/
|
|
10
|
+
export declare function settleScriptedOpening(mesh: THREE.Object3D): boolean;
|
|
11
|
+
//# sourceMappingURL=scripted-opening.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripted-opening.d.ts","sourceRoot":"","sources":["../../src/lib/scripted-opening.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC,2GAA2G;AAC3G,eAAO,MAAM,mBAAmB,kBAAkB,CAAA;AAElD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,GAAG,OAAO,CAWnE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** The group a scripted window or door renders its artifact into; the opening's system leaves it alone. */
|
|
2
|
+
export const SCRIPTED_MODEL_FLAG = 'scriptedModel';
|
|
3
|
+
/**
|
|
4
|
+
* A window or door built from a script renders its artifact, not the
|
|
5
|
+
* parametric frame: drop what an earlier parametric build left under the
|
|
6
|
+
* mesh, and report whether the artifact has loaded (until then the node
|
|
7
|
+
* stays dirty, so scene-ready and bakes wait for it, as for items).
|
|
8
|
+
*/
|
|
9
|
+
export function settleScriptedOpening(mesh) {
|
|
10
|
+
let settled = false;
|
|
11
|
+
for (const child of [...mesh.children]) {
|
|
12
|
+
if (child.userData[SCRIPTED_MODEL_FLAG]) {
|
|
13
|
+
settled = child.userData.itemModelSettled === true;
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
mesh.remove(child);
|
|
17
|
+
child.traverse((object) => object.geometry?.dispose());
|
|
18
|
+
}
|
|
19
|
+
return settled;
|
|
20
|
+
}
|
|
@@ -29,6 +29,21 @@ export type SnapshotCaptureResult = {
|
|
|
29
29
|
outW: number;
|
|
30
30
|
outH: number;
|
|
31
31
|
};
|
|
32
|
+
/**
|
|
33
|
+
* An opaque studio backdrop in place of the theme sky: a radial gradient in
|
|
34
|
+
* exact sRGB (never tone mapped, so the hexes land as authored). Fixed at
|
|
35
|
+
* pipeline creation — callers without one get the untouched theme-backdrop
|
|
36
|
+
* pipeline. Ground shadows come from the caller's own shadow catcher, which
|
|
37
|
+
* composites over it through the scene alpha.
|
|
38
|
+
*/
|
|
39
|
+
export type StudioBackdrop = {
|
|
40
|
+
/** sRGB hex at `center`. */
|
|
41
|
+
inner: string;
|
|
42
|
+
/** sRGB hex at the frame corner farthest from `center`. */
|
|
43
|
+
outer: string;
|
|
44
|
+
/** Gradient centre in screen UV (0,0 = top-left). */
|
|
45
|
+
center: [number, number];
|
|
46
|
+
};
|
|
32
47
|
export type SnapshotPipeline = {
|
|
33
48
|
applyEnvironment: ({ theme, transparent, grade, edges, camera, }: {
|
|
34
49
|
theme: string;
|
|
@@ -37,17 +52,32 @@ export type SnapshotPipeline = {
|
|
|
37
52
|
edges: EdgeMode;
|
|
38
53
|
camera: Camera;
|
|
39
54
|
}) => void;
|
|
40
|
-
capture: ({ captureMode, cropRegion, standardSize, }: {
|
|
55
|
+
capture: ({ captureMode, cropRegion, standardSize, mime, }: {
|
|
41
56
|
captureMode?: SnapshotCaptureMode;
|
|
42
57
|
cropRegion?: SnapshotCropRegion;
|
|
43
58
|
standardSize?: SnapshotSize;
|
|
59
|
+
/** The encoding, when not the snapshot default (a print picture wants a lossless `image/png`). */
|
|
60
|
+
mime?: string;
|
|
44
61
|
}) => Promise<SnapshotCaptureResult>;
|
|
45
62
|
dispose: () => void;
|
|
46
63
|
};
|
|
47
|
-
export declare function createSnapshotPipeline({ renderer, scene, camera, atmosphere, }: {
|
|
64
|
+
export declare function createSnapshotPipeline({ renderer, scene, camera, atmosphere, studioBackdrop, }: {
|
|
48
65
|
renderer: WebGPURenderer;
|
|
49
66
|
scene: Scene;
|
|
50
67
|
camera: Camera;
|
|
51
68
|
atmosphere?: SceneAtmosphereSource | null;
|
|
69
|
+
studioBackdrop?: StudioBackdrop;
|
|
70
|
+
}): Promise<SnapshotPipeline | null>;
|
|
71
|
+
/**
|
|
72
|
+
* A capture WITHOUT the post-processing stack: the scene as the renderer
|
|
73
|
+
* draws it, into an offscreen target, read back and encoded like the
|
|
74
|
+
* post-processed frames. The sheets' orthographic elevation captures use
|
|
75
|
+
* it (2026-09-10): an SSGI pass built for a second, orthographic camera
|
|
76
|
+
* never delivered a frame and held the generator's guard forever.
|
|
77
|
+
*/
|
|
78
|
+
export declare function createPlainSnapshotPipeline({ renderer, scene, camera, }: {
|
|
79
|
+
renderer: WebGPURenderer;
|
|
80
|
+
scene: Scene;
|
|
81
|
+
camera: Camera;
|
|
52
82
|
}): Promise<SnapshotPipeline | null>;
|
|
53
83
|
//# sourceMappingURL=snapshot-pipeline.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot-pipeline.d.ts","sourceRoot":"","sources":["../../src/lib/snapshot-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAkB,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"snapshot-pipeline.d.ts","sourceRoot":"","sources":["../../src/lib/snapshot-pipeline.ts"],"names":[],"mappings":"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"}
|