@iwsdk/core 0.5.3 → 1.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/README.md +22 -1
  2. package/dist/asset/asset-manager.d.ts.map +1 -1
  3. package/dist/asset/asset-manager.js +3 -2
  4. package/dist/asset/asset-manager.js.map +1 -1
  5. package/dist/asset/cache-manager.js.map +1 -1
  6. package/dist/asset/loaders/audio-loader.js.map +1 -1
  7. package/dist/asset/loaders/cached-asset-load.js.map +1 -1
  8. package/dist/asset/loaders/gltf-loader.js.map +1 -1
  9. package/dist/asset/loaders/hdr-texture-loader.js.map +1 -1
  10. package/dist/asset/loaders/texture-loader.js.map +1 -1
  11. package/dist/asset/loaders/uikitml-loader.js.map +1 -1
  12. package/dist/audio/audio-pool.js.map +1 -1
  13. package/dist/audio/audio-system.js.map +1 -1
  14. package/dist/audio/audio-utils.js.map +1 -1
  15. package/dist/audio/audio.js.map +1 -1
  16. package/dist/camera/camera-source.js.map +1 -1
  17. package/dist/camera/camera-system.d.ts +7 -3
  18. package/dist/camera/camera-system.d.ts.map +1 -1
  19. package/dist/camera/camera-system.js +81 -50
  20. package/dist/camera/camera-system.js.map +1 -1
  21. package/dist/camera/camera-utils.d.ts +5 -0
  22. package/dist/camera/camera-utils.d.ts.map +1 -1
  23. package/dist/camera/camera-utils.js +8 -1
  24. package/dist/camera/camera-utils.js.map +1 -1
  25. package/dist/camera/types.js.map +1 -1
  26. package/dist/depth/depth-occludable.js.map +1 -1
  27. package/dist/depth/depth-sensing-system.d.ts +3 -0
  28. package/dist/depth/depth-sensing-system.d.ts.map +1 -1
  29. package/dist/depth/depth-sensing-system.js +55 -1
  30. package/dist/depth/depth-sensing-system.js.map +1 -1
  31. package/dist/depth/depth-textures.js.map +1 -1
  32. package/dist/depth/occlusion/preprocessing-pass.js.map +1 -1
  33. package/dist/depth/occlusion/preprocessing-shader.glsl.js.map +1 -1
  34. package/dist/ecs/builtin-components.js.map +1 -1
  35. package/dist/ecs/component-editor-metadata.js.map +1 -1
  36. package/dist/ecs/component-manifest.js.map +1 -1
  37. package/dist/ecs/entity.js.map +1 -1
  38. package/dist/ecs/system.js.map +1 -1
  39. package/dist/ecs/world.d.ts +2 -0
  40. package/dist/ecs/world.d.ts.map +1 -1
  41. package/dist/ecs/world.js +4 -0
  42. package/dist/ecs/world.js.map +1 -1
  43. package/dist/environment/dome-gradient.js.map +1 -1
  44. package/dist/environment/dome-texture.js.map +1 -1
  45. package/dist/environment/environment-system.js.map +1 -1
  46. package/dist/environment/gradient-environment.js.map +1 -1
  47. package/dist/environment/ibl-gradient.js.map +1 -1
  48. package/dist/environment/ibl-texture.js.map +1 -1
  49. package/dist/environment/scene-ar-environment.js.map +1 -1
  50. package/dist/environment-raycast/environment-raycast.js.map +1 -1
  51. package/dist/environment-raycast/raycast-target.js.map +1 -1
  52. package/dist/grab/distance-grabbable.d.ts +5 -0
  53. package/dist/grab/distance-grabbable.d.ts.map +1 -1
  54. package/dist/grab/distance-grabbable.js +5 -0
  55. package/dist/grab/distance-grabbable.js.map +1 -1
  56. package/dist/grab/grab-helpers.js.map +1 -1
  57. package/dist/grab/grab-system.js.map +1 -1
  58. package/dist/grab/grab-warnings.js.map +1 -1
  59. package/dist/grab/grabbed.js.map +1 -1
  60. package/dist/grab/handles.d.ts +6 -0
  61. package/dist/grab/handles.d.ts.map +1 -1
  62. package/dist/grab/handles.js +46 -12
  63. package/dist/grab/handles.js.map +1 -1
  64. package/dist/grab/index.js.map +1 -1
  65. package/dist/grab/one-hand-grabbable.d.ts +5 -0
  66. package/dist/grab/one-hand-grabbable.d.ts.map +1 -1
  67. package/dist/grab/one-hand-grabbable.js +5 -0
  68. package/dist/grab/one-hand-grabbable.js.map +1 -1
  69. package/dist/grab/pointer-events-patch.js.map +1 -1
  70. package/dist/grab/two-hands-grabbable.d.ts +5 -0
  71. package/dist/grab/two-hands-grabbable.d.ts.map +1 -1
  72. package/dist/grab/two-hands-grabbable.js +5 -0
  73. package/dist/grab/two-hands-grabbable.js.map +1 -1
  74. package/dist/index.js +4 -3
  75. package/dist/index.js.map +1 -1
  76. package/dist/init/browser-camera.js.map +1 -1
  77. package/dist/init/index.d.ts +2 -2
  78. package/dist/init/index.d.ts.map +1 -1
  79. package/dist/init/player-camera.js.map +1 -1
  80. package/dist/init/session-grant.d.ts +34 -0
  81. package/dist/init/session-grant.d.ts.map +1 -0
  82. package/dist/init/session-grant.js +89 -0
  83. package/dist/init/session-grant.js.map +1 -0
  84. package/dist/init/world-initializer.d.ts +87 -4
  85. package/dist/init/world-initializer.d.ts.map +1 -1
  86. package/dist/init/world-initializer.js +45 -41
  87. package/dist/init/world-initializer.js.map +1 -1
  88. package/dist/init/xr.d.ts +19 -0
  89. package/dist/init/xr.d.ts.map +1 -1
  90. package/dist/init/xr.js +136 -41
  91. package/dist/init/xr.js.map +1 -1
  92. package/dist/input/canvas-pointer-system.d.ts +2 -0
  93. package/dist/input/canvas-pointer-system.d.ts.map +1 -1
  94. package/dist/input/canvas-pointer-system.js +33 -13
  95. package/dist/input/canvas-pointer-system.js.map +1 -1
  96. package/dist/input/input-actions.js.map +1 -1
  97. package/dist/input/input-manager.js.map +1 -1
  98. package/dist/input/input-system.d.ts.map +1 -1
  99. package/dist/input/input-system.js +5 -2
  100. package/dist/input/input-system.js.map +1 -1
  101. package/dist/input/state-tags.js.map +1 -1
  102. package/dist/input/stateful-browser-gamepad.js.map +1 -1
  103. package/dist/input/stateful-keyboard.js.map +1 -1
  104. package/dist/layers/xr-cylinder-layer.d.ts +2 -1
  105. package/dist/layers/xr-cylinder-layer.d.ts.map +1 -1
  106. package/dist/layers/xr-cylinder-layer.js +2 -1
  107. package/dist/layers/xr-cylinder-layer.js.map +1 -1
  108. package/dist/layers/xr-layer-init.d.ts +19 -0
  109. package/dist/layers/xr-layer-init.d.ts.map +1 -0
  110. package/dist/layers/xr-layer-init.js +20 -0
  111. package/dist/layers/xr-layer-init.js.map +1 -0
  112. package/dist/layers/xr-layer-state.js.map +1 -1
  113. package/dist/layers/xr-layer-system.d.ts +41 -1
  114. package/dist/layers/xr-layer-system.d.ts.map +1 -1
  115. package/dist/layers/xr-layer-system.js +506 -132
  116. package/dist/layers/xr-layer-system.js.map +1 -1
  117. package/dist/layers/xr-layer-transform.d.ts +18 -0
  118. package/dist/layers/xr-layer-transform.d.ts.map +1 -0
  119. package/dist/layers/xr-layer-transform.js +115 -0
  120. package/dist/layers/xr-layer-transform.js.map +1 -0
  121. package/dist/layers/xr-quad-layer.d.ts +2 -1
  122. package/dist/layers/xr-quad-layer.d.ts.map +1 -1
  123. package/dist/layers/xr-quad-layer.js +2 -1
  124. package/dist/layers/xr-quad-layer.js.map +1 -1
  125. package/dist/level/level-component-applier.d.ts +2 -0
  126. package/dist/level/level-component-applier.d.ts.map +1 -1
  127. package/dist/level/level-component-applier.js +24 -5
  128. package/dist/level/level-component-applier.js.map +1 -1
  129. package/dist/level/level-player-rig.js.map +1 -1
  130. package/dist/level/level-root.js.map +1 -1
  131. package/dist/level/level-scene-environment.js.map +1 -1
  132. package/dist/level/level-scene-json-importer.js.map +1 -1
  133. package/dist/level/level-scene-material.js.map +1 -1
  134. package/dist/level/level-scene-object.js.map +1 -1
  135. package/dist/level/level-scene-primitive.js.map +1 -1
  136. package/dist/level/level-system.js.map +1 -1
  137. package/dist/level/level-tag.js.map +1 -1
  138. package/dist/lighting/light-binding.js.map +1 -1
  139. package/dist/lighting/light-components.js.map +1 -1
  140. package/dist/lighting/light-system.js.map +1 -1
  141. package/dist/locomotion/geometries/beveled-cylinder.js.map +1 -1
  142. package/dist/locomotion/locomotion-environment.js.map +1 -1
  143. package/dist/locomotion/locomotion-input-provider.js.map +1 -1
  144. package/dist/locomotion/locomotion.js.map +1 -1
  145. package/dist/locomotion/materials/line.js.map +1 -1
  146. package/dist/locomotion/slide.js.map +1 -1
  147. package/dist/locomotion/teleport.js.map +1 -1
  148. package/dist/locomotion/turn.js.map +1 -1
  149. package/dist/mcp/ecs-debug-tools.d.ts +4 -1
  150. package/dist/mcp/ecs-debug-tools.d.ts.map +1 -1
  151. package/dist/mcp/ecs-debug-tools.js +113 -10
  152. package/dist/mcp/ecs-debug-tools.js.map +1 -1
  153. package/dist/mcp/index.d.ts +1 -0
  154. package/dist/mcp/index.d.ts.map +1 -1
  155. package/dist/mcp/mcp-runtime.d.ts +2 -0
  156. package/dist/mcp/mcp-runtime.d.ts.map +1 -1
  157. package/dist/mcp/mcp-runtime.js +41 -0
  158. package/dist/mcp/mcp-runtime.js.map +1 -1
  159. package/dist/mcp/scene-tools.js.map +1 -1
  160. package/dist/mcp/ui-debug-tools.d.ts +56 -0
  161. package/dist/mcp/ui-debug-tools.d.ts.map +1 -0
  162. package/dist/mcp/ui-debug-tools.js +412 -0
  163. package/dist/mcp/ui-debug-tools.js.map +1 -0
  164. package/dist/physics/index.js +1 -1
  165. package/dist/physics/physics-runtime.d.ts +22 -0
  166. package/dist/physics/physics-runtime.d.ts.map +1 -0
  167. package/dist/physics/physics-runtime.js +423 -0
  168. package/dist/physics/physics-runtime.js.map +1 -0
  169. package/dist/physics/physics-system.d.ts +84 -108
  170. package/dist/physics/physics-system.d.ts.map +1 -1
  171. package/dist/physics/physics-system.js +686 -555
  172. package/dist/physics/physics-system.js.map +1 -1
  173. package/dist/physics/physics-transport.d.ts +20 -0
  174. package/dist/physics/physics-transport.d.ts.map +1 -0
  175. package/dist/physics/physics-transport.js +111 -0
  176. package/dist/physics/physics-transport.js.map +1 -0
  177. package/dist/physics/physics-worker-protocol.d.ts +144 -0
  178. package/dist/physics/physics-worker-protocol.d.ts.map +1 -0
  179. package/dist/physics/physics-worker-protocol.js +41 -0
  180. package/dist/physics/physics-worker-protocol.js.map +1 -0
  181. package/dist/physics/physics-worker-utils.d.ts +8 -0
  182. package/dist/physics/physics-worker-utils.d.ts.map +1 -0
  183. package/dist/physics/physics-worker-utils.js +12 -0
  184. package/dist/physics/physics-worker-utils.js.map +1 -0
  185. package/dist/physics/physics-worker.d.ts +8 -0
  186. package/dist/physics/physics-worker.d.ts.map +1 -0
  187. package/dist/physics/physics-worker.js +66 -0
  188. package/dist/physics/physics-worker.js.map +1 -0
  189. package/dist/physics/physicsBody.js.map +1 -1
  190. package/dist/physics/physicsManipulation.js.map +1 -1
  191. package/dist/physics/physicsShape.js.map +1 -1
  192. package/dist/physics/utils.js.map +1 -1
  193. package/dist/project/normalize.js +7 -1
  194. package/dist/project/normalize.js.map +1 -1
  195. package/dist/project/paths.js.map +1 -1
  196. package/dist/project/types.d.ts +7 -1
  197. package/dist/project/types.d.ts.map +1 -1
  198. package/dist/project/types.js.map +1 -1
  199. package/dist/project/validation.js +36 -2
  200. package/dist/project/validation.js.map +1 -1
  201. package/dist/runtime/three.js.map +1 -1
  202. package/dist/scene-understanding/anchor.js.map +1 -1
  203. package/dist/scene-understanding/mesh.js.map +1 -1
  204. package/dist/scene-understanding/plane.js.map +1 -1
  205. package/dist/scene-understanding/scene-understanding-system.d.ts +42 -6
  206. package/dist/scene-understanding/scene-understanding-system.d.ts.map +1 -1
  207. package/dist/scene-understanding/scene-understanding-system.js +391 -106
  208. package/dist/scene-understanding/scene-understanding-system.js.map +1 -1
  209. package/dist/schemas/iwsdk-project.v1.schema.json +20 -1
  210. package/dist/transform/synced-euler.js.map +1 -1
  211. package/dist/transform/synced-quaternion.js.map +1 -1
  212. package/dist/transform/synced-vector3.js.map +1 -1
  213. package/dist/transform/transform-component.js.map +1 -1
  214. package/dist/transform/transform-utils.js.map +1 -1
  215. package/dist/transform/transform.js.map +1 -1
  216. package/dist/ui/document.js.map +1 -1
  217. package/dist/ui/follow-component.js.map +1 -1
  218. package/dist/ui/follow.d.ts.map +1 -1
  219. package/dist/ui/follow.js +0 -1
  220. package/dist/ui/follow.js.map +1 -1
  221. package/dist/ui/panel-components.js.map +1 -1
  222. package/dist/ui/screenspace-component.js.map +1 -1
  223. package/dist/ui/screenspace.js.map +1 -1
  224. package/dist/ui/ui.js.map +1 -1
  225. package/dist/ui/uikitml-asset.js.map +1 -1
  226. package/dist/ui/uikitml.js.map +1 -1
  227. package/dist/version.d.ts +1 -1
  228. package/dist/version.d.ts.map +1 -1
  229. package/dist/version.js +1 -1
  230. package/dist/version.js.map +1 -1
  231. package/dist/visibility/visibility-component.js.map +1 -1
  232. package/dist/visibility/visibility.js.map +1 -1
  233. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"grab-warnings.js","sources":["../../src/grab/grab-warnings.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAAA;;;;;AAKG;AAUH,IAAI,uBAAuB,GAAG,IAAI,OAAO,EAAoC;AAE7E,SAAS,oBAAoB,GAAA;;IAC3B,OAAO,CAAA,CAAA,EAAA,GAAC,MAAM,CAAC,IAAY,CAAC,GAAG,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,GAAG,MAAK,KAAK;AAChD;AAEM,SAAU,kBAAkB,CAAC,MAAgB,EAAA;IACjD,IAAI,KAAK,GAAG,KAAK;AAEjB,IAAA,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAI;QACxB,IAAI,KAAK,EAAE;YACT;QACF;QAEA,MAAM,IAAI,GAAG,KAAa;QAC1B,KAAK;YACH,IAAI,CAAC,MAAM,KAAK,IAAI;AACpB,gBAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AACtB,gBAAA,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU;AACtC,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,KAAK;AACd;AAEM,SAAU,uBAAuB,CACrC,MAA0C,EAC1C,aAAgC,EAAA;AAEhC,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ;AAC9B,IAAA,IAAI,EAAE,MAAM,YAAY,QAAQ,CAAC,EAAE;QACjC;IACF;IAEA,IAAI,CAAC,oBAAoB,EAAE,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE;QACzD;IACF;IAEA,IAAI,gBAAgB,GAAG,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC;IAC1D,IAAI,CAAC,gBAAgB,EAAE;AACrB,QAAA,gBAAgB,GAAG,IAAI,GAAG,EAAE;AAC5B,QAAA,uBAAuB,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC;IACvD;AAEA,IAAA,IAAI,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;QACvC;IACF;AAEA,IAAA,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC;AAEnC,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC;UACvB,IAAI,MAAM,CAAC,IAAI,CAAA,SAAA,EAAY,MAAM,CAAC,KAAK,CAAA,CAAA;AACzC,UAAE,CAAA,CAAA,EAAI,MAAM,CAAC,KAAK,EAAE;IAEtB,OAAO,CAAC,IAAI,CACV,CAAA,eAAA,EAAkB,WAAW,CAAA,KAAA,EAAQ,aAAa,CAAA,gIAAA,CAAkI,CACrL;AACH;;;;"}
