@needle-tools/engine 5.1.9 → 5.1.11

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 (105) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/SKILL.md +64 -4
  3. package/components.needle.json +1 -1
  4. package/dist/{needle-engine.bundle-CHq9xqXv.min.js → needle-engine.bundle-d-dLyN3s.min.js} +137 -136
  5. package/dist/{needle-engine.bundle-DYPk7VZg.umd.cjs → needle-engine.bundle-n5YALNtc.umd.cjs} +140 -139
  6. package/dist/{needle-engine.bundle-XZ6cKssu.js → needle-engine.bundle-ue2Lw4bF.js} +5267 -5101
  7. package/dist/needle-engine.d.ts +138 -26
  8. package/dist/needle-engine.js +522 -518
  9. package/dist/needle-engine.min.js +1 -1
  10. package/dist/needle-engine.umd.cjs +1 -1
  11. package/dist/three-examples.js +727 -781
  12. package/dist/three-examples.min.js +12 -12
  13. package/dist/three-examples.umd.cjs +9 -9
  14. package/lib/engine/api.d.ts +1 -1
  15. package/lib/engine/api.js +1 -1
  16. package/lib/engine/api.js.map +1 -1
  17. package/lib/engine/engine_init.js +2 -2
  18. package/lib/engine/engine_init.js.map +1 -1
  19. package/lib/engine/engine_license.d.ts +7 -7
  20. package/lib/engine/engine_license.js +71 -71
  21. package/lib/engine/engine_license.js.map +1 -1
  22. package/lib/engine/engine_materialpropertyblock.d.ts +13 -4
  23. package/lib/engine/engine_materialpropertyblock.js +16 -5
  24. package/lib/engine/engine_materialpropertyblock.js.map +1 -1
  25. package/lib/engine/engine_math.d.ts +13 -0
  26. package/lib/engine/engine_math.js +17 -0
  27. package/lib/engine/engine_math.js.map +1 -1
  28. package/lib/engine/engine_networking_blob.js +3 -3
  29. package/lib/engine/engine_networking_blob.js.map +1 -1
  30. package/lib/engine/engine_utils_qrcode.js +2 -2
  31. package/lib/engine/engine_utils_qrcode.js.map +1 -1
  32. package/lib/engine/postprocessing/postprocessing.d.ts +18 -0
  33. package/lib/engine/postprocessing/postprocessing.js +31 -2
  34. package/lib/engine/postprocessing/postprocessing.js.map +1 -1
  35. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +2 -2
  36. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js.map +1 -1
  37. package/lib/engine/webcomponents/needle menu/needle-menu.js +5 -5
  38. package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
  39. package/lib/engine/webcomponents/needle-engine.js +2 -2
  40. package/lib/engine/webcomponents/needle-engine.js.map +1 -1
  41. package/lib/engine/webcomponents/needle-engine.loading.js +2 -2
  42. package/lib/engine/webcomponents/needle-engine.loading.js.map +1 -1
  43. package/lib/engine/xr/TempXRContext.js +2 -2
  44. package/lib/engine/xr/TempXRContext.js.map +1 -1
  45. package/lib/engine/xr/XRHandMeshModel.d.ts +31 -0
  46. package/lib/engine/xr/XRHandMeshModel.js +153 -0
  47. package/lib/engine/xr/XRHandMeshModel.js.map +1 -0
  48. package/lib/engine-components/DragControls.d.ts +0 -5
  49. package/lib/engine-components/DragControls.js +0 -8
  50. package/lib/engine-components/DragControls.js.map +1 -1
  51. package/lib/engine-components/ReflectionProbe.js +3 -3
  52. package/lib/engine-components/ReflectionProbe.js.map +1 -1
  53. package/lib/engine-components/RendererInstancing.d.ts +34 -3
  54. package/lib/engine-components/RendererInstancing.js +92 -11
  55. package/lib/engine-components/RendererInstancing.js.map +1 -1
  56. package/lib/engine-components/RendererLightmap.js +1 -1
  57. package/lib/engine-components/RendererLightmap.js.map +1 -1
  58. package/lib/engine-components/SyncedRoom.js +5 -0
  59. package/lib/engine-components/SyncedRoom.js.map +1 -1
  60. package/lib/engine-components/export/usdz/USDZExporter.js +4 -4
  61. package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -1
  62. package/lib/engine-components/postprocessing/Effects/DepthOfField.js +10 -2
  63. package/lib/engine-components/postprocessing/Effects/DepthOfField.js.map +1 -1
  64. package/lib/engine-components/postprocessing/index.d.ts +4 -0
  65. package/lib/engine-components/postprocessing/index.js +7 -0
  66. package/lib/engine-components/postprocessing/index.js.map +1 -1
  67. package/lib/engine-components/splines/SplineWalker.js +9 -3
  68. package/lib/engine-components/splines/SplineWalker.js.map +1 -1
  69. package/lib/engine-components/utils/LookAt.d.ts +13 -4
  70. package/lib/engine-components/utils/LookAt.js +13 -4
  71. package/lib/engine-components/utils/LookAt.js.map +1 -1
  72. package/lib/engine-components/webxr/WebXR.js +1 -1
  73. package/lib/engine-components/webxr/WebXR.js.map +1 -1
  74. package/lib/engine-components/webxr/controllers/XRControllerModel.d.ts +1 -1
  75. package/lib/engine-components/webxr/controllers/XRControllerModel.js +12 -7
  76. package/lib/engine-components/webxr/controllers/XRControllerModel.js.map +1 -1
  77. package/package.json +2 -2
  78. package/plugins/common/license.js +4 -4
  79. package/plugins/vite/license.js +4 -4
  80. package/src/engine/api.ts +1 -1
  81. package/src/engine/engine_init.ts +2 -2
  82. package/src/engine/engine_license.ts +68 -68
  83. package/src/engine/engine_materialpropertyblock.ts +17 -5
  84. package/src/engine/engine_math.ts +17 -0
  85. package/src/engine/engine_networking_blob.ts +3 -3
  86. package/src/engine/engine_utils_qrcode.ts +2 -2
  87. package/src/engine/postprocessing/postprocessing.ts +32 -2
  88. package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +2 -2
  89. package/src/engine/webcomponents/needle menu/needle-menu.ts +5 -5
  90. package/src/engine/webcomponents/needle-engine.loading.ts +6 -6
  91. package/src/engine/webcomponents/needle-engine.ts +2 -2
  92. package/src/engine/xr/TempXRContext.ts +2 -2
  93. package/src/engine/xr/XRHandMeshModel.ts +179 -0
  94. package/src/engine-components/DragControls.ts +0 -7
  95. package/src/engine-components/ReflectionProbe.ts +3 -3
  96. package/src/engine-components/RendererInstancing.ts +92 -11
  97. package/src/engine-components/RendererLightmap.ts +1 -1
  98. package/src/engine-components/SyncedRoom.ts +5 -0
  99. package/src/engine-components/export/usdz/USDZExporter.ts +4 -4
  100. package/src/engine-components/postprocessing/Effects/DepthOfField.ts +10 -2
  101. package/src/engine-components/postprocessing/index.ts +7 -0
  102. package/src/engine-components/splines/SplineWalker.ts +9 -3
  103. package/src/engine-components/utils/LookAt.ts +13 -4
  104. package/src/engine-components/webxr/WebXR.ts +1 -1
  105. package/src/engine-components/webxr/controllers/XRControllerModel.ts +13 -7
