@relu-interactives/spatial-ecs 0.5.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. package/dist/{System-V_mv07le.d.cts → System-8D-XBDKZ.d.cts} +734 -8
  2. package/dist/{System-V_mv07le.d.ts → System-DPMAW30g.d.ts} +734 -8
  3. package/dist/{XRHandPose-CU3vNFuS.d.ts → XRHandPose-G0Dl-F0w.d.ts} +93 -3
  4. package/dist/{XRHandPose-CQTLGxFC.d.cts → XRHandPose-VQMT1WXj.d.cts} +93 -3
  5. package/dist/animation/index.cjs +252 -0
  6. package/dist/animation/index.cjs.map +1 -0
  7. package/dist/animation/index.d.cts +100 -0
  8. package/dist/animation/index.d.ts +100 -0
  9. package/dist/animation/index.js +4 -0
  10. package/dist/animation/index.js.map +1 -0
  11. package/dist/chunk-CKTHDXPS.js +11 -0
  12. package/dist/chunk-CKTHDXPS.js.map +1 -0
  13. package/dist/chunk-G4XJ53LS.js +1237 -0
  14. package/dist/chunk-G4XJ53LS.js.map +1 -0
  15. package/dist/chunk-GSWC6LLD.js +241 -0
  16. package/dist/chunk-GSWC6LLD.js.map +1 -0
  17. package/dist/{chunk-DF5SSRN6.js → chunk-JIJQFW6P.js} +1216 -2920
  18. package/dist/chunk-JIJQFW6P.js.map +1 -0
  19. package/dist/{chunk-BUEKOSR5.js → chunk-NNDUOQ7O.js} +188 -14
  20. package/dist/chunk-NNDUOQ7O.js.map +1 -0
  21. package/dist/chunk-OHCNPPMX.js +334 -0
  22. package/dist/chunk-OHCNPPMX.js.map +1 -0
  23. package/dist/{chunk-RXBLOO5B.js → chunk-SGF73YTF.js} +105 -715
  24. package/dist/chunk-SGF73YTF.js.map +1 -0
  25. package/dist/chunk-U727NTWQ.js +2856 -0
  26. package/dist/chunk-U727NTWQ.js.map +1 -0
  27. package/dist/{chunk-OY7ZODZP.js → chunk-XE4OXN2W.js} +3 -9
  28. package/dist/chunk-XE4OXN2W.js.map +1 -0
  29. package/dist/{chunk-OWQSESTO.js → chunk-XU2DVWCP.js} +4 -3
  30. package/dist/chunk-XU2DVWCP.js.map +1 -0
  31. package/dist/components/index.cjs +183 -10
  32. package/dist/components/index.cjs.map +1 -1
  33. package/dist/components/index.d.cts +5 -3
  34. package/dist/components/index.d.ts +5 -3
  35. package/dist/components/index.js +3 -2
  36. package/dist/docs/api/Behaviour/classes/Behaviour.md +366 -79
  37. package/dist/docs/api/Behaviour/index.md +7 -3
  38. package/dist/docs/api/Behaviour/type-aliases/UiInteractionEvent.md +35 -0
  39. package/dist/docs/api/Component/classes/Component.md +14 -1
  40. package/dist/docs/api/components/classes/AnimationComponent.md +26 -26
  41. package/dist/docs/api/components/classes/AudioComponent.md +19 -19
  42. package/dist/docs/api/components/classes/CameraComponent.md +14 -14
  43. package/dist/docs/api/components/classes/EntityType.md +4 -4
  44. package/dist/docs/api/components/classes/Environment.md +5 -4
  45. package/dist/docs/api/components/classes/ImageComponent.md +7 -7
  46. package/dist/docs/api/components/classes/ImageTarget.md +8 -8
  47. package/dist/docs/api/components/classes/ImageTargetAnchor.md +4 -4
  48. package/dist/docs/api/components/classes/InstanceSlotComponent.md +4 -4
  49. package/dist/docs/api/components/classes/InstancedMeshComponent.md +10 -10
  50. package/dist/docs/api/components/classes/LightComponent.md +6 -6
  51. package/dist/docs/api/components/classes/MaterialComponent.md +16 -16
  52. package/dist/docs/api/components/classes/MeshComponent.md +3 -3
  53. package/dist/docs/api/components/classes/MeshGeometryComponent.md +9 -9
  54. package/dist/docs/api/components/classes/ModelComponent.md +8 -5
  55. package/dist/docs/api/components/classes/Name.md +3 -3
  56. package/dist/docs/api/components/classes/Object3DRef.md +4 -4
  57. package/dist/docs/api/components/classes/ParentId.md +3 -3
  58. package/dist/docs/api/components/classes/PhysicsComponent.md +7 -6
  59. package/dist/docs/api/components/classes/Postprocessing.md +3 -3
  60. package/dist/docs/api/components/classes/PrefabInstance.md +5 -5
  61. package/dist/docs/api/components/classes/PrefabNode.md +3 -3
  62. package/dist/docs/api/components/classes/ScriptComponent.md +5 -5
  63. package/dist/docs/api/components/classes/ScriptObjectComponent.md +9 -9
  64. package/dist/docs/api/components/classes/Selectable.md +3 -3
  65. package/dist/docs/api/components/classes/SelectionTransformState.md +5 -5
  66. package/dist/docs/api/components/classes/SpriteComponent.md +7 -7
  67. package/dist/docs/api/components/classes/TransformComponent.md +12 -12
  68. package/dist/docs/api/components/classes/UIButtonComponent.md +63 -0
  69. package/dist/docs/api/components/classes/UIPanelComponent.md +62 -0
  70. package/dist/docs/api/components/classes/UISliderComponent.md +59 -0
  71. package/dist/docs/api/components/classes/UITextComponent.md +59 -0
  72. package/dist/docs/api/components/classes/UIToggleComponent.md +56 -0
  73. package/dist/docs/api/components/classes/VRTeleportAreaComponent.md +53 -0
  74. package/dist/docs/api/components/classes/VideoComponent.md +28 -28
  75. package/dist/docs/api/components/classes/XRAnchorComponent.md +64 -0
  76. package/dist/docs/api/components/classes/XREnvironmentComponent.md +64 -0
  77. package/dist/docs/api/components/classes/XRHandPoseComponent.md +50 -0
  78. package/dist/docs/api/components/classes/XRInteractableComponent.md +74 -0
  79. package/dist/docs/api/components/classes/XRInteractorComponent.md +57 -0
  80. package/dist/docs/api/components/classes/XRInteractorSideComponent.md +50 -0
  81. package/dist/docs/api/components/classes/XRRigComponent.md +68 -0
  82. package/dist/docs/api/components/functions/createAttachPoint.md +25 -0
  83. package/dist/docs/api/components/functions/createHandPoseEntry.md +25 -0
  84. package/dist/docs/api/components/functions/defaultMaterialValue.md +1 -1
  85. package/dist/docs/api/components/functions/handPoseDefinitionFor.md +33 -0
  86. package/dist/docs/api/components/functions/normalizeEnvironmentLighting.md +30 -0
  87. package/dist/docs/api/components/functions/normalizePhysicsState.md +1 -1
  88. package/dist/docs/api/components/functions/setModelLoadState.md +33 -0
  89. package/dist/docs/api/components/functions/setPhysicsLiveRef.md +3 -9
  90. package/dist/docs/api/components/index.md +61 -4
  91. package/dist/docs/api/components/type-aliases/AnimationComponentOptions.md +9 -9
  92. package/dist/docs/api/components/type-aliases/CameraComponentOptions.md +13 -13
  93. package/dist/docs/api/components/type-aliases/CameraProjection.md +1 -1
  94. package/dist/docs/api/components/type-aliases/CameraRuntimeType.md +5 -3
  95. package/dist/docs/api/components/type-aliases/ColliderShape.md +1 -1
  96. package/dist/docs/api/components/type-aliases/ColliderState.md +20 -20
  97. package/dist/docs/api/components/type-aliases/CubeMeshParameters.md +4 -4
  98. package/dist/docs/api/components/type-aliases/EditableMeshObjectKind.md +1 -1
  99. package/dist/docs/api/components/type-aliases/EnvironmentFogState.md +8 -8
  100. package/dist/docs/api/components/type-aliases/EnvironmentFogType.md +1 -1
  101. package/dist/docs/api/components/type-aliases/EnvironmentGradientEffect.md +1 -1
  102. package/dist/docs/api/components/type-aliases/EnvironmentLightingState.md +40 -0
  103. package/dist/docs/api/components/type-aliases/EnvironmentSkyboxImageProjection.md +22 -0
  104. package/dist/docs/api/components/type-aliases/EnvironmentSkyboxState.md +9 -7
  105. package/dist/docs/api/components/type-aliases/EnvironmentSkyboxType.md +1 -1
  106. package/dist/docs/api/components/type-aliases/EnvironmentState.md +7 -5
  107. package/dist/docs/api/components/type-aliases/EnvironmentToneMapping.md +16 -0
  108. package/dist/docs/api/components/type-aliases/ImageTargetAnchorOptions.md +3 -3
  109. package/dist/docs/api/components/type-aliases/ImageTargetReference.md +7 -7
  110. package/dist/docs/api/components/type-aliases/InstanceTransform.md +13 -13
  111. package/dist/docs/api/components/type-aliases/InstancedMeshKind.md +1 -1
  112. package/dist/docs/api/components/type-aliases/LightShadowState.md +37 -0
  113. package/dist/docs/api/components/type-aliases/LightValueState.md +13 -11
  114. package/dist/docs/api/components/type-aliases/MaterialTypeValue.md +1 -1
  115. package/dist/docs/api/components/type-aliases/MaterialValueState.md +28 -28
  116. package/dist/docs/api/components/type-aliases/MeshGeometryParameters.md +1 -1
  117. package/dist/docs/api/components/type-aliases/MeshGeometryParametersByKind.md +7 -7
  118. package/dist/docs/api/components/type-aliases/ModelLoadState.md +15 -0
  119. package/dist/docs/api/components/type-aliases/PhysicsState.md +3 -3
  120. package/dist/docs/api/components/type-aliases/PlaneMeshParameters.md +3 -3
  121. package/dist/docs/api/components/type-aliases/PostprocessingState.md +62 -62
  122. package/dist/docs/api/components/type-aliases/RadiusHeightMeshParameters.md +3 -3
  123. package/dist/docs/api/components/type-aliases/RadiusMeshParameters.md +2 -2
  124. package/dist/docs/api/components/type-aliases/RigidbodyState.md +17 -17
  125. package/dist/docs/api/components/type-aliases/RigidbodyType.md +1 -1
  126. package/dist/docs/api/components/type-aliases/ScriptEntry.md +8 -8
  127. package/dist/docs/api/components/type-aliases/ScriptObjectComponentInput.md +1 -1
  128. package/dist/docs/api/components/type-aliases/ScriptObjectRuntimeState.md +1 -1
  129. package/dist/docs/api/components/type-aliases/TextureFilteringValue.md +1 -1
  130. package/dist/docs/api/components/type-aliases/TransformData.md +4 -4
  131. package/dist/docs/api/components/type-aliases/TransformModeValue.md +1 -1
  132. package/dist/docs/api/components/type-aliases/TransformSpaceValue.md +1 -1
  133. package/dist/docs/api/components/type-aliases/UIButtonOptions.md +45 -0
  134. package/dist/docs/api/components/type-aliases/UIPanelOptions.md +39 -0
  135. package/dist/docs/api/components/type-aliases/UISliderOptions.md +39 -0
  136. package/dist/docs/api/components/type-aliases/UITextOptions.md +41 -0
  137. package/dist/docs/api/components/type-aliases/UIToggleOptions.md +35 -0
  138. package/dist/docs/api/components/type-aliases/UiFollowMode.md +15 -0
  139. package/dist/docs/api/components/type-aliases/UiTextAlign.md +13 -0
  140. package/dist/docs/api/components/type-aliases/UiTextVAlign.md +13 -0
  141. package/dist/docs/api/components/type-aliases/VRTeleportAreaOptions.md +29 -0
  142. package/dist/docs/api/components/type-aliases/Vec3.md +4 -4
  143. package/dist/docs/api/components/type-aliases/VrTeleportShape.md +15 -0
  144. package/dist/docs/api/components/type-aliases/XRAnchorOptions.md +23 -0
  145. package/dist/docs/api/components/type-aliases/XRHandPoseOptions.md +23 -0
  146. package/dist/docs/api/components/type-aliases/XRInteractableOptions.md +75 -0
  147. package/dist/docs/api/components/type-aliases/XRInteractorOptions.md +37 -0
  148. package/dist/docs/api/components/type-aliases/XRRigOptions.md +51 -0
  149. package/dist/docs/api/components/type-aliases/XrAttachPoint.md +53 -0
  150. package/dist/docs/api/components/type-aliases/XrDistanceGrabBehavior.md +19 -0
  151. package/dist/docs/api/components/type-aliases/XrEnvironmentKind.md +15 -0
  152. package/dist/docs/api/components/type-aliases/XrEnvironmentOrientation.md +15 -0
  153. package/dist/docs/api/components/type-aliases/XrEnvironmentPhysics.md +25 -0
  154. package/dist/docs/api/components/type-aliases/XrGrabGesture.md +19 -0
  155. package/dist/docs/api/components/type-aliases/XrGrabHands.md +20 -0
  156. package/dist/docs/api/components/type-aliases/XrGrabReach.md +20 -0
  157. package/dist/docs/api/components/type-aliases/XrHandPoseEntry.md +49 -0
  158. package/dist/docs/api/components/type-aliases/XrHandPreset.md +19 -0
  159. package/dist/docs/api/components/type-aliases/XrInteractorSide.md +15 -0
  160. package/dist/docs/api/components/type-aliases/XrInteractorType.md +13 -0
  161. package/dist/docs/api/components/type-aliases/XrLocomotionMode.md +15 -0
  162. package/dist/docs/api/components/type-aliases/XrTrackingOrigin.md +24 -0
  163. package/dist/docs/api/components/type-aliases/XrTwoHandRotation.md +15 -0
  164. package/dist/docs/api/components/variables/DEFAULT_COLLIDER_STATE.md +1 -1
  165. package/dist/docs/api/components/variables/DEFAULT_ENVIRONMENT_LIGHTING.md +15 -0
  166. package/dist/docs/api/components/variables/DEFAULT_ENVIRONMENT_STATE.md +1 -1
  167. package/dist/docs/api/components/variables/DEFAULT_INSTANCED_MESH_PARAMETERS.md +1 -1
  168. package/dist/docs/api/components/variables/DEFAULT_INSTANCE_TRANSFORM.md +1 -1
  169. package/dist/docs/api/components/variables/DEFAULT_MESH_GEOMETRY_PARAMETERS.md +1 -1
  170. package/dist/docs/api/components/variables/DEFAULT_PHYSICS_STATE.md +1 -1
  171. package/dist/docs/api/components/variables/DEFAULT_POSE_CURLS.md +13 -0
  172. package/dist/docs/api/components/variables/DEFAULT_POSE_DIRECTIONS.md +13 -0
  173. package/dist/docs/api/components/variables/DEFAULT_POSTPROCESSING_STATE.md +1 -1
  174. package/dist/docs/api/components/variables/DEFAULT_RIGIDBODY_STATE.md +1 -1
  175. package/dist/docs/api/components/variables/MODEL_NO_PATH_MESSAGE.md +15 -0
  176. package/dist/docs/api/index/classes/AnimationStateMachine.md +16 -16
  177. package/dist/docs/api/index/classes/AnimationStateManager.md +13 -13
  178. package/dist/docs/api/index/classes/AnimationSystem.md +3 -3
  179. package/dist/docs/api/index/classes/AudioSystem.md +4 -4
  180. package/dist/docs/api/index/classes/CameraSyncSystem.md +2 -2
  181. package/dist/docs/api/index/classes/EnvironmentSyncSystem.md +19 -4
  182. package/dist/docs/api/index/classes/HandPoseTracker.md +114 -0
  183. package/dist/docs/api/index/classes/InputSystem.md +33 -33
  184. package/dist/docs/api/index/classes/InstancedMeshSystem.md +2 -2
  185. package/dist/docs/api/index/classes/LightSyncSystem.md +2 -2
  186. package/dist/docs/api/index/classes/MaterialSyncSystem.md +3 -3
  187. package/dist/docs/api/index/classes/MeshGeometrySystem.md +2 -2
  188. package/dist/docs/api/index/classes/ObjectManagementSystem.md +14 -14
  189. package/dist/docs/api/index/classes/ObjectVisibilitySystem.md +2 -2
  190. package/dist/docs/api/index/classes/PhysicsSyncSystem.md +4 -4
  191. package/dist/docs/api/index/classes/PostprocessingSyncSystem.md +34 -10
  192. package/dist/docs/api/index/classes/RenderSystem.md +13 -4
  193. package/dist/docs/api/index/classes/ScriptBehaviourSystem.md +9 -5
  194. package/dist/docs/api/index/classes/ScriptObject.md +10 -10
  195. package/dist/docs/api/index/classes/ScriptObjectSystem.md +6 -6
  196. package/dist/docs/api/index/classes/TeleportAimGate.md +114 -0
  197. package/dist/docs/api/index/classes/ThrowVelocityTracker.md +89 -0
  198. package/dist/docs/api/index/classes/TransformSyncSystem.md +2 -2
  199. package/dist/docs/api/index/classes/UIInteractionSystem.md +60 -0
  200. package/dist/docs/api/index/classes/UIPanelSystem.md +79 -0
  201. package/dist/docs/api/index/classes/VRTeleportAreaSystem.md +49 -0
  202. package/dist/docs/api/index/classes/VideoSystem.md +8 -6
  203. package/dist/docs/api/index/classes/World.md +282 -100
  204. package/dist/docs/api/index/classes/XRAnchorSystem.md +90 -0
  205. package/dist/docs/api/index/classes/XRControllerVisualSystem.md +77 -0
  206. package/dist/docs/api/index/classes/XREnvironmentSystem.md +137 -0
  207. package/dist/docs/api/index/classes/XRHandPoseSystem.md +107 -0
  208. package/dist/docs/api/index/classes/XRHitTestSystem.md +93 -0
  209. package/dist/docs/api/index/classes/XRHoverVisualSystem.md +76 -0
  210. package/dist/docs/api/index/classes/XRInputSystem.md +189 -0
  211. package/dist/docs/api/index/classes/XRInteractionSystem.md +323 -0
  212. package/dist/docs/api/index/classes/XRLocomotionSystem.md +128 -0
  213. package/dist/docs/api/index/classes/XRSessionSystem.md +116 -0
  214. package/dist/docs/api/index/classes/XRTeleportVisualSystem.md +75 -0
  215. package/dist/docs/api/index/functions/angularVelocityFrom.md +33 -0
  216. package/dist/docs/api/index/functions/applyHandMaterial.md +26 -0
  217. package/dist/docs/api/index/functions/applyPrefabToSnapshotInstances.md +1 -1
  218. package/dist/docs/api/index/functions/arcGroundCrossing.md +30 -0
  219. package/dist/docs/api/index/functions/buildComponentValueMaps.md +1 -1
  220. package/dist/docs/api/index/functions/buildNodeKeyMapsFromSnapshot.md +1 -1
  221. package/dist/docs/api/index/functions/buildNodeMapsFromSnapshot.md +1 -1
  222. package/dist/docs/api/index/functions/canonicalizeComponentValue.md +1 -1
  223. package/dist/docs/api/index/functions/clearModelCache.md +1 -1
  224. package/dist/docs/api/index/functions/clearPrefabCache.md +1 -1
  225. package/dist/docs/api/index/functions/cloneHandPose.md +23 -0
  226. package/dist/docs/api/index/functions/collectDiffPaths.md +1 -1
  227. package/dist/docs/api/index/functions/collectDirectPrefabDependencies.md +1 -1
  228. package/dist/docs/api/index/functions/collectEntitySubtree.md +1 -1
  229. package/dist/docs/api/index/functions/collectSnapshotSubtreeIds.md +1 -1
  230. package/dist/docs/api/index/functions/computeFingerCurl.md +29 -0
  231. package/dist/docs/api/index/functions/computeHandShape.md +29 -0
  232. package/dist/docs/api/index/functions/computeInstanceOverrides.md +1 -1
  233. package/dist/docs/api/index/functions/computePalmPose.md +30 -0
  234. package/dist/docs/api/index/functions/computePalmWidth.md +25 -0
  235. package/dist/docs/api/index/functions/computePinch.md +29 -0
  236. package/dist/docs/api/index/functions/computeSpread.md +33 -0
  237. package/dist/docs/api/index/functions/createAnimationComponent.md +1 -1
  238. package/dist/docs/api/index/functions/createAudioComponent.md +1 -1
  239. package/dist/docs/api/index/functions/createCameraComponent.md +1 -1
  240. package/dist/docs/api/index/functions/createEntityTypeComponent.md +2 -2
  241. package/dist/docs/api/index/functions/createEnvironmentComponent.md +1 -1
  242. package/dist/docs/api/index/functions/createHandMaterial.md +30 -0
  243. package/dist/docs/api/index/functions/createImageComponent.md +1 -1
  244. package/dist/docs/api/index/functions/createImageTargetAnchorComponent.md +1 -1
  245. package/dist/docs/api/index/functions/createImageTargetComponent.md +2 -2
  246. package/dist/docs/api/index/functions/createInstanceSlotComponent.md +1 -1
  247. package/dist/docs/api/index/functions/createInstancedMeshComponent.md +1 -1
  248. package/dist/docs/api/index/functions/createLightComponent.md +2 -2
  249. package/dist/docs/api/index/functions/createMaterialComponent.md +2 -2
  250. package/dist/docs/api/index/functions/createMeshComponent.md +1 -1
  251. package/dist/docs/api/index/functions/createMeshGeometryComponent.md +1 -1
  252. package/dist/docs/api/index/functions/createModelComponent.md +1 -1
  253. package/dist/docs/api/index/functions/createNameComponent.md +1 -1
  254. package/dist/docs/api/index/functions/createObject3DRefComponent.md +1 -1
  255. package/dist/docs/api/index/functions/createParentIdComponent.md +1 -1
  256. package/dist/docs/api/index/functions/createPhysicsComponent.md +1 -1
  257. package/dist/docs/api/index/functions/createPostprocessingComponent.md +1 -1
  258. package/dist/docs/api/index/functions/createScriptComponent.md +1 -1
  259. package/dist/docs/api/index/functions/createScriptObjectComponent.md +1 -1
  260. package/dist/docs/api/index/functions/createSelectableComponent.md +1 -1
  261. package/dist/docs/api/index/functions/createSelectionTransformStateComponent.md +1 -1
  262. package/dist/docs/api/index/functions/createSpriteComponent.md +1 -1
  263. package/dist/docs/api/index/functions/createTransformComponent.md +1 -1
  264. package/dist/docs/api/index/functions/createUIButtonComponent.md +28 -0
  265. package/dist/docs/api/index/functions/createUIPanelComponent.md +28 -0
  266. package/dist/docs/api/index/functions/createUISliderComponent.md +28 -0
  267. package/dist/docs/api/index/functions/createUITextComponent.md +28 -0
  268. package/dist/docs/api/index/functions/createUIToggleComponent.md +28 -0
  269. package/dist/docs/api/index/functions/createVRTeleportAreaComponent.md +28 -0
  270. package/dist/docs/api/index/functions/createVideoComponent.md +1 -1
  271. package/dist/docs/api/index/functions/createXRAnchorComponent.md +28 -0
  272. package/dist/docs/api/index/functions/createXRHandPoseComponent.md +28 -0
  273. package/dist/docs/api/index/functions/createXRInteractableComponent.md +28 -0
  274. package/dist/docs/api/index/functions/createXRInteractorComponent.md +28 -0
  275. package/dist/docs/api/index/functions/createXRInteractorSideComponent.md +28 -0
  276. package/dist/docs/api/index/functions/createXRRigComponent.md +28 -0
  277. package/dist/docs/api/index/functions/decanonicalizeComponentValue.md +1 -1
  278. package/dist/docs/api/index/functions/despawnPrefab.md +1 -1
  279. package/dist/docs/api/index/functions/encodeOverride.md +1 -1
  280. package/dist/docs/api/index/functions/estimateHandScale.md +28 -0
  281. package/dist/docs/api/index/functions/findSnapshotRootEntityIds.md +1 -1
  282. package/dist/docs/api/index/functions/findTopLevelNestedRegions.md +1 -1
  283. package/dist/docs/api/index/functions/getHandPosePreset.md +31 -0
  284. package/dist/docs/api/index/functions/groupOverridePaths.md +1 -1
  285. package/dist/docs/api/index/functions/handPoseFromCurls.md +42 -0
  286. package/dist/docs/api/index/functions/hydrateWorldFromSnapshot.md +1 -1
  287. package/dist/docs/api/index/functions/hydrateWorldFromSnapshotDetailed.md +1 -1
  288. package/dist/docs/api/index/functions/indexSnapshotByEntity.md +1 -1
  289. package/dist/docs/api/index/functions/instantiateSubtree.md +1 -1
  290. package/dist/docs/api/index/functions/loadPrefab.md +1 -1
  291. package/dist/docs/api/index/functions/loadSharedGltf.md +1 -1
  292. package/dist/docs/api/index/functions/matchHandPose.md +34 -0
  293. package/dist/docs/api/index/functions/mergeComponentValue.md +1 -1
  294. package/dist/docs/api/index/functions/parseOverride.md +1 -1
  295. package/dist/docs/api/index/functions/parsePrefabAsset.md +1 -1
  296. package/dist/docs/api/index/functions/prefabFileVersionFor.md +1 -1
  297. package/dist/docs/api/index/functions/readXrCapabilities.md +30 -0
  298. package/dist/docs/api/index/functions/registerDefaultComponentFactories.md +1 -1
  299. package/dist/docs/api/index/functions/registerDefaultFactories.md +1 -1
  300. package/dist/docs/api/index/functions/remapSnapshotEntityIds.md +3 -3
  301. package/dist/docs/api/index/functions/resolveDracoDecoderPath.md +1 -1
  302. package/dist/docs/api/index/functions/restoreComponentState.md +1 -1
  303. package/dist/docs/api/index/functions/restorePostCreateComponents.md +1 -1
  304. package/dist/docs/api/index/functions/sampleTeleportArc.md +40 -0
  305. package/dist/docs/api/index/functions/serializeEntitySubtree.md +1 -1
  306. package/dist/docs/api/index/functions/setDracoDecoderPath.md +1 -1
  307. package/dist/docs/api/index/functions/setPrefabAssetUrlResolver.md +1 -1
  308. package/dist/docs/api/index/functions/spawnPrefab.md +1 -1
  309. package/dist/docs/api/index/index.md +116 -4
  310. package/dist/docs/api/index/interfaces/ChromaKeyOptions.md +20 -0
  311. package/dist/docs/api/index/interfaces/EcsSystem.md +3 -3
  312. package/dist/docs/api/index/interfaces/PostprocessingBuildContext.md +21 -0
  313. package/dist/docs/api/index/interfaces/PostprocessingPipeline.md +84 -0
  314. package/dist/docs/api/index/interfaces/RenderBackend.md +168 -0
  315. package/dist/docs/api/index/interfaces/StateMachine.md +13 -13
  316. package/dist/docs/api/index/type-aliases/AnimationStateCallbacks.md +4 -4
  317. package/dist/docs/api/index/type-aliases/ApplyPrefabToSnapshotResult.md +3 -3
  318. package/dist/docs/api/index/type-aliases/ComponentFactory.md +1 -1
  319. package/dist/docs/api/index/type-aliases/ComponentValueMaps.md +50 -26
  320. package/dist/docs/api/index/type-aliases/EcsComponentFactoryKind.md +14 -2
  321. package/dist/docs/api/index/type-aliases/EcsRenderer.md +17 -0
  322. package/dist/docs/api/index/type-aliases/EcsWorldComponentSnapshot.md +3 -3
  323. package/dist/docs/api/index/type-aliases/EcsWorldStateSnapshotLike.md +4 -4
  324. package/dist/docs/api/index/type-aliases/ExternalRefWarning.md +5 -5
  325. package/dist/docs/api/index/type-aliases/HandMaterialOptions.md +32 -0
  326. package/dist/docs/api/index/type-aliases/HandPoseTrackerOptions.md +27 -0
  327. package/dist/docs/api/index/type-aliases/HydrateOptions.md +3 -3
  328. package/dist/docs/api/index/type-aliases/HydrateWorldFromSnapshotResult.md +4 -4
  329. package/dist/docs/api/index/type-aliases/InstantiateSubtreeResult.md +3 -3
  330. package/dist/docs/api/index/type-aliases/KeyboardKey.md +1 -1
  331. package/dist/docs/api/index/type-aliases/ModuleLoader.md +1 -1
  332. package/dist/docs/api/index/type-aliases/MouseButton.md +1 -1
  333. package/dist/docs/api/index/type-aliases/NestedRegion.md +5 -5
  334. package/dist/docs/api/index/type-aliases/NodeKeyMaps.md +5 -5
  335. package/dist/docs/api/index/type-aliases/NodeMaps.md +4 -4
  336. package/dist/docs/api/index/type-aliases/PrefabAsset.md +5 -5
  337. package/dist/docs/api/index/type-aliases/RemapSnapshotOptions.md +2 -2
  338. package/dist/docs/api/index/type-aliases/RendererKind.md +15 -0
  339. package/dist/docs/api/index/type-aliases/ScriptBehaviourSystemOptions.md +23 -0
  340. package/dist/docs/api/index/type-aliases/ScriptErrorEvent.md +39 -0
  341. package/dist/docs/api/index/type-aliases/ScriptErrorListener.md +25 -0
  342. package/dist/docs/api/index/type-aliases/ScriptErrorPhase.md +28 -0
  343. package/dist/docs/api/index/type-aliases/ScriptErrorReport.md +31 -0
  344. package/dist/docs/api/index/type-aliases/ScriptErrorSource.md +15 -0
  345. package/dist/docs/api/index/type-aliases/SelectionContext.md +4 -4
  346. package/dist/docs/api/index/type-aliases/SerializeEntitySubtreeResult.md +4 -4
  347. package/dist/docs/api/index/type-aliases/SpawnPrefabOptions.md +5 -5
  348. package/dist/docs/api/index/type-aliases/SpawnPrefabSource.md +1 -1
  349. package/dist/docs/api/index/type-aliases/SubtreeSnapshot.md +3 -3
  350. package/dist/docs/api/index/type-aliases/UiCanvasLike.md +46 -0
  351. package/dist/docs/api/index/type-aliases/VelocitySample.md +23 -0
  352. package/dist/docs/api/index/type-aliases/XrCapabilities.md +41 -0
  353. package/dist/docs/api/index/type-aliases/XrFinger.md +13 -0
  354. package/dist/docs/api/index/type-aliases/XrFingerCurl.md +27 -0
  355. package/dist/docs/api/index/type-aliases/XrFingerTarget.md +31 -0
  356. package/dist/docs/api/index/type-aliases/XrHandJointName.md +40 -0
  357. package/dist/docs/api/index/type-aliases/XrHandJoints.md +18 -0
  358. package/dist/docs/api/index/type-aliases/XrHandPoseAxis.md +15 -0
  359. package/dist/docs/api/index/type-aliases/XrHandPoseContext.md +23 -0
  360. package/dist/docs/api/index/type-aliases/XrHandPoseDefinition.md +47 -0
  361. package/dist/docs/api/index/type-aliases/XrHandPoseDirection.md +21 -0
  362. package/dist/docs/api/index/type-aliases/XrHandPoseEvent.md +13 -0
  363. package/dist/docs/api/index/type-aliases/XrHandPoseEventDetail.md +27 -0
  364. package/dist/docs/api/index/type-aliases/XrHandPoseMatch.md +25 -0
  365. package/dist/docs/api/index/type-aliases/XrHandPoseOrientation.md +25 -0
  366. package/dist/docs/api/index/type-aliases/XrHandShape.md +46 -0
  367. package/dist/docs/api/index/type-aliases/XrHandedness.md +15 -0
  368. package/dist/docs/api/index/type-aliases/XrHitResult.md +25 -0
  369. package/dist/docs/api/index/type-aliases/XrInputKind.md +19 -0
  370. package/dist/docs/api/index/type-aliases/XrInputState.md +60 -0
  371. package/dist/docs/api/index/type-aliases/XrPalmPose.md +31 -0
  372. package/dist/docs/api/index/variables/ADDED_NODE_MARKER_COMPONENT.md +2 -2
  373. package/dist/docs/api/index/variables/ARC_GRAVITY.md +15 -0
  374. package/dist/docs/api/index/variables/ARC_MAX_TIME.md +15 -0
  375. package/dist/docs/api/index/variables/ARC_SPEED.md +15 -0
  376. package/dist/docs/api/index/variables/ARC_STEPS.md +15 -0
  377. package/dist/docs/api/index/variables/CURLED_COS.md +13 -0
  378. package/dist/docs/api/index/variables/DEFAULT_DIRECTION_TOLERANCE.md +15 -0
  379. package/dist/docs/api/index/variables/DEFAULT_ENTER_CONFIDENCE.md +13 -0
  380. package/dist/docs/api/index/variables/DEFAULT_EXIT_CONFIDENCE.md +13 -0
  381. package/dist/docs/api/index/variables/DEFAULT_LOST_GRACE_SECONDS.md +13 -0
  382. package/dist/docs/api/index/variables/DEFAULT_MIN_HOLD_SECONDS.md +13 -0
  383. package/dist/docs/api/index/variables/DEFAULT_SCRIPT_ERROR_RETRY_DELAY.md +17 -0
  384. package/dist/docs/api/index/variables/FALLBACK_HAND_SCALE.md +15 -0
  385. package/dist/docs/api/index/variables/HAND_POSE_PRESETS.md +19 -0
  386. package/dist/docs/api/index/variables/HAND_POSE_PRESET_IDS.md +15 -0
  387. package/dist/docs/api/index/variables/HYDRATABLE_ENTITY_KINDS.md +1 -1
  388. package/dist/docs/api/index/variables/KeyboardKeys.md +89 -89
  389. package/dist/docs/api/index/variables/MATCH_FALLOFF.md +15 -0
  390. package/dist/docs/api/index/variables/MAX_PLAUSIBLE_SPEED.md +25 -0
  391. package/dist/docs/api/index/variables/MAX_SAMPLE_AGE_SECONDS.md +18 -0
  392. package/dist/docs/api/index/variables/NODE_KEY_SEPARATOR.md +1 -1
  393. package/dist/docs/api/index/variables/NO_XR_CAPABILITIES.md +15 -0
  394. package/dist/docs/api/index/variables/OVERRIDE_DIFF_EXCLUDED_COMPONENTS.md +1 -1
  395. package/dist/docs/api/index/variables/OVERRIDE_ROOT_EXCLUDED_COMPONENTS.md +1 -1
  396. package/dist/docs/api/index/variables/PINCH_FINGERS.md +15 -0
  397. package/dist/docs/api/index/variables/PREFAB_FILE_VERSION.md +1 -1
  398. package/dist/docs/api/index/variables/PREFAB_FILE_VERSION_NESTED.md +1 -1
  399. package/dist/docs/api/index/variables/SCRIPT_OBJECT_ROOT_FLAG.md +1 -1
  400. package/dist/docs/api/index/variables/SHARED_MODEL_RESOURCE_FLAG.md +1 -1
  401. package/dist/docs/api/index/variables/STRAIGHT_COS.md +19 -0
  402. package/dist/docs/api/index/variables/VELOCITY_SAMPLES.md +15 -0
  403. package/dist/docs/api/index/variables/XR_FINGERS.md +13 -0
  404. package/dist/docs/api/index/variables/XR_HOVER_SHELL_FLAG.md +15 -0
  405. package/dist/docs/api/index/variables/webglBackend.md +16 -0
  406. package/dist/docs/api/typedoc-sidebar.json +1 -1
  407. package/dist/docs/api/types/type-aliases/AssetInput.md +3 -3
  408. package/dist/docs/api/types/type-aliases/CheckboxInput.md +3 -3
  409. package/dist/docs/api/types/type-aliases/ColorInput.md +1 -1
  410. package/dist/docs/api/types/type-aliases/ComponentInput.md +4 -4
  411. package/dist/docs/api/types/type-aliases/ComponentKind.md +1 -1
  412. package/dist/docs/api/types/type-aliases/DropdownInput.md +3 -3
  413. package/dist/docs/api/types/type-aliases/DropdownOption.md +3 -3
  414. package/dist/docs/api/types/type-aliases/EcsEntityEditorKind.md +1 -1
  415. package/dist/docs/api/types/type-aliases/EcsEntityKind.md +10 -2
  416. package/dist/docs/api/types/type-aliases/EntityId.md +1 -1
  417. package/dist/docs/api/types/type-aliases/EntityInput.md +3 -3
  418. package/dist/docs/api/types/type-aliases/FloatInput.md +1 -1
  419. package/dist/docs/api/types/type-aliases/IntersectionResult.md +3 -3
  420. package/dist/docs/api/types/type-aliases/ParentLookup.md +3 -3
  421. package/dist/docs/api/types/type-aliases/SelectionListener.md +1 -1
  422. package/dist/docs/api/types/type-aliases/SliderInput.md +5 -5
  423. package/dist/docs/api/types/type-aliases/TextInput.md +1 -1
  424. package/dist/docs/api/types/type-aliases/ToggleInput.md +1 -1
  425. package/dist/docs/api/types/type-aliases/Vec3.md +1 -1
  426. package/dist/docs/api/types/type-aliases/Vector2Input.md +3 -3
  427. package/dist/docs/api/types/type-aliases/Vector3Input.md +4 -4
  428. package/dist/docs/api/types/type-aliases/WorldEntityView.md +1 -1
  429. package/dist/docs/guide/audio-mixing-and-sound-banks.md +71 -0
  430. package/dist/docs/guide/authoring-a-behaviour.md +3 -3
  431. package/dist/docs/guide/authoring-a-script-object.md +12 -9
  432. package/dist/docs/guide/behaviour-data-binding/index.md +11 -11
  433. package/dist/docs/guide/behaviour-lifecycle.md +9 -0
  434. package/dist/docs/guide/bone-attachments-and-ik.md +128 -0
  435. package/dist/docs/guide/component-catalog.md +10 -2
  436. package/dist/docs/guide/components/light.md +42 -0
  437. package/dist/docs/guide/components/model.md +32 -3
  438. package/dist/docs/guide/concepts.md +2 -2
  439. package/dist/docs/guide/getting-started/creating-objects.md +2 -2
  440. package/dist/docs/guide/getting-started/editing-objects.md +2 -2
  441. package/dist/docs/guide/getting-started/editor/ai-agent.md +227 -0
  442. package/dist/docs/guide/getting-started/editor/hierarchy.md +2 -2
  443. package/dist/docs/guide/getting-started/editor/index.md +3 -2
  444. package/dist/docs/guide/getting-started/editor/inspector.md +2 -2
  445. package/dist/docs/guide/getting-started/editor/scene-inspector.md +3 -3
  446. package/dist/docs/guide/getting-started/editor/toolbar.md +11 -11
  447. package/dist/docs/guide/getting-started/editor/viewport.md +17 -9
  448. package/dist/docs/guide/getting-started/index.md +1 -1
  449. package/dist/docs/guide/getting-started/installation.md +1 -1
  450. package/dist/docs/guide/getting-started/preview-and-test.md +7 -7
  451. package/dist/docs/guide/getting-started/project-types/image-tracking.md +23 -11
  452. package/dist/docs/guide/getting-started/project-types/index.md +4 -4
  453. package/dist/docs/guide/getting-started/project-types/vr.md +270 -2
  454. package/dist/docs/guide/getting-started/projects.md +4 -5
  455. package/dist/docs/guide/getting-started/shortcuts.md +5 -4
  456. package/dist/docs/guide/multiplayer.md +92 -0
  457. package/dist/docs/guide/scene/environment.md +101 -4
  458. package/dist/docs/guide/scene/index.md +4 -4
  459. package/dist/docs/guide/scene/postprocessing.md +67 -5
  460. package/dist/docs/guide/spawning/area-light.md +2 -0
  461. package/dist/docs/guide/systems/environment-sync-system.md +11 -6
  462. package/dist/docs/guide/systems/light-sync-system.md +5 -3
  463. package/dist/docs/guide/systems/postprocessing-sync-system.md +16 -6
  464. package/dist/docs/guide/systems/render-system.md +7 -6
  465. package/dist/docs/guide/systems/script-behaviour-system.md +7 -5
  466. package/dist/docs/guide/systems/script-object-system.md +3 -1
  467. package/dist/docs/guide/systems/video-system.md +1 -1
  468. package/dist/docs/guide/webgpu-and-tsl.md +415 -0
  469. package/dist/docs/guide/world-api.md +52 -2
  470. package/dist/factories/index.cjs +770 -283
  471. package/dist/factories/index.cjs.map +1 -1
  472. package/dist/factories/index.d.cts +14 -3
  473. package/dist/factories/index.d.ts +14 -3
  474. package/dist/factories/index.js +7 -4
  475. package/dist/{index-D2Jt_JzH.d.ts → index-C61n65PE.d.ts} +135 -42
  476. package/dist/{index-DaG03vyN.d.cts → index-C70N4BYG.d.cts} +135 -42
  477. package/dist/{index-C3ik3sA1.d.ts → index-D9DjrUn3.d.cts} +25 -3
  478. package/dist/{index-Dlr-7-4m.d.cts → index-DppafVu4.d.ts} +25 -3
  479. package/dist/index.cjs +3642 -1263
  480. package/dist/index.cjs.map +1 -1
  481. package/dist/index.d.cts +113 -11
  482. package/dist/index.d.ts +113 -11
  483. package/dist/index.js +187 -12
  484. package/dist/index.js.map +1 -1
  485. package/dist/network/index.cjs +4896 -0
  486. package/dist/network/index.cjs.map +1 -0
  487. package/dist/network/index.d.cts +98 -0
  488. package/dist/network/index.d.ts +98 -0
  489. package/dist/network/index.js +493 -0
  490. package/dist/network/index.js.map +1 -0
  491. package/dist/systems/index.cjs +3958 -1762
  492. package/dist/systems/index.cjs.map +1 -1
  493. package/dist/systems/index.d.cts +4 -2
  494. package/dist/systems/index.d.ts +4 -2
  495. package/dist/systems/index.js +8 -4
  496. package/dist/types.d.cts +3 -1
  497. package/dist/types.d.ts +3 -1
  498. package/dist/webgpu/index.d.ts +113 -0
  499. package/dist/webgpu/index.js +302 -0
  500. package/dist/webgpu/index.js.map +1 -0
  501. package/dist/worldSnapshotUtils.d.cts +3 -1
  502. package/dist/worldSnapshotUtils.d.ts +3 -1
  503. package/dist/worldSnapshotUtils.js +3 -2
  504. package/package.json +19 -3
  505. package/dist/chunk-BUEKOSR5.js.map +0 -1
  506. package/dist/chunk-DF5SSRN6.js.map +0 -1
  507. package/dist/chunk-OWQSESTO.js.map +0 -1
  508. package/dist/chunk-OY7ZODZP.js.map +0 -1
  509. package/dist/chunk-RXBLOO5B.js.map +0 -1
  510. package/dist/chunk-WJD2VKEH.js +0 -315
  511. package/dist/chunk-WJD2VKEH.js.map +0 -1
