beckhoff-xts-viewer-3d 5.2.2 → 5.2.3

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/index.d.cts CHANGED
@@ -12,7 +12,7 @@ import { GLTF } from 'three-stdlib';
12
12
  * Run `npm run sync-version` (or any script that depends on it) to refresh
13
13
  * after bumping the package version.
14
14
  */
15
- declare const VERSION: "5.2.2";
15
+ declare const VERSION: "5.2.3";
16
16
 
17
17
  /**
18
18
  * Default CDN URL for the GLB asset bundle (`beckhoff-xts-viewer-3d-assets`).
@@ -1420,6 +1420,201 @@ interface XtsRuntimeState {
1420
1420
  display?: Partial<DisplayOptions>;
1421
1421
  }
1422
1422
 
1423
+ /**
1424
+ * SidecarLoader — fetches per-asset JSON sidecars.
1425
+ *
1426
+ * Sidecars carry origin-correction (translateMm + rotationDegEuler) plus
1427
+ * path metadata. They live next to the GLB at <baseUrl>/<id>.meta.json (or
1428
+ * <id>.tool.meta.json for mover tools).
1429
+ *
1430
+ * On 404 the loader falls back to default origin-correction `(0,0,0)` /
1431
+ * `(0,0,0)`. The renderer can still place the GLB; the calibration tool is
1432
+ * the authoritative source for sidecar values.
1433
+ */
1434
+
1435
+ interface OriginCorrection {
1436
+ translateMm: Vec3;
1437
+ rotationDegEuler: Vec3;
1438
+ }
1439
+ interface ModuleSidecar {
1440
+ moduleType: ModuleType3D;
1441
+ glbByRailSystem: {
1442
+ Beckhoff: string | null;
1443
+ HepcoGfx?: string | null;
1444
+ };
1445
+ originCorrection: OriginCorrection;
1446
+ pathType: 'Straight' | 'Curve' | 'Free';
1447
+ moduleLengthMm: number;
1448
+ endAngleDeg: number;
1449
+ freePathFile?: string;
1450
+ approximateBoundsMm?: {
1451
+ min: Vec3;
1452
+ max: Vec3;
1453
+ };
1454
+ }
1455
+ interface MoverSidecar {
1456
+ moverType: MoverType3D;
1457
+ glb: string;
1458
+ originCorrection: OriginCorrection;
1459
+ magnetPlateCenterMm: Vec3;
1460
+ pathLengthMm: number;
1461
+ }
1462
+ interface MoverToolSidecar {
1463
+ toolType: MoverToolType3D;
1464
+ glbUrl: string;
1465
+ originCorrection: OriginCorrection;
1466
+ defaultOffsetMm: Vec3;
1467
+ approximateBoundsMm?: {
1468
+ min: Vec3;
1469
+ max: Vec3;
1470
+ };
1471
+ label: string;
1472
+ }
1473
+ /**
1474
+ * Calibration sidecar for a guiding-rail GLB. The rail is rendered in the
1475
+ * same module-local frame as the module (i.e. under the module's
1476
+ * `startWorldPose`) with this correction applied to the GLB scene.
1477
+ */
1478
+ interface RailSidecar {
1479
+ railType: RailType3D;
1480
+ glb: string;
1481
+ originCorrection: OriginCorrection;
1482
+ approximateBoundsMm?: {
1483
+ min: Vec3;
1484
+ max: Vec3;
1485
+ };
1486
+ }
1487
+ declare const DEFAULT_ORIGIN_CORRECTION: OriginCorrection;
1488
+ /**
1489
+ * Generic sidecar fetch with promise caching + graceful fallback. Returns
1490
+ * `undefined` on 404 (caller substitutes a default), and surfaces network or
1491
+ * parse errors as `Error` (caller is expected to forward to onError).
1492
+ */
1493
+ declare class SidecarLoader {
1494
+ private readonly timeoutMs;
1495
+ private readonly cache;
1496
+ constructor(timeoutMs?: number);
1497
+ clear(): void;
1498
+ /**
1499
+ * Fetch and cache the sidecar at `url`. The loader validates the one field
1500
+ * every sidecar shape shares (`originCorrection`) and hands the rest to the
1501
+ * caller as `T` — the kind is a property of the URL, not of the loader.
1502
+ */
1503
+ fetch<T>(url: string): Promise<T | undefined>;
1504
+ }
1505
+ /**
1506
+ * Resolve the effective origin correction for a module sidecar — falls back
1507
+ * to identity when the sidecar is absent.
1508
+ */
1509
+ declare function resolveOriginCorrection(sidecar: {
1510
+ originCorrection?: OriginCorrection;
1511
+ } | undefined): OriginCorrection;
1512
+ /** Standard sidecar filename from a base id. */
1513
+ declare function moduleSidecarFilename(moduleType: ModuleType3D): string;
1514
+ declare function moverSidecarFilename(moverType: MoverType3D): string;
1515
+ declare function toolSidecarFilename(toolType: MoverToolType3D): string;
1516
+ declare function railSidecarFilename(railType: RailType3D): string;
1517
+ /** Anything that names a GLB per rail system — a sidecar or a manifest entry. */
1518
+ interface GlbByRailSystem {
1519
+ glbByRailSystem: {
1520
+ Beckhoff: string | null;
1521
+ HepcoGfx?: string | null;
1522
+ };
1523
+ }
1524
+ /**
1525
+ * Pure helper: pick the GLB filename with rail-system fallback. Returns null
1526
+ * when the entry marks the module 'prepared but not delivered'.
1527
+ *
1528
+ * Takes the structural shape rather than `ModuleSidecar` so
1529
+ * `resolveModuleGlbUrl`, which used to carry a line-for-line identical copy
1530
+ * of this body over manifest entries, can delegate here. Both are public
1531
+ * API, so both stay — but there is one implementation of the fallback rule.
1532
+ */
1533
+ declare function pickGlbForRail(entry: GlbByRailSystem | undefined, rail: RailSystem): string | null;
1534
+
1535
+ /**
1536
+ * Option shapes shared between the public `<XtsViewer3D>` props and the
1537
+ * internal `<XtsScene>` / `<ProcessingUnitRoot>` props.
1538
+ *
1539
+ * Each of these used to be declared twice — once on each side of that
1540
+ * boundary, character for character — so the two could drift silently, and
1541
+ * `SidecarOverrides` was even exported under two public names. Declared once
1542
+ * here and imported by both.
1543
+ */
1544
+
1545
+ /** Where the view cube sits in the canvas. */
1546
+ type ViewCubeAlignment = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top-center' | 'bottom-center' | 'center-left' | 'center-right' | 'center-center';
1547
+ interface ViewCubeOptions {
1548
+ enabled?: boolean;
1549
+ /** Default `'bottom-right'`. */
1550
+ alignment?: ViewCubeAlignment;
1551
+ /** Distance from the aligned corner, in CSS px. Default `[80, 80]`. */
1552
+ marginPx?: [number, number];
1553
+ }
1554
+ /** Interaction locks. Each `true` disables that interaction. */
1555
+ interface InteractionLocks {
1556
+ rotate?: boolean;
1557
+ pan?: boolean;
1558
+ zoom?: boolean;
1559
+ selection?: boolean;
1560
+ }
1561
+ interface PerformanceOptions {
1562
+ /** Cap the frameloop rate. Unset = uncapped. */
1563
+ maxFps?: number;
1564
+ /**
1565
+ * Draw a processing unit's movers as one `InstancedMesh` instead of one
1566
+ * scene node each, cutting mover draw calls from N to 1. Default: false.
1567
+ *
1568
+ * Applies from four movers up, and only to movers with nothing bound to
1569
+ * them: a mover carrying tools, a mover-bound custom asset, or a visible
1570
+ * drive status still gets its own node. Turning on the anchor marker or
1571
+ * mover-id labels gives every mover a child object, so the batch is
1572
+ * skipped for that unit entirely. Selection and clicks work either way.
1573
+ */
1574
+ instancing?: boolean;
1575
+ /** Stop the frameloop while the tab is hidden. Default: true. */
1576
+ autoPauseOnHidden?: boolean;
1577
+ /**
1578
+ * Enable demand rendering: frames only render when something changes
1579
+ * (camera move, mover position update, selection). Saves >90% GPU time
1580
+ * when the scene is idle. Default: true.
1581
+ */
1582
+ demandRendering?: boolean;
1583
+ /**
1584
+ * Cap the device pixel ratio. Values above 2 rarely improve perceptible
1585
+ * quality but double fill-rate cost on Retina/4K displays. Default: 2.
1586
+ */
1587
+ maxDpr?: number;
1588
+ /**
1589
+ * Disable automatic per-frame shadow map updates. Shadows only re-render
1590
+ * on camera change. Default: true (when shadows enabled).
1591
+ */
1592
+ shadowOnDemand?: boolean;
1593
+ /**
1594
+ * Opt into the WebGPU renderer when the browser supports it. Falls back to
1595
+ * WebGL automatically. Default: false (experimental).
1596
+ */
1597
+ webgpu?: boolean;
1598
+ /**
1599
+ * Override the KTX2 (Basis) transcoder path used to decode compressed
1600
+ * textures in the GLB assets. Defaults to a CDN copy pinned to the bundled
1601
+ * three.js revision. Point this at a self-hosted
1602
+ * `basis_transcoder.{js,wasm}` directory for offline / air-gapped use.
1603
+ */
1604
+ ktx2TranscoderUrl?: string;
1605
+ }
1606
+ /**
1607
+ * Live override of the per-asset origin-correction sidecars, keyed by asset
1608
+ * type. Useful for calibration tooling that adjusts a model's origin without
1609
+ * re-publishing its `.meta.json`.
1610
+ */
1611
+ interface SidecarOverrides {
1612
+ modules?: Partial<Record<ModuleType3D, OriginCorrection>>;
1613
+ movers?: Partial<Record<MoverType3D, OriginCorrection>>;
1614
+ tools?: Partial<Record<MoverToolType3D, OriginCorrection>>;
1615
+ rails?: Partial<Record<RailType3D, OriginCorrection>>;
1616
+ }
1617
+
1423
1618
  /**
1424
1619
  * Module catalog (3D-canonical).
1425
1620
  *
@@ -1556,6 +1751,67 @@ declare function moverWorldAt(chain: BuiltChain, partPositionMm: number): Planar
1556
1751
  /** Convenience: chain from full ModuleEntry[] returning trackLength alone. */
