@pascal-app/viewer 0.9.1 → 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/README.md +20 -5
  2. package/dist/components/error-boundary.d.ts +6 -0
  3. package/dist/components/error-boundary.d.ts.map +1 -1
  4. package/dist/components/error-boundary.js +6 -0
  5. package/dist/components/renderers/node-renderer.d.ts +5 -1
  6. package/dist/components/renderers/node-renderer.d.ts.map +1 -1
  7. package/dist/components/renderers/node-renderer.js +5 -2
  8. package/dist/components/renderers/parametric-node-renderer.d.ts.map +1 -1
  9. package/dist/components/renderers/parametric-node-renderer.js +7 -4
  10. package/dist/components/viewer/bvh-ecctrl.d.ts +77 -0
  11. package/dist/components/viewer/bvh-ecctrl.d.ts.map +1 -0
  12. package/dist/components/viewer/bvh-ecctrl.js +552 -0
  13. package/dist/components/viewer/frame-limiter.d.ts.map +1 -1
  14. package/dist/components/viewer/frame-limiter.js +59 -4
  15. package/dist/components/viewer/glb-interactive.d.ts +41 -0
  16. package/dist/components/viewer/glb-interactive.d.ts.map +1 -0
  17. package/dist/components/viewer/glb-interactive.js +394 -0
  18. package/dist/components/viewer/glb-reference-nodes.d.ts +29 -0
  19. package/dist/components/viewer/glb-reference-nodes.d.ts.map +1 -0
  20. package/dist/components/viewer/glb-reference-nodes.js +80 -0
  21. package/dist/components/viewer/glb-replace-instances.d.ts +18 -0
  22. package/dist/components/viewer/glb-replace-instances.d.ts.map +1 -0
  23. package/dist/components/viewer/glb-replace-instances.js +61 -0
  24. package/dist/components/viewer/glb-scene.d.ts +54 -0
  25. package/dist/components/viewer/glb-scene.d.ts.map +1 -0
  26. package/dist/components/viewer/glb-scene.js +920 -0
  27. package/dist/components/viewer/glb-walkthrough-controller.d.ts +22 -0
  28. package/dist/components/viewer/glb-walkthrough-controller.d.ts.map +1 -0
  29. package/dist/components/viewer/glb-walkthrough-controller.js +445 -0
  30. package/dist/components/viewer/index.d.ts +19 -2
  31. package/dist/components/viewer/index.d.ts.map +1 -1
  32. package/dist/components/viewer/index.js +113 -12
  33. package/dist/components/viewer/lights.d.ts.map +1 -1
  34. package/dist/components/viewer/lights.js +36 -5
  35. package/dist/components/viewer/perf-monitor.d.ts.map +1 -1
  36. package/dist/components/viewer/perf-monitor.js +17 -2
  37. package/dist/components/viewer/post-processing.d.ts +7 -1
  38. package/dist/components/viewer/post-processing.d.ts.map +1 -1
  39. package/dist/components/viewer/post-processing.js +180 -24
  40. package/dist/components/viewer/registered-systems.d.ts.map +1 -1
  41. package/dist/components/viewer/registered-systems.js +6 -4
  42. package/dist/components/viewer/scene-bvh.d.ts +2 -1
  43. package/dist/components/viewer/scene-bvh.d.ts.map +1 -1
  44. package/dist/components/viewer/scene-bvh.js +3 -0
  45. package/dist/components/viewer/scene-bvh.test.d.ts +2 -0
  46. package/dist/components/viewer/scene-bvh.test.d.ts.map +1 -0
  47. package/dist/components/viewer/scene-bvh.test.js +13 -0
  48. package/dist/components/viewer/scene-environment.d.ts +2 -0
  49. package/dist/components/viewer/scene-environment.d.ts.map +1 -0
  50. package/dist/components/viewer/scene-environment.js +79 -0
  51. package/dist/components/viewer/selection-manager.d.ts.map +1 -1
  52. package/dist/components/viewer/selection-manager.js +23 -12
  53. package/dist/hooks/use-gltf-ktx2.d.ts.map +1 -1
  54. package/dist/hooks/use-gltf-ktx2.js +2 -24
  55. package/dist/hooks/use-node-events.d.ts +1 -1
  56. package/dist/hooks/use-node-events.d.ts.map +1 -1
  57. package/dist/hooks/use-node-events.js +22 -14
  58. package/dist/index.d.ts +24 -10
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +29 -13
  61. package/dist/lib/backdrop.d.ts +33 -0
  62. package/dist/lib/backdrop.d.ts.map +1 -0
  63. package/dist/lib/backdrop.js +92 -0
  64. package/dist/lib/box-uv.d.ts +13 -0
  65. package/dist/lib/box-uv.d.ts.map +1 -0
  66. package/dist/lib/box-uv.js +32 -0
  67. package/dist/lib/csg-utils.d.ts +3 -9
  68. package/dist/lib/csg-utils.d.ts.map +1 -1
  69. package/dist/lib/csg-utils.js +65 -5
  70. package/dist/lib/csg-utils.test.d.ts +2 -0
  71. package/dist/lib/csg-utils.test.d.ts.map +1 -0
  72. package/dist/lib/csg-utils.test.js +45 -0
  73. package/dist/lib/edge-style.d.ts +1 -0
  74. package/dist/lib/edge-style.d.ts.map +1 -1
  75. package/dist/lib/edge-style.js +26 -6
  76. package/dist/lib/hero-pose.d.ts +47 -0
  77. package/dist/lib/hero-pose.d.ts.map +1 -0
  78. package/dist/lib/hero-pose.js +227 -0
  79. package/dist/lib/ink-edges.d.ts +1 -1
  80. package/dist/lib/ink-edges.d.ts.map +1 -1
  81. package/dist/lib/ink-edges.js +13 -7
  82. package/dist/lib/ktx2-loader.d.ts +46 -0
  83. package/dist/lib/ktx2-loader.d.ts.map +1 -0
  84. package/dist/lib/ktx2-loader.js +142 -0
  85. package/dist/lib/layers.d.ts +10 -0
  86. package/dist/lib/layers.d.ts.map +1 -1
  87. package/dist/lib/layers.js +10 -0
  88. package/dist/lib/materials.d.ts +16 -1
  89. package/dist/lib/materials.d.ts.map +1 -1
  90. package/dist/lib/materials.js +158 -34
  91. package/dist/lib/materials.test.d.ts +2 -0
  92. package/dist/lib/materials.test.d.ts.map +1 -0
  93. package/dist/lib/materials.test.js +25 -0
  94. package/dist/lib/merged-outline-node.test.d.ts +2 -0
  95. package/dist/lib/merged-outline-node.test.d.ts.map +1 -0
  96. package/dist/lib/merged-outline-node.test.js +22 -0
  97. package/dist/lib/scene-themes.d.ts +1 -0
  98. package/dist/lib/scene-themes.d.ts.map +1 -1
  99. package/dist/lib/scene-themes.js +25 -16
  100. package/dist/lib/shadow-only.d.ts +4 -0
  101. package/dist/lib/shadow-only.d.ts.map +1 -0
  102. package/dist/lib/shadow-only.js +36 -0
  103. package/dist/lib/snapshot-pipeline.d.ts +42 -0
  104. package/dist/lib/snapshot-pipeline.d.ts.map +1 -0
  105. package/dist/lib/snapshot-pipeline.js +254 -0
  106. package/dist/lib/terrain-perimeter-fill.d.ts +7 -0
  107. package/dist/lib/terrain-perimeter-fill.d.ts.map +1 -0
  108. package/dist/lib/terrain-perimeter-fill.js +75 -0
  109. package/dist/lib/texture-node-guard.d.ts +13 -0
  110. package/dist/lib/texture-node-guard.d.ts.map +1 -0
  111. package/dist/lib/texture-node-guard.js +39 -0
  112. package/dist/lib/texture-reference.d.ts +31 -0
  113. package/dist/lib/texture-reference.d.ts.map +1 -0
  114. package/dist/lib/texture-reference.js +139 -0
  115. package/dist/lib/texture-reference.test.d.ts +2 -0
  116. package/dist/lib/texture-reference.test.d.ts.map +1 -0
  117. package/dist/lib/texture-reference.test.js +86 -0
  118. package/dist/lib/tsl-compat.d.ts +12 -0
  119. package/dist/lib/tsl-compat.d.ts.map +1 -0
  120. package/dist/lib/tsl-compat.js +13 -0
  121. package/dist/store/use-viewer.d.ts +73 -18
  122. package/dist/store/use-viewer.d.ts.map +1 -1
  123. package/dist/store/use-viewer.js +191 -4
  124. package/dist/store/use-viewer.test.d.ts +2 -0
  125. package/dist/store/use-viewer.test.d.ts.map +1 -0
  126. package/dist/store/use-viewer.test.js +61 -0
  127. package/dist/systems/ceiling/ceiling-system.d.ts.map +1 -1
  128. package/dist/systems/ceiling/ceiling-system.js +12 -5
  129. package/dist/systems/door/door-animation.test.d.ts +2 -0
  130. package/dist/systems/door/door-animation.test.d.ts.map +1 -0
  131. package/dist/systems/door/door-animation.test.js +51 -0
  132. package/dist/systems/door/door-floor-alignment.test.d.ts +2 -0
  133. package/dist/systems/door/door-floor-alignment.test.d.ts.map +1 -0
  134. package/dist/systems/door/door-floor-alignment.test.js +50 -0
  135. package/dist/systems/door/door-system.d.ts +24 -0
  136. package/dist/systems/door/door-system.d.ts.map +1 -1
  137. package/dist/systems/door/door-system.js +494 -161
  138. package/dist/systems/fence/fence-system.d.ts +17 -0
  139. package/dist/systems/fence/fence-system.d.ts.map +1 -1
  140. package/dist/systems/fence/fence-system.js +221 -53
  141. package/dist/systems/floor-elevation/floor-elevation-system.d.ts.map +1 -1
  142. package/dist/systems/floor-elevation/floor-elevation-system.js +30 -7
  143. package/dist/systems/geometry/geometry-system.d.ts +7 -0
  144. package/dist/systems/geometry/geometry-system.d.ts.map +1 -1
  145. package/dist/systems/geometry/geometry-system.js +95 -26
  146. package/dist/systems/geometry/geometry-system.test.d.ts +2 -0
  147. package/dist/systems/geometry/geometry-system.test.d.ts.map +1 -0
  148. package/dist/systems/geometry/geometry-system.test.js +30 -0
  149. package/dist/systems/interactive/control-widget.d.ts +10 -0
  150. package/dist/systems/interactive/control-widget.d.ts.map +1 -0
  151. package/dist/systems/interactive/control-widget.js +35 -0
  152. package/dist/systems/interactive/interactive-system.d.ts.map +1 -1
  153. package/dist/systems/interactive/interactive-system.js +55 -56
  154. package/dist/systems/item/item-system.d.ts.map +1 -1
  155. package/dist/systems/item/item-system.js +20 -6
  156. package/dist/systems/level/level-system.d.ts.map +1 -1
  157. package/dist/systems/level/level-system.js +34 -9
  158. package/dist/systems/level/level-utils.d.ts +0 -3
  159. package/dist/systems/level/level-utils.d.ts.map +1 -1
  160. package/dist/systems/level/level-utils.js +7 -45
  161. package/dist/systems/roof/roof-materials.d.ts.map +1 -1
  162. package/dist/systems/roof/roof-materials.js +29 -8
  163. package/dist/systems/roof/roof-system.d.ts +21 -8
  164. package/dist/systems/roof/roof-system.d.ts.map +1 -1
  165. package/dist/systems/roof/roof-system.js +1079 -221
  166. package/dist/systems/slab/slab-system.d.ts +7 -4
  167. package/dist/systems/slab/slab-system.d.ts.map +1 -1
  168. package/dist/systems/slab/slab-system.js +31 -83
  169. package/dist/systems/slab/slab-system.test.js +54 -14
  170. package/dist/systems/stair/stair-system.js +7 -4
  171. package/dist/systems/wall/opening-cutout-geometry.d.ts +31 -0
  172. package/dist/systems/wall/opening-cutout-geometry.d.ts.map +1 -0
  173. package/dist/systems/wall/opening-cutout-geometry.js +167 -0
  174. package/dist/systems/wall/opening-cutout-geometry.test.d.ts +2 -0
  175. package/dist/systems/wall/opening-cutout-geometry.test.d.ts.map +1 -0
  176. package/dist/systems/wall/opening-cutout-geometry.test.js +172 -0
  177. package/dist/systems/wall/wall-cutout.d.ts.map +1 -1
  178. package/dist/systems/wall/wall-cutout.js +49 -17
  179. package/dist/systems/wall/wall-materials.d.ts +11 -7
  180. package/dist/systems/wall/wall-materials.d.ts.map +1 -1
  181. package/dist/systems/wall/wall-materials.js +244 -35
  182. package/dist/systems/wall/wall-opening-cutout.test.d.ts +2 -0
  183. package/dist/systems/wall/wall-opening-cutout.test.d.ts.map +1 -0
  184. package/dist/systems/wall/wall-opening-cutout.test.js +59 -0
  185. package/dist/systems/wall/wall-support-extension.test.d.ts +2 -0
  186. package/dist/systems/wall/wall-support-extension.test.d.ts.map +1 -0
  187. package/dist/systems/wall/wall-support-extension.test.js +116 -0
  188. package/dist/systems/wall/wall-system.d.ts +4 -8
  189. package/dist/systems/wall/wall-system.d.ts.map +1 -1
  190. package/dist/systems/wall/wall-system.js +397 -177
  191. package/dist/systems/wall/wall-terrain-bottom.test.d.ts +2 -0
  192. package/dist/systems/wall/wall-terrain-bottom.test.d.ts.map +1 -0
  193. package/dist/systems/wall/wall-terrain-bottom.test.js +34 -0
  194. package/dist/systems/window/window-animation-system.d.ts +12 -0
  195. package/dist/systems/window/window-animation-system.d.ts.map +1 -1
  196. package/dist/systems/window/window-animation-system.js +16 -5
  197. package/dist/systems/window/window-system.d.ts +7 -0
  198. package/dist/systems/window/window-system.d.ts.map +1 -1
  199. package/dist/systems/window/window-system.js +240 -14
  200. package/package.json +4 -4
  201. package/dist/components/viewer/ground-occluder.d.ts +0 -2
  202. package/dist/components/viewer/ground-occluder.d.ts.map +0 -1
  203. package/dist/components/viewer/ground-occluder.js +0 -67
  204. package/dist/components/viewer/walkthrough-controls.d.ts +0 -2
  205. package/dist/components/viewer/walkthrough-controls.d.ts.map +0 -1
  206. package/dist/components/viewer/walkthrough-controls.js +0 -131
