@relu-interactives/spatial-ecs 0.5.3 → 0.9.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 (512) 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-CWSrsnYN.d.ts} +236 -3
  4. package/dist/{XRHandPose-CQTLGxFC.d.cts → XRHandPose-Dn2yiALk.d.cts} +236 -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-GSWC6LLD.js +241 -0
  14. package/dist/chunk-GSWC6LLD.js.map +1 -0
  15. package/dist/chunk-JEPUCLZX.js +1237 -0
  16. package/dist/chunk-JEPUCLZX.js.map +1 -0
  17. package/dist/{chunk-BUEKOSR5.js → chunk-JNYPJB55.js} +435 -14
  18. package/dist/chunk-JNYPJB55.js.map +1 -0
  19. package/dist/{chunk-RXBLOO5B.js → chunk-NXASMBDS.js} +105 -715
  20. package/dist/chunk-NXASMBDS.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-DF5SSRN6.js → chunk-VYIWOXAY.js} +2574 -3381
  24. package/dist/chunk-VYIWOXAY.js.map +1 -0
  25. package/dist/chunk-WWP46AEF.js +2878 -0
  26. package/dist/chunk-WWP46AEF.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 +334 -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/spatial-ui.md +83 -7
  461. package/dist/docs/guide/spawning/area-light.md +2 -0
  462. package/dist/docs/guide/systems/environment-sync-system.md +11 -6
  463. package/dist/docs/guide/systems/light-sync-system.md +5 -3
  464. package/dist/docs/guide/systems/postprocessing-sync-system.md +16 -6
  465. package/dist/docs/guide/systems/render-system.md +7 -6
  466. package/dist/docs/guide/systems/script-behaviour-system.md +7 -5
  467. package/dist/docs/guide/systems/script-object-system.md +3 -1
  468. package/dist/docs/guide/systems/video-system.md +1 -1
  469. package/dist/docs/guide/webgpu-and-tsl.md +415 -0
  470. package/dist/docs/guide/world-api.md +52 -2
  471. package/dist/factories/index.cjs +921 -283
  472. package/dist/factories/index.cjs.map +1 -1
  473. package/dist/factories/index.d.cts +14 -3
  474. package/dist/factories/index.d.ts +14 -3
  475. package/dist/factories/index.js +7 -4
  476. package/dist/{index-C3ik3sA1.d.ts → index-CAZHrh0q.d.cts} +28 -3
  477. package/dist/{index-Dlr-7-4m.d.cts → index-CLtSMf2M.d.ts} +28 -3
  478. package/dist/{index-D2Jt_JzH.d.ts → index-D5MmJNyj.d.ts} +161 -43
  479. package/dist/{index-DaG03vyN.d.cts → index-DiIjV2lm.d.cts} +161 -43
  480. package/dist/index.cjs +4959 -1414
  481. package/dist/index.cjs.map +1 -1
  482. package/dist/index.d.cts +113 -11
  483. package/dist/index.d.ts +113 -11
  484. package/dist/index.js +187 -12
  485. package/dist/index.js.map +1 -1
  486. package/dist/network/index.cjs +5069 -0
  487. package/dist/network/index.cjs.map +1 -0
  488. package/dist/network/index.d.cts +98 -0
  489. package/dist/network/index.d.ts +98 -0
  490. package/dist/network/index.js +493 -0
  491. package/dist/network/index.js.map +1 -0
  492. package/dist/systems/index.cjs +5319 -1957
  493. package/dist/systems/index.cjs.map +1 -1
  494. package/dist/systems/index.d.cts +4 -2
  495. package/dist/systems/index.d.ts +4 -2
  496. package/dist/systems/index.js +8 -4
  497. package/dist/types.d.cts +3 -1
  498. package/dist/types.d.ts +3 -1
  499. package/dist/webgpu/index.d.ts +113 -0
  500. package/dist/webgpu/index.js +302 -0
  501. package/dist/webgpu/index.js.map +1 -0
  502. package/dist/worldSnapshotUtils.d.cts +3 -1
  503. package/dist/worldSnapshotUtils.d.ts +3 -1
  504. package/dist/worldSnapshotUtils.js +3 -2
  505. package/package.json +19 -3
  506. package/dist/chunk-BUEKOSR5.js.map +0 -1
  507. package/dist/chunk-DF5SSRN6.js.map +0 -1
  508. package/dist/chunk-OWQSESTO.js.map +0 -1
  509. package/dist/chunk-OY7ZODZP.js.map +0 -1
  510. package/dist/chunk-RXBLOO5B.js.map +0 -1
  511. package/dist/chunk-WJD2VKEH.js +0 -315
  512. package/dist/chunk-WJD2VKEH.js.map +0 -1
@@ -11,7 +11,7 @@ It is a **singleton** there is exactly one `Postprocessing` entity per scene, ow
11
11
 
12
12
  ## Get the component from the world
13
13
 