1557
1752
  declare function trackLengthOf(modules: ReadonlyArray<ModuleEntry>): number;
1558
1753
 
1754
+ /**
1755
+ * normalizeXtsConfig — pre-render pass.
1756
+ *
1757
+ * Fail-fast validation + AT2050 half-clothoid merging:
1758
+ * AT2050_0500 + AT2050_0501 (gap=0) → AT2050_0500_180
1759
+ * ATH2050_0500 + ATH2050_0501 (gap=0) → ATH2050_0500_180
1760
+ *
1761
+ * Errors thrown via XtsViewerErrorException:
1762
+ * - 'unknown-module-type'
1763
+ * - 'unknown-mover-type'
1764
+ * - 'unmatched-clothoid-half' (0500 without 0501 or vice versa)
1765
+ *
1766
+ * Warnings (collected, non-fatal) returned alongside the normalized config:
1767
+ * - mover.partOid not in part-list
1768
+ * - duplicate mover.id within an XPU
1769
+ * - mover.partPositionMm out of range (clamped)
1770
+ */
1771
+
1772
+ interface NormalizedXtsConfig extends XtsConfig {
1773
+ /**
1774
+ * Same shape as the input, with all parts' modules pre-merged + validated.
1775
+ * Mover positions are clamped, but the original values are preserved in
1776
+ * `__warnings` for diagnostics.
1777
+ */
1778
+ readonly __warnings: NormalizationWarning[];
1779
+ }
1780
+ interface NormalizationWarning {
1781
+ code: 'mover-out-of-range' | 'mover-orphan' | 'mover-duplicate-id' | 'mover-missing-id' | 'mover-invalid-id' | 'empty-part' | 'prepared-module' | 'duplicate-xpu-object-id' | 'missing-xpu-object-id' | 'invalid-xpu-object-id' | 'duplicate-part-object-id' | 'missing-part-object-id' | 'invalid-part-object-id' | 'duplicate-part-global-number' | 'missing-part-global-number' | 'invalid-part-global-number' | 'duplicate-module-global-number' | 'missing-module-global-number' | 'invalid-module-global-number';
1782
+ message: string;
1783
+ details?: unknown;
1784
+ }
1785
+ /**
1786
+ * Normalizer handle.
1787
+ *
1788
+ * This used to carry a single-slot structural cache keyed on a
1789
+ * `JSON.stringify` of the config with the frame-paced fields stripped out.
1790
+ * It was removed: the only production caller is `useNormalizedConfig`, whose
1791
+ * `useMemo` already collapses repeat calls on an unchanged config, so the
1792
+ * cache could fire only when the config identity changed but its structure
1793
+ * did not — and in exactly that case the "fast path" cost a full stringify
1794
+ * of the config plus a full rebuild of every XPU, which is strictly more
1795
+ * work than the single O(n) pass it was avoiding.
1796
+ *
1797
+ * It also cost correctness twice over. The key stripped `status` by name at
1798
+ * every depth, so it removed `ModuleEntry.status` along with the mover field
1799
+ * it was aimed at, while the clone path rebuilt only movers — freezing
1800
+ * declarative module warnings after the first normalize. And it forced a
1801
+ * second copy of the mover clamp that had already drifted from `clampMover`
1802
+ * (different `details` key, different `original` value), so hosts parsing
1803
+ * warning details saw two shapes for one warning code.
1804
+ *
1805
+ * The class stays because it is part of the published API. It is now a thin
1806
+ * handle over the pure function.
1807
+ */
1808
+ declare class XtsConfigNormalizer {
1809
+ normalize(config: XtsConfig): NormalizedXtsConfig;
1810
+ /** No-op. Kept so existing callers keep compiling; there is no cache. */
1811
+ clearCache(): void;
1812
+ }
1813
+ declare function normalizeXtsConfig(config: XtsConfig): NormalizedXtsConfig;
1814
+
1559
1815
  /**
1560
1816
  * Mover collision detection.
1561
1817
  *
@@ -1665,6 +1921,20 @@ interface MoverProbe {
1665
1921
  * appear first.
1666
1922
  */