@@ -5,6 +5,7 @@ import { Audio as Audio_2 } from 'three';
5
5
  import { AudioListener as AudioListener_3 } from 'three';
6
6
  import { BatchedMesh } from 'three';
7
7
  import { BloomEffect as BloomEffect_2 } from 'postprocessing';
8
+ import { Bone } from 'three';
8
9
  import { Box3 } from 'three';
9
10
  import { BufferGeometry } from 'three';
10
11
  import { Camera as Camera_2 } from 'three';
@@ -111,22 +112,21 @@ import { WebGLRenderTarget } from 'three';
111
112
  import { WebXRArrayCamera } from 'three';
112
113
  import { World } from '@dimforge/rapier3d-compat';
113
114
  import { XRControllerModelFactory } from 'three/examples/jsm/webxr/XRControllerModelFactory.js';
114
- import { XRHandMeshModel } from 'three/examples/jsm/webxr/XRHandMeshModel.js';
115
115
  import { XRHandSpace } from 'three';
116
116
 
117
117
  export declare const $componentName: unique symbol;
118
118
 
119
- /* Excluded from this release type: $iNNlsg */
120
-
121
119
  export declare const $physicsKey: unique symbol;
122
120
 
123
- /* Excluded from this release type: _$qxlHFE */
124
-
125
121
  export declare class __Ignore {
126
122
  }