14
- Use `world.getPostprocessingComponent()` — a convenience method that handles the entity lookup for you:
14
+ Use `world.getPostprocessingComponent()`, a convenience method that handles the entity lookup for you:
15
15
 
16
16
  ```ts
17
17
  import { Behaviour } from "@relu-interactives/spatial-ecs";
@@ -26,7 +26,7 @@ export default class ReadPostprocessing extends Behaviour {
26
26
  }
27
27
  ```
28
28
 
29
- `post.values` is the live state object — mutate fields on it directly. The `PostprocessingSyncSystem` reads it every frame and rebuilds the composer pipeline as effects are toggled.
29
+ `post.values` is the live state object, mutate fields on it directly. The `PostprocessingSyncSystem` reads it every frame and rebuilds the effect chain as effects are toggled.
30
30
 
31
31
  ## Change values at runtime
32
32
 
@@ -73,6 +73,68 @@ post.values.hueSaturation.hue = 0.05; // radians
73
73
  post.values.hueSaturation.saturation = 0.2; // 0 = unchanged
74
74
  ```
75
75
 
76
+ ### Lens and retro effects
77
+
78
+ Since 0.5.4, chromatic aberration, pixelation, SMAA and tone mapping all render. Earlier versions accepted these fields and drew nothing.
79
+
80
+ ```ts
81
+ import { Behaviour } from "@relu-interactives/spatial-ecs";
82
+
83
+ export default class RetroLook extends Behaviour {
84
+ init() {
85
+ const post = this.world.getPostprocessingComponent();
86
+ if (!post) return;
87
+
88
+ post.values.postEnabled = true;
89
+
90
+ // Red/blue fringing. The (x, y) offset sets direction and strength, in UV units.
91
+ post.values.chromAberration.enabled = true;
92
+ post.values.chromAberration.offsetX = 0.002;
93
+ post.values.chromAberration.offsetY = 0.001;
94
+
95
+ // Mosaic blocks, `granularity` CSS pixels wide.
96
+ post.values.pixelation.enabled = true;
97
+ post.values.pixelation.granularity = 4;
98
+
99
+ // Edge antialiasing for the composed image.
100
+ post.values.smaa.enabled = true;
101
+
102
+ // ACES tone mapping at this exposure.
103
+ post.values.toneMapping.enabled = true;
104
+ post.values.toneMapping.exposure = 1.2;
105
+ }
106
+ }
107
+ ```
108
+
109
+ - **Chromatic aberration** runs three's `RGBShiftShader`. The pass shifts red by the offset and blue by the opposite offset.
110
+ - **Pixelation** samples the centre of each block. It pixelates everything earlier in the chain, bloom included.
111
+ - **SMAA** runs three's `SMAAPass` right before the output pass. Turn it on when the canvas was created without `antialias`, or whenever the composer is active: render targets do not use the canvas's built-in MSAA.
112
+ - **Tone mapping** has no pass of its own. It sets the renderer's tone mapping and exposure, which the final `OutputPass` applies. When the scene's `Environment.values.lighting.toneMapping` names an operator, that operator wins and this effect only sets the exposure. With no environment operator it uses ACES Filmic. The [Environment page](./environment#tone-mapping-and-the-post-processing-stack) has the full table.
113
+
114
+ The composer applies effects in this order: scene → depth of field → bloom → vignette → hue/saturation → sepia → film noise → dot screen → SSAO → glitch → chromatic aberration → pixelation → SMAA → output (tone mapping and sRGB).
115
+
116
+ ## Support per renderer
117
+
118
+ The same component drives both renderers. On WebGL the chain is an `EffectComposer`; with `WebGPURenderer` and `webgpuBackend` it is a TSL `RenderPipeline` ([WebGPU and TSL](../webgpu-and-tsl)).
119
+
120
+ | Effect | WebGL | WebGPU |
121
+ | --- | --- | --- |
122
+ | Depth of field | ✅ `BokehPass` | ✅ `DepthOfFieldNode` (`focusDistance` / `focalLength` in world units) |
123
+ | Bloom | ✅ `UnrealBloomPass` | ✅ `BloomNode` |
124
+ | Vignette | ✅ | ✅ same formula |
125
+ | Hue / saturation | ✅ | ✅ `hue()` / `saturation()` with the same curves |
126
+ | Sepia | ✅ | ✅ |
127
+ | Film noise | ✅ `FilmPass` | ✅ `FilmNode` |
128
+ | Dot screen | ✅ `DotScreenPass` | ✅ `DotScreenNode` |
129
+ | SSAO | ✅ `SSAOPass` | ≈ GTAO (`GTAONode`); `intensity` is the occlusion exponent, normals come from depth |
130
+ | Chromatic aberration | ✅ `RGBShiftShader` | ✅ `RGBShiftNode` |
131
+ | Pixelation | ✅ | ✅ |
132
+ | SMAA | ✅ `SMAAPass` | ✅ `SMAANode` |
133
+ | Tone mapping | ✅ | ✅ |
134
+ | Glitch | ✅ `GlitchPass` | ❌ skipped, with one warning |
135
+
136
+ On WebGPU, changing a parameter (bloom strength, vignette darkness, ...) updates the running chain in place. Switching an effect on or off rebuilds it. A `WebGPURenderer` without `webgpuBackend` renders with no post-processing at all.
137
+
76
138
  ## Authorable values
77
139
 
78
140
  Top-level master toggle:
@@ -88,10 +150,10 @@ Each effect lives under its own key with `enabled` plus parameters:
88
150
  | Depth of field | `dof` | `focusDistance`, `focalLength`, `bokehScale` |
89
151
  | Bloom | `bloom` | `intensity`, `threshold`, `radius` |
90
152
  | Vignette | `vignette` | `offset`, `darkness` |
91
- | Chromatic aberration | `chromAberration` | `offsetX`, `offsetY` |
153
+ | Chromatic aberration | `chromAberration` | `offsetX`, `offsetY` (UV units) |
92
154
  | Film noise | `noise` | `opacity` |
93
- | Pixelation | `pixelation` | `granularity` |
94
- | Tone mapping | `toneMapping` | `exposure` |
155
+ | Pixelation | `pixelation` | `granularity` (CSS pixels) |
156
+ | Tone mapping | `toneMapping` | `exposure` (ACES unless the environment picks an operator) |
95
157
  | Hue / saturation | `hueSaturation` | `hue`, `saturation` |
96
158
  | Sepia | `sepia` | `intensity` |
97
159
  | SMAA | `smaa` | _(toggle only)_ |
@@ -21,8 +21,9 @@ raise its `width`/`height` fields and it re-renders crisply.
21
21
  1. Create a **UI Panel** — the backdrop. A comfortable read is 1–2 m from the
22
22
  player, centred around eye height (y ≈ 1.2–1.6).
23
23
  2. Create **Text**, **Button**, **Toggle**, **Slider** entities and parent
24
- them under the panel. Place them with local transforms, a hair in front of
25
- the backdrop (local z ≈ 0.01) so they draw over it.
24
+ them under the panel. Place them with local transforms. Children always
25
+ draw over their parent, from any angle, so local z is only for depth you
26
+ want to see.
26
27
  3. Give each interactive widget an `actionId` (empty means "use the entity's
27
28
  name").
28
29
  4. Attach **one Behaviour to the panel**. UI events fire on the widget's own
@@ -71,7 +72,9 @@ independent: each panel script hears only its own children.
71
72
  | Toggle | `UIToggleComponent` | On/off switch. Fires `onUiToggle`; `value` persists with the scene. |
72
73
  | Slider | `UISliderComponent` | Draggable value in `[min, max]`. Fires `onUiChange`. |
73
74
 
74
- Images need no widget: parent an ordinary `image` entity under the panel.
75
+ Images need no widget: parent an ordinary `image` entity under the panel. A
76
+ transparent mesh under a widget draws with it, in front of that widget and
77
+ behind the widget's own children.
75
78
 
76
79
  ### Press semantics
77
80
 
@@ -90,6 +93,65 @@ and always fires once more with the final value on release.
90
93
  panel's texture density. Lines wrap automatically to the component's `width`;
91
94
  overflow past `height` is clamped with an ellipsis.
92
95
 
96
+ ## Styling
97
+
98
+ Every widget takes a `style`, which wins over its plain colour fields. Leave it
99
+ out and the widget draws as it always has.
100
+
101
+ ```ts
102
+ import { UIPanelComponent } from "@relu-interactives/spatial-ecs/components";
103
+
104
+ const panel = new UIPanelComponent({
105
+ width: 0.9,
106
+ height: 0.6,
107
+ tokens: { plate: "#1b2432", plateDeep: "#121824" },
108
+ style: {
109
+ fill: {
110
+ kind: "linear",
111
+ angle: 160,
112
+ stops: [
113
+ { at: 0, color: "$plate" },
114
+ { at: 1, color: "$plateDeep" },
115
+ ],
116
+ },
117
+ radius: 0.036,
118
+ shadows: [{ x: 0, y: -0.02, blur: 0.06, color: "#00000099" }],
119
+ edge: { width: 0.0035, color: "#ffffff30" },
120
+ },
121
+ });
122
+ ```
123
+
124
+ | Field | What it does |
125
+ | --- | --- |
126
+ | `fill` | `solid`, `linear` (angle in degrees, reads like CSS), `radial`, or `image` (`cover`, `contain`, `fill`, with an optional `tint`) |
127
+ | `border` | Width in metres and a paint |
128
+ | `radius` | One radius, or four: top-left, top-right, bottom-right, bottom-left |
129
+ | `shadows` | Drop shadows, in metres, outside the shape only. They don't change what a pointer can hit |
130
+ | `edge` | A thin highlight along the top inner edge |
131
+ | `opacity` | 0–1. Multiplies down the widget tree, so fading a panel fades its menu, and a fade never redraws anything |
132
+ | `text` | `font`, `weight`, `tracking`, `transform`, `paint`, `maxLines`, `shadow` |
133
+
134
+ ### Tokens
135
+
136
+ `tokens` on a panel name values for every widget under it, as `$name` in any
137
+ colour or file field, the nearest panel winning. A theme therefore travels with
138
+ a prefab, and one edit restyles a whole menu, redrawing only the widgets that
139
+ use that token.
140
+
141
+ ### Fonts and images
142
+
143
+ `style.text.font` takes a font file in the project, and `fill` with
144
+ `kind: "image"` or a button's `icon` takes an image or SVG. Files load on
145
+ demand and the widget redraws when they arrive. Until then text uses a system
146
+ face.
147
+
148
+ ### Variants
149
+
150
+ - Toggle `variant`: `switch` (default), `checkbox`, `radio`.
151
+ - Slider `variant`: `slider` (default), `progress`, `ring`. The last two only
152
+ show a value. `readOnly` does the same for a plain slider, and `step` snaps
153
+ a dragged value.
154
+
93
155
  ## Follow modes
94
156
 
95
157
  - `follow: "world"` (default) — the panel stays where you put it.
@@ -148,7 +210,8 @@ export class Inspect extends Behaviour {
148
210
  }
149
211
 
150
212
  onUiHoverStart(event: UiInteractionEvent) {
151
- // The pointer moved onto the widget (also fires for mouse hover).
213
+ // A ray or the mouse moved onto the widget. Two hands on one widget count
214
+ // as one hover. Vision Pro has no hover before a pinch.
152
215
  console.log("hovering", event.targetEntityId);
153
216
  }
154
217
  }
@@ -160,6 +223,19 @@ export class Inspect extends Behaviour {
160
223
  idle menu costs nothing per frame.
161
224
  - Slider drags and toggle flips move **geometry** (the knob and fill quads),
162
225
  not pixels, so dragging never re-renders the texture.
163
- - `pixelDensity` (panel) trades texture memory for sharpness: the default
164
- 1024 px/m is crisp at arm's length; raise it only for panels the player
165
- inspects up close.
226
+ - `pixelDensity` (every widget) trades texture memory for sharpness: the
227
+ default 1024 px/m is crisp at arm's length; raise it only for widgets the
228
+ player inspects up close.
229
+
230
+ ## Draw order and blending
231
+
232
+ Widgets draw in a fixed order: within one UI tree, parents before children;
233
+ between trees, back to front by plane distance. Widgets on one plane that are
234
+ not parented to each other draw large before small, so parent them when the
235
+ order matters.
236
+
237
+ Text and controls show from the front only. A panel keeps its back.
238
+
239
+ On a WebGPU project a translucent widget over a bright background looks a
240
+ little duller than on WebGL, because WebGPU blends in linear light. Over dark
241
+ backgrounds the two match. Opaque widgets are identical on both.
@@ -27,6 +27,8 @@ export default class SpawnSoftbox extends Behaviour {
27
27
 
28
28
  Default color `#ffffff`, intensity `5`, dimensions `4 × 4`.