1667
1923
  declare function checkSamePathCollisions(chain: BuiltChain, partOid: number, probes: ReadonlyArray<MoverProbe>, opts?: CheckMoverCollisionsOptions): MoverCollision[];
1924
+ /**
1925
+ * Collision check across a whole config: build a probe per mover, group by
1926
+ * part, and run `checkSamePathCollisions` on each group with two or more.
1927
+ *
1928
+ * `livePositionOf` supplies the current position of a mover when one is
1929
+ * being driven imperatively — the `MoverPositionStore` at 60 Hz — falling
1930
+ * back to the config value. Passing it as a function rather than the store
1931
+ * itself is what keeps this a pure geometry function: it was previously
1932
+ * trapped inside the `useImperativeHandle` closure of `useXtsViewerHandle`,
1933
+ * where it could only be exercised through a mounted canvas.
1934
+ *
1935
+ * Results are sorted so the deepest collision in the scene comes first.
1936
+ */
1937
+ declare function checkAllMoverCollisions(config: NormalizedXtsConfig, livePositionOf: (moverId: number) => number | undefined, opts?: CheckMoverCollisionsOptions): MoverCollision[];
1668
1938
 
1669
1939
  /**
1670
1940
  * Module collision / overlap detection.
@@ -1819,58 +2089,25 @@ declare function checkModuleCollisions(probes: ReadonlyArray<ModuleProbe>, adjac
1819
2089
  count: number;
1820
2090
  closed: boolean;
1821
2091
  }>, opts?: CheckModuleCollisionsOptions): ModuleCollision[];
1822
-
1823
2092
  /**
1824
- * normalizeXtsConfig — pre-render pass.
1825
- *
1826
- * Fail-fast validation + AT2050 half-clothoid merging:
1827
- * AT2050_0500 + AT2050_0501 (gap=0) → AT2050_0500_180
1828
- * ATH2050_0500 + ATH2050_0501 (gap=0) → ATH2050_0500_180
2093
+ * Resolve a normalized config into the per-XPU inputs `buildModuleProbes`
2094
+ * takes, applying the same override precedence the scene uses: an imperative
2095
+ * `trackTransformOverrides` entry beats the config value.
1829
2096
  *
1830
- * Errors thrown via XtsViewerErrorException:
1831
- * - 'unknown-module-type'
1832
- * - 'unknown-mover-type'
1833
- * - 'unmatched-clothoid-half' (0500 without 0501 or vice versa)
2097
+ * This adapter was written out twice, character for character — once in
2098
+ * `<ModuleCollisionMonitor>` and once inside the `checkModuleCollisions`
2099
+ * closure of `useXtsViewerHandle` — with the only difference being where the
2100
+ * orientation came from.
1834
2101
  *
1835
- * Warnings (collected, non-fatal) returned alongside the normalized config:
1836
- * - mover.partOid not in part-list
1837
- * - duplicate mover.id within an XPU
1838
- * - mover.partPositionMm out of range (clamped)
2102
+ * A part whose chain cannot be built is skipped, as before, but no longer in
2103
+ * silence: `normalizeXtsConfig` has already made that impossible, so if it
2104
+ * ever happens it means a part has silently dropped out of collision
2105
+ * detection, which is a safety feature. Reported rather than thrown, because
2106
+ * both callers run inside React and a throw would take the scene down.
1839
2107
  */
1840
-
1841
- interface NormalizedXtsConfig extends XtsConfig {
1842
- /**
1843
- * Same shape as the input, with all parts' modules pre-merged + validated.
1844
- * Mover positions are clamped, but the original values are preserved in
1845
- * `__warnings` for diagnostics.
1846
- */
1847
- readonly __warnings: NormalizationWarning[];
1848
- }
1849
- interface NormalizationWarning {
1850
- code: 'mover-out-of-range' | 'mover-orphan' | 'mover-duplicate-id' | 'mover-missing-id' | 'mover-invalid-id' | 'empty-part' | 'prepared-module' | 'duplicate-xpu-object-id' | 'missing-xpu-object-id' | 'invalid-xpu-object-id' | 'duplicate-part-object-id' | 'missing-part-object-id' | 'invalid-part-object-id' | 'duplicate-module-global-number' | 'missing-module-global-number' | 'invalid-module-global-number';
1851
- message: string;
1852
- details?: unknown;
1853
- }
1854
- /**
1855
- * Stateful normalizer with a single-slot structural cache. The key
1856
- * intentionally excludes `mover.partPositionMm` so that frame-paced
1857
- * position updates fall into the fast path: when the structure (modules,
1858
- * parts, transforms, mover ids/partOids) hasn't changed between calls,
1859
- * we return a clone of the cached result with only the mover positions
1860
- * re-clamped against the current input.
1861
- *
1862
- * Construct your own instance when you need an isolated cache (e.g. in
1863
- * tests, or when multiple viewers in the same JS realm would otherwise
1864
- * thrash a shared single-slot cache). The standalone `normalizeXtsConfig`
1865
- * function delegates to a process-wide singleton for backwards
1866
- * compatibility.
1867
- */
1868
- declare class XtsConfigNormalizer {
1869
- private _cache;
1870
- normalize(config: XtsConfig): NormalizedXtsConfig;
1871
- clearCache(): void;
1872
- }
1873
- declare function normalizeXtsConfig(config: XtsConfig): NormalizedXtsConfig;
2108
+ declare function toModuleCollisionInputs(config: NormalizedXtsConfig, trackTransformOverrides?: Record<number, TrackTransform>): ModuleCollisionXpuInput[];
2109
+ /** `toModuleCollisionInputs` → `buildModuleProbes` → `checkModuleCollisions`. */
2110
+ declare function checkAllModuleCollisions(config: NormalizedXtsConfig, orientation: Orientation | undefined, trackTransformOverrides?: Record<number, TrackTransform>, opts?: CheckModuleCollisionsOptions): ModuleCollision[];
1874
2111
 
1875
2112
  /**
1876
2113
  * Shared, mostly-pure plumbing behind `exportScreenshot` and
@@ -1891,6 +2128,89 @@ declare function normalizeXtsConfig(config: XtsConfig): NormalizedXtsConfig;
1891
2128
  */
1892
2129
 
1893
2130
  type CaptureMode = 'current' | 'top-down' | 'custom';
