@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
@@ -0,0 +1,415 @@
1
+ # WebGPU and TSL
2
+
3
+ Since 0.6.0 a `World` can render with three's `WebGPURenderer` as well as the classic `WebGLRenderer`. With WebGPU you write materials and post effects in **TSL** (three's node-based shading language, `three/tsl`) instead of GLSL strings.
4
+
5
+ ## Choosing a renderer
6
+
7
+ | | `WebGLRenderer` (default) | `WebGPURenderer` + `webgpuBackend` |
8
+ | --- | --- | --- |
9
+ | Import | `three` | `three/webgpu` + `@relu-interactives/spatial-ecs/webgpu` |
10
+ | Custom shaders | GLSL (`ShaderMaterial`, `onBeforeCompile`) | TSL node materials |
11
+ | Post-processing | `EffectComposer` passes | `RenderPipeline` of TSL nodes |
12
+ | Browser support | every WebGL 2 browser | WebGPU where available, **WebGL 2 fallback otherwise** (automatic) |
13
+ | XR (VR / mixed reality) | ✅ | ❌ use WebGL |
14
+ | Image tracking (AR) | ✅ | ❌ use WebGL (the tracking engine owns a WebGL renderer) |
15
+
16
+ - `WebGPURenderer` falls back to WebGL 2 by itself when the browser has no WebGPU. TSL and the WebGPU backend work on both, so you do not need a second code path for older browsers. `renderer.backend.isWebGPUBackend` says which one you got.
17
+ - XR and image-tracking projects stay on `WebGLRenderer`.
18
+ - Check the renderer from a script with `this.world.getRendererKind()`, which returns `"webgl"` or `"webgpu"`. The WebGL 2 fallback still reports `"webgpu"`: it is still a `WebGPURenderer`, and TSL still works.
19
+
20
+ ```ts
21
+ import { Behaviour } from "@relu-interactives/spatial-ecs";
22
+
23
+ export default class RendererInfo extends Behaviour {
24
+ init() {
25
+ if (this.world.getRendererKind() === "webgpu") {
26
+ console.log("TSL materials and the TSL post stack are available");
27
+ } else {
28
+ console.log("WebGL: use GLSL ShaderMaterial and EffectComposer");
29
+ }
30
+ }
31
+ }
32
+ ```
33
+
34
+ ## Constructing a World on WebGPU
35
+
36
+ Pass the renderer and `webgpuBackend`, and `await renderer.init()` before the first `world.update()`. Until the renderer is initialised, `RenderSystem` skips frames and warns once instead of throwing.
37
+
38
+ ```ts
39
+ import * as THREE from "three";
40
+ import { WebGPURenderer } from "three/webgpu";
41
+ import { World } from "@relu-interactives/spatial-ecs";
42
+ import { webgpuBackend } from "@relu-interactives/spatial-ecs/webgpu";
43
+
44
+ const renderer = new WebGPURenderer({ antialias: true });
45
+ renderer.setSize(window.innerWidth, window.innerHeight);
46
+ document.body.appendChild(renderer.domElement);
47
+ await renderer.init();
48
+
49
+ const scene = new THREE.Scene();
50
+ const camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 200);
51
+
52
+ const world = new World({ scene, camera, renderer, backend: webgpuBackend });
53
+ world.setup({ systems: [] });
54
+
55
+ let last = performance.now();
56
+ renderer.setAnimationLoop((now: number) => {
57
+ world.update((now - last) / 1000);
58
+ last = now;
59
+ });
60
+ ```
61
+
62
+ `webgpuBackend` lives in its own entry point (`@relu-interactives/spatial-ecs/webgpu`) so WebGL apps never load `three/webgpu`. It is ESM only.
63
+
64
+ A `WebGPURenderer` without `webgpuBackend` still renders, but the world warns once and turns off post-processing, green-screen keying and area lights, because their WebGL versions cannot run there.
65
+
66
+ ## What changes on WebGPU
67
+
68
+ - **No GLSL.** `ShaderMaterial`, `RawShaderMaterial` and `material.onBeforeCompile` are WebGL only. `WebGPURenderer` logs that the material is not compatible and draws a blank material instead. Write a node material (`MeshStandardNodeMaterial`, `MeshBasicNodeMaterial`, ...) with TSL.
69
+ - **No `EffectComposer`.** `three/examples/jsm/postprocessing/*` passes are WebGL only. Post effects are TSL nodes in a `RenderPipeline` (see [Custom post effect](#custom-post-effect)).
70
+ - **Built-in materials still work.** `MeshStandardMaterial` and friends are converted to their node versions automatically.
71
+ - **No `renderer.capabilities`.** Ask `renderer.getMaxAnisotropy()` on WebGPU.
72
+ - **Environment maps** are prefiltered by the renderer: `EnvironmentSyncSystem` assigns the equirect texture to `scene.environment` directly instead of running the WebGL `PMREMGenerator`.
73
+ - **Video green screen** uses a TSL material with the same keying maths as the WebGL shader.
74
+
75
+ ### Post-processing effects per backend
76
+
77
+ The `Postprocessing` component is the same on both renderers. The WebGPU backend maps each effect to the closest TSL node:
78
+
79
+ | Effect | WebGL (`EffectComposer`) | WebGPU (`RenderPipeline`) |
80
+ | --- | --- | --- |
81
+ | Depth of field | `BokehPass` | `dof` (`DepthOfFieldNode`); `focusDistance` / `focalLength` in world units |
82
+ | Bloom | `UnrealBloomPass` | `bloom` (`BloomNode`), added to the image |
83
+ | Vignette | `VignetteShader` | same formula as a TSL function |
84
+ | Hue / saturation | `HueSaturationShader` | `hue()` + `saturation()` with matching curves |
85
+ | Sepia | `SepiaShader` | `sepia` |
86
+ | Film noise | `FilmPass` | `film` (`FilmNode`) |
87
+ | Dot screen | `DotScreenPass` | `dotScreen` (`DotScreenNode`) |
88
+ | SSAO | `SSAOPass` | ≈ GTAO (`ao`, `GTAONode`): `radius` → radius, `intensity` → occlusion exponent; normals come from depth |
89
+ | Chromatic aberration | `RGBShiftShader` | `rgbShift` (`RGBShiftNode`) |
90
+ | Pixelation | custom pass | TSL block sampling |
91
+ | SMAA | `SMAAPass` | `smaa` (`SMAANode`) on tone-mapped sRGB colour |
92
+ | Tone mapping | renderer + `OutputPass` | renderer + `RenderPipeline` output transform |
93
+ | Glitch | `GlitchPass` | ❌ **not available**; skipped with one warning |
94
+
95
+ On WebGPU, changing an effect's parameters updates its uniforms in place. Switching an effect on or off rebuilds the chain.
96
+
97
+ With SSAO or depth of field on, the scene pass renders without MSAA: those effects read the depth buffer, and WGSL can't size a multisampled depth texture. Turn on SMAA to smooth edges in those scenes.
98
+
99
+ ## TSL in Script Objects
100
+
101
+ A [Script Object](./authoring-a-script-object) builds its visual in code, so it is where TSL materials go. Imports come from `three/tsl` (functions such as `uniform`, `time`, `sin`) and `three/webgpu` (node material classes).
102
+
103
+ > [!IMPORTANT]
104
+ > Node materials need a `WebGPURenderer`. A `WebGLRenderer` cannot draw them. A Script Object that may run on either renderer should check `this.world.getRendererKind()` in `build()` and return a plain material on WebGL, as the first example does.
105
+
106
+ TSL values that change at runtime are `uniform(...)` nodes: write `uniform.value` in `update()` and the GPU picks it up. Do not rebuild the material per frame.
107
+
108
+ ### Animated emissive pulse
109
+
110
+ ```ts
111
+ import { ScriptObject, type ColorInput, type FloatInput } from "@relu-interactives/spatial-ecs";
112
+ import * as THREE from "three";
113
+ import { MeshStandardNodeMaterial } from "three/webgpu";
114
+ import { sin, time, uniform } from "three/tsl";
115
+
116
+ export default class PulseOrb extends ScriptObject {
117
+ data = { color: "#ff6b35" as ColorInput, speed: 2 as FloatInput };
118
+
119
+ private readonly glowColor = uniform(new THREE.Color());
120
+ private readonly speed = uniform(2);
121
+ private material: THREE.Material | null = null;
122
+
123
+ build(): THREE.Object3D {
124
+ const geometry = new THREE.SphereGeometry(0.5, 48, 32);
125
+
126
+ if (this.world.getRendererKind() !== "webgpu") {
127
+ // WebGL cannot draw node materials: show a static stand-in.
128
+ this.material = new THREE.MeshStandardMaterial({
129
+ color: 0x222222,
130
+ emissive: new THREE.Color(this.data.color),
131
+ });
132
+ return new THREE.Mesh(geometry, this.material);
133
+ }
134
+
135
+ const material = new MeshStandardNodeMaterial({ color: 0x222222 });
136
+ // 0..1, once per 2π / speed seconds.
137
+ const pulse = sin(time.mul(this.speed)).mul(0.5).add(0.5);
138
+ material.emissiveNode = this.glowColor.rgb.mul(pulse);
139
+ this.material = material;
140
+ this.update();
141
+ return new THREE.Mesh(geometry, material);
142
+ }
143
+
144
+ update(): void {
145
+ // Uniform writes are cheap: no shader rebuild.
146
+ this.glowColor.value.set(this.data.color);
147
+ this.speed.value = this.data.speed;
148
+ }
149
+
150
+ dispose(): void {
151
+ this.material?.dispose();
152
+ }
153
+ }
154
+ ```
155
+
156
+ ### Vertex displacement with `positionLocal` and `time`
157
+
158
+ `material.positionNode` replaces the vertex position. Offsetting along `normalLocal` keeps the wave on the surface.
159
+
160
+ ```ts
161
+ import { ScriptObject, type FloatInput } from "@relu-interactives/spatial-ecs";
162
+ import * as THREE from "three";
163
+ import { MeshStandardNodeMaterial } from "three/webgpu";
164
+ import { normalLocal, positionLocal, sin, time, uniform } from "three/tsl";
165
+
166
+ export default class WobbleBlob extends ScriptObject {
167
+ data = { amplitude: 0.08 as FloatInput, frequency: 6 as FloatInput };
168
+
169
+ private readonly amplitude = uniform(0.08);
170
+ private readonly frequency = uniform(6);
171
+ private material: MeshStandardNodeMaterial | null = null;
172
+
173
+ build(): THREE.Object3D {
174
+ const material = new MeshStandardNodeMaterial({ color: 0x66ccff, roughness: 0.35 });
175
+ const wave = sin(positionLocal.y.mul(this.frequency).add(time.mul(3)));
176
+ material.positionNode = positionLocal.add(normalLocal.mul(wave.mul(this.amplitude)));
177
+ this.material = material;
178
+ this.update();
179
+ return new THREE.Mesh(new THREE.IcosahedronGeometry(0.5, 32), material);
180
+ }
181
+
182
+ update(): void {
183
+ this.amplitude.value = this.data.amplitude;
184
+ this.frequency.value = this.data.frequency;
185
+ }
186
+
187
+ dispose(): void {
188
+ this.material?.dispose();
189
+ }
190
+ }
191
+ ```
192
+
193
+ ### Fresnel rim light
194
+
195
+ Brightens the silhouette where the surface turns away from the camera.
196
+
197
+ ```ts
198
+ import { ScriptObject, type ColorInput } from "@relu-interactives/spatial-ecs";
199
+ import * as THREE from "three";
200
+ import { MeshStandardNodeMaterial } from "three/webgpu";
201
+ import {
202
+ cameraPosition,
203
+ dot,
204
+ normalWorld,
205
+ oneMinus,
206
+ positionWorld,
207
+ pow,
208
+ saturate,
209
+ uniform,
210
+ } from "three/tsl";
211
+
212
+ export default class RimShell extends ScriptObject {
213
+ data = { rimColor: "#7fd8ff" as ColorInput };
214
+
215
+ private readonly rimColor = uniform(new THREE.Color());
216
+ private material: MeshStandardNodeMaterial | null = null;
217
+
218
+ build(): THREE.Object3D {
219
+ const material = new MeshStandardNodeMaterial({ color: 0x101820, metalness: 0.2 });
220
+ const viewDirection = cameraPosition.sub(positionWorld).normalize();
221
+ const facing = saturate(dot(normalWorld, viewDirection));
222
+ const rim = pow(oneMinus(facing), 3);
223
+ material.emissiveNode = this.rimColor.rgb.mul(rim);
224
+ this.material = material;
225
+ this.update();
226
+ return new THREE.Mesh(new THREE.TorusKnotGeometry(0.35, 0.12, 160, 24), material);
227
+ }
228
+
229
+ update(): void {
230
+ this.rimColor.value.set(this.data.rimColor);
231
+ }
232
+
233
+ dispose(): void {
234
+ this.material?.dispose();
235
+ }
236
+ }
237
+ ```
238
+
239
+ ### Dissolve with noise
240
+
241
+ `Discard()` throws away fragments below the threshold; a thin band just above it glows.
242
+
243
+ ```ts
244
+ import { ScriptObject, type ColorInput, type FloatInput } from "@relu-interactives/spatial-ecs";
245
+ import * as THREE from "three";
246
+ import { MeshStandardNodeMaterial } from "three/webgpu";
247
+ import {
248
+ Discard,
249
+ Fn,
250
+ If,
251
+ mx_noise_float,
252
+ oneMinus,
253
+ positionLocal,
254
+ smoothstep,
255
+ uniform,
256
+ } from "three/tsl";
257
+
258
+ export default class DissolveCube extends ScriptObject {
259
+ data = {
260
+ baseColor: "#8899aa" as ColorInput,
261
+ edgeColor: "#ffb347" as ColorInput,
262
+ speed: 0.25 as FloatInput,
263
+ };
264
+
265
+ private readonly threshold = uniform(0);
266
+ private readonly baseColor = uniform(new THREE.Color());
267
+ private readonly edgeColor = uniform(new THREE.Color());
268
+ private material: MeshStandardNodeMaterial | null = null;
269
+ private elapsed = 0;
270
+
271
+ build(): THREE.Object3D {
272
+ const material = new MeshStandardNodeMaterial();
273
+ // mx_noise_float returns roughly -1..1; remap to 0..1.
274
+ const noise = mx_noise_float(positionLocal.mul(4)).mul(0.5).add(0.5);
275
+
276
+ material.colorNode = Fn(() => {
277
+ If(noise.lessThan(this.threshold), () => {
278
+ Discard();
279
+ });
280
+ return this.baseColor.rgb;
281
+ })();
282
+ const band = oneMinus(smoothstep(this.threshold, this.threshold.add(0.06), noise));
283
+ material.emissiveNode = this.edgeColor.rgb.mul(band.mul(4));
284
+
285
+ this.material = material;
286
+ this.update(0);
287
+ return new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), material);
288
+ }
289
+
290
+ update(deltaTime: number): void {
291
+ // Sweep the threshold 0 → 1 and start over.
292
+ this.elapsed = (this.elapsed + deltaTime * this.data.speed) % 1;
293
+ this.threshold.value = this.elapsed;
294
+ this.baseColor.value.set(this.data.baseColor);
295
+ this.edgeColor.value.set(this.data.edgeColor);
296
+ }
297
+
298
+ dispose(): void {
299
+ this.material?.dispose();
300
+ }
301
+ }
302
+ ```
303
+
304
+ ### Scrolling UVs
305
+
306
+ Offset the UV by `time` to scroll a texture. The texture needs `RepeatWrapping` so it tiles.
307
+
308
+ ```ts
309
+ import { ScriptObject, type FloatInput } from "@relu-interactives/spatial-ecs";
310
+ import * as THREE from "three";
311
+ import { MeshBasicNodeMaterial } from "three/webgpu";
312
+ import { texture, time, uniform, uv, vec2 } from "three/tsl";
313
+
314
+ export default class ScrollingStripes extends ScriptObject {
315
+ data = { speed: 0.2 as FloatInput };
316
+
317
+ private readonly speed = uniform(0.2);
318
+ private map: THREE.DataTexture | null = null;
319
+ private material: MeshBasicNodeMaterial | null = null;
320
+
321
+ build(): THREE.Object3D {
322
+ // 2×1 stripe texture made in code; any loaded texture works the same way.
323
+ const pixels = new Uint8Array([255, 107, 53, 255, 20, 20, 30, 255]);
324
+ const map = new THREE.DataTexture(pixels, 2, 1);
325
+ map.wrapS = THREE.RepeatWrapping;
326
+ map.wrapT = THREE.RepeatWrapping;
327
+ map.colorSpace = THREE.SRGBColorSpace;
328
+ map.needsUpdate = true;
329
+
330
+ const material = new MeshBasicNodeMaterial();
331
+ const offset = vec2(time.mul(this.speed), 0);
332
+ material.colorNode = texture(map, uv().mul(4).add(offset));
333
+
334
+ this.map = map;
335
+ this.material = material;
336
+ this.update();
337
+ return new THREE.Mesh(new THREE.PlaneGeometry(2, 1), material);
338
+ }
339
+
340
+ update(): void {
341
+ this.speed.value = this.data.speed;
342
+ }
343
+
344
+ dispose(): void {
345
+ this.material?.dispose();
346
+ this.map?.dispose();
347
+ }
348
+ }
349
+ ```
350
+
351
+ ## Custom post effect
352
+
353
+ To run your own post chain, build a `RenderPipeline` and hand it to `RenderSystem` through `scene.userData`, the same slot `PostprocessingSyncSystem` uses:
354
+
355
+ - `scene.userData.ecsPostprocessingComposer`: any object with `render()` (a `RenderPipeline` qualifies; `setSize()` and `setPixelRatio()` are called only if present).
356
+ - `scene.userData.ecsPostprocessingComposerActive`: `true` while it should render.
357
+
358
+ Set both **every frame**. Scripts run before `RenderSystem`, and `PostprocessingSyncSystem` rewrites both fields whenever the scene's `Postprocessing` component changes.
359
+
360
+ ```ts
361
+ import { Behaviour, type FloatInput } from "@relu-interactives/spatial-ecs";
362
+ import { RenderPipeline, type WebGPURenderer } from "three/webgpu";
363
+ import { float, mix, pass, screenSize, screenUV, sin, uniform, vec4 } from "three/tsl";
364
+
365
+ export default class ScanlinePost extends Behaviour {
366
+ data = { strength: 0.3 as FloatInput };
367
+
368
+ private pipeline: RenderPipeline | null = null;
369
+ private readonly strength = uniform(0.3);
370
+
371
+ init() {
372
+ // RenderPipeline needs a WebGPURenderer. On WebGL use EffectComposer instead.
373
+ if (this.world.getRendererKind() !== "webgpu") return;
374
+
375
+ const renderer = this.world.getRenderer() as WebGPURenderer;
376
+ const scenePass = pass(this.world.getScene(), this.world.getCamera());
377
+ const color = scenePass.getTextureNode("output");
378
+
379
+ // One dark line every two device pixels.
380
+ const lines = sin(screenUV.y.mul(screenSize.y).mul(Math.PI)).mul(0.5).add(0.5);
381
+ const shaded = color.rgb.mul(mix(float(1), lines, this.strength));
382
+
383
+ // The pipeline applies tone mapping and the output colour space itself.
384
+ this.pipeline = new RenderPipeline(renderer, vec4(shaded, color.a));
385
+ }
386
+
387
+ onUpdate() {
388
+ if (!this.pipeline) return;
389
+ this.strength.value = this.data.strength;
390
+
391
+ const userData = this.world.getScene().userData;
392
+ userData.ecsPostprocessingComposer = this.pipeline;
393
+ userData.ecsPostprocessingComposerActive = true;
394
+ }
395
+
396
+ dispose() {
397
+ if (!this.pipeline) return;
398
+ const userData = this.world.getScene().userData;
399
+ if (userData.ecsPostprocessingComposer === this.pipeline) {
400
+ delete userData.ecsPostprocessingComposer;
401
+ userData.ecsPostprocessingComposerActive = false;
402
+ }
403
+ this.pipeline.dispose();
404
+ this.pipeline = null;
405
+ }
406
+ }
407
+ ```
408
+
409
+ A custom pipeline replaces the scene's `Postprocessing` effects while it is installed. To combine them, chain the built-in effect nodes yourself (`three/examples/jsm/tsl/display/*`).
410
+
411
+ ## See also
412
+
413
+ - [Postprocessing](./scene/postprocessing): the component and its per-backend support
414
+ - [Script Objects](./authoring-a-script-object)
415
+ - [`RenderSystem`](./systems/render-system) and [`PostprocessingSyncSystem`](./systems/postprocessing-sync-system)
@@ -86,7 +86,9 @@ export default class Spinner extends Behaviour {
86
86
  | --- | --- |
87
87
  | `getScene()` | The live `THREE.Scene`. |
88
88
  | `getCamera()` | The active rendering camera. |
89
- | `getRenderer()` | The `THREE.WebGLRenderer`. |
89
+ | `getRenderer()` | The renderer: a `THREE.WebGLRenderer`, or a `WebGPURenderer` from `three/webgpu` ([WebGPU and TSL](./webgpu-and-tsl)). Typed `EcsRenderer`; check `getRendererKind()` before using an API only one has (e.g. `capabilities` is WebGL only). |
90
+ | `getRendererKind()` | `"webgl"` or `"webgpu"` (also `"webgpu"` on `WebGPURenderer`'s WebGL 2 fallback). Use it to pick GLSL vs TSL. |
91
+ | `getRenderBackend()` | The `RenderBackend` in use (post-processing, green-screen video, area lights). `webglBackend` by default. |
90
92
  | `getPhysicsWorld()` | The Rapier `World` (or `null` if physics is disabled). |
91
93
 
92
94
  ### Raycasting
@@ -105,9 +107,17 @@ Both methods accept `Vec3` (`THREE.Vector3` or `{ x, y, z }`) and return `Inters
105
107
  | `getSystem(instance)` | Resolve the REGISTERED system matching the argument's class — pass a throwaway instance (`world.getSystem(new XRHitTestSystem())`), never the class itself. |
106
108
  | `hasSystem(SystemClass)` | `true` if the system is registered. |
107
109
  | `getObjectManagementSystem()` | Shorthand for the built-in `ObjectManagementSystem`. Use this to spawn or destroy entities at runtime (`requestCreate`, `createNow`, `deleteEntity`). |
108
- | `getEnvironmentComponent()` | Returns the singleton [`Environment`](./scene/environment) component, or `undefined` if not yet initialized. Mutate `values` to change skybox, fog, or gravity at runtime. |
110
+ | `getEnvironmentComponent()` | Returns the singleton [`Environment`](./scene/environment) component, or `undefined` if not yet initialized. Mutate `values` to change skybox, fog, gravity, or HDRI lighting and tone mapping at runtime. |
109
111
  | `getPostprocessingComponent()` | Returns the singleton [`Postprocessing`](./scene/postprocessing) component, or `undefined` if not yet initialized. Mutate `values` to toggle effects or adjust parameters at runtime. |
110
112
 
113
+ ### Script errors
114
+
115
+ | Method | Purpose |
116
+ | --- | --- |
117
+ | `onScriptError(listener)` | Called once per distinct Behaviour or ScriptObject error with `{ entityId, entityName, scriptUrl, className, phase, message, stack?, source }`. Returns an unsubscribe function. |
118
+ | `reportScriptError(report, error)` | Used by systems that call Behaviour hooks. Logs and emits the error the first time it occurs; returns `true` when it was new. |
119
+ | `clearScriptErrors(scriptUrl?)` | Forget reported errors (all, or one script's) so they report again, for example after a hot reload. |
120
+
111
121
  ### World lifecycle
112
122
 
113
123
  | Method | Purpose |
@@ -440,6 +450,46 @@ export default class PauseOnHit extends Behaviour {
440
450
  > stop a subset of entities (for example, freeze enemies while a menu is open)
441
451
  > use a flag in a custom script (`Behaviour`) instead and guard your `onUpdate` logic.
442
452
 
453
+ ### Catch script errors
454
+
455
+ When a script throws, the engine logs the error once with `console.error`, naming the entity, class and phase, and sets the script's `runtimeState` to `"error"`. A Behaviour that throws waits about one second before it is re-initialised, so a script that throws every frame does not rebuild itself every frame.
456
+
457
+ Subscribe with `onScriptError` to collect errors yourself, for example to show them in an in-game debug overlay:
458
+
459
+ ```ts
460
+ import { Behaviour, type ScriptErrorEvent } from "@relu-interactives/spatial-ecs";
461
+
462
+ export default class ErrorOverlay extends Behaviour {
463
+ private errors: ScriptErrorEvent[] = [];
464
+ private stop: (() => void) | null = null;
465
+
466
+ init() {
467
+ this.stop = this.world.onScriptError((event) => {
468
+ this.errors.push(event);
469
+ console.warn(
470
+ `${event.className} on "${event.entityName}" failed in ${event.phase}: ${event.message}`,
471
+ );
472
+ });
473
+ }
474
+
475
+ dispose() {
476
+ this.stop?.();
477
+ }
478
+ }
479
+ ```
480
+
481
+ `phase` tells you where the error came from:
482
+
483
+ | `phase` | Meaning |
484
+ | --- | --- |
485
+ | `"load"` | The module failed to import, or it has no export with the entry's class name. |
486
+ | `"init"` | The constructor or `init()` threw. |
487
+ | `"build"` | A ScriptObject's `build()` threw or returned something that is not a `THREE.Object3D`. |
488
+ | `"update"` | `onUpdate()` (Behaviour) or `update()` (ScriptObject) threw. |
489
+ | hook name | A Behaviour hook threw: `"onSelect"`, `"onUiPress"`, `"onGrab"`, `"onXRSessionStart"`, and so on. |
490
+
491
+ The listener receives each distinct error once. The engine treats two errors as the same when the script URL, class name, phase and message all match, so ten enemies running one broken script report a single event. `source` is `"behaviour"` or `"scriptObject"`, and `stack` carries the stack trace when the error had one.
492
+
443
493
  ## See also
444
494
 
445
495
  - [Custom Behaviours](./authoring-a-behaviour) — `init`, `onUpdate`, `dispose`, `data`, lifecycle.