@pascal-app/viewer 1.0.0-beta.5 → 1.0.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 (190) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -0
  3. package/dist/capture/asset-url.d.ts +2 -0
  4. package/dist/capture/asset-url.d.ts.map +1 -0
  5. package/dist/capture/asset-url.js +13 -0
  6. package/dist/capture/capture-runtime.d.ts +43 -0
  7. package/dist/capture/capture-runtime.d.ts.map +1 -0
  8. package/dist/capture/capture-runtime.js +228 -0
  9. package/dist/capture/frame.d.ts +4 -0
  10. package/dist/capture/frame.d.ts.map +1 -0
  11. package/dist/capture/frame.js +21 -0
  12. package/dist/capture/index.d.ts +12 -0
  13. package/dist/capture/index.d.ts.map +1 -0
  14. package/dist/capture/index.js +11 -0
  15. package/dist/capture/layer-visibility.d.ts +5 -0
  16. package/dist/capture/layer-visibility.d.ts.map +1 -0
  17. package/dist/capture/layer-visibility.js +11 -0
  18. package/dist/capture/layers/clay-matcap.d.ts +3 -0
  19. package/dist/capture/layers/clay-matcap.d.ts.map +1 -0
  20. package/dist/capture/layers/clay-matcap.js +26 -0
  21. package/dist/capture/layers/device-motion-layer.d.ts +7 -0
  22. package/dist/capture/layers/device-motion-layer.d.ts.map +1 -0
  23. package/dist/capture/layers/device-motion-layer.js +78 -0
  24. package/dist/capture/layers/point-cloud-layer.d.ts +15 -0
  25. package/dist/capture/layers/point-cloud-layer.d.ts.map +1 -0
  26. package/dist/capture/layers/point-cloud-layer.js +106 -0
  27. package/dist/capture/layers/room-model-layer.d.ts +9 -0
  28. package/dist/capture/layers/room-model-layer.d.ts.map +1 -0
  29. package/dist/capture/layers/room-model-layer.js +71 -0
  30. package/dist/capture/layers/surface-mesh-data.d.ts +9 -0
  31. package/dist/capture/layers/surface-mesh-data.d.ts.map +1 -0
  32. package/dist/capture/layers/surface-mesh-data.js +74 -0
  33. package/dist/capture/layers/surface-mesh-layer.d.ts +7 -0
  34. package/dist/capture/layers/surface-mesh-layer.d.ts.map +1 -0
  35. package/dist/capture/layers/surface-mesh-layer.js +16 -0
  36. package/dist/capture/preview.d.ts +3 -0
  37. package/dist/capture/preview.d.ts.map +1 -0
  38. package/dist/capture/preview.js +2 -0
  39. package/dist/capture/source-state.d.ts +22 -0
  40. package/dist/capture/source-state.d.ts.map +1 -0
  41. package/dist/capture/source-state.js +182 -0
  42. package/dist/capture/stream-rendering.d.ts +14 -0
  43. package/dist/capture/stream-rendering.d.ts.map +1 -0
  44. package/dist/capture/stream-rendering.js +69 -0
  45. package/dist/capture/trajectory.d.ts +20 -0
  46. package/dist/capture/trajectory.d.ts.map +1 -0
  47. package/dist/capture/trajectory.js +77 -0
  48. package/dist/components/viewer/batched-mesh-spike.d.ts +14 -0
  49. package/dist/components/viewer/batched-mesh-spike.d.ts.map +1 -0
  50. package/dist/components/viewer/batched-mesh-spike.js +64 -0
  51. package/dist/components/viewer/frame-limiter.d.ts.map +1 -1
  52. package/dist/components/viewer/frame-limiter.js +4 -3
  53. package/dist/components/viewer/index.d.ts.map +1 -1
  54. package/dist/components/viewer/index.js +70 -62
  55. package/dist/components/viewer/lights.d.ts.map +1 -1
  56. package/dist/components/viewer/lights.js +123 -89
  57. package/dist/components/viewer/perf-monitor.d.ts +6 -1
  58. package/dist/components/viewer/perf-monitor.d.ts.map +1 -1
  59. package/dist/components/viewer/perf-monitor.js +307 -116
  60. package/dist/components/viewer/perf-panel.d.ts +3 -0
  61. package/dist/components/viewer/perf-panel.d.ts.map +1 -0
  62. package/dist/components/viewer/perf-panel.js +178 -0
  63. package/dist/components/viewer/pointer-raycast-layers.d.ts +15 -0
  64. package/dist/components/viewer/pointer-raycast-layers.d.ts.map +1 -0
  65. package/dist/components/viewer/pointer-raycast-layers.js +28 -0
  66. package/dist/components/viewer/post-processing.d.ts.map +1 -1
  67. package/dist/components/viewer/post-processing.js +124 -83
  68. package/dist/components/viewer/registered-systems.d.ts +14 -5
  69. package/dist/components/viewer/registered-systems.d.ts.map +1 -1
  70. package/dist/components/viewer/registered-systems.js +22 -10
  71. package/dist/components/viewer/scene-atmosphere.d.ts +30 -0
  72. package/dist/components/viewer/scene-atmosphere.d.ts.map +1 -0
  73. package/dist/components/viewer/scene-atmosphere.js +89 -0
  74. package/dist/components/viewer/scene-environment.d.ts.map +1 -1
  75. package/dist/components/viewer/scene-environment.js +19 -5
  76. package/dist/components/viewer/scene-ground-replacement.d.ts +5 -0
  77. package/dist/components/viewer/scene-ground-replacement.d.ts.map +1 -0
  78. package/dist/components/viewer/scene-ground-replacement.js +35 -0
  79. package/dist/components/viewer/viewer-camera.d.ts.map +1 -1
  80. package/dist/components/viewer/viewer-camera.js +4 -1
  81. package/dist/components/viewer/viewer-presentations.d.ts +67 -0
  82. package/dist/components/viewer/viewer-presentations.d.ts.map +1 -0
  83. package/dist/components/viewer/viewer-presentations.js +120 -0
  84. package/dist/hooks/use-library-materials-version.d.ts +7 -0
  85. package/dist/hooks/use-library-materials-version.d.ts.map +1 -0
  86. package/dist/hooks/use-library-materials-version.js +10 -0
  87. package/dist/hooks/use-node-events.d.ts.map +1 -1
  88. package/dist/hooks/use-node-events.js +1 -0
  89. package/dist/index.d.ts +15 -6
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +15 -6
  92. package/dist/lib/csg-utils.d.ts +1 -0
  93. package/dist/lib/csg-utils.d.ts.map +1 -1
  94. package/dist/lib/csg-utils.js +6 -1
  95. package/dist/lib/gpu-perf.d.ts +0 -2
  96. package/dist/lib/gpu-perf.d.ts.map +1 -1
  97. package/dist/lib/gpu-perf.js +7 -21
  98. package/dist/lib/layer-pass.d.ts +28 -0
  99. package/dist/lib/layer-pass.d.ts.map +1 -0
  100. package/dist/lib/layer-pass.js +254 -0
  101. package/dist/lib/materials.d.ts +12 -0
  102. package/dist/lib/materials.d.ts.map +1 -1
  103. package/dist/lib/materials.js +51 -17
  104. package/dist/lib/merged-outline-node.d.ts +17 -8
  105. package/dist/lib/merged-outline-node.d.ts.map +1 -1
  106. package/dist/lib/merged-outline-node.js +194 -52
  107. package/dist/lib/perf-actions.d.ts +55 -0
  108. package/dist/lib/perf-actions.d.ts.map +1 -0
  109. package/dist/lib/perf-actions.js +211 -0
  110. package/dist/lib/perf-observers.d.ts +2 -0
  111. package/dist/lib/perf-observers.d.ts.map +1 -0
  112. package/dist/lib/perf-observers.js +17 -0
  113. package/dist/lib/perf-panel-store.d.ts +71 -0
  114. package/dist/lib/perf-panel-store.d.ts.map +1 -0
  115. package/dist/lib/perf-panel-store.js +29 -0
  116. package/dist/lib/perf-tracks.d.ts +43 -0
  117. package/dist/lib/perf-tracks.d.ts.map +1 -0
  118. package/dist/lib/perf-tracks.js +113 -0
  119. package/dist/lib/pointer-events.d.ts +7 -0
  120. package/dist/lib/pointer-events.d.ts.map +1 -0
  121. package/dist/lib/pointer-events.js +680 -0
  122. package/dist/lib/post-processing-resources.d.ts +12 -0
  123. package/dist/lib/post-processing-resources.d.ts.map +1 -0
  124. package/dist/lib/post-processing-resources.js +19 -0
  125. package/dist/lib/renderer-capability.d.ts.map +1 -1
  126. package/dist/lib/renderer-capability.js +4 -2
  127. package/dist/lib/scene-visibility.d.ts +2 -1
  128. package/dist/lib/scene-visibility.d.ts.map +1 -1
  129. package/dist/lib/scene-visibility.js +22 -1
  130. package/dist/store/use-viewer.d.ts +2 -2
  131. package/dist/store/use-viewer.d.ts.map +1 -1
  132. package/dist/systems/ceiling/ceiling-system.js +1 -1
  133. package/dist/systems/door/door-animation-system.d.ts.map +1 -1
  134. package/dist/systems/door/door-animation-system.js +6 -9
  135. package/dist/systems/door/door-system.d.ts.map +1 -1
  136. package/dist/systems/door/door-system.js +13 -2
  137. package/dist/systems/geometry/geometry-system.d.ts.map +1 -1
  138. package/dist/systems/geometry/geometry-system.js +3 -2
  139. package/dist/systems/level/level-system.d.ts.map +1 -1
  140. package/dist/systems/level/level-system.js +1 -1
  141. package/dist/systems/level/level-utils.d.ts +9 -0
  142. package/dist/systems/level/level-utils.d.ts.map +1 -1
  143. package/dist/systems/level/level-utils.js +14 -0
  144. package/dist/systems/perf-action-settle/perf-action-settle-system.d.ts +8 -0
  145. package/dist/systems/perf-action-settle/perf-action-settle-system.d.ts.map +1 -0
  146. package/dist/systems/perf-action-settle/perf-action-settle-system.js +32 -0
  147. package/dist/systems/roof/roof-system.d.ts.map +1 -1
  148. package/dist/systems/roof/roof-system.js +1196 -58
  149. package/dist/systems/scan/scan-system.js +6 -5
  150. package/dist/systems/slab/slab-system.d.ts.map +1 -1
  151. package/dist/systems/slab/slab-system.js +1 -2
  152. package/dist/systems/stair/stair-system.d.ts.map +1 -1
  153. package/dist/systems/stair/stair-system.js +9 -8
  154. package/dist/systems/surface-hole-geometry.d.ts +1 -1
  155. package/dist/systems/surface-hole-geometry.d.ts.map +1 -1
  156. package/dist/systems/surface-hole-geometry.js +1 -1
  157. package/dist/systems/wall/level-miter-cache.d.ts.map +1 -1
  158. package/dist/systems/wall/wall-build-lifecycle.d.ts +9 -0
  159. package/dist/systems/wall/wall-build-lifecycle.d.ts.map +1 -0
  160. package/dist/systems/wall/wall-build-lifecycle.js +74 -0
  161. package/dist/systems/wall/wall-cutout-cache.d.ts +57 -0
  162. package/dist/systems/wall/wall-cutout-cache.d.ts.map +1 -0
  163. package/dist/systems/wall/wall-cutout-cache.js +304 -0
  164. package/dist/systems/wall/wall-cutout.d.ts +12 -1
  165. package/dist/systems/wall/wall-cutout.d.ts.map +1 -1
  166. package/dist/systems/wall/wall-cutout.js +24 -161
  167. package/dist/systems/wall/wall-material-variant.d.ts +31 -0
  168. package/dist/systems/wall/wall-material-variant.d.ts.map +1 -0
  169. package/dist/systems/wall/wall-material-variant.js +10 -0
  170. package/dist/systems/wall/wall-materials.d.ts +6 -0
  171. package/dist/systems/wall/wall-materials.d.ts.map +1 -1
  172. package/dist/systems/wall/wall-materials.js +29 -13
  173. package/dist/systems/wall/wall-placeholder-sweep.d.ts +50 -0
  174. package/dist/systems/wall/wall-placeholder-sweep.d.ts.map +1 -0
  175. package/dist/systems/wall/wall-placeholder-sweep.js +51 -0
  176. package/dist/systems/wall/wall-rebuild-notifications.d.ts +5 -0
  177. package/dist/systems/wall/wall-rebuild-notifications.d.ts.map +1 -0
  178. package/dist/systems/wall/wall-rebuild-notifications.js +23 -0
  179. package/dist/systems/wall/wall-system.d.ts +11 -4
  180. package/dist/systems/wall/wall-system.d.ts.map +1 -1
  181. package/dist/systems/wall/wall-system.js +405 -153
  182. package/dist/systems/window/window-animation-system.d.ts.map +1 -1
  183. package/dist/systems/window/window-animation-system.js +9 -8
  184. package/dist/systems/window/window-system.d.ts +1 -0
  185. package/dist/systems/window/window-system.d.ts.map +1 -1
  186. package/dist/systems/window/window-system.js +16 -2
  187. package/package.json +17 -4
  188. package/dist/lib/polygon-union.d.ts +0 -4
  189. package/dist/lib/polygon-union.d.ts.map +0 -1
  190. package/dist/lib/polygon-union.js +0 -289