2131
+ /**
2132
+ * The options `exportScreenshot` and `beginFrameCapture` share.
2133
+ *
2134
+ * They used to be written out twice — `ScreenshotOptions` and
2135
+ * `FrameCaptureOptions` each hand-documented the same nine fields, and the
2136
+ * two `updateShadows` comments already described the same behaviour in
2137
+ * different words. Documented once here; each path intersects this with the
2138
+ * handful of options that are genuinely its own.
2139
+ */
2140
+ interface CaptureRequest {
2141
+ /** Camera mode. Default `'current'`. */
2142
+ mode?: CaptureMode;
2143
+ /** Required when `mode === 'custom'`. Ignored otherwise. */
2144
+ camera?: CameraState;
2145
+ /**
2146
+ * Dimensions in pixels. Supply at least one; the other follows the scene
2147
+ * aspect (`top-down`) or the live canvas aspect (`current` / `custom`).
2148
+ * Omit both to use the live canvas dimensions x pixel ratio.
2149
+ *
2150
+ * Both are clamped to what the GPU can actually allocate — read
2151
+ * `widthPx` / `heightPx` / `clamped` back for what was really rendered.
2152
+ */
2153
+ width?: number;
2154
+ height?: number;
2155
+ /**
2156
+ * Background colour:
2157
+ * - `null` (default) → transparent frames, matching the live canvas
2158
+ * contract. JPEG falls back to white because it has no alpha.
2159
+ * - `'#RRGGBB'` / any three.js ColorRepresentation → solid fill.
2160
+ */
2161
+ backgroundColor?: ColorRepresentation | null;
2162
+ /** Margin around the scene AABB in `top-down` mode. Default 1.1 (10 %). */
2163
+ paddingFactor?: number;
2164
+ /**
2165
+ * Multiplier applied to every Light in the scene for the render, restored
2166
+ * afterwards. The default differs per path: 1.35 for a still, which
2167
+ * otherwise reads dim next to the live canvas, and 1 for a clip, where
2168
+ * that boost would make the whole video brighter than the run the user
2169
+ * watched. Pass 1 to disable.
2170
+ */
2171
+ exposureBoost?: number;
2172
+ /**
2173
+ * MSAA sample count for the offscreen target. Default 4 where the context
2174
+ * supports it, 0 otherwise; 0 disables. The live canvas is created with
2175
+ * `antialias: true`, so without this every geometry edge in an export is
2176
+ * hard-aliased while the live view stays smooth. The effective count,
2177
+ * clamped to the hardware maximum, is reported back.
2178
+ */
2179
+ samples?: number;
2180
+ /**
2181
+ * Refresh the shadow map before rendering. Default `true`.
2182
+ *
2183
+ * `performance.shadowOnDemand` leaves `shadowMap.autoUpdate` off and only
2184
+ * dirties the map on camera change, so movers driven through
2185
+ * `setMoverPositions` would otherwise cast shadows from a stale position.
2186
+ * Costs one shadow pass; pass `false` to skip it.
2187
+ */
2188
+ updateShadows?: boolean;
2189
+ /**
2190
+ * Pin wall-clock animations (the drive-status blink) for the render.
2191
+ * Default `true`.
2192
+ *
2193
+ * Unpinned, a capture catches whatever phase the last live frame left
2194
+ * behind: two stills of the same scene differ, and a clip flickers at an
2195
+ * irregular rate because its frames are not produced at wall-clock speed.
2196
+ */
2197
+ freezeAnimations?: boolean;
2198
+ }
2199
+ /** What a capture reports back about the frame it actually produced. */
2200
+ interface CaptureDimensions {
2201
+ /** Dimensions actually rendered — after hardware / budget clamping. */
2202
+ widthPx: number;
2203
+ heightPx: number;
2204
+ /** Dimensions requested, before clamping. */
2205
+ requestedWidthPx: number;
2206
+ requestedHeightPx: number;
2207
+ /** True when the request exceeded what the GPU could allocate. */
2208
+ clamped: boolean;
2209
+ /** MSAA samples actually used (0 = off). */
2210
+ samples: number;
2211
+ /** Camera the frame was rendered with. */
2212
+ camera: CameraState;
2213
+ }
1894
2214
 
1895
2215
  /**
1896
2216
  * captureScreenshot — render the live r3f scene into an offscreen
@@ -1931,79 +2251,26 @@ type CaptureMode = 'current' | 'top-down' | 'custom';
1931
2251
  * background and boosted lights.
1932
2252
  */
1933
2253
 
1934
- type ScreenshotMode = 'current' | 'top-down' | 'custom';
2254
+ /**
2255
+ * @deprecated Use `CaptureMode`. This was a byte-for-byte re-declaration of
2256
+ * it, so the package shipped two public names for one union.
2257
+ */
2258
+ type ScreenshotMode = CaptureMode;
1935
2259
  type ScreenshotFormat = 'png' | 'jpeg' | 'webp';