1
+ {"version":3,"file":"grab-warnings.js","sources":["../../src/grab/grab-warnings.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport type { Entity } from '../ecs/entity.js';\nimport { Mesh, Object3D } from '../runtime/index.js';\n\ntype GrabComponentName =\n | 'DistanceGrabbable'\n | 'OneHandGrabbable'\n | 'TwoHandsGrabbable';\n\nlet warnedNoRaycastableMesh = new WeakMap<Object3D, Set<GrabComponentName>>();\n\nfunction shouldEmitDevWarning(): boolean {\n return (import.meta as any).env?.DEV !== false;\n}\n\nexport function hasRaycastableMesh(object: Object3D): boolean {\n let found = false;\n\n object.traverse((child) => {\n if (found) {\n return;\n }\n\n const mesh = child as Mesh;\n found =\n mesh.isMesh === true &&\n Boolean(mesh.geometry) &&\n typeof mesh.raycast === 'function';\n });\n\n return found;\n}\n\nexport function warnIfNoRaycastableMesh(\n entity: Pick<Entity, 'index' | 'object3D'>,\n componentName: GrabComponentName,\n): void {\n const object = entity.object3D;\n if (!(object instanceof Object3D)) {\n return;\n }\n\n if (!shouldEmitDevWarning() || hasRaycastableMesh(object)) {\n return;\n }\n\n let warnedComponents = warnedNoRaycastableMesh.get(object);\n if (!warnedComponents) {\n warnedComponents = new Set();\n warnedNoRaycastableMesh.set(object, warnedComponents);\n }\n\n if (warnedComponents.has(componentName)) {\n return;\n }\n\n warnedComponents.add(componentName);\n\n const entityLabel = object.name\n ? `\"${object.name}\" (index ${entity.index})`\n : `#${entity.index}`;\n\n console.warn(\n `[IWSDK] Entity ${entityLabel} has ${componentName} but no raycastable mesh in its Object3D subtree. Grab will not work. Attach a Mesh as a child or to the entity's root Object3D.`,\n );\n}\n\nexport function resetGrabWarningStateForTests(): void {\n warnedNoRaycastableMesh = new WeakMap();\n}\n"],"names":[],"mappings":";;;AAAA;;;;;AAKG;AAUH,IAAI,uBAAuB,GAAG,IAAI,OAAO,EAAoC;AAE7E,SAAS,oBAAoB,GAAA;;IAC3B,OAAO,CAAA,CAAA,EAAA,GAAC,MAAM,CAAC,IAAY,CAAC,GAAG,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,GAAG,MAAK,KAAK;AAChD;AAEM,SAAU,kBAAkB,CAAC,MAAgB,EAAA;IACjD,IAAI,KAAK,GAAG,KAAK;AAEjB,IAAA,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAI;QACxB,IAAI,KAAK,EAAE;YACT;QACF;QAEA,MAAM,IAAI,GAAG,KAAa;QAC1B,KAAK;YACH,IAAI,CAAC,MAAM,KAAK,IAAI;AACpB,gBAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AACtB,gBAAA,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU;AACtC,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,KAAK;AACd;AAEM,SAAU,uBAAuB,CACrC,MAA0C,EAC1C,aAAgC,EAAA;AAEhC,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ;AAC9B,IAAA,IAAI,EAAE,MAAM,YAAY,QAAQ,CAAC,EAAE;QACjC;IACF;IAEA,IAAI,CAAC,oBAAoB,EAAE,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE;QACzD;IACF;IAEA,IAAI,gBAAgB,GAAG,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC;IAC1D,IAAI,CAAC,gBAAgB,EAAE;AACrB,QAAA,gBAAgB,GAAG,IAAI,GAAG,EAAE;AAC5B,QAAA,uBAAuB,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC;IACvD;AAEA,IAAA,IAAI,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;QACvC;IACF;AAEA,IAAA,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC;AAEnC,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC;UACvB,IAAI,MAAM,CAAC,IAAI,CAAA,SAAA,EAAY,MAAM,CAAC,KAAK,CAAA,CAAA;AACzC,UAAE,CAAA,CAAA,EAAI,MAAM,CAAC,KAAK,EAAE;IAEtB,OAAO,CAAC,IAAI,CACV,CAAA,eAAA,EAAkB,WAAW,CAAA,KAAA,EAAQ,aAAa,CAAA,gIAAA,CAAkI,CACrL;AACH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"grabbed.js","sources":["../../src/grab/grabbed.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA;;;;;AAKG;AAGH;;;;;;;;;;;;AAYG;AACI,MAAM,OAAO,GAAG,eAAe,CACpC,SAAS,EACT,EAAE,EACF,iEAAiE;;;;"}
1
+ {"version":3,"file":"grabbed.js","sources":["../../src/grab/grabbed.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { createComponent } from '../ecs/component.js';\n/**\n * Transient state tag indicating an entity is currently being grabbed.\n *\n * @remarks\n * - Managed by {@link GrabSystem}; do not add/remove this component manually.\n * - Added when a grab handle captures one or more pointers.\n * - Removed when all pointers are released and the grab ends.\n * - Often used to gate grab-state-specific logic (e.g. physics kinematic override).\n * - Works with {@link OneHandGrabbable}, {@link TwoHandsGrabbable}, and {@link DistanceGrabbable} entities.\n *\n * @category Grab\n * @hideineditor\n */\nexport const Grabbed = createComponent(\n 'Grabbed',\n {},\n 'A tag added by GrabSystem while the entity is actively grabbed.',\n);\n"],"names":[],"mappings":";;AAAA;;;;;AAKG;AAGH;;;;;;;;;;;;AAYG;AACI,MAAM,OAAO,GAAG,eAAe,CACpC,SAAS,EACT,EAAE,EACF,iEAAiE;;;;"}
@@ -38,6 +38,12 @@ export declare class DistanceGrabHandle<T> extends HandleStore<T> {
38
38
  readonly detachOnGrab: boolean;
39
39
  private previousPointerOrigin;
40
40
  private isSnapped;
41
+ private returnOriginCaptured;
42
+ private returnTargetParent;
43
+ private readonly returnTargetPosition;
44
+ private readonly returnTargetQuaternion;
45
+ private readonly returnTargetRotation;
46
+ private readonly returnTargetScale;
41
47
  private static SNAP_THRESHOLD;
42
48
  private static MOVE_SPEED_SCALE;
43
49
  private static _tmp;
@@ -1 +1 @@
1
- {"version":3,"file":"handles.d.ts","sourceRoot":"","sources":["../../src/grab/handles.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAmB,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEpE,eAAO,MAAM,MAAM;;;;;EAMlB,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,YAAY;IACvB,oFAAoF;;IAEpF,qEAAqE;;IAErE,qFAAqF;;IAErF,8DAA8D;;CAE/D,CAAC;AAEF,qBAAa,kBAAkB,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;IAarD,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG;QAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;KAAE;IAC1D,QAAQ,CAAC,UAAU,EAAE,QAAQ;aACb,UAAU,EAAE,MAAM,aAAa,CAAC,CAAC,CAAC;aAClC,YAAY,EAAE,MAAM;aACpB,cAAc,EAAE,OAAO;aACvB,eAAe,EAAE,MAAM;aACvB,eAAe,EAAE,OAAO;aACxB,gBAAgB,EAAE,UAAU;aAC5B,YAAY,EAAE,OAAO;IApBvC,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAS;IACtC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAO;IACtC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAiB;IACpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAC3C,OAAO,CAAC,MAAM,CAAC,UAAU,CAAiB;IAC1C,OAAO,CAAC,MAAM,CAAC,WAAW,CAAoB;IAC9C,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAiB;IAChD,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAoB;gBAGzC,OAAO,EAAE,QAAQ,GAAG;QAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;KAAE,EACjD,UAAU,EAAE,QAAQ,EACb,UAAU,GAAE,MAAM,aAAa,CAAC,CAAC,CAAC,aAAa,EAC/C,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,OAAO,EACvB,eAAe,EAAE,MAAM,YAAM,EAC7B,eAAe,EAAE,OAAO,YAAuB,EAC/C,gBAAgB,EAAE,UAAU,YAA6B,EACzD,YAAY,EAAE,OAAO;IAOvC,MAAM,CAAC,IAAI,EAAE,MAAM;IA4InB,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG,CAAC;CAcrC"}
1
+ {"version":3,"file":"handles.d.ts","sourceRoot":"","sources":["../../src/grab/handles.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAmB,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAS,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE3E,eAAO,MAAM,MAAM;;;;;EAMlB,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,YAAY;IACvB,oFAAoF;;IAEpF,qEAAqE;;IAErE,qFAAqF;;IAErF,8DAA8D;;CAE/D,CAAC;AAEF,qBAAa,kBAAkB,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;IAmBrD,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG;QAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;KAAE;IAC1D,QAAQ,CAAC,UAAU,EAAE,QAAQ;aACb,UAAU,EAAE,MAAM,aAAa,CAAC,CAAC,CAAC;aAClC,YAAY,EAAE,MAAM;aACpB,cAAc,EAAE,OAAO;aACvB,eAAe,EAAE,MAAM;aACvB,eAAe,EAAE,OAAO;aACxB,gBAAgB,EAAE,UAAU;aAC5B,YAAY,EAAE,OAAO;IA1BvC,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,kBAAkB,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAiB;IACtD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAoB;IAC3D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAe;IACpD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiB;IACnD,OAAO,CAAC,MAAM,CAAC,cAAc,CAAS;IACtC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAO;IACtC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAiB;IACpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAC3C,OAAO,CAAC,MAAM,CAAC,UAAU,CAAiB;IAC1C,OAAO,CAAC,MAAM,CAAC,WAAW,CAAoB;IAC9C,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAiB;IAChD,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAoB;gBAGzC,OAAO,EAAE,QAAQ,GAAG;QAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;KAAE,EACjD,UAAU,EAAE,QAAQ,EACb,UAAU,GAAE,MAAM,aAAa,CAAC,CAAC,CAAC,aAAa,EAC/C,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,OAAO,EACvB,eAAe,EAAE,MAAM,YAAM,EAC7B,eAAe,EAAE,OAAO,YAAuB,EAC/C,gBAAgB,EAAE,UAAU,YAA6B,EACzD,YAAY,EAAE,OAAO;IAOvC,MAAM,CAAC,IAAI,EAAE,MAAM;IAmJnB,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG,CAAC;CAyCrC"}
@@ -1,7 +1,7 @@
1
1
  import { HandleStore } from '@pmndrs/handle';
2
2
  import { createComponent, Types } from 'elics';
3
3
  import '../runtime/three.js';
4
- import { Vector3, Quaternion } from 'three';
4
+ import { Vector3, Quaternion, Euler } from 'three';
5
5
 
6
6
  /**
7
7
  * Copyright (c) Meta Platforms, Inc. and affiliates.
@@ -36,6 +36,12 @@ class DistanceGrabHandle extends HandleStore {
36
36
  this.targetQuatOffset = targetQuatOffset;
37
37
  this.detachOnGrab = detachOnGrab;
38
38
  this.isSnapped = false;
39
+ this.returnOriginCaptured = false;
40
+ this.returnTargetParent = null;
41
+ this.returnTargetPosition = new Vector3();
42
+ this.returnTargetQuaternion = new Quaternion();
43
+ this.returnTargetRotation = new Euler();
44
+ this.returnTargetScale = new Vector3();
39
45
  this.targetQuatOffset.normalize();
40
46
  }
41
47
  update(time) {
@@ -104,9 +110,15 @@ class DistanceGrabHandle extends HandleStore {
104
110
  .copy(pointerQuaternion)
105
111
  .multiply(this.targetQuatOffset);
106
112
  const distance = targetPosition.distanceTo(DistanceGrabHandle._posHelper);
113
+ const rawInterpolationAlpha = this.moveSpeedFactor * time * DistanceGrabHandle.MOVE_SPEED_SCALE;
114
+ // Invalid timing/config input must never poison the target transform.
115
+ // Freeze on NaN; clamp finite values and infinities to the valid lerp range.
116
+ const interpolationAlpha = Number.isNaN(rawInterpolationAlpha)
117
+ ? 0
118
+ : Math.min(1, Math.max(0, rawInterpolationAlpha));
107
119
  if (!this.isSnapped && distance > DistanceGrabHandle.SNAP_THRESHOLD) {
108
- DistanceGrabHandle._posHelper.lerp(targetPosition, this.moveSpeedFactor * time * DistanceGrabHandle.MOVE_SPEED_SCALE);
109
- DistanceGrabHandle._quatHelper.slerp(targetQuaternion, this.moveSpeedFactor * time * DistanceGrabHandle.MOVE_SPEED_SCALE);
120
+ DistanceGrabHandle._posHelper.lerp(targetPosition, interpolationAlpha);
121
+ DistanceGrabHandle._quatHelper.slerp(targetQuaternion, interpolationAlpha);
110
122
  }
111
123
  else {
112
124
  if (!this.isSnapped) {
@@ -155,15 +167,37 @@ class DistanceGrabHandle extends HandleStore {
155
167
  this.latestMoveEvent = undefined;
156
168
  }
157
169
  apply(target) {
158
- var _a;
159
- // On release (last frame), if configured to return to origin,
160
- // restore the initially saved transform instead of leaving the final drag state.
161
- if (this.returnToOrigin && ((_a = this.outputState) === null || _a === void 0 ? void 0 : _a.last)) {
162
- target.position.copy(this.initialTargetPosition);
163
- // Keep rotation order consistent when restoring
164
- target.rotation.order = this.initialTargetRotation.order;
165
- target.quaternion.copy(this.initialTargetQuaternion);
166
- target.scale.copy(this.initialTargetScale);
170
+ if (this.returnToOrigin &&
171
+ this.inputState.size === 1 &&
172
+ this.outputState.first &&
173
+ !this.returnOriginCaptured) {
174
+ this.returnTargetParent = target.parent;
175
+ this.returnTargetPosition.copy(target.position);
176
+ this.returnTargetQuaternion.copy(target.quaternion);
177
+ this.returnTargetRotation.copy(target.rotation);
178
+ this.returnTargetScale.copy(target.scale);
179
+ this.returnOriginCaptured = true;
180
+ }
181
+ // HandleStore intentionally saves a new manipulation baseline whenever a
182
+ // second pointer joins or one pointer leaves. Return-to-origin needs the
183
+ // transform from the start of the whole gesture, not a handoff baseline.
184
+ if (this.returnToOrigin &&
185
+ this.outputState.last &&
186
+ this.returnOriginCaptured) {
187
+ if (this.detachOnGrab && target.parent !== this.returnTargetParent) {
188
+ if (this.returnTargetParent == null) {
189
+ target.removeFromParent();
190
+ }
191
+ else {
192
+ this.returnTargetParent.add(target);
193
+ }
194
+ }
195
+ target.position.copy(this.returnTargetPosition);
196
+ target.rotation.order = this.returnTargetRotation.order;
197
+ target.quaternion.copy(this.returnTargetQuaternion);
198
+ target.scale.copy(this.returnTargetScale);
199
+ this.returnTargetParent = null;
200
+ this.returnOriginCaptured = false;
167
201
  // Do not call super.apply to avoid re-applying the drag transform.
168
202
  return undefined;
169
203
  }
@@ -1 +1 @@
1
- {"version":3,"file":"handles.js","sources":["../../src/grab/handles.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handles.js","sources":["../../src/grab/handles.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { HandleOptions, HandleStore } from '@pmndrs/handle';\nimport { Types, createComponent } from '../ecs/component.js';\nimport { Euler, Object3D, Quaternion, Vector3 } from '../runtime/index.js';\n\nexport const Handle = createComponent(\n 'Handle',\n {\n instance: { type: Types.Object, default: undefined },\n },\n 'Internal component storing an active interaction handle instance',\n);\n\n/** MovementMode for {@link DistanceGrabbable}. @category Grab */\nexport const MovementMode = {\n /** Object smoothly moves with the ray cast end point of the grabbing controller. */\n MoveFromTarget: 'MoveFromTarget',\n /** Object smoothly moves toward the input source that's grabbing. */\n MoveTowardsTarget: 'MoveTowardsTarget',\n /** Object moves relative to controller delta movement while maintaining distance. */\n MoveAtSource: 'MoveAtSource',\n /** Object rotates in place without translation or scaling. */\n RotateAtSource: 'RotateAtSource',\n};\n\nexport class DistanceGrabHandle<T> extends HandleStore<T> {\n private previousPointerOrigin: Vector3 | undefined;\n private isSnapped: boolean = false;\n private returnOriginCaptured = false;\n private returnTargetParent: Object3D | null = null;\n private readonly returnTargetPosition = new Vector3();\n private readonly returnTargetQuaternion = new Quaternion();\n private readonly returnTargetRotation = new Euler();\n private readonly returnTargetScale = new Vector3();\n private static SNAP_THRESHOLD = 0.005;\n private static MOVE_SPEED_SCALE = 100;\n private static _tmp = new Vector3();\n private static _tmpQuat = new Quaternion();\n private static _posHelper = new Vector3();\n private static _quatHelper = new Quaternion();\n private static _offsetPosHelper = new Vector3();\n private static _offsetQuatHelper = new Quaternion();\n\n constructor(\n readonly target_: Object3D | { current?: Object3D | null },\n readonly sceneRoot_: Object3D,\n public readonly getOptions: () => HandleOptions<T> = () => ({}),\n public readonly movementMode: string,\n public readonly returnToOrigin: boolean,\n public readonly moveSpeedFactor: number = 0.1,\n public readonly targetPosOffset: Vector3 = new Vector3(0, 0, 0),\n public readonly targetQuatOffset: Quaternion = new Quaternion(0, 0, 0, 1),\n public readonly detachOnGrab: boolean,\n ) {\n super(target_, getOptions);\n\n this.targetQuatOffset.normalize();\n }\n\n update(time: number) {\n const target = this.getTarget();\n\n if (this.inputState.size === 0) {\n // No active pointers: the grab was released, cancelled, or\n // force-released. Clear transient snap state so the next grab starts\n // unsnapped. This replaces the constructor's 'pointerup' DOM listener,\n // which was never removed (a listener leak) and also missed\n // forceRelease()/cancel() (which don't fire a DOM pointerup).\n this.isSnapped = false;\n }\n\n if (\n target == null ||\n this.inputState.size === 0 ||\n (this.latestMoveEvent == null &&\n (this.getOptions().alwaysUpdate ?? false) === false)\n ) {\n if (this.previousPointerOrigin != undefined) {\n this.previousPointerOrigin = undefined;\n }\n return;\n }\n\n if (this.detachOnGrab && target.parent != this.sceneRoot_) {\n this.sceneRoot_.attach(target);\n }\n\n if (\n this.movementMode === MovementMode.RotateAtSource ||\n this.movementMode === MovementMode.MoveFromTarget\n ) {\n super.update(time);\n return;\n }\n\n const pointerAmount = this.inputState.size;\n target.getWorldPosition(DistanceGrabHandle._posHelper);\n target.getWorldQuaternion(DistanceGrabHandle._quatHelper);\n const position = target.position;\n const quaternion = target.quaternion;\n const rotation = target.rotation;\n const scale = target.scale;\n\n switch (this.movementMode) {\n case MovementMode.MoveAtSource: {\n const [p1] = this.inputState.values();\n const current = p1.pointerWorldOrigin;\n if (this.previousPointerOrigin != undefined) {\n const delta = DistanceGrabHandle._tmp\n .copy(current)\n .sub(this.previousPointerOrigin);\n DistanceGrabHandle._posHelper.add(delta);\n } else {\n this.previousPointerOrigin = new Vector3().copy(current);\n }\n // Update stored previous for next frame\n this.previousPointerOrigin!.copy(current);\n break;\n }\n case MovementMode.MoveTowardsTarget: {\n const [p1] = this.inputState.values();\n const pointerOrigin = p1.pointerWorldOrigin;\n const pointerQuaternion = p1.pointerWorldQuaternion;\n\n // Calculate target position by applying position offset in pointer's local space\n const targetPosition = DistanceGrabHandle._offsetPosHelper\n .copy(this.targetPosOffset)\n .applyQuaternion(pointerQuaternion)\n .add(pointerOrigin);\n\n // Calculate target rotation by multiplying pointer rotation with rotation offset\n const targetQuaternion = DistanceGrabHandle._offsetQuatHelper\n .copy(pointerQuaternion)\n .multiply(this.targetQuatOffset);\n\n const distance = targetPosition.distanceTo(\n DistanceGrabHandle._posHelper,\n );\n const rawInterpolationAlpha =\n this.moveSpeedFactor * time * DistanceGrabHandle.MOVE_SPEED_SCALE;\n // Invalid timing/config input must never poison the target transform.\n // Freeze on NaN; clamp finite values and infinities to the valid lerp range.\n const interpolationAlpha = Number.isNaN(rawInterpolationAlpha)\n ? 0\n : Math.min(1, Math.max(0, rawInterpolationAlpha));\n\n if (!this.isSnapped && distance > DistanceGrabHandle.SNAP_THRESHOLD) {\n DistanceGrabHandle._posHelper.lerp(\n targetPosition,\n interpolationAlpha,\n );\n DistanceGrabHandle._quatHelper.slerp(\n targetQuaternion,\n interpolationAlpha,\n );\n } else {\n if (!this.isSnapped) {\n this.isSnapped = true;\n }\n DistanceGrabHandle._posHelper.copy(targetPosition);\n DistanceGrabHandle._quatHelper.copy(targetQuaternion);\n }\n\n break;\n }\n }\n\n // Convert world space transforms to local space\n if (target.parent) {\n // Get parent's inverse world matrix\n const parentWorldMatrixInverse = target.parent.matrixWorld\n .clone()\n .invert();\n\n // Transform desired world position to local space\n position\n .copy(DistanceGrabHandle._posHelper)\n .applyMatrix4(parentWorldMatrixInverse);\n\n // Transform desired world quaternion to local space\n const parentWorldQuaternionInverse = target.parent\n .getWorldQuaternion(DistanceGrabHandle._tmpQuat)\n .invert();\n quaternion\n .copy(DistanceGrabHandle._quatHelper)\n .premultiply(parentWorldQuaternionInverse);\n } else {\n // No parent, world space = local space\n position.copy(DistanceGrabHandle._posHelper);\n quaternion.copy(DistanceGrabHandle._quatHelper);\n }\n\n // Always apply during drag; if returnToOrigin is true,\n // the override in apply() will snap back on release.\n this.outputState.update(this.latestMoveEvent, {\n pointerAmount,\n position,\n quaternion,\n rotation,\n scale,\n time,\n });\n this.outputState.memo = this.apply(target);\n this.latestMoveEvent = undefined;\n }\n\n protected apply(target: Object3D): T {\n if (\n this.returnToOrigin &&\n this.inputState.size === 1 &&\n this.outputState.first &&\n !this.returnOriginCaptured\n ) {\n this.returnTargetParent = target.parent;\n this.returnTargetPosition.copy(target.position);\n this.returnTargetQuaternion.copy(target.quaternion);\n this.returnTargetRotation.copy(target.rotation);\n this.returnTargetScale.copy(target.scale);\n this.returnOriginCaptured = true;\n }\n\n // HandleStore intentionally saves a new manipulation baseline whenever a\n // second pointer joins or one pointer leaves. Return-to-origin needs the\n // transform from the start of the whole gesture, not a handoff baseline.\n if (\n this.returnToOrigin &&\n this.outputState.last &&\n this.returnOriginCaptured\n ) {\n if (this.detachOnGrab && target.parent !== this.returnTargetParent) {\n if (this.returnTargetParent == null) {\n target.removeFromParent();\n } else {\n this.returnTargetParent.add(target);\n }\n }\n target.position.copy(this.returnTargetPosition);\n target.rotation.order = this.returnTargetRotation.order;\n target.quaternion.copy(this.returnTargetQuaternion);\n target.scale.copy(this.returnTargetScale);\n this.returnTargetParent = null;\n this.returnOriginCaptured = false;\n // Do not call super.apply to avoid re-applying the drag transform.\n return undefined as unknown as T;\n }\n return super.apply(target);\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/grab/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;AAAA;;;;;AAKG;AAgBH;AACA,cAAc,CAAC,SAAS,CAAC,uBAAuB;AAC9C,IAAA,iCAAiC;AACnC,iBAAiB,CAAC,SAAS,CAAC,uBAAuB;AACjD,IAAA,oCAAoC;AACtC,iBAAiB,CAAC,SAAS,CAAC,mBAAmB,GAAG,0BAA0B"}
1
+ {"version":3,"file":"index.js","sources":["../../src/grab/index.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { RayIntersector, SphereIntersector } from '@pmndrs/pointer-events';\nimport {\n patchedExecuteIntersection,\n patchedIntersectRayPointerCapture,\n patchedIntersectSpherePointerCapture,\n} from './pointer-events-patch.js';\n\nexport * from './grab-system.js';\nexport * from './grabbed.js';\nexport * from './one-hand-grabbable.js';\nexport * from './two-hands-grabbable.js';\nexport * from './distance-grabbable.js';\nexport { MovementMode } from './handles.js';\n\n// Apply monkeypatch once\nRayIntersector.prototype.intersectPointerCapture =\n patchedIntersectRayPointerCapture;\nSphereIntersector.prototype.intersectPointerCapture =\n patchedIntersectSpherePointerCapture;\nSphereIntersector.prototype.executeIntersection = patchedExecuteIntersection;\n"],"names":[],"mappings":";;;;;;;;;AAAA;;;;;AAKG;AAgBH;AACA,cAAc,CAAC,SAAS,CAAC,uBAAuB;AAC9C,IAAA,iCAAiC;AACnC,iBAAiB,CAAC,SAAS,CAAC,uBAAuB;AACjD,IAAA,oCAAoC;AACtC,iBAAiB,CAAC,SAAS,CAAC,mBAAmB,GAAG,0BAA0B"}
@@ -13,6 +13,11 @@ import { Types } from '../ecs/component.js';
13
13
  * - Supports independent control of rotation and translation (movement) axes.
14
14
  * - Rotation and translation can be constrained using min/max limits per axis.
15
15
  * - Works with the {@link GrabSystem} to automatically create interaction handles.
16
+ * - Grab components are mutually exclusive per entity. Choose exactly one of
17
+ * {@link OneHandGrabbable}, {@link TwoHandsGrabbable}, or
18
+ * {@link DistanceGrabbable}; {@link GrabSystem} creates only one handle and
19
+ * ignores additional grab components. Do not rely on which component wins
20
+ * when multiple modes are present.
16
21
  * - Requires the entity to have an `object3D` for the interaction to work.
17
22
  *
18
23
  * @example Basic single‑hand grabbable object
@@ -1 +1 @@
1
- {"version":3,"file":"one-hand-grabbable.d.ts","sourceRoot":"","sources":["../../src/grab/one-hand-grabbable.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAmB,MAAM,qBAAqB,CAAC;AAC7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,eAAO,MAAM,gBAAgB;IAGzB,qEAAqE;;;;;IAErE,gGAAgG;;;;;IAKhG,gGAAgG;;;;;IAKhG,8EAA8E;;;;;IAE9E,mFAAmF;;;;;IAKnF,mFAAmF;;;;;EAOtF,CAAC"}
1
+ {"version":3,"file":"one-hand-grabbable.d.ts","sourceRoot":"","sources":["../../src/grab/one-hand-grabbable.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAmB,MAAM,qBAAqB,CAAC;AAC7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,eAAO,MAAM,gBAAgB;IAGzB,qEAAqE;;;;;IAErE,gGAAgG;;;;;IAKhG,gGAAgG;;;;;IAKhG,8EAA8E;;;;;IAE9E,mFAAmF;;;;;IAKnF,mFAAmF;;;;;EAOtF,CAAC"}
@@ -14,6 +14,11 @@ import { createComponent, Types } from 'elics';
14
14
  * - Supports independent control of rotation and translation (movement) axes.
15
15
  * - Rotation and translation can be constrained using min/max limits per axis.
16
16
  * - Works with the {@link GrabSystem} to automatically create interaction handles.
17
+ * - Grab components are mutually exclusive per entity. Choose exactly one of
18
+ * {@link OneHandGrabbable}, {@link TwoHandsGrabbable}, or
19
+ * {@link DistanceGrabbable}; {@link GrabSystem} creates only one handle and
20
+ * ignores additional grab components. Do not rely on which component wins
21
+ * when multiple modes are present.
17
22
  * - Requires the entity to have an `object3D` for the interaction to work.
18
23
  *
19
24
  * @example Basic single‑hand grabbable object
@@ -1 +1 @@
1
- {"version":3,"file":"one-hand-grabbable.js","sources":["../../src/grab/one-hand-grabbable.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA;;;;;AAKG;AAGH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCG;AAEI,MAAM,gBAAgB,GAAG,eAAe,CAC7C,kBAAkB,EAClB;;IAEE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;;AAE9C,IAAA,SAAS,EAAE;QACT,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,QAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;AACxC,KAAA;;AAED,IAAA,SAAS,EAAE;QACT,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAC3C,KAAA;;IAED,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;;AAEjD,IAAA,YAAY,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,QAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;AACxC,KAAA;;AAED,IAAA,YAAY,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAC3C,KAAA;CACF,EACD,4DAA4D;;;;"}
1
+ {"version":3,"file":"one-hand-grabbable.js","sources":["../../src/grab/one-hand-grabbable.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { Types, createComponent } from '../ecs/component.js';\n/**\n * Component for enabling single‑hand object grabbing and manipulation.\n *\n * @remarks\n * - Allows users to grab and manipulate objects using a single VR controller or hand input.\n * - Supports independent control of rotation and translation (movement) axes.\n * - Rotation and translation can be constrained using min/max limits per axis.\n * - Works with the {@link GrabSystem} to automatically create interaction handles.\n * - Grab components are mutually exclusive per entity. Choose exactly one of\n * {@link OneHandGrabbable}, {@link TwoHandsGrabbable}, or\n * {@link DistanceGrabbable}; {@link GrabSystem} creates only one handle and\n * ignores additional grab components. Do not rely on which component wins\n * when multiple modes are present.\n * - Requires the entity to have an `object3D` for the interaction to work.\n *\n * @example Basic single‑hand grabbable object\n * ```ts\n * entity.addComponent(OneHandGrabbable, {})\n * ```\n *\n * @example Constrained manipulation (rotation‑only on Y axis)\n * ```ts\n * entity.addComponent(OneHandGrabbable, {\n * rotate: true,\n * rotateMin: [0, -Math.PI, 0],\n * rotateMax: [0, Math.PI, 0],\n * translate: false\n * })\n * ```\n *\n * @example Limited movement range\n * ```ts\n * entity.addComponent(OneHandGrabbable, {\n * rotate: true,\n * translate: true,\n * translateMin: [-2, 0, -2],\n * translateMax: [2, 3, 2]\n * })\n * ```\n *\n * @category Grab\n * @see {@link GrabSystem}\n * @see {@link TwoHandsGrabbable}\n * @see {@link DistanceGrabbable}\n */\n\nexport const OneHandGrabbable = createComponent(\n 'OneHandGrabbable',\n {\n /** A boolean value to set whether rotating the object is allowed. */\n rotate: { type: Types.Boolean, default: true },\n /** An optional vector to define the maximum angle of the allowed rotation in [x, y, z] axes. */\n rotateMax: {\n type: Types.Vec3,\n default: [Infinity, Infinity, Infinity],\n },\n /** An optional vector to define the minimum angle of the allowed rotation in [x, y, z] axes. */\n rotateMin: {\n type: Types.Vec3,\n default: [-Infinity, -Infinity, -Infinity],\n },\n /** A boolean value to set whether moving the object's position is allowed. */\n translate: { type: Types.Boolean, default: true },\n /** An optional vector to define the maximum allowed position in [x, y, z] axes. */\n translateMax: {\n type: Types.Vec3,\n default: [Infinity, Infinity, Infinity],\n },\n /** An optional vector to define the minimum allowed position in [x, y, z] axes. */\n translateMin: {\n type: Types.Vec3,\n default: [-Infinity, -Infinity, -Infinity],\n },\n },\n 'Component for single-hand object grabbing and manipulation',\n);\n"],"names":[],"mappings":";;AAAA;;;;;AAKG;AAGH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CG;AAEI,MAAM,gBAAgB,GAAG,eAAe,CAC7C,kBAAkB,EAClB;;IAEE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;;AAE9C,IAAA,SAAS,EAAE;QACT,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,QAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;AACxC,KAAA;;AAED,IAAA,SAAS,EAAE;QACT,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAC3C,KAAA;;IAED,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;;AAEjD,IAAA,YAAY,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,QAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;AACxC,KAAA;;AAED,IAAA,YAAY,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAC3C,KAAA;CACF,EACD,4DAA4D;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"pointer-events-patch.js","sources":["../../src/grab/pointer-events-patch.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pointer-events-patch.js","sources":["../../src/grab/pointer-events-patch.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// Monkeypatch @pmndrs/pointer-events RayIntersector to skip expensive UV recomputation\n// during pointer capture. This keeps grabbing performant on dense meshes.\n\nimport {\n Plane,\n Vector3,\n Quaternion,\n Object3D,\n Sphere,\n Matrix4,\n InstancedMesh,\n Mesh,\n} from '../runtime/index.js';\n\ntype PointerCapture = { intersection: any; object: Object3D };\n\nconst planeHelper = new Plane();\nconst helperSphere: Sphere = new Sphere();\n\nconst rayDirectionHelperMap = new Map<any, Vector3>();\nconst pointerPositionHelperMap = new Map<any, Vector3>();\nconst pointerQuaternionHelperMap = new Map<any, Quaternion>();\n\nconst oldInputDevicePointOffset = new Vector3();\nconst inputDeviceQuaternionOffset = new Quaternion();\n\nconst vectorHelper = new Vector3();\nconst matrixHelper = new Matrix4();\nconst boxSizeHelper = new Vector3();\nconst boxCenterHelper = new Vector3();\nconst vec0_0001 = new Vector3(0.0001, 0.0001, 0.0001);\nconst invertedMatrixHelper = new Matrix4();\n\nexport function patchedIntersectRayPointerCapture(\n this: any,\n { intersection, object }: PointerCapture,\n) {\n const details = intersection.details;\n if (details.type !== 'ray') {\n throw new Error(\n `unable to process a pointer capture of type \"${details.type}\" with a ray intersector`,\n );\n }\n if (!this.prepareTransformation()) {\n return intersection;\n }\n\n object.updateWorldMatrix(true, false);\n\n // Recompute the plane in world space using the stored localPoint and normal/face\n const normal = intersection.normal ?? intersection.face?.normal;\n if (normal != null && intersection.localPoint != null) {\n planeHelper.setFromNormalAndCoplanarPoint(normal, intersection.localPoint);\n planeHelper.applyMatrix4(object.matrixWorld);\n } else {\n // Fallback: face-on plane at previous world point\n planeHelper.setFromNormalAndCoplanarPoint(\n new Vector3(0, 0, 1),\n intersection.point,\n );\n }\n\n const { ray } = this.raycaster;\n const pointOnFace =\n ray.intersectPlane(planeHelper, new Vector3()) ?? intersection.point;\n\n let rayDirectionHelper = rayDirectionHelperMap.get(this);\n if (!rayDirectionHelper) {\n rayDirectionHelper = new Vector3();\n rayDirectionHelperMap.set(this, rayDirectionHelper);\n }\n\n let pointerPositionHelper = pointerPositionHelperMap.get(this);\n if (!pointerPositionHelper) {\n pointerPositionHelper = new Vector3();\n pointerPositionHelperMap.set(this, pointerPositionHelper);\n }\n\n let pointerQuaternionHelper = pointerQuaternionHelperMap.get(this);\n if (!pointerQuaternionHelper) {\n pointerQuaternionHelper = new Quaternion();\n pointerQuaternionHelperMap.set(this, pointerQuaternionHelper);\n }\n\n // Preserve distance along the ray from previous intersection\n const distanceAlongRay = intersection.pointerPosition.distanceTo(\n intersection.point,\n );\n const point = rayDirectionHelper\n .copy(ray.direction)\n .multiplyScalar(distanceAlongRay)\n .add(ray.origin);\n\n // NOTE: We intentionally skip UV recomputation here for performance.\n return {\n ...intersection,\n object,\n pointOnFace,\n point,\n pointerPosition: pointerPositionHelper.copy(ray.origin),\n pointerQuaternion: pointerQuaternionHelper.copy(this.raycasterQuaternion),\n };\n}\n\nexport function patchedIntersectSpherePointerCapture(\n this: any,\n { intersection, object }: PointerCapture,\n) {\n const details = intersection.details;\n if (details.type !== 'sphere') {\n throw new Error(\n `unable to process a pointer capture of type \"${details.type}\" with a ray intersector`,\n );\n }\n if (!this.prepareTransformation()) {\n return intersection;\n }\n\n //compute old inputDevicePosition-point offset\n oldInputDevicePointOffset\n .copy(intersection.point)\n .sub(intersection.pointerPosition);\n //compute oldInputDeviceQuaternion-newInputDeviceQuaternion offset\n inputDeviceQuaternionOffset\n .copy(intersection.pointerQuaternion)\n .invert()\n .multiply(this.fromQuaternion);\n\n //apply quaternion offset to old inputDevicePosition-point offset and add to new inputDevicePosition\n const point = oldInputDevicePointOffset\n .clone()\n .applyQuaternion(inputDeviceQuaternionOffset)\n .add(this.fromPosition);\n object.updateWorldMatrix(true, false);\n // Recompute the plane in world space using the stored localPoint and normal/face\n const normal = intersection.normal ?? intersection.face?.normal;\n if (normal != null && intersection.localPoint != null) {\n planeHelper.setFromNormalAndCoplanarPoint(normal, intersection.localPoint);\n planeHelper.applyMatrix4(object.matrixWorld);\n } else {\n // Fallback: face-on plane at previous world point\n planeHelper.setFromNormalAndCoplanarPoint(\n new Vector3(0, 0, 1),\n intersection.point,\n );\n }\n const pointOnFace = planeHelper.projectPoint(\n this.fromPosition,\n new Vector3(),\n );\n\n let pointerPositionHelper = pointerPositionHelperMap.get(this);\n if (!pointerPositionHelper) {\n pointerPositionHelper = new Vector3();\n pointerPositionHelperMap.set(this, pointerPositionHelper);\n }\n\n let pointerQuaternionHelper = pointerQuaternionHelperMap.get(this);\n if (!pointerQuaternionHelper) {\n pointerQuaternionHelper = new Quaternion();\n pointerQuaternionHelperMap.set(this, pointerQuaternionHelper);\n }\n\n // NOTE: We intentionally skip UV recomputation here for performance.\n return {\n details: {\n type: 'sphere',\n },\n distance: point.distanceTo(pointOnFace),\n pointerPosition: pointerPositionHelper.copy(this.fromPosition),\n pointerQuaternion: pointerQuaternionHelper.copy(this.fromQuaternion),\n object,\n point,\n pointOnFace,\n face: intersection.face,\n localPoint: intersection.localPoint,\n };\n}\n\nfunction maximizeAxisVector(vec: Vector3) {\n const absX = Math.abs(vec.x);\n const absY = Math.abs(vec.y);\n const absZ = Math.abs(vec.z);\n if (absX >= absY && absX >= absZ) {\n //x biggest\n vec.set(vec.x < 0 ? -1 : 1, 0, 0);\n return;\n }\n if (absY >= absX && absY >= absZ) {\n //y biggest\n vec.set(0, vec.y < 0 ? -1 : 1, 0);\n return;\n }\n //z biggest\n vec.set(0, 0, vec.z < 0 ? -1 : 1);\n}\n\nfunction patchedIsSphereIntersectingMesh(\n pointerSphere: any,\n { geometry }: Mesh,\n meshMatrixWorld: Matrix4,\n) {\n if (geometry.boundingSphere == null) {\n geometry.computeBoundingSphere();\n }\n helperSphere\n .copy(geometry.boundingSphere ?? new Sphere())\n .applyMatrix4(meshMatrixWorld);\n return (\n helperSphere.center.distanceToSquared(pointerSphere.center) <\n (pointerSphere.radius + helperSphere.radius) ** 2\n );\n}\n\nfunction patchedIntersectSphereWithObject(\n pointerSphere: any,\n object: Object3D,\n target: any,\n) {\n object.updateWorldMatrix(true, false);\n if (object.spherecast != null) {\n object.spherecast(pointerSphere, target);\n return;\n }\n if (object instanceof InstancedMesh) {\n if (object.geometry.boundingSphere == null) {\n object.geometry.computeBoundingSphere();\n }\n if (object.geometry.boundingBox == null) {\n object.geometry.computeBoundingBox();\n }\n for (let i = 0; i < object.count; i++) {\n object.getMatrixAt(i, matrixHelper);\n matrixHelper.premultiply(object.matrixWorld);\n if (\n !patchedIsSphereIntersectingMesh(pointerSphere, object, matrixHelper)\n ) {\n continue;\n }\n const intersection = patchedIntersectSphereMesh(\n pointerSphere,\n object,\n matrixHelper,\n i,\n );\n if (intersection == null) {\n continue;\n }\n target.push(intersection);\n }\n }\n if (!(object instanceof Mesh)) {\n return;\n }\n if (\n !patchedIsSphereIntersectingMesh(pointerSphere, object, object.matrixWorld)\n ) {\n return;\n }\n invertedMatrixHelper.copy(object.matrixWorld).invert();\n const intersection = patchedIntersectSphereMesh(\n pointerSphere,\n object,\n object.matrixWorld,\n );\n if (intersection == null) {\n return;\n }\n target.push(intersection);\n}\n\nfunction patchedIntersectSphereMesh(\n pointerSphere: any,\n mesh: Mesh,\n meshMatrixWorld: Matrix4,\n instanceId?: number,\n) {\n invertedMatrixHelper.copy(meshMatrixWorld).invert();\n helperSphere.copy(pointerSphere).applyMatrix4(invertedMatrixHelper);\n const { geometry } = mesh;\n if (geometry.boundingBox == null) {\n geometry.computeBoundingBox();\n }\n geometry.boundingBox?.getSize(boxSizeHelper);\n geometry.boundingBox?.getCenter(boxCenterHelper);\n geometry.boundingBox?.clampPoint(helperSphere.center, vectorHelper);\n vectorHelper.applyMatrix4(meshMatrixWorld); //world coordinates\n const distanceToSphereCenterSquared = vectorHelper.distanceToSquared(\n pointerSphere.center,\n );\n if (\n distanceToSphereCenterSquared >\n pointerSphere.radius * pointerSphere.radius\n ) {\n return undefined;\n }\n boxSizeHelper.max(vec0_0001);\n const normal = helperSphere.center.clone().sub(boxCenterHelper);\n normal.divide(boxSizeHelper);\n maximizeAxisVector(normal);\n const point = vectorHelper.clone();\n\n return {\n distance: Math.sqrt(distanceToSphereCenterSquared),\n face: {\n a: 0,\n b: 0,\n c: 0,\n materialIndex: 0,\n normal,\n },\n normal,\n point,\n instanceId,\n object: mesh,\n };\n}\n\nexport function patchedExecuteIntersection(this: any, object: Object3D) {\n if (!this.isReady()) {\n return;\n }\n patchedIntersectSphereWithObject(\n this.collisionSphere,\n object,\n this.intersects,\n );\n}\n"],"names":[],"mappings":"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"}
@@ -16,6 +16,11 @@ import { Types } from '../ecs/component.js';
16
16
  * - Rotation is calculated from the relative orientation between the two hands.
17
17
  * - All transformations can be independently enabled/disabled and constrained per axis.
18
18
  * - Works with the {@link GrabSystem} to automatically create multitouch interaction handles.
19
+ * - Grab components are mutually exclusive per entity. Choose exactly one of
20
+ * {@link OneHandGrabbable}, {@link TwoHandsGrabbable}, or
21
+ * {@link DistanceGrabbable}; {@link GrabSystem} creates only one handle and
22
+ * ignores additional grab components. Do not rely on which component wins
23
+ * when multiple modes are present.
19
24
  *
20
25
  * @example Basic two‑handed grabbable object
21
26
  * ```ts
@@ -1 +1 @@
1
- {"version":3,"file":"two-hands-grabbable.d.ts","sourceRoot":"","sources":["../../src/grab/two-hands-grabbable.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAmB,MAAM,qBAAqB,CAAC;AAC7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,eAAO,MAAM,iBAAiB;IAG1B,qEAAqE;;;;;IAErE,gGAAgG;;;;;IAKhG,gGAAgG;;;;;IAKhG,8EAA8E;;;;;IAE9E,mFAAmF;;;;;IAKnF,mFAAmF;;;;;IAKnF,gFAAgF;;;;;IAEhF,kFAAkF;;;;;IAKlF,kFAAkF;;;;;EAOrF,CAAC"}
1
+ {"version":3,"file":"two-hands-grabbable.d.ts","sourceRoot":"","sources":["../../src/grab/two-hands-grabbable.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAmB,MAAM,qBAAqB,CAAC;AAC7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAEH,eAAO,MAAM,iBAAiB;IAG1B,qEAAqE;;;;;IAErE,gGAAgG;;;;;IAKhG,gGAAgG;;;;;IAKhG,8EAA8E;;;;;IAE9E,mFAAmF;;;;;IAKnF,mFAAmF;;;;;IAKnF,gFAAgF;;;;;IAEhF,kFAAkF;;;;;IAKlF,kFAAkF;;;;;EAOrF,CAAC"}
@@ -17,6 +17,11 @@ import { createComponent, Types } from 'elics';
17
17
  * - Rotation is calculated from the relative orientation between the two hands.
18
18
  * - All transformations can be independently enabled/disabled and constrained per axis.
19
19
  * - Works with the {@link GrabSystem} to automatically create multitouch interaction handles.
20
+ * - Grab components are mutually exclusive per entity. Choose exactly one of
21
+ * {@link OneHandGrabbable}, {@link TwoHandsGrabbable}, or
22
+ * {@link DistanceGrabbable}; {@link GrabSystem} creates only one handle and
23
+ * ignores additional grab components. Do not rely on which component wins
24
+ * when multiple modes are present.
20
25
  *
21
26
  * @example Basic two‑handed grabbable object
22
27
  * ```ts
@@ -1 +1 @@
1
- {"version":3,"file":"two-hands-grabbable.js","sources":["../../src/grab/two-hands-grabbable.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA;;;;;AAKG;AAGH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CG;AAEI,MAAM,iBAAiB,GAAG,eAAe,CAC9C,mBAAmB,EACnB;;IAEE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;;AAE9C,IAAA,SAAS,EAAE;QACT,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,QAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;AACxC,KAAA;;AAED,IAAA,SAAS,EAAE;QACT,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAC3C,KAAA;;IAED,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;;AAEjD,IAAA,YAAY,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,QAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;AACxC,KAAA;;AAED,IAAA,YAAY,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAC3C,KAAA;;IAED,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;;AAE7C,IAAA,QAAQ,EAAE;QACR,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,QAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;AACxC,KAAA;;AAED,IAAA,QAAQ,EAAE;QACR,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAC3C,KAAA;CACF,EACD,2DAA2D;;;;"}
1
+ {"version":3,"file":"two-hands-grabbable.js","sources":["../../src/grab/two-hands-grabbable.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { Types, createComponent } from '../ecs/component.js';\n/**\n * Component for enabling two‑handed object grabbing and manipulation.\n *\n * @remarks\n * - Enables advanced manipulation using both VR controllers or hand inputs simultaneously.\n * - Supports rotation, translation, and **scaling** operations (scaling requires two hands).\n * - Distance between hands controls scaling: spreading hands apart scales up, bringing them together scales down.\n * - The position of first controller that grabbed the objects determines the object's position during translation.\n * - Rotation is calculated from the relative orientation between the two hands.\n * - All transformations can be independently enabled/disabled and constrained per axis.\n * - Works with the {@link GrabSystem} to automatically create multitouch interaction handles.\n * - Grab components are mutually exclusive per entity. Choose exactly one of\n * {@link OneHandGrabbable}, {@link TwoHandsGrabbable}, or\n * {@link DistanceGrabbable}; {@link GrabSystem} creates only one handle and\n * ignores additional grab components. Do not rely on which component wins\n * when multiple modes are present.\n *\n * @example Basic two‑handed grabbable object\n * ```ts\n * entity.addComponent(TwoHandsGrabbable, {})\n * ```\n *\n * @example Scaling‑only with constraints\n * ```ts\n * entity.addComponent(TwoHandsGrabbable, {\n * rotate: false,\n * translate: false,\n * scale: true,\n * scaleMin: [0.1, 0.1, 0.1],\n * scaleMax: [5, 5, 5]\n * })\n * ```\n *\n * @example Precise manipulation with limits\n * ```ts\n * entity.addComponent(TwoHandsGrabbable, {\n * rotate: true,\n * translate: true,\n * scale: true,\n * rotateMin: [-Math.PI/4, -Math.PI/2, -Math.PI/4],\n * rotateMax: [Math.PI/4, Math.PI/2, Math.PI/4],\n * translateMin: [-1, 0, -1],\n * translateMax: [1, 2, 1],\n * scaleMin: [0.5, 0.5, 0.5],\n * scaleMax: [2, 2, 2]\n * })\n * ```\n *\n * @category Grab\n * @see {@link GrabSystem}\n * @see {@link OneHandGrabbable}\n * @see {@link DistanceGrabbable}\n */\n\nexport const TwoHandsGrabbable = createComponent(\n 'TwoHandsGrabbable',\n {\n /** A boolean value to set whether rotating the object is allowed. */\n rotate: { type: Types.Boolean, default: true },\n /** An optional vector to define the maximum angle of the allowed rotation in [x, y, z] axes. */\n rotateMax: {\n type: Types.Vec3,\n default: [Infinity, Infinity, Infinity],\n },\n /** An optional vector to define the minimum angle of the allowed rotation in [x, y, z] axes. */\n rotateMin: {\n type: Types.Vec3,\n default: [-Infinity, -Infinity, -Infinity],\n },\n /** A boolean value to set whether moving the object's position is allowed. */\n translate: { type: Types.Boolean, default: true },\n /** An optional vector to define the maximum allowed position in [x, y, z] axes. */\n translateMax: {\n type: Types.Vec3,\n default: [Infinity, Infinity, Infinity],\n },\n /** An optional vector to define the minimum allowed position in [x, y, z] axes. */\n translateMin: {\n type: Types.Vec3,\n default: [-Infinity, -Infinity, -Infinity],\n },\n /** A boolean value to set whether scaling the object up and down is allowed. */\n scale: { type: Types.Boolean, default: true },\n /** An optional vector to define the maximum allowed scaling in [x, y, z] axes. */\n scaleMax: {\n type: Types.Vec3,\n default: [Infinity, Infinity, Infinity],\n },\n /** An optional vector to define the minimum allowed scaling in [x, y, z] axes. */\n scaleMin: {\n type: Types.Vec3,\n default: [-Infinity, -Infinity, -Infinity],\n },\n },\n 'Component for two-handed object grabbing and manipulation',\n);\n"],"names":[],"mappings":";;AAAA;;;;;AAKG;AAGH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDG;AAEI,MAAM,iBAAiB,GAAG,eAAe,CAC9C,mBAAmB,EACnB;;IAEE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;;AAE9C,IAAA,SAAS,EAAE;QACT,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,QAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;AACxC,KAAA;;AAED,IAAA,SAAS,EAAE;QACT,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAC3C,KAAA;;IAED,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;;AAEjD,IAAA,YAAY,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,QAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;AACxC,KAAA;;AAED,IAAA,YAAY,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAC3C,KAAA;;IAED,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;;AAE7C,IAAA,QAAQ,EAAE;QACR,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,QAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;AACxC,KAAA;;AAED,IAAA,QAAQ,EAAE;QACR,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAC3C,KAAA;CACF,EACD,2DAA2D;;;;"}
package/dist/index.js CHANGED
@@ -46,14 +46,14 @@ export { IBLGradient } from './environment/ibl-gradient.js';
46
46
  export { EnvironmentSystem } from './environment/environment-system.js';
47
47
  export { LevelSystem, applySceneHeroCamera } from './level/level-system.js';
48
48
  export { LevelTag } from './level/level-tag.js';
49
- export { LEVEL_COMPONENT_PREFIX, LevelComponentApplier } from './level/level-component-applier.js';
49
+ export { LEVEL_COMPONENT_PREFIX, LevelComponentApplier, resetLevelComponentWarningStateForTests } from './level/level-component-applier.js';
50
50
  export { SceneJSONImporter, activateScenePlayerAttachments, createSceneEntityReferenceResolver } from './level/level-scene-json-importer.js';
51
51
  export { SceneMaterialPool, createSceneMaterial, disposeStandaloneSceneMaterial } from './level/level-scene-material.js';
52
52
  export { applySceneEnvironment, captureSceneEnvironment, restoreSceneEnvironment } from './level/level-scene-environment.js';
53
53
  export { applySceneTransform, createSceneContentObject, disposeLoweredSceneNodes, disposeSceneObjectResources, lowerSceneDocumentObjects, lowerSceneNodeObject, resolveSceneDocumentForLowering } from './level/level-scene-object.js';
54
54
  export { createSceneGeometry, createScenePrimitiveObject, disposeScenePrimitiveObject } from './level/level-scene-primitive.js';
55
55
  export { LevelRoot } from './level/level-root.js';
56
- export { SceneUnderstandingSystem, findExtremeVertices } from './scene-understanding/scene-understanding-system.js';
56
+ export { SceneUnderstandingSystem, findAxisAlignedBounds, findExtremeVertices } from './scene-understanding/scene-understanding-system.js';
57
57
  export { XRAnchor } from './scene-understanding/anchor.js';
58
58
  export { XRPlane } from './scene-understanding/plane.js';
59
59
  export { XRMesh } from './scene-understanding/mesh.js';
@@ -63,7 +63,7 @@ export { AudioSource, DistanceModel, InstanceStealPolicy, PlaybackMode } from '.
63
63
  export { AudioSystem } from './audio/audio-system.js';
64
64
  export { AudioUtils } from './audio/audio-utils.js';
65
65
  export { AudioPool } from './audio/audio-pool.js';
66
- export { PhysicsSystem, getCapsuleAxisEndpoints } from './physics/physics-system.js';
66
+ export { PhysicsSystem } from './physics/physics-system.js';
67
67
  export { DEFAULT_ANGULAR_DAMPING, DEFAULT_GRAVITY_FACTOR, DEFAULT_LINEAR_DAMPING, PhysicsBody, PhysicsState } from './physics/physicsBody.js';
68
68
  export { PhysicsManipulation } from './physics/physicsManipulation.js';
69
69
  export { DEFAULT_DENSITY, DEFAULT_FRICTION, DEFAULT_RESTITUTION, PhysicsShape, PhysicsShapeType } from './physics/physicsShape.js';
@@ -105,6 +105,7 @@ export { Transform } from './transform/transform-component.js';
105
105
  export { TwoHandsGrabbable } from './grab/two-hands-grabbable.js';
106
106
  export { Visibility } from './visibility/visibility-component.js';
107
107
  export { XRLayerState } from './layers/xr-layer-state.js';
108
+ export { getCapsuleAxisEndpoints } from './physics/physics-worker-protocol.js';
108
109
  export { normalizeProjectDevOptions, normalizeProjectModuleSourcePath, normalizeProjectWorldOptions, projectRegexSpecToRegExp } from './project/normalize.js';
109
110
 
110
111
  /**
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":[null],"names":["EliCSVersion"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;AAKG;AA6CH,OAAO,CAAC,GAAG,CAAC,CAAA;;;;;;;;;qBASS,OAAO;YAChB,QAAQ;SACXA,SAAY,CAAA,CAAE,CAAC;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { VERSION as EliCSVersion } from 'elics';\nimport { REVISION } from 'three';\nimport { VERSION } from './version.js';\n\nexport * from './runtime/index.js';\nexport * from './ecs/index.js';\nexport * from './transform/index.js';\nexport * from './asset/index.js';\nexport * from './locomotion/index.js';\nexport * from './visibility/index.js';\nexport * from './ui/index.js';\nexport * from './init/index.js';\nexport * from './grab/index.js';\nexport * from './input/index.js';\nexport * from './environment/index.js';\nexport * from './level/index.js';\nexport * from './scene-understanding/index.js';\nexport * from './environment-raycast/index.js';\nexport * from './audio/index.js';\nexport * from './physics/index.js';\nexport * from './camera/index.js';\nexport * from './depth/index.js';\nexport * from './layers/index.js';\nexport * from './lighting/index.js';\nexport * from './mcp/index.js';\nexport * from './project/index.js';\n\n// re-exports\nexport * from '@iwsdk/xr-input';\nexport * from '@iwsdk/locomotor';\nexport * as UIKit from '@pmndrs/uikit';\nexport {\n signal,\n effect,\n computed,\n batch,\n untracked,\n Signal,\n} from '@preact/signals-core';\nexport type { ReadonlySignal } from '@preact/signals-core';\n\nexport { VERSION };\n\nconsole.log(` \n▄▄▄▄▄▄ ▄▄ ▄▄ ▄▄▄▄ ▄▄▄▄▄ ▄▄ ▄▄▄ \n▀▀██▀▀ ██ ██ ▄█▀▀▀▀█ ██▀▀▀██ ██ ██▀ \n ██ ▀█▄ ██ ▄█▀ ██▄ ██ ██ ██▄██ \n ██ ██ ██ ██ ▀████▄ ██ ██ █████ \n ██ ███▀▀███ ▀██ ██ ██ ██ ██▄ \n▄▄██▄▄ ███ ███ █▄▄▄▄▄█▀ ██▄▄▄██ ██ ██▄ \n▀▀▀▀▀▀ ▀▀▀ ▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀▀ \n===============================================\nImmersive Web SDK v${VERSION}\nThree.js r${REVISION}\nEliCS v${EliCSVersion}`);\n"],"names":["EliCSVersion"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;AAKG;AA6CH,OAAO,CAAC,GAAG,CAAC,CAAA;;;;;;;;;qBASS,OAAO;YAChB,QAAQ;SACXA,SAAY,CAAA,CAAE,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"browser-camera.js","sources":["../../src/init/browser-camera.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;AAKG;AAyBH;;;AAGG;AACG,SAAU,qBAAqB,CACnC,MAAyB,EAAA;IAEzB,OAAO;AACL,QAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE;AACjC,QAAA,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE;AACrC,QAAA,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB;AACH;AAEA;;;;AAIG;AACG,SAAU,0BAA0B,CACxC,MAAyB,EACzB,QAA+B,EAAA;IAE/B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACvC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC3C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACjC,IAAA,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;AAC/B,IAAA,MAAM,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG;AACzB,IAAA,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI;AAC3B,IAAA,MAAM,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG;AACzB,IAAA,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI;IAC3B,MAAM,CAAC,sBAAsB,EAAE;AAC/B,IAAA,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAChC;AAEA;;;;;;;AAOG;AACG,SAAU,0BAA0B,CACxC,MAAyB,EACzB,OAAkB,EAAA;AAElB,IAAA,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAK;AACjB,QAAA,OAAO,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC;QACzC,qBAAqB,CAAC,MAAM,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC3E,IAAA,CAAC;AACD,IAAA,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC;AACxC;;;;"}
1
+ {"version":3,"file":"browser-camera.js","sources":["../../src/init/browser-camera.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport {\n Quaternion,\n Vector3,\n type PerspectiveCamera,\n} from '../runtime/index.js';\n\n/**\n * @internal\n * Snapshot of the local-space camera state captured before an XR session\n * starts, used to undo the head-pose / projection mutations that\n * `WebGLRenderer.xr` writes into the camera each frame.\n */\nexport interface BrowserCameraSnapshot {\n position: Vector3;\n quaternion: Quaternion;\n scale: Vector3;\n aspect: number;\n fov: number;\n near: number;\n far: number;\n zoom: number;\n}\n\n/**\n * @internal\n * Capture the local transform and projection of `camera`.\n */\nexport function snapshotBrowserCamera(\n camera: PerspectiveCamera,\n): BrowserCameraSnapshot {\n return {\n position: camera.position.clone(),\n quaternion: camera.quaternion.clone(),\n scale: camera.scale.clone(),\n aspect: camera.aspect,\n fov: camera.fov,\n near: camera.near,\n far: camera.far,\n zoom: camera.zoom,\n };\n}\n\n/**\n * @internal\n * Apply a snapshot back to `camera`, refreshing both projection and world\n * matrices. Safe to call regardless of XR state.\n */\nexport function applyBrowserCameraSnapshot(\n camera: PerspectiveCamera,\n snapshot: BrowserCameraSnapshot,\n): void {\n camera.position.copy(snapshot.position);\n camera.quaternion.copy(snapshot.quaternion);\n camera.scale.copy(snapshot.scale);\n camera.aspect = snapshot.aspect;\n camera.fov = snapshot.fov;\n camera.near = snapshot.near;\n camera.far = snapshot.far;\n camera.zoom = snapshot.zoom;\n camera.updateProjectionMatrix();\n camera.updateMatrixWorld(true);\n}\n\n/**\n * @internal\n * Snapshot the camera now and restore it when `session` ends. The restore\n * is deferred one `requestAnimationFrame` tick because `WebXRManager` is\n * still tearing down render targets / camera-auto-update on the same tick\n * the session fires `'end'` — overwriting the camera mid-teardown produces\n * a frame at the wrong projection.\n */\nexport function attachBrowserCameraRestore(\n camera: PerspectiveCamera,\n session: XRSession,\n): void {\n const snapshot = snapshotBrowserCamera(camera);\n const onEnd = () => {\n session.removeEventListener('end', onEnd);\n requestAnimationFrame(() => applyBrowserCameraSnapshot(camera, snapshot));\n };\n session.addEventListener('end', onEnd);\n}\n"],"names":[],"mappings":"AAAA;;;;;AAKG;AAyBH;;;AAGG;AACG,SAAU,qBAAqB,CACnC,MAAyB,EAAA;IAEzB,OAAO;AACL,QAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE;AACjC,QAAA,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE;AACrC,QAAA,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB;AACH;AAEA;;;;AAIG;AACG,SAAU,0BAA0B,CACxC,MAAyB,EACzB,QAA+B,EAAA;IAE/B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACvC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC3C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACjC,IAAA,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;AAC/B,IAAA,MAAM,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG;AACzB,IAAA,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI;AAC3B,IAAA,MAAM,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG;AACzB,IAAA,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI;IAC3B,MAAM,CAAC,sBAAsB,EAAE;AAC/B,IAAA,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAChC;AAEA;;;;;;;AAOG;AACG,SAAU,0BAA0B,CACxC,MAAyB,EACzB,OAAkB,EAAA;AAElB,IAAA,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAK;AACjB,QAAA,OAAO,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC;QACzC,qBAAqB,CAAC,MAAM,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC3E,IAAA,CAAC;AACD,IAAA,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC;AACxC;;;;"}
@@ -4,6 +4,6 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- export * from './xr.js';
8
- export * from './world-initializer.js';
7
+ export { ReferenceSpaceType, SessionMode, buildSessionInit, launchXR, normalizeReferenceSpec, resolveReferenceSpaceType, type DepthSensingFlag, type FeatureFlag, type ReferenceSpaceSpec, type XRFeatureOptions, type XROptions, } from './xr.js';
8
+ export { initializeWorld, type WorldOptions } from './world-initializer.js';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/init/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/init/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,sBAAsB,EACtB,yBAAyB,EACzB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,SAAS,GACf,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"player-camera.js","sources":["../../src/init/player-camera.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;AAKG;AAIG,SAAU,oBAAoB,CAClC,MAAgB,EAChB,MAAyB,EAAA;AAEzB,IAAA,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE;AAC5B,QAAA,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;IACpB;AACF;;;;"}
1
+ {"version":3,"file":"player-camera.js","sources":["../../src/init/player-camera.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { Object3D, PerspectiveCamera } from '../runtime/index.js';\n\nexport function attachCameraToPlayer(\n player: Object3D,\n camera: PerspectiveCamera,\n): void {\n if (camera.parent !== player) {\n player.add(camera);\n }\n}\n"],"names":[],"mappings":"AAAA;;;;;AAKG;AAIG,SAAU,oBAAoB,CAClC,MAAgB,EAChB,MAAyB,EAAA;AAEzB,IAAA,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE;AAC5B,QAAA,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;IACpB;AACF;;;;"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ type SessionGrantCallback = () => void;
8
+ type SessionGrantSubscriptionOptions = {
9
+ persistent?: boolean;
10
+ };
11
+ /**
12
+ * Start recording native sessiongranted events before asynchronous world
13
+ * initialization begins. Calling this more than once for the same XRSystem is
14
+ * a no-op.
15
+ *
16
+ * @internal
17
+ */
18
+ export declare function armSessionGrantCapture(): void;
19
+ /** Arm capture synchronously when world options request grant-driven launch. */
20
+ export declare function armSessionGrantCaptureForOptions(xr: false | {
21
+ launchOnSessionGranted?: boolean;
22
+ } | undefined): void;
23
+ /**
24
+ * Consume a recently captured grant, or subscribe to a future grant. One-shot
25
+ * subscriptions run at most once. Persistent subscriptions remain armed so a
26
+ * world can re-enter XR after a failed request or an ended session.
27
+ *
28
+ * @internal
29
+ */
30
+ export declare function onSessionGrant(callback: SessionGrantCallback, options?: SessionGrantSubscriptionOptions): () => void;
31
+ /** Reset module state for isolated tests. @internal */
32
+ export declare function resetSessionGrantCaptureForTests(): void;
33
+ export {};
34
+ //# sourceMappingURL=session-grant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-grant.d.ts","sourceRoot":"","sources":["../../src/init/session-grant.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,KAAK,oBAAoB,GAAG,MAAM,IAAI,CAAC;AAEvC,KAAK,+BAA+B,GAAG;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAyCF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAQ7C;AAED,gFAAgF;AAChF,wBAAgB,gCAAgC,CAC9C,EAAE,EAAE,KAAK,GAAG;IAAE,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,GAC3D,IAAI,CAIN;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,GAAE,+BAAoC,GAC5C,MAAM,IAAI,CAeZ;AAED,uDAAuD;AACvD,wBAAgB,gCAAgC,IAAI,IAAI,CAMvD"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ const SESSION_GRANT_TTL_MS = 30000;
8
+ let armedXRSystem;
9
+ let pendingGrantAt;
10
+ const subscribers = new Set();
11
+ const persistentSubscribers = new Set();
12
+ function now() {
13
+ return Date.now();
14
+ }
15
+ function hasFreshPendingGrant() {
16
+ if (pendingGrantAt == null) {
17
+ return false;
18
+ }
19
+ if (now() - pendingGrantAt <= SESSION_GRANT_TTL_MS) {
20
+ return true;
21
+ }
22
+ pendingGrantAt = undefined;
23
+ return false;
24
+ }
25
+ function handleSessionGranted() {
26
+ pendingGrantAt = now();
27
+ if (subscribers.size === 0 && persistentSubscribers.size === 0) {
28
+ return;
29
+ }
30
+ const pendingSubscribers = [...subscribers];
31
+ const recurringSubscribers = [...persistentSubscribers];
32
+ subscribers.clear();
33
+ pendingGrantAt = undefined;
34
+ for (const subscriber of [...pendingSubscribers, ...recurringSubscribers]) {
35
+ try {
36
+ subscriber();
37
+ }
38
+ catch (error) {
39
+ console.error('[XR] sessiongranted subscriber failed:', error);
40
+ }
41
+ }
42
+ }
43
+ /**
44
+ * Start recording native sessiongranted events before asynchronous world
45
+ * initialization begins. Calling this more than once for the same XRSystem is
46
+ * a no-op.
47
+ *
48
+ * @internal
49
+ */
50
+ function armSessionGrantCapture() {
51
+ var _a;
52
+ const xr = (_a = globalThis.navigator) === null || _a === void 0 ? void 0 : _a.xr;
53
+ if (xr == null || xr === armedXRSystem) {
54
+ return;
55
+ }
56
+ armedXRSystem === null || armedXRSystem === void 0 ? void 0 : armedXRSystem.removeEventListener('sessiongranted', handleSessionGranted);
57
+ armedXRSystem = xr;
58
+ xr.addEventListener('sessiongranted', handleSessionGranted);
59
+ }
60
+ /** Arm capture synchronously when world options request grant-driven launch. */
61
+ function armSessionGrantCaptureForOptions(xr) {
62
+ if (xr !== false && (xr === null || xr === void 0 ? void 0 : xr.launchOnSessionGranted) === true) {
63
+ armSessionGrantCapture();
64
+ }
65
+ }
66
+ /**
67
+ * Consume a recently captured grant, or subscribe to a future grant. One-shot
68
+ * subscriptions run at most once. Persistent subscriptions remain armed so a
69
+ * world can re-enter XR after a failed request or an ended session.
70
+ *
71
+ * @internal
72
+ */
73
+ function onSessionGrant(callback, options = {}) {
74
+ const target = options.persistent ? persistentSubscribers : subscribers;
75
+ target.add(callback);
76
+ if (hasFreshPendingGrant()) {
77
+ pendingGrantAt = undefined;
78
+ if (!options.persistent) {
79
+ target.delete(callback);
80
+ }
81
+ callback();
82
+ }
83
+ return () => {
84
+ target.delete(callback);
85
+ };
86
+ }
87
+
88
+ export { armSessionGrantCapture, armSessionGrantCaptureForOptions, onSessionGrant };
89
+ //# sourceMappingURL=session-grant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-grant.js","sources":["../../src/init/session-grant.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nconst SESSION_GRANT_TTL_MS = 30_000;\n\ntype SessionGrantCallback = () => void;\n\ntype SessionGrantSubscriptionOptions = {\n persistent?: boolean;\n};\n\nlet armedXRSystem: XRSystem | undefined;\nlet pendingGrantAt: number | undefined;\nconst subscribers = new Set<SessionGrantCallback>();\nconst persistentSubscribers = new Set<SessionGrantCallback>();\n\nfunction now(): number {\n return Date.now();\n}\n\nfunction hasFreshPendingGrant(): boolean {\n if (pendingGrantAt == null) {\n return false;\n }\n if (now() - pendingGrantAt <= SESSION_GRANT_TTL_MS) {\n return true;\n }\n pendingGrantAt = undefined;\n return false;\n}\n\nfunction handleSessionGranted(): void {\n pendingGrantAt = now();\n if (subscribers.size === 0 && persistentSubscribers.size === 0) {\n return;\n }\n\n const pendingSubscribers = [...subscribers];\n const recurringSubscribers = [...persistentSubscribers];\n subscribers.clear();\n pendingGrantAt = undefined;\n for (const subscriber of [...pendingSubscribers, ...recurringSubscribers]) {\n try {\n subscriber();\n } catch (error) {\n console.error('[XR] sessiongranted subscriber failed:', error);\n }\n }\n}\n\n/**\n * Start recording native sessiongranted events before asynchronous world\n * initialization begins. Calling this more than once for the same XRSystem is\n * a no-op.\n *\n * @internal\n */\nexport function armSessionGrantCapture(): void {\n const xr = globalThis.navigator?.xr;\n if (xr == null || xr === armedXRSystem) {\n return;\n }\n armedXRSystem?.removeEventListener('sessiongranted', handleSessionGranted);\n armedXRSystem = xr;\n xr.addEventListener('sessiongranted', handleSessionGranted);\n}\n\n/** Arm capture synchronously when world options request grant-driven launch. */\nexport function armSessionGrantCaptureForOptions(\n xr: false | { launchOnSessionGranted?: boolean } | undefined,\n): void {\n if (xr !== false && xr?.launchOnSessionGranted === true) {\n armSessionGrantCapture();\n }\n}\n\n/**\n * Consume a recently captured grant, or subscribe to a future grant. One-shot\n * subscriptions run at most once. Persistent subscriptions remain armed so a\n * world can re-enter XR after a failed request or an ended session.\n *\n * @internal\n */\nexport function onSessionGrant(\n callback: SessionGrantCallback,\n options: SessionGrantSubscriptionOptions = {},\n): () => void {\n const target = options.persistent ? persistentSubscribers : subscribers;\n target.add(callback);\n\n if (hasFreshPendingGrant()) {\n pendingGrantAt = undefined;\n if (!options.persistent) {\n target.delete(callback);\n }\n callback();\n }\n\n return () => {\n target.delete(callback);\n };\n}\n\n/** Reset module state for isolated tests. @internal */\nexport function resetSessionGrantCaptureForTests(): void {\n armedXRSystem?.removeEventListener('sessiongranted', handleSessionGranted);\n armedXRSystem = undefined;\n pendingGrantAt = undefined;\n subscribers.clear();\n persistentSubscribers.clear();\n}\n"],"names":[],"mappings":"AAAA;;;;;AAKG;AAEH,MAAM,oBAAoB,GAAG,KAAM;AAQnC,IAAI,aAAmC;AACvC,IAAI,cAAkC;AACtC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAwB;AACnD,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAwB;AAE7D,SAAS,GAAG,GAAA;AACV,IAAA,OAAO,IAAI,CAAC,GAAG,EAAE;AACnB;AAEA,SAAS,oBAAoB,GAAA;AAC3B,IAAA,IAAI,cAAc,IAAI,IAAI,EAAE;AAC1B,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,GAAG,EAAE,GAAG,cAAc,IAAI,oBAAoB,EAAE;AAClD,QAAA,OAAO,IAAI;IACb;IACA,cAAc,GAAG,SAAS;AAC1B,IAAA,OAAO,KAAK;AACd;AAEA,SAAS,oBAAoB,GAAA;IAC3B,cAAc,GAAG,GAAG,EAAE;AACtB,IAAA,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,IAAI,qBAAqB,CAAC,IAAI,KAAK,CAAC,EAAE;QAC9D;IACF;AAEA,IAAA,MAAM,kBAAkB,GAAG,CAAC,GAAG,WAAW,CAAC;AAC3C,IAAA,MAAM,oBAAoB,GAAG,CAAC,GAAG,qBAAqB,CAAC;IACvD,WAAW,CAAC,KAAK,EAAE;IACnB,cAAc,GAAG,SAAS;IAC1B,KAAK,MAAM,UAAU,IAAI,CAAC,GAAG,kBAAkB,EAAE,GAAG,oBAAoB,CAAC,EAAE;AACzE,QAAA,IAAI;AACF,YAAA,UAAU,EAAE;QACd;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC;QAChE;IACF;AACF;AAEA;;;;;;AAMG;SACa,sBAAsB,GAAA;;IACpC,MAAM,EAAE,GAAG,CAAA,EAAA,GAAA,UAAU,CAAC,SAAS,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,EAAE;IACnC,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,KAAK,aAAa,EAAE;QACtC;IACF;IACA,aAAa,KAAA,IAAA,IAAb,aAAa,KAAA,MAAA,GAAA,MAAA,GAAb,aAAa,CAAE,mBAAmB,CAAC,gBAAgB,EAAE,oBAAoB,CAAC;IAC1E,aAAa,GAAG,EAAE;AAClB,IAAA,EAAE,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,oBAAoB,CAAC;AAC7D;AAEA;AACM,SAAU,gCAAgC,CAC9C,EAA4D,EAAA;AAE5D,IAAA,IAAI,EAAE,KAAK,KAAK,IAAI,CAAA,EAAE,KAAA,IAAA,IAAF,EAAE,KAAA,MAAA,GAAA,MAAA,GAAF,EAAE,CAAE,sBAAsB,MAAK,IAAI,EAAE;AACvD,QAAA,sBAAsB,EAAE;IAC1B;AACF;AAEA;;;;;;AAMG;SACa,cAAc,CAC5B,QAA8B,EAC9B,UAA2C,EAAE,EAAA;AAE7C,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,qBAAqB,GAAG,WAAW;AACvE,IAAA,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAEpB,IAAI,oBAAoB,EAAE,EAAE;QAC1B,cAAc,GAAG,SAAS;AAC1B,QAAA,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AACvB,YAAA,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QACzB;AACA,QAAA,QAAQ,EAAE;IACZ;AAEA,IAAA,OAAO,MAAK;AACV,QAAA,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;AACzB,IAAA,CAAC;AACH;;;;"}