@@ -0,0 +1,31 @@
1
+ import type * as THREE from 'three';
2
+ export type PascalTextureMap = 'basecolor' | 'normal' | 'roughness' | 'metalness' | 'height' | 'other';
3
+ export type PascalTextureColorSpace = 'srgb' | 'linear';
4
+ type PascalTextureRefBase = {
5
+ v: 1;
6
+ src: string;
7
+ map: PascalTextureMap;
8
+ colorSpace: PascalTextureColorSpace;
9
+ };
10
+ export type PascalTextureRef = (PascalTextureRefBase & {
11
+ kind: 'library-material' | 'app-material' | 'project-asset';
12
+ }) | (PascalTextureRefBase & {
13
+ kind: 'item-glb';
14
+ imageIndex: number;
15
+ });
16
+ export declare function textureMapForSlot(slot: string): PascalTextureMap;
17
+ export declare function stampPascalTextureRef(texture: THREE.Texture, input: {
18
+ /** 'material' resolves to library-material (storage bucket) or
19
+ * app-material (static catalog on the assets CDN) by URL shape. */
20
+ kind: 'material' | 'project-asset';
21
+ src: string;
22
+ slot: string;
23
+ } | {
24
+ kind: 'item-glb';
25
+ src: string;
26
+ slot: string;
27
+ imageIndex: number;
28
+ }): PascalTextureRef | null;
29
+ export declare function getPascalTextureRef(texture: THREE.Texture): PascalTextureRef | null;
30
+ export {};
31
+ //# sourceMappingURL=texture-reference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"texture-reference.d.ts","sourceRoot":"","sources":["../../src/lib/texture-reference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAGnC,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,QAAQ,GACR,WAAW,GACX,WAAW,GACX,QAAQ,GACR,OAAO,CAAA;AAEX,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEvD,KAAK,oBAAoB,GAAG;IAC1B,CAAC,EAAE,CAAC,CAAA;IACJ,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,gBAAgB,CAAA;IACrB,UAAU,EAAE,uBAAuB,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,gBAAgB,GACxB,CAAC,oBAAoB,GAAG;IACtB,IAAI,EAAE,kBAAkB,GAAG,cAAc,GAAG,eAAe,CAAA;CAC5D,CAAC,GACF,CAAC,oBAAoB,GAAG;IACtB,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAC,CAAA;AAqDN,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAgBhE;AAMD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,KAAK,EACD;IACE;wEACoE;IACpE,IAAI,EAAE,UAAU,GAAG,eAAe,CAAA;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACb,GACD;IACE,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB,GACJ,gBAAgB,GAAG,IAAI,CA6BzB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAmCnF"}
@@ -0,0 +1,139 @@
1
+ import { ASSETS_CDN_URL } from './asset-url';
2
+ const STORAGE_BUCKET_BY_KIND = {
3
+ 'library-material': 'materials',
4
+ 'item-glb': 'items',
5
+ 'project-asset': 'project-assets',
6
+ };
7
+ let cachedStorageOrigin;
8
+ function pascalStorageOrigin() {
9
+ if (cachedStorageOrigin !== undefined)
10
+ return cachedStorageOrigin;
11
+ try {
12
+ const url = process.env.NEXT_PUBLIC_SUPABASE_URL;
13
+ cachedStorageOrigin = url ? new URL(url).origin : null;
14
+ }
15
+ catch {
16
+ cachedStorageOrigin = null;
17
+ }
18
+ return cachedStorageOrigin;
19
+ }
20
+ /** Static catalog materials ship in the app's public dir and resolve through
21
+ * the assets CDN (`/material/{category}/{slug}/{slug}_{map}_{size}.ktx2`) —
22
+ * a server-known KTX2 source like the storage buckets, just app-hosted. */
23
+ function isAppMaterialUrl(src) {
24
+ try {
25
+ const url = new URL(src);
26
+ return url.origin === new URL(ASSETS_CDN_URL).origin && url.pathname.startsWith('/material/');
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ const TEXTURE_MAPS = new Set([
33
+ 'basecolor',
34
+ 'normal',
35
+ 'roughness',
36
+ 'metalness',
37
+ 'height',
38
+ 'other',
39
+ ]);
40
+ function isPascalStorageUrl(src, kind) {
41
+ const origin = pascalStorageOrigin();
42
+ if (!origin)
43
+ return false;
44
+ try {
45
+ const url = new URL(src);
46
+ const bucket = STORAGE_BUCKET_BY_KIND[kind];
47
+ return url.origin === origin && url.pathname.startsWith(`/storage/v1/object/public/${bucket}/`);
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ export function textureMapForSlot(slot) {
54
+ switch (slot) {
55
+ case 'map':
56
+ return 'basecolor';
57
+ case 'normalMap':
58
+ return 'normal';
59
+ case 'roughnessMap':
60
+ return 'roughness';
61
+ case 'metalnessMap':
62
+ return 'metalness';
63
+ case 'displacementMap':
64
+ case 'bumpMap':
65
+ return 'height';
66
+ default:
67
+ return 'other';
68
+ }
69
+ }
70
+ function textureColorSpace(texture) {
71
+ return texture.colorSpace === 'srgb' ? 'srgb' : 'linear';
72
+ }
73
+ export function stampPascalTextureRef(texture, input) {
74
+ const base = {
75
+ v: 1,
76
+ src: input.src,
77
+ map: textureMapForSlot(input.slot),
78
+ colorSpace: textureColorSpace(texture),
79
+ };
80
+ let ref;
81
+ if (input.kind === 'item-glb') {
82
+ if (!isPascalStorageUrl(input.src, 'item-glb'))
83
+ return null;
84
+ if (!Number.isInteger(input.imageIndex) || input.imageIndex < 0)
85
+ return null;
86
+ ref = { ...base, kind: 'item-glb', imageIndex: input.imageIndex };
87
+ }
88
+ else {
89
+ const kind = input.kind === 'material'
90
+ ? isPascalStorageUrl(input.src, 'library-material')
91
+ ? 'library-material'
92
+ : isAppMaterialUrl(input.src)
93
+ ? 'app-material'
94
+ : null
95
+ : isPascalStorageUrl(input.src, 'project-asset')
96
+ ? 'project-asset'
97
+ : null;
98
+ if (!kind)
99
+ return null;
100
+ ref = { ...base, kind };
101
+ }
102
+ texture.userData.pascalTextureRef = ref;
103
+ return ref;
104
+ }
105
+ export function getPascalTextureRef(texture) {
106
+ const raw = texture.userData.pascalTextureRef;
107
+ if (!raw || typeof raw !== 'object')
108
+ return null;
109
+ const candidate = raw;
110
+ const kind = candidate.kind;
111
+ if (candidate.v !== 1 ||
112
+ (kind !== 'library-material' &&
113
+ kind !== 'app-material' &&
114
+ kind !== 'item-glb' &&
115
+ kind !== 'project-asset') ||
116
+ typeof candidate.src !== 'string' ||
117
+ !(kind === 'app-material'
118
+ ? isAppMaterialUrl(candidate.src)
119
+ : isPascalStorageUrl(candidate.src, kind)) ||
120
+ typeof candidate.map !== 'string' ||
121
+ !TEXTURE_MAPS.has(candidate.map) ||
122
+ (candidate.colorSpace !== 'srgb' && candidate.colorSpace !== 'linear')) {
123
+ return null;
124
+ }
125
+ const base = {
126
+ v: 1,
127
+ src: candidate.src,
128
+ map: candidate.map,
129
+ colorSpace: candidate.colorSpace,
130
+ };
131
+ if (kind === 'item-glb') {
132
+ if (!Number.isInteger(candidate.imageIndex) || candidate.imageIndex < 0)
133
+ return null;
134
+ return { ...base, kind, imageIndex: candidate.imageIndex };
135
+ }
136
+ if (candidate.imageIndex !== undefined)
137
+ return null;
138
+ return { ...base, kind };
139
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=texture-reference.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"texture-reference.test.d.ts","sourceRoot":"","sources":["../../src/lib/texture-reference.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ // @ts-expect-error — bun:test is provided by the Bun runtime; viewer does not
2
+ // depend on @types/bun so the import type is unresolved at compile time.
3
+ import { describe, expect, test } from 'bun:test';
4
+ import * as THREE from 'three';
5
+ import { getPascalTextureRef, stampPascalTextureRef } from './texture-reference';
6
+ // The module reads the storage origin lazily on first use, so setting the env
7
+ // here (before any stamp call) pins it for the whole test file.
8
+ process.env.NEXT_PUBLIC_SUPABASE_URL ??= 'https://test-storage.supabase.co';
9
+ const STORAGE_ORIGIN = new URL(process.env.NEXT_PUBLIC_SUPABASE_URL).origin;
10
+ describe('Pascal texture references', () => {
11
+ test("resolves 'material' input to library-material for storage-bucket URLs", () => {
12
+ const texture = new THREE.Texture();
13
+ texture.colorSpace = THREE.SRGBColorSpace;
14
+ const src = `${STORAGE_ORIGIN}/storage/v1/object/public/materials/user/mtl_1/oak_basecolor_512.ktx2`;
15
+ const ref = stampPascalTextureRef(texture, { kind: 'material', src, slot: 'map' });
16
+ expect(ref).toEqual({
17
+ v: 1,
18
+ kind: 'library-material',
19
+ src,
20
+ map: 'basecolor',
21
+ colorSpace: 'srgb',
22
+ });
23
+ expect(getPascalTextureRef(texture)).toEqual(ref);
24
+ });
25
+ test("resolves 'material' input to app-material for assets-CDN catalog URLs", () => {
26
+ const cdnOrigin = new URL(process.env.NEXT_PUBLIC_ASSETS_CDN_URL || 'https://editor.pascal.app')
27
+ .origin;
28
+ const texture = new THREE.Texture();
29
+ const src = `${cdnOrigin}/material/concrete/prepared_drywall/prepared_drywall_normal_512.ktx2`;
30
+ const ref = stampPascalTextureRef(texture, { kind: 'material', src, slot: 'normalMap' });
31
+ expect(ref).toEqual({ v: 1, kind: 'app-material', src, map: 'normal', colorSpace: 'linear' });
32
+ expect(getPascalTextureRef(texture)).toEqual(ref);
33
+ const foreign = new THREE.Texture();
34
+ expect(stampPascalTextureRef(foreign, {
35
+ kind: 'material',
36
+ src: 'https://example.com/material/concrete/x/x_basecolor_512.ktx2',
37
+ slot: 'map',
38
+ })).toBeNull();
39
+ });
40
+ test('stamps the exact project-asset payload for Pascal storage URLs', () => {
41
+ const texture = new THREE.Texture();
42
+ texture.colorSpace = THREE.SRGBColorSpace;
43
+ const ref = stampPascalTextureRef(texture, {
44
+ kind: 'project-asset',
45
+ src: `${STORAGE_ORIGIN}/storage/v1/object/public/project-assets/project/asset.png`,
46
+ slot: 'map',
47
+ });
48
+ expect(ref).toEqual({
49
+ v: 1,
50
+ kind: 'project-asset',
51
+ src: `${STORAGE_ORIGIN}/storage/v1/object/public/project-assets/project/asset.png`,
52
+ map: 'basecolor',
53
+ colorSpace: 'srgb',
54
+ });
55
+ expect(getPascalTextureRef(texture)).toEqual(ref);
56
+ });
57
+ test('keeps local and non-Pascal URLs unstamped', () => {
58
+ for (const src of [
59
+ 'asset://project/asset',
60
+ 'blob:https://editor.pascal.app/asset',
61
+ 'data:image/png;base64,AAAA',
62
+ 'https://example.com/storage/v1/object/public/project-assets/project/asset.png',
63
+ ]) {
64
+ const texture = new THREE.Texture();
65
+ expect(stampPascalTextureRef(texture, { kind: 'project-asset', src, slot: 'map' })).toBeNull();
66
+ expect(texture.userData.pascalTextureRef).toBeUndefined();
67
+ }
68
+ });
69
+ test('includes imageIndex only for item GLB references', () => {
70
+ const texture = new THREE.Texture();
71
+ const ref = stampPascalTextureRef(texture, {
72
+ kind: 'item-glb',
73
+ src: `${STORAGE_ORIGIN}/storage/v1/object/public/items/system/chair/model.glb`,
74
+ slot: 'normalMap',
75
+ imageIndex: 2,
76
+ });
77
+ expect(ref).toEqual({
78
+ v: 1,
79
+ kind: 'item-glb',
80
+ src: `${STORAGE_ORIGIN}/storage/v1/object/public/items/system/chair/model.glb`,
81
+ imageIndex: 2,
82
+ map: 'normal',
83
+ colorSpace: 'linear',
84
+ });
85
+ });
86
+ });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * three runs at 0.185 but @types/three is pinned at 0.184: the 0.185 typings
3
+ * make tsgo's type inference allocate unboundedly (microsoft/typescript-go
4
+ * #2125 class) and OOM the machine. r185 renamed directionToColor /
5
+ * colorToDirection to packNormalToRGB / unpackRGBToNormal — re-export the new
6
+ * runtime names under the old names' signatures. Delete this file (and the
7
+ * @types/three pin) once tsgo handles the 0.185 types; the `typeof` references
8
+ * to the removed old names will fail the build as a reminder.
9
+ */
10
+ export declare const packNormalToRGB: (node: import("three/webgpu").Node) => import("three/webgpu").Node<"vec3">;
11
+ export declare const unpackRGBToNormal: (node: import("three/webgpu").Node) => import("three/webgpu").Node<"vec3">;
12
+ //# sourceMappingURL=tsl-compat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsl-compat.d.ts","sourceRoot":"","sources":["../../src/lib/tsl-compat.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,4EACV,CAAA;AAClB,eAAO,MAAM,iBAAiB,4EAEX,CAAA"}
@@ -0,0 +1,13 @@
1
+ import * as TSL from 'three/tsl';
2
+ /**
3
+ * three runs at 0.185 but @types/three is pinned at 0.184: the 0.185 typings
4
+ * make tsgo's type inference allocate unboundedly (microsoft/typescript-go
5
+ * #2125 class) and OOM the machine. r185 renamed directionToColor /
6
+ * colorToDirection to packNormalToRGB / unpackRGBToNormal — re-export the new
7
+ * runtime names under the old names' signatures. Delete this file (and the
8
+ * @types/three pin) once tsgo handles the 0.185 types; the `typeof` references
9
+ * to the removed old names will fail the build as a reminder.
10
+ */
11
+ export const packNormalToRGB = TSL
12
+ .packNormalToRGB;
13
+ export const unpackRGBToNormal = TSL.unpackRGBToNormal;
@@ -3,6 +3,7 @@ import type { Object3D } from 'three';
3
3
  import type { EdgeMode } from '../lib/edge-style';
4
4
  import type { ColorPreset, RenderShading } from '../lib/materials';
5
5
  export type RenderContext = 'editor' | 'viewer';
6
+ export type MetricNotation = 'meters' | 'millimeters';
6
7
  type SelectionPath = {
7
8
  buildingId: BuildingNode['id'] | null;
8
9
  levelId: LevelNode['id'] | null;
@@ -17,6 +18,10 @@ type ViewerState = {
17
18
  selection: SelectionPath;
18
19
  previewSelectedIds: BaseNode['id'][];
19
20
  setPreviewSelectedIds: (ids: BaseNode['id'][]) => void;
21
+ /** Host-owned selection highlights rendered through the viewer's native
22
+ * selection paths without changing the local user's editable selection. */
23
+ externalSelectedIds: BaseNode['id'][];
24
+ setExternalSelectedIds: (ids: BaseNode['id'][]) => void;
20
25
  hoverHighlightMode: string;
21
26
  setHoverHighlightMode: (mode: string) => void;
22
27
  hoveredId: AnyNode['id'] | ZoneNode['id'] | null;
@@ -27,6 +32,23 @@ type ViewerState = {
27
32
  setSceneTheme: (id: string) => void;
28
33
  renderContext: RenderContext;
29
34
  setRenderContext: (context: RenderContext) => void;
35
+ /** True during a GLB bake/export pass. Renderers that normally draw via a
36
+ * collective InstancedMesh (`def.system`) and mount only an invisible per-node
37
+ * proxy can watch this to emit real, visible geometry so the exporter — which
38
+ * clones only the `scene-renderer` subtree — captures them. Transient (never
39
+ * persisted). */
40
+ isExporting: boolean;
41
+ setExporting: (value: boolean) => void;
42
+ /** Item model loads that exhausted their retries — nodeId → asset URL. The
43
+ * scene renders without these items (they settle as skipped); a bake host
44
+ * can persist the map onto the artifact's metadata so a missing item is
45
+ * queryable instead of silently absent. Transient (never persisted). */
46
+ itemLoadFailures: Record<string, string>;
47
+ reportItemLoadFailure: (nodeId: string, url: string) => void;
48
+ clearItemLoadFailure: (nodeId: string) => void;
49
+ /** Suspend the render loop while the canvas is fully covered (e.g. studio gallery). */
50
+ renderPaused: boolean;
51
+ setRenderPaused: (value: boolean) => void;
30
52
  shading: RenderShading;
31
53
  shadingByContext: Partial<Record<RenderContext, RenderShading>>;
32
54
  setShading: (shading: RenderShading) => void;
@@ -40,32 +62,55 @@ type ViewerState = {
40
62
  setShadows: (shadows: boolean) => void;
41
63
  unit: 'metric' | 'imperial';
42
64
  setUnit: (unit: 'metric' | 'imperial') => void;
65
+ metricNotation: MetricNotation;
66
+ setMetricNotation: (notation: MetricNotation) => void;
67
+ /** True once the user explicitly picked a unit. Until then `unit` is a
68
+ * locale-derived default and is not persisted, so the default can keep
69
+ * tracking the browser locale across sessions. */
70
+ unitExplicit: boolean;
43
71
  levelMode: 'stacked' | 'exploded' | 'solo' | 'manual';
44
72
  setLevelMode: (mode: 'stacked' | 'exploded' | 'solo' | 'manual') => void;
45
- wallMode: 'up' | 'cutaway' | 'down';
46
- setWallMode: (mode: 'up' | 'cutaway' | 'down') => void;
73
+ wallMode: 'up' | 'cutaway' | 'down' | 'translucent';
74
+ setWallMode: (mode: 'up' | 'cutaway' | 'down' | 'translucent') => void;
47
75
  showScans: boolean;
48
76
  setShowScans: (show: boolean) => void;
49
77
  showGuides: boolean;
50
78
  setShowGuides: (show: boolean) => void;
51
79
  showGrid: boolean;
52
80
  setShowGrid: (show: boolean) => void;
81
+ showMeasurements: boolean;
82
+ setShowMeasurements: (show: boolean) => void;
83
+ showZones: boolean;
84
+ setShowZones: (show: boolean) => void;
85
+ transparentBackground: boolean;
86
+ setTransparentBackground: (transparent: boolean) => void;
87
+ inkOpacity: number | null;
88
+ setInkOpacity: (opacity: number | null) => void;
53
89
  projectId: string | null;
54
90
  setProjectId: (id: string | null) => void;
55
91
  projectPreferences: Record<string, {
56
92
  showScans?: boolean;
57
93
  showGuides?: boolean;
58
94
  showGrid?: boolean;
95
+ showMeasurements?: boolean;
59
96
  }>;
60
97
  setSelection: (updates: Partial<SelectionPath>) => void;
61
98
  resetSelection: () => void;
62
99
  outliner: Outliner;
100
+ /** Bumped by GeometrySystem after each rebuild pass so selection/outline
101
+ * effects can re-apply to the freshly swapped meshes. */
102
+ geometryRevision: number;
103
+ bumpGeometryRevision: () => void;
63
104
  exportScene: ((format?: 'glb' | 'stl' | 'obj') => Promise<void>) | null;
64
105
  setExportScene: (fn: ((format?: 'glb' | 'stl' | 'obj') => Promise<void>) | null) => void;
65
106
  debugColors: boolean;
66
107
  setDebugColors: (enabled: boolean) => void;
67
108
  walkthroughMode: boolean;
68
109
  setWalkthroughMode: (mode: boolean) => void;
110
+ /** Pointer lock temporarily released mid-walkthrough (⌘/PrintScreen — OS
111
+ * screenshot needs a movable cursor); clicking the canvas re-locks. */
112
+ walkthroughSuspended: boolean;
113
+ setWalkthroughSuspended: (suspended: boolean) => void;
69
114
  cameraDragging: boolean;
70
115
  setCameraDragging: (dragging: boolean) => void;
71
116
  /**
@@ -86,6 +131,16 @@ declare const useViewer: import("zustand").UseBoundStore<Omit<import("zustand").
86
131
  setState(state: ViewerState | ((state: ViewerState) => ViewerState), replace: true): unknown;
87
132
  persist: {
88
133
  setOptions: (options: Partial<import("zustand/middleware").PersistOptions<ViewerState, {
134
+ metricNotation: MetricNotation;
135
+ levelMode: "manual" | "stacked" | "exploded" | "solo";
136
+ wallMode: "up" | "down" | "cutaway" | "translucent";
137
+ projectPreferences: Record<string, {
138
+ showScans?: boolean;
139
+ showGuides?: boolean;
140
+ showGrid?: boolean;
141
+ showMeasurements?: boolean;
142
+ }>;
143
+ unit?: "metric" | "imperial" | undefined;
89
144
  cameraMode: "perspective" | "orthographic";
90
145
  sceneTheme: string;
91
146
  shadingByContext: Partial<Record<RenderContext, RenderShading>>;
@@ -93,14 +148,6 @@ declare const useViewer: import("zustand").UseBoundStore<Omit<import("zustand").
93
148
  colorPreset: ColorPreset;
94
149
  edges: EdgeMode;
95
150
  shadows: boolean;
96
- unit: "metric" | "imperial";
97
- levelMode: "manual" | "stacked" | "exploded" | "solo";
98
- wallMode: "up" | "down" | "cutaway";
99
- projectPreferences: Record<string, {
100
- showScans?: boolean;
101
- showGuides?: boolean;
102
- showGrid?: boolean;
103
- }>;
104
151
  }, unknown>>) => void;
105
152
  clearStorage: () => void;
106
153
  rehydrate: () => Promise<void> | void;
@@ -108,6 +155,16 @@ declare const useViewer: import("zustand").UseBoundStore<Omit<import("zustand").
108
155
  onHydrate: (fn: (state: ViewerState) => void) => () => void;
109
156
  onFinishHydration: (fn: (state: ViewerState) => void) => () => void;
110
157
  getOptions: () => Partial<import("zustand/middleware").PersistOptions<ViewerState, {
158
+ metricNotation: MetricNotation;
159
+ levelMode: "manual" | "stacked" | "exploded" | "solo";
160
+ wallMode: "up" | "down" | "cutaway" | "translucent";
161
+ projectPreferences: Record<string, {
162
+ showScans?: boolean;
163
+ showGuides?: boolean;
164
+ showGrid?: boolean;
165
+ showMeasurements?: boolean;
166
+ }>;
167
+ unit?: "metric" | "imperial" | undefined;
111
168
  cameraMode: "perspective" | "orthographic";
112
169
  sceneTheme: string;
113
170
  shadingByContext: Partial<Record<RenderContext, RenderShading>>;
@@ -115,16 +172,14 @@ declare const useViewer: import("zustand").UseBoundStore<Omit<import("zustand").
115
172
  colorPreset: ColorPreset;
116
173
  edges: EdgeMode;
117
174
  shadows: boolean;
118
- unit: "metric" | "imperial";
119
- levelMode: "manual" | "stacked" | "exploded" | "solo";
120
- wallMode: "up" | "down" | "cutaway";
121
- projectPreferences: Record<string, {
122
- showScans?: boolean;
123
- showGuides?: boolean;
124
- showGrid?: boolean;
125
- }>;
126
175
  }, unknown>>;
127
176
  };
128
177
  }>;
178
+ /** Apply an authoritative country code (e.g. IP-derived by the host app) as
179
+ * the unit default. Stronger signal than the timezone heuristic used at store
180
+ * creation, but still a default: it never overrides an explicit user choice
181
+ * and is not persisted (the unit only sticks once the user touches the
182
+ * toggle). */
183
+ export declare function applyCountryUnitDefault(country: string | null | undefined): void;
129
184
  export default useViewer;
130
185
  //# sourceMappingURL=use-viewer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-viewer.d.ts","sourceRoot":"","sources":["../../src/store/use-viewer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-viewer.d.ts","sourceRoot":"","sources":["../../src/store/use-viewer.ts"],"names":[],"mappings":"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"}