1936
- interface ScreenshotOptions {
1937
- /** Camera mode. Default: `'current'`. */
1938
- mode?: ScreenshotMode;
1939
- /** Required when `mode === 'custom'`. Ignored otherwise. */
1940
- camera?: CameraState;
1941
- /**
1942
- * Image dimensions in pixels.
1943
- * - Both supplied: the rendered frustum (top-down) is adjusted to
1944
- * match the resulting aspect; the camera (current / custom) is
1945
- * fitted to `width / height`.
1946
- * - One supplied: the other is derived to keep the scene's aspect
1947
- * ratio (top-down) or the live canvas aspect (current / custom).
1948
- * - Neither: canvas CSS dimensions × `pixelRatio`.
1949
- *
1950
- * Both are clamped to what the GPU can actually allocate — check
1951
- * `widthPx` / `heightPx` / `clamped` on the result for what was
1952
- * really rendered.
1953
- */
1954
- width?: number;
1955
- height?: number;
2260
+ /**
2261
+ * `CaptureRequest` carries the nine options shared with `beginFrameCapture`;
2262
+ * these three are the still-image path's own.
2263
+ */
2264
+ interface ScreenshotOptions extends CaptureRequest {
1956
2265
  format?: ScreenshotFormat;
1957
2266
  /** 0..1 — JPEG / WebP quality. Default 0.92. Ignored for PNG. */
1958
2267
  quality?: number;
1959
2268
  /**
1960
- * Padding factor around the scene AABB in `top-down` mode. Default
1961
- * 1.1 (10 % margin on each side). Higher = more whitespace.
1962
- */
1963
- paddingFactor?: number;
1964
- /**
1965
- * Background colour:
1966
- * - `null` (default) → transparent PNG, matches the live canvas
1967
- * contract. JPEG falls back to white because the format has no
1968
- * alpha channel.
1969
- * - `'#RRGGBB'` / any three.js ColorRepresentation → solid fill.
1970
- */
1971
- backgroundColor?: ColorRepresentation | null;
1972
- /**
1973
- * Pixel ratio for offscreen renders. Default = renderer's current
1974
- * pixel ratio (matches the live canvas sharpness on high-DPI
1975
- * displays). Set explicitly for fixed-resolution exports.
2269
+ * Pixel ratio for the offscreen render. Default = the renderer's current
2270
+ * pixel ratio, which matches live-canvas sharpness on high-DPI displays.
2271
+ * Set explicitly for fixed-resolution exports.
1976
2272
  */
1977
2273
  pixelRatio?: number;
1978
- /**
1979
- * Multiplier applied to every Light in the scene during the offscreen
1980
- * render. Default 1.35 — screenshots tend to feel dim compared to
1981
- * the live canvas because the live tone-mapping pipeline picks up
1982
- * the surrounding monitor luminance, which the offscreen render
1983
- * doesn't. Pass 1 to disable, > 1 for a brighter result. Restored
1984
- * after capture.
1985
- */
1986
- exposureBoost?: number;
1987
- /**
1988
- * MSAA sample count for the offscreen target. Default 4 where the
1989
- * context supports it, 0 otherwise. 0 disables.
1990
- *
1991
- * The live canvas is created with `antialias: true`; without this the
1992
- * offscreen pass had no MSAA at all, so every geometry edge in an
1993
- * export was hard-aliased while the live view stayed smooth. The
1994
- * effective count (clamped to the hardware maximum) comes back on the
1995
- * result.
1996
- */
1997
- samples?: number;
1998
- /**
1999
- * Refresh the shadow map before rendering. Default `true`.
2000
- *
2001
- * `performance.shadowOnDemand` leaves `shadowMap.autoUpdate` off and
2002
- * only dirties the map when the camera moves, so movers driven purely
2003
- * through `setMoverPositions` would otherwise cast shadows from a
2004
- * stale position. Costs one shadow pass; pass `false` to skip it.
2005
- */
2006
- updateShadows?: boolean;
2007
2274
  }
2008
2275
  interface ScreenshotResult {
2009
2276
  blob: Blob;
@@ -2079,69 +2346,13 @@ interface ScreenshotResult {
2079
2346
  * `exportScreenshot` does.
2080
2347
  */
2081
2348
 
2082
- interface FrameCaptureOptions {
2083
- /**
2084
- * Frame dimensions in px. Supply at least one; the other follows the scene
2085
- * aspect (`top-down`) or the live canvas aspect (`current` / `custom`).
2086
- * Omit both to use the live canvas dimensions × pixel ratio.
2087
- *
2088
- * Sessions tolerate a render size well above the live canvas — supersampling
2089
- * for the encoder is the expected usage. Both values are clamped to what the
2090
- * GPU can allocate; check `widthPx` / `heightPx` / `clamped` for what you
2091
- * actually get.
2092
- */
2093
- width?: number;
2094
- height?: number;
2095
- /** Camera mode. Default `'current'`. */
2096
- mode?: CaptureMode;
2097
- /** Required when `mode === 'custom'`. */
2098
- camera?: CameraState;
2099
- /** `null` (default) → transparent frames. */
2100
- backgroundColor?: ColorRepresentation | null;
2101
- /** Top-down margin. Fixed for the session. Default 1.1. */
2102
- paddingFactor?: number;
2103
- /**
2104
- * Light multiplier. Default **1** — unlike `exportScreenshot`, which uses
2105
- * 1.35 because a single still reads dim next to the live canvas. Applying
2106
- * that to every frame of a clip would make the whole video uniformly
2107
- * brighter than the run the user watched.
2108
- */
2109
- exposureBoost?: number;
2110
- /** MSAA samples. Default 4, clamped to the hardware maximum. 0 disables. */
2111
- samples?: number;
2112
- /**
2113
- * Pin wall-clock-driven effects (the drive-status blink) to a fixed value
2114
- * for every frame. Default `true`.
2115
- *
2116
- * Export frames are not produced at wall-clock speed, so an unpinned blink
2117
- * flickers at an irregular rate in the clip and two exports of the same run
2118
- * differ pixel-wise.
2119
- */
2120
- freezeAnimations?: boolean;
2121
- /**
2122
- * Refresh the shadow map on every frame. Default `true` when shadows are
2123
- * enabled.
2124
- *
2125
- * `performance.shadowOnDemand` leaves `shadowMap.autoUpdate` off and only
2126
- * dirties on camera change, so movers driven through `setMoverPositions`
2127
- * would drag their first-frame shadows through the whole clip. Costs one
2128
- * shadow pass per frame; set `false` to trade correctness for speed.
2129
- */
2130
- updateShadows?: boolean;
2131
- }
2132
- interface FrameCaptureSession {
2133
- /** Dimensions actually rendered — after hardware / budget clamping. */
2134
- readonly widthPx: number;
2135
- readonly heightPx: number;
2136
- /** Dimensions requested, before clamping. */
2137
- readonly requestedWidthPx: number;
2138
- readonly requestedHeightPx: number;
2139
- /** True when the request exceeded what the GPU could allocate. */
2140
- readonly clamped: boolean;
2141
- /** MSAA samples actually used (0 = off). */
2142
- readonly samples: number;
2143
- /** Camera pinned for the whole session. */
2144
- readonly camera: CameraState;
2349
+ /**
2350
+ * `CaptureRequest` carries the nine options shared with `exportScreenshot`.
2351
+ * The clip path adds nothing of its own; it only differs in the default for
2352
+ * `exposureBoost` (1 rather than 1.35 — see the field's doc).
2353
+ */
2354
+ type FrameCaptureOptions = CaptureRequest;
2355
+ interface FrameCaptureSession extends Readonly<CaptureDimensions> {
2145
2356
  /** True until `dispose()`. */
2146
2357
  readonly disposed: boolean;
2147
2358
  /**
@@ -2408,6 +2619,14 @@ interface XtsViewer3DRef {
2408
2619
  focusOn(target: FocusTarget, opts?: FocusOptions): void;
2409
2620
  setCamera(cam: CameraState): void;
2410
2621
  getCamera(): CameraState | null;
2622
+ /**
2623
+ * @deprecated Not implemented — this is a no-op that warns in development.
2624
+ *
2625
+ * `orientation` is a static prop in this build; there is no state behind
2626
+ * it to update. Set it through `<XtsViewer3D orientation={…}>` instead.
2627
+ * The method is kept only so the published interface does not change
2628
+ * shape mid-major, and will be removed in the next major.
2629
+ */
2411
2630
  setOrientation(orientation: XtsConfig['orientation']): void;
2412
2631
  getMoverWorldTransform(ref: MoverRef): {
2413
2632
  positionMm: [number, number, number];
@@ -2472,6 +2691,15 @@ interface XtsViewer3DRef {
2472
2691
  * frameloop tick.
2473
2692
  */
2474
2693
  renderFrameNow(): void;
2694
+ /**
2695
+ * @deprecated Not implemented — this is a no-op that warns in development.
2696
+ *
2697
+ * GLB caching lives in `useGLTF`'s global cache, which r3f exposes no
2698
+ * per-instance handle to clear. Use `useGLTF.clear()` from
2699
+ * `@react-three/drei` directly if you need to drop cached assets. Kept
2700
+ * only so the published interface does not change shape mid-major, and
2701
+ * will be removed in the next major.
2702
+ */
2475
2703
  reloadAssets(): Promise<void>;
2476
2704
  setMoverPosition(moverId: number, partPositionMm: number): void;
2477
2705
  /**
@@ -2528,107 +2756,6 @@ interface XtsViewer3DRef {
2528
2756
  measurements: MeasurementApi;
2529
2757
  }
2530
2758
 
2531
- /**
2532
- * SidecarLoader — fetches per-asset JSON sidecars.
2533
- *
2534
- * Sidecars carry origin-correction (translateMm + rotationDegEuler) plus
2535
- * path metadata. They live next to the GLB at <baseUrl>/<id>.meta.json (or
2536
- * <id>.tool.meta.json for mover tools).
2537
- *
2538
- * On 404 the loader falls back to default origin-correction `(0,0,0)` /
2539
- * `(0,0,0)`. The renderer can still place the GLB; the calibration tool is
2540
- * the authoritative source for sidecar values.
2541
- */
2542
-
2543
- interface OriginCorrection {
2544
- translateMm: Vec3;
2545
- rotationDegEuler: Vec3;
2546
- }
2547
- interface ModuleSidecar {
2548
- moduleType: ModuleType3D;
2549
- glbByRailSystem: {
2550
- Beckhoff: string | null;
2551
- HepcoGfx?: string | null;
2552
- };
2553
- originCorrection: OriginCorrection;
2554
- pathType: 'Straight' | 'Curve' | 'Free';
2555
- moduleLengthMm: number;
2556
- endAngleDeg: number;
2557
- freePathFile?: string;
2558
- approximateBoundsMm?: {
2559
- min: Vec3;
2560
- max: Vec3;
2561
- };
2562
- }
2563
- interface MoverSidecar {
2564
- moverType: MoverType3D;
2565
- glb: string;
2566
- originCorrection: OriginCorrection;
2567
- magnetPlateCenterMm: Vec3;
2568
- pathLengthMm: number;
2569
- }
2570
- interface MoverToolSidecar {
2571
- toolType: MoverToolType3D;
2572
- glbUrl: string;
2573
- originCorrection: OriginCorrection;
2574
- defaultOffsetMm: Vec3;
2575
- approximateBoundsMm?: {
2576
- min: Vec3;
2577
- max: Vec3;
2578
- };
2579
- label: string;
2580
- }
2581
- /**
2582
- * Calibration sidecar for a guiding-rail GLB. The rail is rendered in the
2583
- * same module-local frame as the module (i.e. under the module's
2584
- * `startWorldPose`) with this correction applied to the GLB scene.
2585
- */
2586
- interface RailSidecar {
2587
- railType: RailType3D;
2588
- glb: string;
2589
- originCorrection: OriginCorrection;
2590
- approximateBoundsMm?: {
2591
- min: Vec3;
2592
- max: Vec3;
2593
- };
2594
- }
2595
- declare const DEFAULT_ORIGIN_CORRECTION: OriginCorrection;
2596
- /**
2597
- * Generic sidecar fetch with promise caching + graceful fallback. Returns
2598
- * `undefined` on 404 (caller substitutes a default), and surfaces network or
2599
- * parse errors as `Error` (caller is expected to forward to onError).
2600
- */
2601
- declare class SidecarLoader {
2602
- private readonly timeoutMs;
2603
- private readonly cache;
2604
- constructor(timeoutMs?: number);
2605
- clear(): void;
2606
- /**
2607
- * Fetch and cache the sidecar at `url`. The loader validates the one field
2608
- * every sidecar shape shares (`originCorrection`) and hands the rest to the
2609
- * caller as `T` — the kind is a property of the URL, not of the loader.
2610
- */
2611
- fetch<T>(url: string): Promise<T | undefined>;
2612
- }
2613
- /**
2614
- * Resolve the effective origin correction for a module sidecar — falls back
2615
- * to identity when the sidecar is absent.
2616
- */
2617
- declare function resolveOriginCorrection(sidecar: {
2618
- originCorrection?: OriginCorrection;
2619
- } | undefined): OriginCorrection;
2620
- /** Standard sidecar filename from a base id. */
2621
- declare function moduleSidecarFilename(moduleType: ModuleType3D): string;
2622
- declare function moverSidecarFilename(moverType: MoverType3D): string;
2623
- declare function toolSidecarFilename(toolType: MoverToolType3D): string;
2624
- declare function railSidecarFilename(railType: RailType3D): string;
2625
- /**
2626
- * Pure helper: pick the GLB filename for a moduleSidecar with rail-system
2627
- * fallback. Returns null when the sidecar marks the module 'prepared but
2628
- * not delivered'.
2629
- */
2630
- declare function pickGlbForRail(sidecar: ModuleSidecar | undefined, rail: RailSystem): string | null;
2631
-
2632
2759
  /**
2633
2760
  * HepcoGfxRailProfile — cross-section of the Hepco GFX guiding rail used by
2634
2761
  * the procedural extrusion in <HepcoGfxRail>.
@@ -2756,12 +2883,6 @@ declare function createHepcoGfxRailShape(dims?: HepcoGfxRailProfileDims): Shape;
2756
2883
  * Live overrides for module/mover/tool origin-correction sidecars. Used by
2757
2884
  * the calibration tool to preview adjustments without writing files.
2758
2885
  */
2759
- interface SidecarOverrides {
2760
- modules?: Partial<Record<ModuleType3D, OriginCorrection>>;
2761
- movers?: Partial<Record<MoverType3D, OriginCorrection>>;
2762
- tools?: Partial<Record<MoverToolType3D, OriginCorrection>>;
2763
- rails?: Partial<Record<RailType3D, OriginCorrection>>;
2764
- }
2765
2886
  interface XtsViewer3DProps {
2766
2887
  /** Complete XTS configuration. */
2767
2888
  config: XtsConfig;
@@ -2806,12 +2927,7 @@ interface XtsViewer3DProps {
2806
2927
  */
2807
2928
  topDown?: boolean;
2808
2929
  /** Lock interactions. */
2809
- lock?: {
2810
- rotate?: boolean;
2811
- pan?: boolean;
2812
- zoom?: boolean;
2813
- selection?: boolean;
2814
- };
2930
+ lock?: InteractionLocks;
2815
2931
  /** Selection-Mode. Default: 'Off'. */
2816
2932
  selectionMode?: SelectionMode;
2817
2933
  /** Controlled selection. */
@@ -2896,40 +3012,7 @@ interface XtsViewer3DProps {
2896
3012
  onError?: (err: XtsViewerError) => void;
2897
3013
  onAssetsLoaded?: () => void;
2898
3014
  /** Performance-Tuning. */
2899
- performance?: {
2900
- maxFps?: number;
2901
- instancing?: boolean;
2902
- autoPauseOnHidden?: boolean;
2903
- /**
2904
- * Enable demand rendering: frames only render when something changes
2905
- * (camera move, mover position update, selection). Saves >90% GPU
2906
- * time when the scene is idle. Default: true.
2907
- */
2908
- demandRendering?: boolean;
2909
- /**
2910
- * Cap the device pixel ratio. Values above 2 rarely improve
2911
- * perceptible quality but double fill-rate cost on Retina/4K
2912
- * displays. Default: 2.
2913
- */
2914
- maxDpr?: number;
2915
- /**
2916
- * Disable automatic per-frame shadow map updates. Shadows only
2917
- * re-render on camera change. Default: true (when shadows enabled).
2918
- */
2919
- shadowOnDemand?: boolean;
2920
- /**
2921
- * Opt into the WebGPU renderer when the browser supports it.
2922
- * Falls back to WebGL automatically. Default: false (experimental).
2923
- */
2924
- webgpu?: boolean;
2925
- /**
2926
- * Override the KTX2 (Basis) transcoder path used to decode compressed
2927
- * textures in the GLB assets. Defaults to a CDN copy pinned to the
2928
- * bundled three.js revision. Point this at a self-hosted
2929
- * `basis_transcoder.{js,wasm}` directory for offline / air-gapped use.
2930
- */
2931
- ktx2TranscoderUrl?: string;
2932
- };
3015
+ performance?: PerformanceOptions;
2933
3016
  /**
2934
3017
  * Live override of the per-asset origin-correction sidecars. Useful for
2935
3018
  * the calibration tool.
@@ -2946,11 +3029,7 @@ interface XtsViewer3DProps {
2946
3029
  */
2947
3030
  hepcoGfxProfile?: Partial<HepcoGfxRailProfileDims>;
2948
3031
  /** CAD-style ViewCube overlay. */
2949
- viewCube?: {
2950
- enabled?: boolean;
2951
- alignment?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top-center' | 'bottom-center' | 'center-left' | 'center-right' | 'center-center';
2952
- marginPx?: [number, number];
2953
- };
3032
+ viewCube?: ViewCubeOptions;
2954
3033
  /** Stator heatmap data — coloured tube along each part's centerline. */
2955
3034
  statorHeatmap?: StatorHeatmap;
2956
3035
  /** Continuous mover collision monitoring. */
@@ -3843,4 +3922,4 @@ declare function snapToGrid(positionMm: Vec3, gridMm: number): Vec3;
3843
3922
  /** Convenience: `resolveSceneContext` + `toEntityRef`. */
3844
3923
  declare function resolveEntityFromObject(object: Object3D | null, instanceId?: number): MeasuredEntityRef | null;
3845
3924
 
3846
- export { type AngleMeasurement, type Annotation, type AnnotationAnchor, type AnnotationInput, type AreaConfig, type AreaOptions, AssetLoader, type AssetManifest, BUILTIN_MODULE_SIDECARS, BUILTIN_MOVER_SIDECARS, BUILTIN_RAIL_SIDECARS, BUILTIN_TOOL_SIDECARS, type BuiltChain, type BuiltModule, type CameraProjection, type CameraState, type CaptureMode, type CheckModuleCollisionsOptions, type CheckMoverCollisionsOptions, type ClickModifiers, type CoordinateSystem, type CustomAssetBinding, type CustomAssetConfig, type CustomMoverLayout, DEFAULT_LABEL_FONT_URL, DEFAULT_MEASUREMENT_STYLE, DEFAULT_MODULE_HALF_WIDTH_MM, DEFAULT_MODULE_HEIGHT_MM, DEFAULT_MODULE_MANIFEST, DEFAULT_MOVER_MANIFEST, DEFAULT_ORIGIN_CORRECTION, DEFAULT_RAIL_MANIFEST, DEFAULT_SNAP_KINDS, DEFAULT_SNAP_RADIUS_PX, DEFAULT_TOOL_MANIFEST, type DimensionOptions, type DisplayOptions, type DistanceMeasurement, EMPTY_SELECTION, type EndDelta, type FeedSegment, type FeedSegmentHighlight, type FeedSegmentSelector, type FeedSegmentSpan, type FocusOptions, type FocusTarget, type FrameCaptureOptions, type FrameCaptureSession, HEPCO_GFX_PROFILE, type HeatmapSample, type HepcoGfxRailProfileDims, IDENTITY_POSE, INFEED_MODULE_TYPES, type InfoBarConfig, type InfoBarMarkerConfig, type InfoBarOptions, JSDELIVR_ASSETS_BASE_URL, MODULE_CATALOG, MODULE_GUIDING_RAIL_MAP, MOVER_CATALOG, type MarkerOptions, type MarkerShape, type MeasuredEntityRef, type Measurement, type MeasurementApi, type MeasurementAxis, type MeasurementDocument, type MeasurementDraft, type MeasurementFormatOptions, type MeasurementId, type MeasurementInput, type MeasurementKind, type MeasurementOptions, type MeasurementPoint, type MeasurementResult, type MeasurementSnapshot, type MeasurementStyle, type MeasurementTool, type ModuleAssetEntry, type ModuleCatalogEntry, type ModuleCollision, type ModuleCollisionPartInput, type ModuleCollisionXpuInput, ModuleCornerMarkers, type ModuleEntry, type ModuleHighlight, type ModuleProbe, type ModuleRef, type ModuleSidecar, type ModuleStatusEntry, type ModuleType3D, type MoverAssetEntry, type MoverCatalogEntry, type MoverCollision, type MoverConfig, MoverIdLabel, type MoverIdLabelOptions, type MoverPositionEntry, type MoverProbe, type MoverRef, type MoverSidecar, type MoverToolAssetEntry, type MoverToolConfig, type MoverToolSidecar, type MoverToolType3D, type MoverType3D, type NormalizationWarning, type NormalizedXtsConfig, type Orientation, type OriginCorrection, type PartConfig, type PartPath, type PartTransformation, type PathMeasurement, type PathSample, type PathType, type PlanarPose, type PointCloud, type PointProjector, type PositionFrame, type ProcessingUnitConfig, type RailAssetEntry, type RailSidecar, type RailSystem, type RailType3D, type ResolvedMeasurementStyle, SIDECAR_KINDS, type ScreenshotFormat, type ScreenshotMode, type ScreenshotOptions, type ScreenshotResult, type SelectionMode, type SelectionState, type SidecarIdOf, type SidecarKind, type SidecarKindSpec, type SidecarKinds, SidecarLoader, type SidecarOf, type SidecarOverrides, type SidecarSourceConfig, SidecarSourceContext, type SnapCandidate, type SnapKind, type SnapOptions, type SplitFeedSegmentsOptions, type StationConfig, type StationOptions, type StatorHeatmap, type StopPositionMoverOptions, type TextOptions, type TrackAnchor, type TrackDistanceMeasurement, type TrackIndex, type TrackIndexEntry, type TrackMetrics, type TrackMetricsResolver, type TrackProjection, type TrackTransform, VERSION, type Vec2, type Vec3, XtsArcCurve3, type XtsConfig, XtsConfigNormalizer, type XtsModelDocument, XtsPointCloudCurve3, type XtsRuntimeState, XtsViewer3D, type XtsViewer3DProps, type XtsViewer3DRef, type XtsViewerError, type XtsViewerErrorCode, XtsViewerErrorException, angleDeg, applyBeckhoffXtsConvention, applyEmptyClick, applyModuleClick, applyMoverClick, arcPoints, axisDistanceMm, buildChain, buildModuleProbes, buildPartPath, buildTrackIndex, chainToUserPositionMm, checkModuleCollisions, checkSamePathCollisions, chooseSnapCandidate, collectFeedSegments, collectFeedSegmentsForXpu, collectTriangleSnapCandidates, composeAssetUrl, computeMeasurementResult, createHepcoGfxBaseplateShape, createHepcoGfxRailShape, deselectAll, distanceMm, findModuleAt, formatAngleDeg, formatLengthMm, getModuleEntry, getMoverEntry, getPointCloud, getSharedAssetLoader, interpolateHeatmapValue, isChainClosed, isKnownModuleType, isKnownMoverType, isModuleSelected, isMoverSelected, labelAnchorFor, moduleAnchorWorld, moduleEndDelta, moduleSidecarFilename, moverAnchorWorld, moverSidecarFilename, moverWorldAt, nearestTrackPoint, normaliseToHeatmapRange, normalizeXtsConfig, pathLengthsMm, pickGlbForRail, poseToMatrix4, railSidecarFilename, registerPointCloud, resolveEntityFromObject, resolveGuidingRailGlbUrl, resolveGuidingRailType, resolveHepcoGfxProfile, resolveMeasurementStyle, resolveModuleGlbUrl, resolveMoverGlbUrl, resolveOriginCorrection, resolveStopPositionMm, resolveToolGlbUrl, sampleChainPoint, sampleChainRange, sampleModulePath, snapToGrid, sortHeatmapSamples, splitIntoFeedSegments, toolSidecarFilename, trackAnchorWorld, trackDistanceMm, trackLengthOf, trackPolylineWorld, unregisterPointCloud, useSidecarSource, userToChainPositionMm, worldPointOnPart };
3925
+ export { type AngleMeasurement, type Annotation, type AnnotationAnchor, type AnnotationInput, type AreaConfig, type AreaOptions, AssetLoader, type AssetManifest, BUILTIN_MODULE_SIDECARS, BUILTIN_MOVER_SIDECARS, BUILTIN_RAIL_SIDECARS, BUILTIN_TOOL_SIDECARS, type BuiltChain, type BuiltModule, type CameraProjection, type CameraState, type CaptureDimensions, type CaptureMode, type CaptureRequest, type CheckModuleCollisionsOptions, type CheckMoverCollisionsOptions, type ClickModifiers, type CoordinateSystem, type CustomAssetBinding, type CustomAssetConfig, type CustomMoverLayout, DEFAULT_LABEL_FONT_URL, DEFAULT_MEASUREMENT_STYLE, DEFAULT_MODULE_HALF_WIDTH_MM, DEFAULT_MODULE_HEIGHT_MM, DEFAULT_MODULE_MANIFEST, DEFAULT_MOVER_MANIFEST, DEFAULT_ORIGIN_CORRECTION, DEFAULT_RAIL_MANIFEST, DEFAULT_SNAP_KINDS, DEFAULT_SNAP_RADIUS_PX, DEFAULT_TOOL_MANIFEST, type DimensionOptions, type DisplayOptions, type DistanceMeasurement, EMPTY_SELECTION, type EndDelta, type FeedSegment, type FeedSegmentHighlight, type FeedSegmentSelector, type FeedSegmentSpan, type FocusOptions, type FocusTarget, type FrameCaptureOptions, type FrameCaptureSession, HEPCO_GFX_PROFILE, type HeatmapSample, type HepcoGfxRailProfileDims, IDENTITY_POSE, INFEED_MODULE_TYPES, type InfoBarConfig, type InfoBarMarkerConfig, type InfoBarOptions, type InteractionLocks, JSDELIVR_ASSETS_BASE_URL, MODULE_CATALOG, MODULE_GUIDING_RAIL_MAP, MOVER_CATALOG, type MarkerOptions, type MarkerShape, type MeasuredEntityRef, type Measurement, type MeasurementApi, type MeasurementAxis, type MeasurementDocument, type MeasurementDraft, type MeasurementFormatOptions, type MeasurementId, type MeasurementInput, type MeasurementKind, type MeasurementOptions, type MeasurementPoint, type MeasurementResult, type MeasurementSnapshot, type MeasurementStyle, type MeasurementTool, type ModuleAssetEntry, type ModuleCatalogEntry, type ModuleCollision, type ModuleCollisionPartInput, type ModuleCollisionXpuInput, ModuleCornerMarkers, type ModuleEntry, type ModuleHighlight, type ModuleProbe, type ModuleRef, type ModuleSidecar, type ModuleStatusEntry, type ModuleType3D, type MoverAssetEntry, type MoverCatalogEntry, type MoverCollision, type MoverConfig, MoverIdLabel, type MoverIdLabelOptions, type MoverPositionEntry, type MoverProbe, type MoverRef, type MoverSidecar, type MoverToolAssetEntry, type MoverToolConfig, type MoverToolSidecar, type MoverToolType3D, type MoverType3D, type NormalizationWarning, type NormalizedXtsConfig, type Orientation, type OriginCorrection, type PartConfig, type PartPath, type PartTransformation, type PathMeasurement, type PathSample, type PathType, type PerformanceOptions, type PlanarPose, type PointCloud, type PointProjector, type PositionFrame, type ProcessingUnitConfig, type RailAssetEntry, type RailSidecar, type RailSystem, type RailType3D, type ResolvedMeasurementStyle, SIDECAR_KINDS, type ScreenshotFormat, type ScreenshotMode, type ScreenshotOptions, type ScreenshotResult, type SelectionMode, type SelectionState, type SidecarIdOf, type SidecarKind, type SidecarKindSpec, type SidecarKinds, SidecarLoader, type SidecarOf, type SidecarOverrides, type SidecarSourceConfig, SidecarSourceContext, type SnapCandidate, type SnapKind, type SnapOptions, type SplitFeedSegmentsOptions, type StationConfig, type StationOptions, type StatorHeatmap, type StopPositionMoverOptions, type TextOptions, type TrackAnchor, type TrackDistanceMeasurement, type TrackIndex, type TrackIndexEntry, type TrackMetrics, type TrackMetricsResolver, type TrackProjection, type TrackTransform, VERSION, type Vec2, type Vec3, type ViewCubeAlignment, type ViewCubeOptions, XtsArcCurve3, type XtsConfig, XtsConfigNormalizer, type XtsModelDocument, XtsPointCloudCurve3, type XtsRuntimeState, XtsViewer3D, type XtsViewer3DProps, type XtsViewer3DRef, type XtsViewerError, type XtsViewerErrorCode, XtsViewerErrorException, angleDeg, applyBeckhoffXtsConvention, applyEmptyClick, applyModuleClick, applyMoverClick, arcPoints, axisDistanceMm, buildChain, buildModuleProbes, buildPartPath, buildTrackIndex, chainToUserPositionMm, checkAllModuleCollisions, checkAllMoverCollisions, checkModuleCollisions, checkSamePathCollisions, chooseSnapCandidate, collectFeedSegments, collectFeedSegmentsForXpu, collectTriangleSnapCandidates, composeAssetUrl, computeMeasurementResult, createHepcoGfxBaseplateShape, createHepcoGfxRailShape, deselectAll, distanceMm, findModuleAt, formatAngleDeg, formatLengthMm, getModuleEntry, getMoverEntry, getPointCloud, getSharedAssetLoader, interpolateHeatmapValue, isChainClosed, isKnownModuleType, isKnownMoverType, isModuleSelected, isMoverSelected, labelAnchorFor, moduleAnchorWorld, moduleEndDelta, moduleSidecarFilename, moverAnchorWorld, moverSidecarFilename, moverWorldAt, nearestTrackPoint, normaliseToHeatmapRange, normalizeXtsConfig, pathLengthsMm, pickGlbForRail, poseToMatrix4, railSidecarFilename, registerPointCloud, resolveEntityFromObject, resolveGuidingRailGlbUrl, resolveGuidingRailType, resolveHepcoGfxProfile, resolveMeasurementStyle, resolveModuleGlbUrl, resolveMoverGlbUrl, resolveOriginCorrection, resolveStopPositionMm, resolveToolGlbUrl, sampleChainPoint, sampleChainRange, sampleModulePath, snapToGrid, sortHeatmapSamples, splitIntoFeedSegments, toModuleCollisionInputs, toolSidecarFilename, trackAnchorWorld, trackDistanceMm, trackLengthOf, trackPolylineWorld, unregisterPointCloud, useSidecarSource, userToChainPositionMm, worldPointOnPart };