@@ -1,6 +1,274 @@
1
1
  # VR
2
2
 
3
- ::: warning Coming Soon
4
- VR (immersive virtual reality) project support is planned for a future release. Documentation will be published when the feature is available.
3
+ A **VR** project creates fully immersive virtual reality experiences that run on WebXR-compatible headsets. Users enter an immersive session where they can look around, move through the scene, grab objects, and interact with 3D content using tracked hands or controllers.
4
+
5
+ Use this for games, training simulations, virtual showrooms, social spaces, architectural walkthroughs, and any experience that places the user inside a virtual world.
6
+
7
+ ## What's different in this project type
8
+
9
+ When you create a VR project, the editor provides:
10
+
11
+ 1. **XR Rig entity** - the player's movable origin that contains the camera. The rig handles locomotion (teleport or smooth movement), tracking origin (floor vs. eye-level), and comfort settings.
12
+ 2. **XR Interactor entities** - configured hand/controller representation with pointer rays for grabbing and pointing at objects.
13
+ 3. **Teleport-first locomotion** - the default is teleport with snap turning, the most comfort-safe movement style recommended by all platform guidelines.
14
+ 4. **Immersive preview** - the preview button launches a WebXR session on a connected headset or simulator.
15
+
16
+ ## Supported platforms
17
+
18
+ - **Meta Quest** (Quest 2, 3, Pro) - hands and controllers, full feature set
19
+ - **Pico** - hands and controllers
20
+ - **Android XR** - hands-first interaction
21
+ - **Apple Vision Pro** - gaze + pinch only (no controllers), `immersive-vr` mode only (no passthrough on web)
22
+ - **Desktop VR** (SteamVR, Windows Mixed Reality) - controller-based
23
+
24
+ ## Workflow
25
+
26
+ 1. **Set up the XR Rig** - configure locomotion mode, tracking origin, and comfort settings in the inspector.
27
+ 2. **Add scene content** - models, lights, interactable objects. Everything is authored at its world position.
28
+ 3. **Mark grabbable objects** - add an **XR Interactable** component to objects users should be able to pick up, and optionally a **Physics** component for throwing.
29
+ 4. **Define teleport areas** - add **VR Teleport Area** components to surfaces where users can teleport (if using teleport locomotion).
30
+ 5. **Customize hands/controllers** - configure the **XR Interactor** to show hands, controllers, or both, with preset visual styles.
31
+ 6. **Wire up interactions** - use `Behaviour` scripts with XR hooks (`onGrab`, `onRelease`, `onSelectStart`, etc.).
32
+ 7. **Preview** - enter the immersive session on your headset to test interactions and comfort.
33
+
34
+ ## Core Components
35
+
36
+ ### XR Rig
37
+
38
+ The rig is the player's movable origin. Key settings:
39
+
40
+ - **Tracking Origin**:
41
+ - `floor` - Y=0 is the user's real floor (for standing experiences)
42
+ - `eye` - Y=0 is where the headset started (for seated/cockpit experiences)
43
+ - **Locomotion**:
44
+ - `teleport` (default) - point and teleport, most comfort-safe
45
+ - `smooth` - continuous movement with thumbstick
46
+ - `none` - no movement (for fixed-position experiences)
47
+ - **Snap Turn** - rotate in fixed steps instead of continuously (reduces nausea)
48
+ - **Teleport Arc Colors** - visual feedback for valid vs. invalid destinations
49
+
50
+ ::: tip Getting tracking origin right
51
+ The classic "I spawned inside/under the geometry" bug comes from mismatched tracking origin. If your scene is authored with content sitting on Y=0 and you use `eye` origin, the user's eyes will be at ground level. Use `floor` for standing experiences where content sits on the ground.
52
+ :::
53
+
54
+ ### XR Interactor
55
+
56
+ Controls what users see as their hands and how they interact:
57
+
58
+ - **Interactor Type**: `hands`, `controllers`, `both` (default - shows whatever the device reports), or `none`
59
+ - **Hand Preset**: visual style for tracked hands
60
+ - `default` - realistic skin tone
61
+ - `ghost` - translucent
62
+ - `neon` - glowing edges
63
+ - `skeleton` - bone structure
64
+ - `custom` - use your own shader
65
+ - **Ray Visibility**:
66
+ - `interacting` (default) - shows only when pointing at something actionable
67
+ - `always` - always visible
68
+ - `never` - hidden
69
+ - **Ray Color/Thickness** - customize the pointer beam
70
+
71
+ ### XR Interactable
72
+
73
+ Makes objects respond to hands and pointers:
74
+
75
+ - **Grabbable** - can be picked up
76
+ - **Pointable** - responds to pointer selection without grabbing
77
+ - **Reach**:
78
+ - `physical` - hand must touch it
79
+ - `distance` - grab along the ray from across the room
80
+ - `both` (default) - accepts either
81
+ - **At Distance**:
82
+ - `snap` - brings object to hand (Half-Life: Alyx style)
83
+ - `remote` - manipulate where it stands
84
+ - **Gesture**: `pinch` (trigger/finger), `full` (grip squeeze), or `any`
85
+ - **Hands**:
86
+ - `single` - one hand only
87
+ - `handOff` (default) - pass between hands
88
+ - `two` - both hands hold it simultaneously (for aiming, resizing)
89
+ - **Apply Velocity** - thrown objects inherit hand motion (for physics-enabled objects)
90
+ - **Attach Points** - authored hand-holds (position, rotation, hand/role restrictions)
91
+ - **Hover Behavior** - visual feedback when ray lands on object (`color`, `scale`, `both`, or `none`)
92
+
93
+ ### VR Teleport Area
94
+
95
+ Marks surfaces as valid teleport destinations. Teleport is an **allow-list** - only entities with this component can be teleported onto.
96
+
97
+ - **Shape**: `plane` (rectangular) or `circle`
98
+ - **Width/Depth** - physical size in metres
99
+ - **Enabled** - toggle without removing the component
100
+
101
+ ## Grabbing and Throwing
102
+
103
+ To make an object **throwable**:
104
+ 1. Add **XR Interactable** component
105
+ 2. Add **Physics** component with **Dynamic** rigidbody type
106
+ 3. Ensure **Apply Velocity** is enabled (it's on by default)
107
+
108
+ The engine automatically:
109
+ - Disables physics while held
110
+ - Tracks hand motion
111
+ - Applies release velocity from the peak of recent hand movement
112
+ - Makes throws feel natural and match the gesture
113
+
114
+ ```ts
115
+ import { Behaviour, type XrInputState } from "@relu-interactives/spatial-ecs";
116
+
117
+ export default class Basketball extends Behaviour {
118
+ onGrab(input: XrInputState) {
119
+ console.log("picked up by", input.handedness);
120
+ }
121
+
122
+ onRelease(input: XrInputState) {
123
+ // Velocity already applied - react here
124
+ console.log("thrown!");
125
+ }
126
+ }
127
+ ```
128
+
129
+ ## Two-Hand Interactions
130
+
131
+ Objects can be held with both hands for:
132
+
133
+ - **Aiming** (like a rifle) - primary hand anchors, secondary hand steers
134
+ - **Resizing** - move hands apart/together to scale uniformly
135
+ - **Hand-off** - pass between hands
136
+
137
+ **Attach points** define where hands should grip:
138
+ - Set **role** to `primary` (anchoring hand) or `secondary` (steering hand)
139
+ - Restrict to `left`, `right`, or `any` hand
140
+ - The nearest eligible point wins when a hand grabs
141
+
142
+ For a two-handed rifle:
143
+ - **Hands**: `two`
144
+ - **Second Hand**: `Aims the object`
145
+ - Two attach points: one `primary` at trigger grip, one `secondary` at foregrip
146
+
147
+ ## Locomotion
148
+
149
+ ### Teleport (Default)
150
+
151
+ - Point at a surface with **VR Teleport Area** component
152
+ - Arc shows valid (green) or invalid (red) landing
153
+ - Release to teleport
154
+ - Only commits if you aimed first (letting go of a grabbed object won't teleport you)
155
+ - Grabbing an object or pointing at a grabbable object suppresses teleport on that hand
156
+
157
+ ### Smooth
158
+
159
+ - Continuous thumbstick movement
160
+ - Higher nausea risk - use teleport as the default and smooth as an option
161
+ - Speed configurable on XR Rig
162
+
163
+ ### None
164
+
165
+ - No movement system (for fixed cockpit, turret, or observation experiences)
166
+
167
+ ## Apple Vision Pro Considerations
168
+
169
+ Vision Pro uses **gaze + pinch** interaction with specific limitations:
170
+
171
+ - **No controllers** - only hand tracking via pinch gestures
172
+ - **Gaze-driven aiming** - look at an object, then pinch to select
173
+ - **No hover before pinch** - the input source is created when pinch starts, so pointer rays appear *during* pinch, not while looking
174
+ - **No grip/squeeze** - set interactable **Gesture** to `Pinch` or `Any`, never `Full grip`
175
+ - **VR only** - Safari on visionOS does not support `immersive-ar` (no web passthrough)
176
+ - **Hand tracking requires permission** - on visionOS 2+, but asks the user separately
177
+
178
+ ::: tip Vision Pro fallback
179
+ VR projects automatically fall back to `immersive-vr` mode on Vision Pro. Mixed-reality projects offer "View in your room" via AR Quick Look (a `.usdz` export placed natively) as an alternative.
5
180
  :::
6
181
 
182
+ ## Mixed Reality Support
183
+
184
+ Add passthrough, depth occlusion, and real-world physics by enabling **Mixed Reality** settings on the XR Rig:
185
+
186
+ - **Passthrough** - show the real room (Quest and Android XR only; switches session to `immersive-ar`)
187
+ - **Depth Occlusion** - real objects hide virtual ones
188
+ - **Environment Physics** - make the real room solid (`planes`, `mesh`, or `auto`)
189
+ - **Environment Debug** - visualize detected geometry on-device
190
+ - **Hit Test** - allow scripts to raycast against the real room
191
+ - **Anchors** - pin content to real-world features
192
+
193
+ ::: warning Room scan required
194
+ Plane and mesh detection replay a scan captured earlier through the headset's room setup. If the user hasn't scanned their room, detected surfaces will be empty. On Quest: *Settings > Guardian > Mixed Reality > Space Setup*.
195
+ :::
196
+
197
+ See [Mixed Reality](../../mixed-reality.md) for full details.
198
+
199
+ ## Scripting VR Interactions
200
+
201
+ Use `Behaviour` hooks to react to XR events:
202
+
203
+ ### Session Lifecycle
204
+
205
+ ```ts
206
+ import { Behaviour, type XrCapabilities } from "@relu-interactives/spatial-ecs";
207
+
208
+ export default class SessionManager extends Behaviour {
209
+ onXRSessionStart(capabilities: XrCapabilities) {
210
+ // Check what was actually granted
211
+ if (capabilities.handTracking) { /* … */ }
212
+ }
213
+
214
+ onXRSessionEnd() { /* … */ }
215
+ }
216
+ ```
217
+
218
+ ### Interaction Hooks
219
+
220
+ | Hook | When it fires |
221
+ |------|---------------|
222
+ | `onSelectStart(input)` | Trigger pressed / finger pinched |
223
+ | `onSelectEnd(input)` | Released |
224
+ | `onGrab(input)` | This entity was picked up |
225
+ | `onRelease(input)` | This entity was let go |
226
+ | `onSecondaryGrab()` | Second hand grabbed (two-hand mode) |
227
+ | `onSecondaryRelease()` | Second hand released |
228
+ | `onHandPoseStart(event)` | A configured hand pose began |
229
+ | `onHandPoseEnd(event)` | That pose ended |
230
+
231
+ `input` is an `XrInputState` containing: `handedness`, `kind`, `rayOrigin`, `rayDirection`, `gripPosition`, `gripQuaternion`, `select`, `squeeze`, `axes`, `buttons`, and `joints` (for tracked hands).
232
+
233
+ See [VR, Grabbing and Hand Poses](../../vr-and-hand-poses.md) for comprehensive interaction patterns.
234
+
235
+ ## Tips
236
+
237
+ ### Comfort and Safety
238
+
239
+ - **Start with teleport locomotion** - it's the most comfortable for the widest audience
240
+ - **Enable snap turn** - rotating in fixed steps greatly reduces nausea
241
+ - **Use `floor` tracking origin** for standing experiences where content sits on the ground
242
+ - **Test on actual hardware** - comfort and presence cannot be validated in desktop preview
243
+ - **Respect the guardian boundary** - users define their safe space, don't fight it
244
+
245
+ ### Performance
246
+
247
+ - VR must maintain **72fps minimum** (90fps or 120fps on newer headsets) or users will feel sick
248
+ - **Reduce draw calls** - combine meshes where possible, use instancing for repeated objects
249
+ - **Bake lighting** when you can - real-time shadows are expensive
250
+ - **Test on Quest** if targeting mobile VR - it's the most constrained platform
251
+ - **Profile early** - don't wait until polish phase to check frame rate
252
+
253
+ ### Interaction Design
254
+
255
+ - **Show hover feedback** - users need to know what they're pointing at before they grab
256
+ - **Make important objects grabbable from both physical and distance reach** - seated and standing users have different comfort zones
257
+ - **Avoid forcing physical reach for small objects** - distance grab makes fine pickups accessible
258
+ - **Use attach points for tools and weapons** - hands should land in the right place
259
+ - **Teleport is an allow-list** - deliberately mark where users can stand, don't make every surface walkable
260
+
261
+ ### Cross-Platform
262
+
263
+ - **Set XR Interactor to `both`** - Quest users may switch from controllers to hands mid-session, Android XR leads with hands
264
+ - **Support pinch gesture** - required for Vision Pro, optional elsewhere
265
+ - **Test gaze + pinch** - Vision Pro interaction feels different from controller pointing
266
+ - **Provide controller and hand alternatives** - not everyone has hand tracking enabled
267
+
268
+ ## Related
269
+
270
+ - [VR, Grabbing and Hand Poses](../../vr-and-hand-poses.md) - comprehensive interaction patterns and scripting examples
271
+ - [Mixed Reality](../../mixed-reality.md) - passthrough, environment physics, depth occlusion
272
+ - [Spatial UI](../../spatial-ui.md) - in-world panels, buttons, and controls for VR menus
273
+ - [Custom Behaviours](../../authoring-a-behaviour.md) - scripting interactive XR logic
274
+
@@ -25,7 +25,7 @@ Each project is a folder under your projects path.
25
25
 
26
26
  ## Create a new project
27
27
 
28
- From the dashboard, click **New project**.
28
+ From the dashboard, click on **Project type** _(see [Project types](./project-types/) for the differences)_ card to create a new project.
29
29
 
30
30
  ![New project Dialog.](/images/getting-started/projects-new-dialog.png)
31
31
 
@@ -33,9 +33,8 @@ From the dashboard, click **New project**.
33
33
  You'll be asked for:
34
34
 
35
35
  - **Project name:** used to derive the folder slug.
36
- - **Project type:** see [Project types](./project-types/) for the differences.
37
36
 
38
- Click **Create**. The editor scaffolds the project, opens it, and seeds the default scene for the chosen project type.
37
+ Click **Create & Open**. The editor scaffolds the project, opens it, and seeds the default scene for the chosen project type.
39
38
 
40
39
  ## Open an existing project
41
40
 
@@ -49,5 +48,5 @@ The dashboard lists every project found in your projects folder.
49
48
 
50
49
  ## Next
51
50
 
52
- - [Project types](./project-types/) — pick the right type for your experience.
53
- - [Understanding the editor](./editor/) — what each region of the editor window does.
51
+ - [Project types](./project-types/): pick the right type for your experience.
52
+ - [Understanding the editor](./editor/): what each region of the editor window does.
@@ -1,6 +1,6 @@
1
1
  # Keyboard Shortcuts
2
2
 
3
- The editor supports keyboard shortcuts for common actions. You can also open the shortcuts panel at any time by clicking the **keyboard icon** in the top-right corner of the navbar (next to the logo).
3
+ The editor supports keyboard shortcuts for common actions. You can also open the shortcuts panel at any time by selecting the **shortcuts option** from the avatar menu in the top-right corner of the navbar.
4
4
 
5
5
  ## Navigation
6
6
 
@@ -13,9 +13,10 @@ The editor supports keyboard shortcuts for common actions. You can also open the
13
13
 
14
14
  | Shortcut | Action |
15
15
  | --- | --- |
16
- | `W` | Switch to **Translate** gizmo |
17
- | `E` | Switch to **Scale** gizmo |
18
- | `R` | Switch to **Rotate** gizmo |
16
+ | **`q`** | All transform modes |
17
+ | **`w`** | Ground mode (_moves objects on the ground plane_). |
18
+ | **`e`** | Front mode (_moves objects on the front plane_). |
19
+ | **`r`** | Side mode (_moves objects on the side plane_). |
19
20
 
20
21
  ## Selection
21
22
 
@@ -0,0 +1,92 @@
1
+ # Multiplayer
2
+
3
+ A shared world runs in a room on a [Colyseus](https://colyseus.io) server. Turn multiplayer on in the editor's Environment panel; it adds a `server/` folder to the project and runs that server for you while you test.
4
+
5
+ ## Who moves what
6
+
7
+ Everything shared has one **owner**, the client that simulates it. The owner moves it at once and sends updates; everyone else plays them back a moment in the past, which is what makes it smooth.
8
+
9
+ - A **scene object** with a Network Identity is owned by the **host**: the first player in the room, then the longest connected. When the host leaves, the next player takes over.
10
+ - A **spawned object** is owned by whoever spawned it, and leaves with them.
11
+
12
+ ## Components
13
+
14
+ | Component | What it does |
15
+ |---|---|
16
+ | Network Identity | Marks an entity as shared. |
17
+ | Network Transform | Shares its position and rotation. `interpolationMs` trades smoothness for how current it looks. |
18
+ | Networked Props | Named values shared with everyone, such as health. Only the owner can change them. |
19
+ | Network Spawner | Gives each player a prefab of their own, placed around this entity. |
20
+
21
+ ## From a script
22
+
23
+ `this.network` is `null` in a single-player run, so a script can work both ways. A script on a shared entity should only drive it when it's the owner:
24
+
25
+ ```ts
26
+ import { Behaviour, KeyboardKeys } from "@relu-interactives/spatial-ecs";
27
+
28
+ export class Player extends Behaviour {
29
+ protected onUpdate() {
30
+ if (this.network && !this.network.isOwner) return; // someone else moves this one
31
+ if (this.world.getKey(KeyboardKeys.W)) {
32
+ this.transform.position.z -= 3 * this.deltaTime;
33
+ }
34
+ }
35
+ }
36
+ ```
37
+
38
+ Shared values, and hearing them change:
39
+
40
+ ```ts
41
+ import { Behaviour } from "@relu-interactives/spatial-ecs";
42
+
43
+ export class Health extends Behaviour {
44
+ takeHit(damage: number) {
45
+ const hp = Number(this.network?.getProp("hp") ?? 100);
46
+ this.network?.setProp("hp", hp - damage);
47
+ }
48
+
49
+ onNetworkProp(key: string, value: unknown) {
50
+ if (key === "hp") console.log("health is now", value);
51
+ }
52
+ }
53
+ ```
54
+
55
+ Messages go to everyone else in the room. Spawn something everyone sees with `spawn`:
56
+
57
+ ```ts
58
+ import { Behaviour } from "@relu-interactives/spatial-ecs";
59
+
60
+ export class Gun extends Behaviour {
61
+ protected init() {
62
+ this.network?.onMessage("shot", (payload, from) => {
63
+ console.log(from, "fired", payload);
64
+ });
65
+ }
66
+
67
+ fire() {
68
+ this.network?.send("shot", { power: 3 });
69
+ this.network?.spawn("assets/bullet.prefab", {
70
+ position: this.transform.position,
71
+ });
72
+ }
73
+
74
+ onPlayerJoin(playerId: string) {
75
+ console.log(playerId, "joined; there are", this.network?.players.length);
76
+ }
77
+ }
78
+ ```
79
+
80
+ ## Server rules
81
+
82
+ Clients can't be trusted, so anything that decides who won belongs on the server, in `server/rooms/game.ts`. Every hook is optional, and with none the room just relays:
83
+
84
+ ```ts
85
+ const game: RoomHooks = {
86
+ maxClients: 8,
87
+ // false moves the player back
88
+ onPose: (room, client, entity, next) => next.y > -50,
89
+ // false keeps a message from the other players
90
+ onMessage: (room, client, name, payload) => name !== "cheat",
91
+ };
92
+ ```
@@ -2,9 +2,10 @@
2
2
 
3
3
  The `Environment` component holds scene-wide settings:
4
4
 
5
- - **Skybox:** gradient, solid color, equirectangular image, or none.
5
+ - **Skybox:** gradient, solid color, image (flat backdrop or 360° panorama), or none.
6
6
  - **Fog:** linear, exponential, or none.
7
7
  - **Gravity:** the world gravity vector applied by the physics system (in m/s²).
8
+ - **Lighting** (optional): an HDRI environment map for image-based lighting, plus tone mapping and exposure. See [Image-based lighting and HDRI](#image-based-lighting-and-hdri).
8
9
 
9
10
  It is a **singleton** there is exactly one `Environment` entity per scene, owned by the editor.
10
11
 
@@ -12,7 +13,7 @@ It is a **singleton** there is exactly one `Environment` entity per scene, owned
12
13
 
13
14
  ## Get the component from the world
14
15
 
15
- Use `world.getEnvironmentComponent()` — a convenience method that handles the entity lookup for you:
16
+ Use `world.getEnvironmentComponent()`, a convenience method that handles the entity lookup for you:
16
17
 
17
18
  ```ts
18
19
  import { Behaviour } from "@relu-interactives/spatial-ecs";
@@ -28,7 +29,7 @@ export default class ReadEnvironment extends Behaviour {
28
29
  }
29
30
  ```
30
31
 
31
- `env.values` is the live state object. Mutating fields on it is enough — `EnvironmentSyncSystem` reads it every frame and pushes changes into the three.js scene.
32
+ `env.values` is the live state object. Mutating fields on it is enough, `EnvironmentSyncSystem` reads it every frame and pushes changes into the three.js scene.
32
33
 
33
34
  ## Change values at runtime
34
35
 
@@ -43,9 +44,13 @@ env.values.skybox.gradient.effect = "linear"; // "linear" | "radial" | "angular"
43
44
  env.values.skybox.type = "color";
44
45
  env.values.skybox.color = "#101010";
45
46
 
46
- // Or an equirectangular image:
47
+ // Or a 360° panorama that turns with the camera (.hdr, .exr, .jpg, .png):
47
48
  env.values.skybox.type = "image";
48
49
  env.values.skybox.imageUrl = "/assets/skies/studio.hdr";
50
+ env.values.skybox.imageProjection = "equirect";
51
+
52
+ // Leave imageProjection unset for a flat backdrop stretched over the screen.
53
+ // That mode only loads ordinary images (.jpg, .png, .webp), not .hdr/.exr.
49
54
 
50
55
  // Or disable it:
51
56
  env.values.skybox.type = "none";
@@ -78,6 +83,88 @@ env.values.gravity = { x: 0, y: -1.62, z: 0 };
78
83
  env.values.gravity = { x: 0, y: 0, z: 0 };
79
84
  ```
80
85
 
86
+ ## Image-based lighting and HDRI
87
+
88
+ Without an environment map, PBR materials only see your lights. Metallic surfaces reflect nothing, so a sci-fi kit or a chrome prop renders close to black. An HDRI fixes that: it lights every material from all directions and gives metals something to reflect.
89
+
90
+ Set `values.lighting` to turn it on:
91
+
92
+ ```ts
93
+ import { Behaviour } from "@relu-interactives/spatial-ecs";
94
+
95
+ export default class StudioLighting extends Behaviour {
96
+ init() {
97
+ const env = this.world.getEnvironmentComponent();
98
+ if (!env) return;
99
+
100
+ env.values.lighting = {
101
+ envMapUrl: "localasset://assets/hdri/studio_small.hdr",
102
+ envIntensity: 1, // strength of the image-based light
103
+ envRotationY: Math.PI / 2, // turn the HDRI to move the key highlight
104
+ useAsBackground: true, // also show the HDRI as the sky
105
+ backgroundBlurriness: 0.2,
106
+ backgroundIntensity: 1,
107
+ toneMapping: "aces", // "none" | "aces" | "agx" | "neutral"
108
+ exposure: 1,
109
+ };
110
+ }
111
+ }
112
+ ```
113
+
114
+ How each field behaves:
115
+
116
+ - **`envMapUrl`** picks the loader from the file extension. `.hdr` and `.exr` load as linear HDR. Any other extension loads as an sRGB image. On WebGL the system pre-filters the map with three's `PMREMGenerator` and assigns it to `scene.environment`; on WebGPU it assigns the equirect texture and the renderer pre-filters it. An empty string removes the map.
117
+ - **`envIntensity`** and **`envRotationY`** apply immediately, even while the map is still loading. You can animate them every frame without reloading anything.
118
+ - **`useAsBackground`** shows the same HDRI behind the scene and replaces the skybox while it is on. Turn it off and the skybox comes back. Use this instead of loading the same file twice as both an equirect skybox and an env map.
119
+ - **`backgroundBlurriness`** (0 to 1) softens the background, which keeps a low-resolution HDRI from looking pixelated. It only applies when `useAsBackground` is on.
120
+ - **`toneMapping`** and **`exposure`** set `renderer.toneMapping` and `renderer.toneMappingExposure`. Exposure has no visible effect while `toneMapping` is `"none"`. Use `"aces"` or `"agx"` with an HDRI: without tone mapping, bright HDR values clip to flat white.
121
+
122
+ Changing `envMapUrl` loads the new map in the background and swaps it in when ready. If you change the URL twice in a row, the last one wins even when the first finishes loading later. The system disposes the old map's GPU resources on every swap.
123
+
124
+ A quick recipe for a dark metallic model:
125
+
126
+ ```ts
127
+ import { Behaviour } from "@relu-interactives/spatial-ecs";
128
+
129
+ export default class FixDarkMetal extends Behaviour {
130
+ init() {
131
+ const env = this.world.getEnvironmentComponent();
132
+ if (!env) return;
133
+
134
+ env.values.lighting = {
135
+ ...env.values.lighting,
136
+ envMapUrl: "localasset://assets/hdri/warehouse.hdr",
137
+ envIntensity: 1.5,
138
+ toneMapping: "agx",
139
+ exposure: 1.1,
140
+ };
141
+ }
142
+ }
143
+ ```
144
+
145
+ ### When the block is absent
146
+
147
+ Scenes without `values.lighting` keep working exactly as before: the system never touches `scene.environment` or the renderer's tone mapping. Removing the block at runtime restores the values the scene and renderer had before it was applied.
148
+
149
+ ### Tone mapping and the post-processing stack
150
+
151
+ `Postprocessing.values.toneMapping` also controls tone mapping. When both are set, they combine like this:
152
+
153
+ | Environment `lighting.toneMapping` | Post `toneMapping.enabled` (and `postEnabled`) | Operator used | Exposure used |
154
+ | --- | --- | --- | --- |
155
+ | absent or `"none"` | off | none | (no effect) |
156
+ | `"aces"` / `"agx"` / `"neutral"` | off | the environment's | `lighting.exposure` |
157
+ | `"aces"` / `"agx"` / `"neutral"` | on | the environment's | post `toneMapping.exposure` |
158
+ | absent or `"none"` | on | ACES Filmic | post `toneMapping.exposure` |
159
+
160
+ In short: the environment picks the operator, the post effect overrides the exposure, and the post effect alone means ACES.
161
+
162
+ ### Mixed reality and the editor
163
+
164
+ In a passthrough session (`world.isXrPassthrough()`) the background stays hidden so the real room shows through, including an HDRI with `useAsBackground`. Image-based lighting and tone mapping still apply to your virtual objects.
165
+
166
+ The editor viewport runs the same system, so the lighting you author is the lighting you see while editing.
167
+
81
168
  ## Authorable values
82
169
 
83
170
  | Path | Type | Default | Notes |
@@ -85,6 +172,7 @@ env.values.gravity = { x: 0, y: 0, z: 0 };
85
172
  | `skybox.type` | `"gradient" \| "color" \| "image" \| "none"` | `"none"` | Active skybox mode. |
86
173
  | `skybox.color` | `string` (hex) | `"#1e1e1e"` | Used when `type` is `"color"`. |
87
174
  | `skybox.imageUrl` | `string` | `""` | Used when `type` is `"image"`. |
175
+ | `skybox.imageProjection` | `"screen" \| "equirect"` | absent (`"screen"`) | `"equirect"` wraps the image around the scene and loads `.hdr`/`.exr`. |
88
176
  | `skybox.gradient.colors` | `string[]` | `["#464766", "#657ea6", "#0f0e1a"]` | Hex color stops. |
89
177
  | `skybox.gradient.effect` | `"linear" \| "radial" \| "angular"` | `"linear"` | Gradient distribution. |
90
178
  | `fog.type` | `"linear" \| "exponential" \| "none"` | `"none"` | Fog model. |
@@ -93,6 +181,15 @@ env.values.gravity = { x: 0, y: 0, z: 0 };
93
181
  | `fog.linear.far` | `number` | `100` | Distance where fog reaches full opacity. |
94
182
  | `fog.exponential.density` | `number` | `0.002` | Higher = thicker fog. |
95
183
  | `gravity` | `{ x, y, z }` | `(0, -9.81, 0)` | World units per second squared. |
184
+ | `lighting` | object | absent | Optional. Absent leaves `scene.environment` and tone mapping untouched. |
185
+ | `lighting.envMapUrl` | `string` | `""` | Equirectangular env map. `.hdr`/`.exr` load as HDR. |
186
+ | `lighting.envIntensity` | `number` | `1` | `scene.environmentIntensity`. |
187
+ | `lighting.envRotationY` | `number` (radians) | `0` | Rotates the env map (and the background when used as one). |
188
+ | `lighting.useAsBackground` | `boolean` | `false` | Show the env map as the background, replacing the skybox. |
189
+ | `lighting.backgroundBlurriness` | `number` (0 to 1) | `0` | Background blur when `useAsBackground` is on. |
190
+ | `lighting.backgroundIntensity` | `number` | `1` | Background brightness when `useAsBackground` is on. |
191
+ | `lighting.toneMapping` | `"none" \| "aces" \| "agx" \| "neutral"` | `"none"` | Renderer tone-mapping operator. |
192
+ | `lighting.exposure` | `number` | `1` | Renderer exposure. Needs a tone-mapping operator to have an effect. |
96
193
 
97
194
  ## API reference
98
195
 
@@ -1,15 +1,15 @@
1
1
  # Scene
2
2
 
3
- Some settings live on the **scene** rather than on a single object the skybox, fog, gravity, and the post-processing stack. They are stored on a singleton entity so you can read and mutate them from any `Behaviour`.
3
+ Some settings live on the **scene** rather than on a single object: the skybox, fog, gravity, image-based lighting, and the post-processing stack. They are stored on a singleton entity so you can read and mutate them from any `Behaviour`.
4
4
 
5
5
  | Page | What it covers |
6
6
  | --- | --- |
7
- | [Environment](./environment) | Skybox (gradient / color / image), fog (linear / exponential), and physics gravity. |
7
+ | [Environment](./environment) | Skybox (gradient / color / image / 360° panorama), fog (linear / exponential), physics gravity, and HDRI lighting with tone mapping and exposure. |
8
8
  | [Postprocessing](./postprocessing) | Bloom, vignette, depth-of-field, tone mapping, and other full-screen effects. |
9
9
 
10
10
  ## Pattern
11
11
 
12
- Both components expose a convenience method on `world` — no manual entity lookup needed:
12
+ Both components expose a convenience method on `world`, no manual entity lookup needed:
13
13
 
14
14
  ```ts
15
15
  import { Behaviour } from "@relu-interactives/spatial-ecs";
@@ -28,4 +28,4 @@ export default class TweakScene extends Behaviour {
28
28
  }
29
29
  ```
30
30
 
31
- The same pattern works for `Postprocessing` via `this.world.getPostprocessingComponent()` — see each page for the full set of authorable values.
31
+ The same pattern works for `Postprocessing` via `this.world.getPostprocessingComponent()`, see each page for the full set of authorable values.