29
29
 
30
+ Area lights shade through lookup tables. The engine loads them the first time an area light is spawned this way (WebGL fetches them on demand; `webgpuBackend` installs them at start-up). If a script builds a `THREE.RectAreaLight` by hand instead, call `this.world.getRenderBackend().prepareAreaLights?.(this.world)` first, or the light renders black on WebGL. A `WebGPURenderer` without `webgpuBackend` cannot render area lights.
31
+
30
32
  ## Components attached
31
33
 
32
34
  `Transform`, `Object3DRef`, `Name`, `EntityType`, `ParentId`, `Selectable`, `Light`.
@@ -1,13 +1,15 @@
1
1
  # EnvironmentSyncSystem
2
2
 
3
- Applies the scene-level `Environment` component to the THREE.js scene each frame — background color, gradient textures, HDRI environment maps, and fog.
3
+ Applies the scene-level `Environment` component to the THREE.js scene: background color, gradient textures, image skyboxes, fog, and the optional `lighting` block (HDRI environment map, tone mapping, exposure).
4
4
 
5
5
  ## Overview
6
6
 
7
7
  `EnvironmentSyncSystem` runs every frame and is responsible for:
8
8
 
9
9
  - Generating canvas-based gradient textures (`linear`, `radial`, `angular`) from the color stops defined in the `Environment` component and setting them as `scene.background`.