127
123
 
128
124
  export declare function __internalNotifyObjectDestroyed(obj: Object3D): void;
129
125
 
126
+ /* Excluded from this release type: __nlZsk */
127
+
128
+ /* Excluded from this release type: __zrAx */
129
+
130
130
  /** Data describing the accessible semantics for a 3D object or component. */
131
131
  declare type AccessibilityData = {
132
132
  /** ARIA role (e.g. `"button"`, `"img"`, `"region"`). */
@@ -5567,7 +5567,7 @@ export declare class DepthOfField extends PostProcessingEffect {
5567
5567
  unapply(): void;
5568
5568
  }
5569
5569
 
5570
- declare enum DepthOfFieldMode {
5570
+ export declare enum DepthOfFieldMode {
5571
5571
  Off = 0,
5572
5572
  Gaussian = 1,
5573
5573
  Bokeh = 2
@@ -5902,11 +5902,6 @@ export declare class DragControls extends Component implements IPointerEventHand
5902
5902
  * This is similar to mouse acceleration on a screen.
5903
5903
  */
5904
5904
  xrDistanceDragFactor: number;
5905
- /**
5906
- * When enabled, draws a visual line from the dragged object downwards to the next raycast hit,
5907
- * providing visual feedback about the object's position relative to surfaces below it.
5908
- */
5909
- showGizmo: boolean;
5910
5905
  /** Drag profile for screen / touch / mouse input. Reads live from the flat serialized fields. */
5911
5906
  readonly screenProfile: DragProfile;
5912
5907
  /** Drag profile for XR tracked-pointer and transient-pointer input. Reads live from the flat `xr*` serialized fields. */
@@ -9492,11 +9487,30 @@ export declare class InputField extends Component implements IPointerEventHandle
9492
9487
  private processInputOniOS;
9493
9488
  }
9494
9489
 
9490
+ /**
9491
+ * Renders one geometry+material combination for many objects using a
9492
+ * {@link https://threejs.org/docs/#api/en/objects/BatchedMesh | BatchedMesh}.
9493
+ *
9494
+ * The BatchedMesh belongs to this class: it is created here, parented directly to the untransformed
9495
+ * `context.scene` and never moved, so its transform is whatever {@link applyBatchTransform} puts
9496
+ * there and nothing else.
9497
+ *
9498
+ * **Mirroring:** three flips the winding for a mirrored transform per *draw call*, from
9499
+ * `object.matrixWorld.determinant()` - and for a batch that object is the BatchedMesh, not the
9500
+ * instance. So mirrored instances get their own batch, which carries the mirror on its own
9501
+ * transform (`scale.z = -1`); otherwise their front faces would be culled.
9502
+ *
9503
+ * That mirror is the one transform the shader's `modelMatrix * batchingMatrix` would otherwise apply
9504
+ * twice, so a mirrored batch stores its instance matrices with it undone. Every other batch is
9505
+ * untransformed and stores world matrices as they are.
9506
+ */
9495
9507
  declare class InstancedMeshRenderer {
9496
9508
  /** The three instanced mesh
9497
9509
  * @link https://threejs.org/docs/#api/en/objects/InstancedMesh
9498
9510
  */
9499
9511
  get batchedMesh(): BatchedMesh;
9512
+ /** True if this batch renders mirrored objects. A batch only holds one or the other. */
9513
+ get mirrored(): boolean;
9500
9514
  get visible(): boolean;
9501
9515
  set visible(val: boolean);
9502
9516
  get castShadow(): boolean;
@@ -9519,6 +9533,7 @@ declare class InstancedMeshRenderer {
9519
9533
  updateBounds(box?: boolean, sphere?: boolean): void;
9520
9534
  private _context;
9521
9535
  private _batchedMesh;
9536
+ private readonly _mirrored;
9522
9537
  private _handles;
9523
9538
  private _geometryIds;
9524
9539
  private _maxInstanceCount;
@@ -9527,25 +9542,33 @@ declare class InstancedMeshRenderer {
9527
9542
  private _currentIndexCount;
9528
9543
  private _maxVertexCount;
9529
9544
  private _maxIndexCount;
9530
- private static nullMatrix;
9545
+ private static instanceMatrix;
9531
9546
  private static lodProjectionScreenMatrix;
9547
+ private static debugBoundsSphere;
9532
9548
  private static debugLODColor;
9533
9549
  private static lodSelectionResult;
9534
9550
  /** Check if the geometry can be added to this instancer
9535
9551
  * @param geometry The geometry to check
9536
9552
  * @param material The material of the geometry
9553
+ * @param mirrored Whether the object's world matrix has a negative determinant
9537
9554
  * @returns true if the geometry can be added
9538
9555
  */
9539
- canAdd(geometry: BufferGeometry, material: Material): boolean;
9556
+ canAdd(geometry: BufferGeometry, material: Material, mirrored: boolean): boolean;
9540
9557
  private _needUpdateBounds;
9541
9558
  private _debugMaterial;
9542
9559
  private getBatchedMeshName;
9543
- constructor(name: string, geo: BufferGeometry, material: Material, initialMaxCount: number, context: Context);
9560
+ constructor(name: string, geo: BufferGeometry, material: Material, initialMaxCount: number, context: Context, mirrored?: boolean);
9544
9561
  dispose(): void;
9545
9562
  addInstance(obj: Mesh, geometry?: BufferGeometry): InstanceHandle | null;
9546
9563
  add(handle: InstanceHandle): boolean;
9547
9564
  remove(handle: InstanceHandle, delete_: boolean): void;
9548
9565
  updateInstance(mat: Matrix4, index: number): void;
9566
+ /** The batch's own transform. This class owns it: the mirror is the only thing that ever goes
9567
+ * here, and the batch is never reparented away from the untransformed scene root. */
9568
+ private applyBatchTransform;
9569
+ /** Writes a *world* matrix to an instance slot, converted into the batch's local space.
9570
+ * All instance matrix writes go through here. */
9571
+ private setInstanceMatrix;
9549
9572
  updateGeometry(geo: BufferGeometry, geometryIndex: number): boolean;
9550
9573
  private onBeforeRender;
9551
9574
  private updateProgressiveMeshLODs;
@@ -9603,6 +9626,9 @@ export declare class InstanceHandle {
9603
9626
  updateMeshInformation(): boolean;
9604
9627
  /** Updates the matrix from the rendered object. Will also call updateWorldMatrix internally */
9605
9628
  updateInstanceMatrix(updateChildren?: boolean, updateMatrix?: boolean): void;
9629
+ private _didWarnAboutMirroringChange;
9630
+ /** Batches are bucketed by mirroring at setup time and an instance can not move between them. */
9631
+ private assertMirroringUnchanged;
9606
9632
  /** Updates the matrix of the instance */
9607
9633
  setMatrix(matrix: Matrix4): void;
9608
9634
  /** Can be used to change the geometry of this instance */
@@ -10458,8 +10484,6 @@ export declare interface IWatch {
10458
10484
  dispose(): any;
10459
10485
  }
10460
10486
 
10461
- /* Excluded from this release type: _iXmRJVD */
10462
-
10463
10487
  export declare interface IXRRig extends Pick<IComponent, "gameObject"> {
10464
10488
  isXRRig(): boolean;
10465
10489
  get isActive(): boolean;
@@ -10502,6 +10526,10 @@ declare abstract class Joint extends Component {
10502
10526
  protected abstract createJoint(self: Rigidbody, other: Rigidbody): any;
10503
10527
  }
10504
10528
 
10529
+ declare type JointBone = Bone & {
10530
+ jointName?: string;
10531
+ };
10532
+
10505
10533
  /** Locks the follow object's world rotation to the quaternion captured at drag-start. */
10506
10534
  export declare class KeepRotationConstraint implements IDragConstraint {
10507
10535
  private readonly _savedQuat;
@@ -11050,19 +11078,28 @@ export declare enum LogType {
11050
11078
  */
11051
11079
  export declare class LookAt extends Component implements UsdzBehaviour {
11052
11080
  /**
11053
- * The target object to look at. If not set, the main camera will be used.
11081
+ * The target object to look at.
11082
+ * @default undefined — when no target is set the main camera is used
11054
11083
  */
11055
11084
  target?: Object3D;
11056
11085
  /**
11057
- * Inverts the forward direction.
11086
+ * Inverts the forward direction, so the object turns its back to the target
11087
+ * instead of facing it. Useful for models authored facing -Z.
11088
+ * @default false
11058
11089
  */
11059
11090
  invertForward: boolean;
11060
11091
  /**
11061
- * Keep the up direction.
11092
+ * Keeps the object upright while turning, so it only rotates around the up
11093
+ * axis rather than tilting to point directly at a target above or below it.
11094
+ * @default true
11062
11095
  */
11063
11096
  keepUpDirection: boolean;
11064
11097
  /**
11065
- * Copy the target rotation.
11098
+ * Copies the target's rotation instead of aiming at its position. Use this to
11099
+ * match a target's orientation, for example to align with the camera.
11100
+ *
11101
+ * Ignored during a VR or AR session.
11102
+ * @default false
11066
11103
  */
11067
11104
  copyTargetRotation: boolean;
11068
11105
  private static flipYQuat;
@@ -11256,7 +11293,7 @@ export declare class MaskableGraphic extends Graphic {
11256
11293
  * This means:
11257
11294
  * - If you change the object's material, the overrides will still be applied to the new material
11258
11295
  * - Multiple objects can share the same material but have different property overrides
11259
- * - If you don't want overrides applied after changing a material, you must remove them using {@link removeOveride}, {@link clearAllOverrides}, or {@link dispose}
11296
+ * - If you don't want overrides applied after changing a material, you must remove them using {@link removeOverride}, {@link clearAllOverrides}, or {@link dispose}
11260
11297
  *
11261
11298
  * The property block system works by:
11262
11299
  * - Temporarily applying overrides in onBeforeRender
@@ -11318,7 +11355,7 @@ export declare class MaskableGraphic extends Graphic {
11318
11355
  * // If you don't want overrides on the new material, remove them:
11319
11356
  * block.clearAllOverrides(); // Remove all overrides
11320
11357
  * // or
11321
- * block.removeOveride("color"); // Remove specific override
11358
+ * block.removeOverride("color"); // Remove specific override
11322
11359
  * // or
11323
11360
  * block.dispose(); // Remove the entire property block
11324
11361
  * ```
@@ -11445,11 +11482,20 @@ export declare class MaterialPropertyBlock<T extends Material = Material> {
11445
11482
  * block.setOverride("lightMap", lightmapTexture);
11446
11483
  *
11447
11484
  * // Remove a specific override - the material will now use its original color
11448
- * block.removeOveride("color");
11485
+ * block.removeOverride("color");
11449
11486
  *
11450
11487
  * // Other overrides (roughness, lightMap) remain active
11451
11488
  * ```
11452
11489
  */
11490
+ removeOverride<K extends NonFunctionPropertyNames<T>>(name: K | ({} & string)): void;
11491
+ /**
11492
+ * Removes a specific property override.
11493
+ *
11494
+ * @param name The property name to remove the override for
11495
+ *
11496
+ * @deprecated The name is missing an `r`. Use {@link removeOverride} instead — this
11497
+ * alias is kept so existing code keeps working and will be removed in a future version.
11498
+ */
11453
11499
  removeOveride<K extends NonFunctionPropertyNames<T>>(name: K | ({} & string)): void;
11454
11500
  /**
11455
11501
  * Removes all property overrides from this block.
@@ -11491,7 +11537,7 @@ export declare class MaterialPropertyBlock<T extends Material = Material> {
11491
11537
  * });
11492
11538
  * ```
11493
11539
  *
11494
- * @see {@link removeOveride} - To remove a single override
11540
+ * @see {@link removeOverride} - To remove a single override
11495
11541
  * @see {@link dispose} - To completely remove the property block and clean up resources
11496
11542
  */
11497
11543
  clearAllOverrides(): void;
@@ -11608,6 +11654,19 @@ declare class MathHelper {
11608
11654
  * @returns Value clamped to [0, 1]
11609
11655
  */
11610
11656
  clamp01(value: number): number;
11657
+ /**
11658
+ * Loops a value so that it never exceeds `length` and never goes below 0 — the modulo you
11659
+ * usually want for wrapping. Note that JavaScript's `%` operator is a *remainder*: it keeps the
11660
+ * sign of the dividend, so `-0.25 % 1` is `-0.25`, not `0.75`. This returns `0.75`.
11661
+ * @param value Value to wrap
11662
+ * @param length Length of the range to wrap into (defaults to 1)
11663
+ * @returns Value wrapped into [0, length)
11664
+ * @example ```javascript
11665
+ * Mathf.repeat(1.5, 1); // 0.5
11666
+ * Mathf.repeat(-0.25, 1); // 0.75
11667
+ * ```
11668
+ */
11669
+ repeat(value: number, length?: number): number;
11611
11670
  /**
11612
11671
  * Linearly interpolates between two values.
11613
11672
  * @param value1 Start value (returned when t=0)
@@ -13333,7 +13392,7 @@ export declare class NestedGltf extends Component {
13333
13392
  private hash;
13334
13393
  }
13335
13394
 
13336
- declare enum NEToneMappingMode {
13395
+ export declare enum NEToneMappingMode {
13337
13396
  None = 0,
13338
13397
  Neutral = 1,// Neutral tonemapper, close to Reinhard
13339
13398
  ACES = 2,// ACES Filmic reference tonemapper (custom approximation)
@@ -14039,6 +14098,8 @@ export declare function offXRSessionEnd(fn: (evt: XRSessionEventArgs) => void):
14039
14098
  */
14040
14099
  export declare function offXRSessionStart(fn: (evt: XRSessionEventArgs) => void): void;
14041
14100
 
14101
+ /* Excluded from this release type: oMxKl */
14102
+
14042
14103
  /**
14043
14104
  * @experimental
14044
14105
  * Subscribe to a DOM event on any {@link EventTarget} (window, document, HTML elements, etc.)
@@ -16258,6 +16319,24 @@ export declare class OrbitControls extends Component implements ICameraControlle
16258
16319
  get effects(): readonly IPostProcessingEffect[];
16259
16320
  get dirty(): boolean;
16260
16321
  set dirty(value: boolean);
16322
+ private _enabled;
16323
+ /**
16324
+ * Whether the postprocessing stack runs at all. When disabled the scene is
16325
+ * rendered directly, with no effects and no composer.
16326
+ *
16327
+ * Every effect keeps its own `enabled` state, so switching this back on
16328
+ * restores exactly the stack that was there before. Useful for a quality
16329
+ * setting, for a clean screenshot, or for comparing a scene with and
16330
+ * without effects.
16331
+ *
16332
+ * @default true
16333
+ * @example
16334
+ * ```ts
16335
+ * context.postprocessing.enabled = false;
16336
+ * ```
16337
+ */
16338
+ get enabled(): boolean;
16339
+ set enabled(value: boolean);
16261
16340
  /** The internal PostProcessingHandler that manages the EffectComposer pipeline */
16262
16341
  get handler(): IPostProcessingHandler | null;
16263
16342
  /**
@@ -16728,6 +16807,13 @@ export declare class OrbitControls extends Component implements ICameraControlle
16728
16807
 
16729
16808
  export { QTrailParticle }
16730
16809
 
16810
+ export declare enum QualityLevel {
16811
+ LOW = 0,
16812
+ MEDIUM = 1,
16813
+ HIGH = 2,
16814
+ ULTRA = 3
16815
+ }
16816
+
16731
16817
  declare type Quat = {
16732
16818
  x: number;
16733
16819
  y: number;
@@ -18907,7 +18993,7 @@ export declare class OrbitControls extends Component implements ICameraControlle
18907
18993
  }
18908
18994
 
18909
18995
  /**See (N8AO documentation)[https://github.com/N8python/n8ao] */
18910
- declare enum ScreenSpaceAmbientOcclusionN8QualityMode {
18996
+ export declare enum ScreenSpaceAmbientOcclusionN8QualityMode {
18911
18997
  Performance = 0,
18912
18998
  Low = 1,
18913
18999
  Medium = 2,
@@ -25112,6 +25198,32 @@ export declare class OrbitControls extends Component implements ICameraControlle
25112
25198
 
25113
25199
  export declare type XRGestureName = "pinch";
25114
25200
 
25201
+ /**
25202
+ * Renders a skinned hand mesh and drives its bones from the tracked WebXR joint poses.
25203
+ *
25204
+ * @see {@link XRControllerModel} which creates one per tracked hand.
25205
+ */
25206
+ declare class XRHandMeshModel {
25207
+ /** The three XRHandSpace whose `joints` drive this mesh. */
25208
+ readonly controller: XRHandSpace;
25209
+ /** The object the loaded hand mesh is added to. */
25210
+ readonly handModel: Object3D;
25211
+ /** The bones driven by {@link updateMesh}, in {@link JOINT_NAMES} order. Sparse if the model lacks joints. */
25212
+ readonly bones: Array<JointBone | undefined>;
25213
+ /**
25214
+ * @param handModel the object the loaded mesh is parented to
25215
+ * @param controller the hand space providing joint poses
25216
+ * @param path base path for the model (defaults to the generic hand profile CDN)
25217
+ * @param handedness file name to load (without extension) — either "left"/"right" for the
25218
+ * default profile, or a full path for a custom hand model
25219
+ * @param loader loader to use; a plain GLTFLoader is created when omitted
25220
+ * @param onLoad invoked with the loaded hand object once it has been added
25221
+ */
25222
+ constructor(handModel: Object3D, controller: XRHandSpace, path: string | null, handedness: string, loader?: GLTFLoader | null, onLoad?: ((object: Object3D) => void) | null);
25223
+ /** Copies the current tracked joint poses onto the mesh bones. Called every XR frame. */
25224
+ updateMesh(): void;
25225
+ }
25226
+
25115
25227
  declare type XRMesh_2 = {
25116
25228
  meshSpace: XRSpace;
25117
25229
  lastChangedTime: number;