@@ -0,0 +1,71 @@
1
+ export type PerfTrackLine = {
2
+ name: string;
3
+ totalMs: number;
4
+ count: number;
5
+ maxMs: number;
6
+ };
7
+ export type PerfStats = {
8
+ fps: number;
9
+ frameMs: number;
10
+ frameMaxMs: number;
11
+ encodeMs: number;
12
+ encodeMaxMs: number;
13
+ gpuMs: number;
14
+ gpuMaxMs: number;
15
+ gpuTracked: boolean;
16
+ queueMs: number;
17
+ queueMaxMs: number;
18
+ drawCalls: number;
19
+ triangles: number;
20
+ batch: PerfBatchStats;
21
+ dirty: number;
22
+ dirtyDetail: string;
23
+ geometries: number;
24
+ textures: number;
25
+ gpuBytes: number;
26
+ heapBytes: number;
27
+ meshes: number;
28
+ lines: number;
29
+ sprites: number;
30
+ lights: number;
31
+ tracks: PerfTrackLine[];
32
+ };
33
+ export declare function publishPerfStats(stats: PerfStats): void;
34
+ export declare function usePerfStats(): PerfStats | null;
35
+ /**
36
+ * Batch membership, published by the batch systems themselves (the panel's
37
+ * collector cannot read their stores across packages). Stable truth — items
38
+ * and instances currently drawn through batch containers — unlike the
39
+ * per-pass `_multiDrawCount`, which snapshots whichever camera (main, shadow,
40
+ * outline) culled the batch last and flips between passes. On WebGPU each
41
+ * batched instance still counts once in `drawCalls` (the backend loops
42
+ * drawIndexed per visible instance), so without this row a batched scene
43
+ * looks no cheaper than an unbatched one — the saving is encode cost per
44
+ * call, not call count.
45
+ */
46
+ export type PerfBatchStats = {
47
+ items: number;
48
+ instances: number;
49
+ containers: number;
50
+ releases?: number;
51
+ joins?: number;
52
+ geometryReplacements?: number;
53
+ overflowRebuilds?: number;
54
+ wallDrain?: {
55
+ initialBuildActive: boolean;
56
+ wallsConsumedThisFrame: number;
57
+ budgetExits: number;
58
+ heavyExits: number;
59
+ drainedExits: number;
60
+ capExits: number;
61
+ pendingNeighbours: number;
62
+ firstBuilds: number;
63
+ reinvalidationBuilds: number;
64
+ neighbourEnqueues: number;
65
+ };
66
+ geometryBytesCopied?: number;
67
+ };
68
+ export declare function publishPerfBatchStats(stats: Partial<PerfBatchStats>): void;
69
+ export declare function publishPerfWallDrainStats(stats: NonNullable<PerfBatchStats['wallDrain']>): void;
70
+ export declare function readPerfBatchStats(): PerfBatchStats;
71
+ //# sourceMappingURL=perf-panel-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perf-panel-store.d.ts","sourceRoot":"","sources":["../../src/lib/perf-panel-store.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAE3F,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,cAAc,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,aAAa,EAAE,CAAA;CACxB,CAAA;AAKD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAGvD;AAOD,wBAAgB,YAAY,IAAI,SAAS,GAAG,IAAI,CAM/C;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE;QACV,kBAAkB,EAAE,OAAO,CAAA;QAC3B,sBAAsB,EAAE,MAAM,CAAA;QAC9B,WAAW,EAAE,MAAM,CAAA;QACnB,UAAU,EAAE,MAAM,CAAA;QAClB,YAAY,EAAE,MAAM,CAAA;QACpB,QAAQ,EAAE,MAAM,CAAA;QAChB,iBAAiB,EAAE,MAAM,CAAA;QACzB,WAAW,EAAE,MAAM,CAAA;QACnB,oBAAoB,EAAE,MAAM,CAAA;QAC5B,iBAAiB,EAAE,MAAM,CAAA;KAC1B,CAAA;IACD,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B,CAAA;AAID,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAE1E;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAE/F;AAED,wBAAgB,kBAAkB,IAAI,cAAc,CAEnD"}
@@ -0,0 +1,29 @@
1
+ // Bridge between the in-canvas collector (perf-monitor.tsx, R3F reconciler)
2
+ // and the DOM panel (perf-panel.tsx). react-dom portals can't cross the R3F
3
+ // renderer boundary, so the collector publishes here and the panel — mounted
4
+ // outside <Canvas> — subscribes via useSyncExternalStore.
5
+ import { useSyncExternalStore } from 'react';
6
+ let current = null;
7
+ const listeners = new Set();
8
+ export function publishPerfStats(stats) {
9
+ current = stats;
10
+ for (const listener of listeners)
11
+ listener();
12
+ }
13
+ function subscribe(listener) {
14
+ listeners.add(listener);
15
+ return () => listeners.delete(listener);
16
+ }
17
+ export function usePerfStats() {
18
+ return useSyncExternalStore(subscribe, () => current, () => null);
19
+ }
20
+ let batchStats = { items: 0, instances: 0, containers: 0 };
21
+ export function publishPerfBatchStats(stats) {
22
+ batchStats = { ...batchStats, ...stats };
23
+ }
24
+ export function publishPerfWallDrainStats(stats) {
25
+ batchStats.wallDrain = stats;
26
+ }
27
+ export function readPerfBatchStats() {
28
+ return batchStats;
29
+ }
@@ -0,0 +1,43 @@
1
+ export type PerfCounterBucket = {
2
+ totalMs: number;
3
+ maxMs: number;
4
+ count: number;
5
+ };
6
+ /** DevTools palette names accepted by the extensibility API. */
7
+ export type PerfTrackColor = 'primary' | 'primary-light' | 'primary-dark' | 'secondary' | 'secondary-light' | 'secondary-dark' | 'tertiary' | 'tertiary-light' | 'tertiary-dark' | 'error';
8
+ type PerfSampleListener = (track: string, ms: number) => void;
9
+ export declare function subscribePerfSamples(listener: PerfSampleListener): () => void;
10
+ /**
11
+ * Time a synchronous block and file it under `track`. The label defaults to
12
+ * the track name; pass `name` for per-entry granularity (e.g. a node id) —
13
+ * it only affects the DevTools lane, not the aggregate bucket.
14
+ */
15
+ export declare function timeSpan<T>(track: string, fn: () => T, opts?: {
16
+ name?: string;
17
+ color?: PerfTrackColor;
18
+ properties?: Array<[string, string]>;
19
+ }): T;
20
+ /**
21
+ * Span for non-callback shapes (spans crossing await points or frames).
22
+ * `beginSpan` returns null when perf is off — callers pass the handle back to
23
+ * `endSpan`, which no-ops on null.
24
+ */
25
+ export type PerfSpanHandle = {
26
+ track: string;
27
+ name: string;
28
+ start: number;
29
+ color: PerfTrackColor;
30
+ };
31
+ export declare function beginSpan(track: string, opts?: {
32
+ name?: string;
33
+ color?: PerfTrackColor;
34
+ }): PerfSpanHandle | null;
35
+ export declare function endSpan(handle: PerfSpanHandle | null, properties?: Array<[string, string]>): void;
36
+ /** Record a duration measured externally (no measure emitted). */
37
+ export declare function recordPerfSample(track: string, ms: number): void;
38
+ /** Hand the current window's buckets to the overlay and start a new window. */
39
+ export declare function drainPerfCounters(): Map<string, PerfCounterBucket>;
40
+ /** Drop accumulated timeline entries so long `?perf` sessions don't leak. */
41
+ export declare function clearPerfMeasures(): void;
42
+ export {};
43
+ //# sourceMappingURL=perf-tracks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perf-tracks.d.ts","sourceRoot":"","sources":["../../src/lib/perf-tracks.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,gEAAgE;AAChE,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,eAAe,GACf,cAAc,GACd,WAAW,GACX,iBAAiB,GACjB,gBAAgB,GAChB,UAAU,GACV,gBAAgB,GAChB,eAAe,GACf,OAAO,CAAA;AAOX,KAAK,kBAAkB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;AAG7D,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,IAAI,CAG7E;AAyCD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,CAAC,EACX,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,GACrF,CAAC,CAUH;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,CAAA;AAElG,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,cAAc,CAAA;CAAE,GAC/C,cAAc,GAAG,IAAI,CAQvB;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,CAKjG;AAED,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAGhE;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAIlE;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,IAAI,IAAI,CAOxC"}
@@ -0,0 +1,113 @@
1
+ // Shared sink for `?perf` instrumentation.
2
+ //
3
+ // Two outputs from one call site:
4
+ // 1. Chrome DevTools Performance panel custom tracks — every span becomes a
5
+ // `performance.measure` with a `detail.devtools` payload, so Pascal systems
6
+ // show up as named lanes in the flame chart while recording.
7
+ // 2. Per-window aggregates — `drainPerfCounters()` hands the overlay one
8
+ // bucket per track (total/max/count since the last drain), so the panel can
9
+ // print "wall-csg 9.8ms" without touching the timeline.
10
+ //
11
+ // Everything is gated on PERF_OVERLAY_ENABLED: when `?perf` is absent the
12
+ // helpers reduce to calling `fn()` directly / returning early, so hot paths pay
13
+ // only a boolean check. Measures otherwise accumulate in the browser's
14
+ // timeline buffer indefinitely — the overlay is responsible for calling
15
+ // `clearPerfMeasures()` on its drain tick.
16
+ import { PERF_OVERLAY_ENABLED } from './gpu-perf';
17
+ const counters = new Map();
18
+ const sampleListeners = new Set();
19
+ export function subscribePerfSamples(listener) {
20
+ sampleListeners.add(listener);
21
+ return () => sampleListeners.delete(listener);
22
+ }
23
+ function record(track, ms) {
24
+ const bucket = counters.get(track);
25
+ if (bucket) {
26
+ bucket.totalMs += ms;
27
+ bucket.count += 1;
28
+ if (ms > bucket.maxMs)
29
+ bucket.maxMs = ms;
30
+ }
31
+ else {
32
+ counters.set(track, { totalMs: ms, maxMs: ms, count: 1 });
33
+ }
34
+ for (const listener of sampleListeners)
35
+ listener(track, ms);
36
+ }
37
+ function emitMeasure(track, name, start, end, color, properties) {
38
+ try {
39
+ performance.measure(name, {
40
+ start,
41
+ end,
42
+ detail: {
43
+ devtools: {
44
+ dataType: 'track-entry',
45
+ track,
46
+ trackGroup: 'Pascal',
47
+ color,
48
+ ...(properties ? { properties } : {}),
49
+ },
50
+ },
51
+ });
52
+ }
53
+ catch {
54
+ // Older browsers reject the options bag — aggregates still work.
55
+ }
56
+ }
57
+ /**
58
+ * Time a synchronous block and file it under `track`. The label defaults to
59
+ * the track name; pass `name` for per-entry granularity (e.g. a node id) —
60
+ * it only affects the DevTools lane, not the aggregate bucket.
61
+ */
62
+ export function timeSpan(track, fn, opts) {
63
+ if (!PERF_OVERLAY_ENABLED)
64
+ return fn();
65
+ const start = performance.now();
66
+ try {
67
+ return fn();
68
+ }
69
+ finally {
70
+ const end = performance.now();
71
+ record(track, end - start);
72
+ emitMeasure(track, opts?.name ?? track, start, end, opts?.color ?? 'primary', opts?.properties);
73
+ }
74
+ }
75
+ export function beginSpan(track, opts) {
76
+ if (!PERF_OVERLAY_ENABLED)
77
+ return null;
78
+ return {
79
+ track,
80
+ name: opts?.name ?? track,
81
+ start: performance.now(),
82
+ color: opts?.color ?? 'primary',
83
+ };
84
+ }
85
+ export function endSpan(handle, properties) {
86
+ if (!handle)
87
+ return;
88
+ const end = performance.now();
89
+ record(handle.track, end - handle.start);
90
+ emitMeasure(handle.track, handle.name, handle.start, end, handle.color, properties);
91
+ }
92
+ /** Record a duration measured externally (no measure emitted). */
93
+ export function recordPerfSample(track, ms) {
94
+ if (!PERF_OVERLAY_ENABLED)
95
+ return;
96
+ record(track, ms);
97
+ }
98
+ /** Hand the current window's buckets to the overlay and start a new window. */
99
+ export function drainPerfCounters() {
100
+ const out = new Map(counters);
101
+ counters.clear();
102
+ return out;
103
+ }
104
+ /** Drop accumulated timeline entries so long `?perf` sessions don't leak. */
105
+ export function clearPerfMeasures() {
106
+ try {
107
+ performance.clearMeasures();
108
+ performance.clearMarks();
109
+ }
110
+ catch {
111
+ // ignore
112
+ }
113
+ }
@@ -0,0 +1,7 @@
1
+ import { events as createWebEvents, type EventManager, type RootStore } from '@react-three/fiber';
2
+ import * as THREE from 'three';
3
+ /** Opt in only when the raycast appends hits without reading prior hits or mutating scene/query state. */
4
+ export declare function markPureRaycast<T extends THREE.Object3D['raycast']>(raycast: T): T;
5
+ export declare function choosePointerEvents(search?: string): typeof createWebEvents;
6
+ export declare function createPascalPointerEvents(store: RootStore): EventManager<HTMLElement>;
7
+ //# sourceMappingURL=pointer-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointer-events.d.ts","sourceRoot":"","sources":["../../src/lib/pointer-events.ts"],"names":[],"mappings":"AA6BA,OAAO,EACL,MAAM,IAAI,eAAe,EAGzB,KAAK,YAAY,EAMjB,KAAK,SAAS,EAEf,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAqC9B,0GAA0G;AAC1G,wBAAgB,eAAe,CAAC,CAAC,SAAS,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAGlF;AAYD,wBAAgB,mBAAmB,CACjC,MAAM,SAA8D,GACnE,OAAO,eAAe,CAIxB;AAiLD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAmBrF"}