10
- - Loading HDRI or image URLs via `THREE.TextureLoader` and assigning them as `scene.background` and/or `scene.environment`.
10
+ - Loading image skyboxes: a flat screen backdrop through `THREE.TextureLoader` by default, or a 360° panorama when `skybox.imageProjection` is `"equirect"` (`.hdr` and `.exr` supported).
11
+ - Loading `lighting.envMapUrl` (`HDRLoader` for `.hdr`, `EXRLoader` for `.exr`, `TextureLoader` otherwise), pre-filtering it with `PMREMGenerator` on WebGL (on WebGPU the equirect texture is assigned as is and `WebGPURenderer` pre-filters it) and assigning `scene.environment`, `scene.environmentIntensity` and `scene.environmentRotation`. With `lighting.useAsBackground` it also becomes `scene.background` with the authored blur, intensity and rotation.
12
+ - Setting `renderer.toneMapping` and `renderer.toneMappingExposure` from `lighting.toneMapping` / `lighting.exposure`, combined with the post-processing tone-mapping effect as described on the [Environment page](../scene/environment#tone-mapping-and-the-post-processing-stack).
11
13
  - Applying solid color backgrounds directly as `THREE.Color`.
12
14
  - Configuring `THREE.FogExp2` or `THREE.Fog` from the fog sub-state (`near`, `far`, `density`, `color`).
13
15
  - Disposing previous textures when the background changes to prevent GPU memory leaks.
@@ -20,10 +22,13 @@ Applies the scene-level `Environment` component to the THREE.js scene each frame
20
22
 
21
23
  ## Behavior notes
22
24
 
23
- - **Signature-based change detection** — the system serializes the entire Environment state into a string signature each frame. Texture regeneration and scene assignments only happen when the signature changes, so frequent re-renders don't rebuild the background every frame.
24
- - **Gradient texture** — generated on a 512×512 `<canvas>` element. In server-side or non-DOM environments a single-pixel `DataTexture` fallback is used instead.
25
- - **Fog clamping** — fog `near` and `far` values are clamped so `far > near + 0.001` and density is clamped to `≥ 0`. Invalid values are replaced with safe defaults.
26
- - **Pending image URL** — image/HDRI loads are queued via an internal pending URL field; a stale load result is discarded if the component signature changed again before the load finished.
25
+ - **Signature-based change detection**: the system keeps one signature each for the skybox, fog and lighting. A part is re-applied only when its own signature changes, so animating `lighting.envIntensity` never rebuilds the skybox texture.
26
+ - **Lighting is opt-in**: without a `lighting` block the system never writes `scene.environment` or the renderer's tone mapping. Removing the block, or disposing the system, restores the values they had before.
27
+ - **Async env maps**: a newer `envMapUrl` always wins over a load still in flight, and the previous PMREM target and source texture are disposed when the new map swaps in.
28
+ - **Passthrough**: while `world.isXrPassthrough()` is true the background stays `null` so the real room shows. Fog and image-based lighting keep applying.
29
+ - **Gradient texture**: generated on a 512×512 `<canvas>` element. In server-side or non-DOM environments a single-pixel `DataTexture` fallback is used instead.
30
+ - **Fog clamping**: fog `near` and `far` values are clamped so `far > near + 0.001` and density is clamped to `≥ 0`. Invalid values are replaced with safe defaults.
31
+ - **Pending image URL**: image/HDRI loads are queued via an internal pending URL field; a stale load result is discarded if the component signature changed again before the load finished.
27
32
 
28
33
  ## API reference
29
34
 
@@ -10,6 +10,7 @@ Applies `LightComponent` authoring values to the underlying THREE.js light objec
10
10
  - Writing `distance` and `decay` for `THREE.PointLight` and `THREE.SpotLight`.
11
11
  - Writing `angle` and `penumbra` for `THREE.SpotLight`.
12
12
  - Writing `width` and `height` for `THREE.RectAreaLight`.
13
+ - Applying the optional `values.shadow` block (`mapSize`, `bias`, `normalBias`, `radius`, `cameraSize`, `near`, `far`) to shadow-casting lights. See [Tune shadow quality](../components/light#tune-shadow-quality).
13
14
 
14
15
  ## Queried components
15
16
 
@@ -19,9 +20,10 @@ Applies `LightComponent` authoring values to the underlying THREE.js light objec
19
20
 
20
21
  ## Behavior notes
21
22
 
22
- - **Signature-based change detection** — per-entity signatures are computed from the serialized `values` object each frame. Light properties are only written when the signature changes, preventing redundant THREE.js mutations on every frame.
23
- - **Value clamping** — `intensity` is clamped to `≥ 0`. `distance` is clamped to `≥ 0`. `angle` is clamped to `[0, π/2]`. `penumbra` is clamped to `[0, 1]`. Non-finite values use safe defaults.
24
- - **Stale entity cleanup** — when an entity is destroyed the system removes its entry from the signature map to prevent unbounded memory growth.
23
+ - **Signature-based change detection**: per-entity signatures are computed from the serialized `values` object each frame. Light properties are only written when the signature changes, preventing redundant THREE.js mutations on every frame.
24
+ - **Value clamping**: `intensity` is clamped to `≥ 0`. `distance` is clamped to `≥ 0`. `angle` is clamped to `[0, π/2]`. `penumbra` is clamped to `[0, 1]`. Non-finite values use safe defaults.
25
+ - **Shadow fields**: only the fields present in `values.shadow` are written; a light without the block keeps three's defaults. Removing a field restores its default. A new `mapSize` disposes the allocated shadow map so three rebuilds it at the new size, and any camera change calls `shadow.camera.updateProjectionMatrix()`. `mapSize` is clamped to `[16, 8192]`.
26
+ - **Stale entity cleanup**: when an entity is destroyed the system removes its entry from the signature map to prevent unbounded memory growth.
25
27
 
26
28
  ## API reference
27
29
 
@@ -1,13 +1,13 @@
1
1
  # PostprocessingSyncSystem
2
2
 
3
- Builds and manages a THREE.js `EffectComposer` pipeline from the `Postprocessing` component's state, enabling full-screen visual effects in the rendered scene.
3
+ Builds and manages the post-processing chain from the `Postprocessing` component's state, enabling full-screen visual effects in the rendered scene. The chain comes from the world's render backend: an `EffectComposer` on WebGL, a TSL `RenderPipeline` with [`webgpuBackend`](../webgpu-and-tsl).
4
4
 
5
5
  ## Overview
6
6
 
7
7
  `PostprocessingSyncSystem` runs every frame and is responsible for:
8
8
 
9
- - Building an `EffectComposer` with a `RenderPass` base and adding post-process passes derived from the enabled effects in `Postprocessing`.
10
- - Rebuilding the composer pipeline when the effect configuration changes (detected by signature).
9
+ - Asking the backend (`world.getRenderBackend().createPostprocessing(...)`) for a chain built from the enabled effects in `Postprocessing`. On WebGL that is an `EffectComposer` with a `RenderPass` base and one pass per effect.
10
+ - Rebuilding the chain when the effect configuration changes (detected by signature), or updating it in place when the backend supports that (WebGPU does for parameter-only changes).
11
11
  - Handing off the composer to `RenderSystem` via `scene.userData.ecsPostprocessingComposer` so the render pass uses it instead of the default `renderer.render()`.
12
12
  - Disposing old composers and passes when the configuration changes or the component is removed.
13
13
 
@@ -19,6 +19,8 @@ Builds and manages a THREE.js `EffectComposer` pipeline from the `Postprocessing
19
19
 
20
20
  ## Supported effects
21
21
 
22
+ WebGL backend (the WebGPU mapping is on the [WebGPU and TSL page](../webgpu-and-tsl#post-processing-effects-per-backend)):
23
+
22
24
  | Effect | THREE.js pass |
23
25
  | --- | --- |
24
26
  | `bloom` | `UnrealBloomPass` |
@@ -30,12 +32,20 @@ Builds and manages a THREE.js `EffectComposer` pipeline from the `Postprocessing
30
32
  | `hueSaturation` | `ShaderPass` (HueSaturationShader) |
31
33
  | `sepia` | `ShaderPass` (SepiaShader) |
32
34
  | `vignette` | `ShaderPass` (VignetteShader) |
35
+ | `chromAberration` | `ShaderPass` (RGBShiftShader) |
36
+ | `pixelation` | Pixelation `ShaderPass` (block sampling, sized in device pixels) |
37
+ | `smaa` | `SMAAPass`, placed right before `OutputPass` |
38
+ | `toneMapping` | No pass: sets `renderer.toneMapping` / `toneMappingExposure`, which `OutputPass` applies |
39
+
40
+ Pass order: render → `dof` → `bloom` → `vignette` → `hueSaturation` → `sepia` → `noise` → `dotScreen` → `ssao` → `glitch` → `chromAberration` → `pixelation` → `smaa` → `OutputPass`.
33
41
 
34
42
  ## Behavior notes
35
43
 
36
- - **Composer handoff** — when the composer is active, `scene.userData.ecsPostprocessingComposerActive` is set to `true` and `scene.userData.ecsPostprocessingComposer` holds the composer reference. `RenderSystem` checks this flag and delegates rendering to the composer instead of calling `renderer.render()` directly.
37
- - **Signature-based rebuild** — the full effect configuration is serialized each frame. The composer is only rebuilt when the signature changes, so parameter tweaks during runtime (e.g. adjusting bloom strength from the inspector) are applied efficiently.
38
- - **Cleanup** — when the `Postprocessing` component is removed from the scene, or when the composer is rebuilt, all existing passes are disposed and the composer is torn down.
44
+ - **Composer handoff**: when the composer is active, `scene.userData.ecsPostprocessingComposerActive` is set to `true` and `scene.userData.ecsPostprocessingComposer` holds the chain (on WebGL, the `EffectComposer` itself). `RenderSystem` checks this flag and delegates rendering to the chain instead of calling `renderer.render()` directly. `scene.userData.ecsPostprocessing` holds the values it was built from.
45
+ - **Signature-based rebuild**: the full effect configuration is serialized each frame and nothing happens while it is unchanged. On a change the WebGL backend rebuilds the composer; the WebGPU backend writes new parameters into its uniforms and rebuilds only when an effect is switched on or off.
46
+ - **WebGPU without `webgpuBackend`**: the world warns once and builds no chain (tone mapping still applies through the renderer). `EffectComposer` never runs on a `WebGPURenderer`.
47
+ - **Tone mapping**: the `toneMapping` effect (with `postEnabled` on) uses ACES Filmic unless `Environment.values.lighting.toneMapping` names an operator, and its `exposure` overrides the environment's. Turning the effect off hands the renderer back to the environment's settings, or to its original values when there are none.
48
+ - **Cleanup**: when the `Postprocessing` component is removed from the scene, or when the composer is rebuilt, all existing passes are disposed and the composer is torn down.
39
49
 
40
50
  ## API reference
41
51
 
@@ -1,21 +1,22 @@
1
1
  # RenderSystem
2
2
 
3
- The final system in the update loop. Submits the frame to the WebGL renderer, delegating to an `EffectComposer` when postprocessing is active.
3
+ The final system in the update loop. Submits the frame to the renderer (`WebGLRenderer` or `WebGPURenderer`), delegating to the post-processing chain when one is active.
4
4
 
5
5
  ## Overview
6
6
 
7
7
  `RenderSystem` runs **last** in the world update loop and is responsible for:
8
8
 
9
9
  - Calling `renderer.render(scene, camera)` to produce the final frame.
10
- - Detecting whether `PostprocessingSyncSystem` has placed an active `EffectComposer` on `scene.userData.ecsPostprocessingComposer`.
11
- - When a composer is active: resizing it to the current renderer element dimensions and calling `composer.render()` instead of the default render path.
10
+ - Detecting whether `PostprocessingSyncSystem` (or a script) has placed an active chain on `scene.userData.ecsPostprocessingComposer`: an `EffectComposer` from the WebGL backend, a TSL `RenderPipeline` from [`webgpuBackend`](../webgpu-and-tsl), or any object with a `render()` method.
11
+ - When a chain is active: resizing it to the current renderer element dimensions (if it has `setSize`) and calling its `render()` instead of the default render path.
12
12
  - Invoking an optional `afterRender` callback after every frame (used by editor overlays or custom render hooks).
13
13
 
14
14
  ## Behavior notes
15
15
 
16
- - **Composer precedence** — the system checks `scene.userData.ecsPostprocessingComposerActive` each frame. If `true`, the `EffectComposer` path is used; otherwise the standard `renderer.render()` path is used. This coupling with `PostprocessingSyncSystem` means both systems must be present for postprocessing to work.
17
- - **Dynamic resize** — before calling `composer.render()`, the system reads `renderer.domElement.clientWidth/Height` (clamped to `≥ 1`) and updates the composer size to match. This ensures the effect pipeline stays correct after window resizes without an explicit resize event handler.
18
- - **Ordering** — `RenderSystem` must be registered last in `World.setup`. All scene mutations (transform sync, visibility, etc.) must have already run.
16
+ - **Composer precedence**: the system checks `scene.userData.ecsPostprocessingComposerActive` each frame. If `true`, the chain in `scene.userData.ecsPostprocessingComposer` renders the frame; otherwise the standard `renderer.render()` path is used. This coupling with `PostprocessingSyncSystem` means both systems must be present for postprocessing to work.
17
+ - **Dynamic resize**: before calling `composer.render()`, the system reads `renderer.domElement.clientWidth/Height` (clamped to `≥ 1`) and the renderer's pixel ratio. It calls `composer.setPixelRatio` / `composer.setSize` only when one of them changed or the composer was rebuilt, and only when the chain has those methods. A WebGPU `RenderPipeline` has neither: it reads the renderer's size every frame.
18
+ - **WebGPU start-up**: `WebGPURenderer.render()` throws until `await renderer.init()` has resolved. While `renderer.initialized` is `false` the system skips the frame (and `afterRender`) and warns once.
19
+ - **Ordering**: `RenderSystem` must be registered last in `World.setup`. All scene mutations (transform sync, visibility, etc.) must have already run.
19
20
 
20
21
  ## API reference
21
22
 
@@ -27,14 +27,16 @@ The system resolves the `Behaviour` constructor from the imported module using:
27
27
  2. `default` export as a fallback.
28
28
  3. A `__reluBehaviourClass` static marker check to handle cases where esbuild bundles a second copy of `@relu-interactives/spatial-ecs` into the script blob (breaking the `instanceof` identity check).
29
29
 
30
- If no valid `Behaviour` subclass is found the entry is skipped and an error is written to the console.
30
+ If no valid `Behaviour` subclass is found, the entry goes to `"error"` with the message `Failed to load script: Missing Behaviour export ...` and the error is reported with phase `"load"`.
31
31
 
32
32
  ## Behavior notes
33
33
 
34
- - **Instance keying** — each script instance is keyed by `entityId + scriptUrl + className`. A new instance is created only when any of these three values changes.
35
- - **Error isolation** — errors thrown inside `init()` or `onUpdate()` are caught per-instance and logged to the console. A failing script does not crash the frame loop or affect other scripts.
36
- - **Destroyed entity cleanup** — when an entity is removed from the world, all of its script instances are destroyed and removed from the registry on the next update.
37
- - **Editor vs preview** — Behaviours execute **only** at preview/runtime. In an editor world (`isEditorMode()`), every `ScriptComponent` entry stays in `idle` state and `init()`/`onUpdate()` never run. For visuals that must render in the editor, use [`ScriptObjectSystem`](./script-object-system) + [`ScriptObject`](../authoring-a-script-object).
34
+ - **Instance keying**: each script instance is keyed by `entityId + scriptUrl + className`. A new instance is created only when any of these three values changes.
35
+ - **Error isolation**: errors thrown inside `init()` or `onUpdate()` are caught per-instance. A failing script does not crash the frame loop or affect other scripts. The entry's `runtimeState` becomes `"error"` and `runtimeMessage` holds the message.
36
+ - **One log per distinct error**: the first occurrence of an error is logged with `console.error` (entity name and id, class, phase) and delivered to [`world.onScriptError`](../world-api#catch-script-errors) listeners. Repeats of the same error are not logged again.
37
+ - **Retry backoff**: after a load, `init()` or `onUpdate()` error the system waits `DEFAULT_SCRIPT_ERROR_RETRY_DELAY` (1 s of world time) before it re-initialises the script. Pass `{ errorRetryDelay }` as the third constructor argument to change it. Disabling and re-enabling the entry retries at once.
38
+ - **Destroyed entity cleanup**: when an entity is removed from the world, all of its script instances are destroyed and removed from the registry on the next update.
39
+ - **Editor vs preview**: Behaviours execute **only** at preview/runtime. In an editor world (`isEditorMode()`), every `ScriptComponent` entry stays in `idle` state and `init()`/`onUpdate()` never run. For visuals that must render in the editor, use [`ScriptObjectSystem`](./script-object-system) + [`ScriptObject`](../authoring-a-script-object).
38
40
 
39
41
  ## API reference
40
42
 
@@ -13,6 +13,8 @@ For each entity with an enabled `ScriptObjectComponent` that has a `scriptUrl` +
13
13
 
14
14
  `runtimeState` is written **only on transitions** (never every frame). A `build()`/`update()` error sets `runtimeState: "error"` with a sanitized message and tombstones the record so a broken script doesn't reload every frame (cleared by a script/enabled change or `invalidate*()`).
15
15
 
16
+ Each distinct error is logged once with `console.error` and delivered to [`world.onScriptError`](../world-api#catch-script-errors) listeners with `source: "scriptObject"` and phase `"load"`, `"init"`, `"build"` or `"update"`. `invalidate*()` also clears the reported-error memory for the affected scripts, so an error that survives a hot reload reports again.
17
+
16
18
  ## Keying
17
19
 
18
20
  Instances are keyed by **entity id** — a duplicated entity gets its own fresh instance, and two entities sharing one `scriptUrl` get independent instances.
@@ -48,5 +50,5 @@ world.setup({
48
50
  ## API reference
49
51
 
50
52
  - Class: [`ScriptObjectComponent`](../../api/components/classes/ScriptObjectComponent.md)
51
- - Base class: [`ScriptObject`](../../api/classes/ScriptObject.md)
53
+ - Base class: [`ScriptObject`](../../api/index/classes/ScriptObject.md)
52
54
  - Source: [`core/systems/ScriptObjectSystem.ts`](https://github.com/Relu-Interactives/relu-spatial-ecs-engine/blob/main/core/systems/ScriptObjectSystem.ts)
@@ -9,7 +9,7 @@ Reconciles `VideoComponent` state with the underlying HTML `<video>` element and
9
9
  - Driving `play()`, `pause()`, and stop (pause + seek to 0) on the HTML `<video>` element based on the intent flags set by `VideoComponent.play()`, `.pause()`, and `.stop()`.
10
10
  - Detecting when a non-looping video ends naturally and resetting the component flags.
11
11
  - Syncing `loop`, `volume`, `width`, `height`, `positional`, `refDistance`, `distanceModel`, and `rolloffFactor` to the video element and THREE.js mesh material.
12
- - Updating the green-screen chroma key shader uniforms (`backgroundColor`, `similarity`, `smoothness`, `spill`) live when they change.
12
+ - Updating the green-screen chroma key (`backgroundColor`, `similarity`, `smoothness`, `spill`) live when it changes. The keying material belongs to the world's render backend (a GLSL `ShaderMaterial` on WebGL, a TSL `MeshBasicNodeMaterial` with `webgpuBackend`), which applies the update.
13
13
 
14
14
  ## Queried components
15
15