@woosh/meep-engine 3.39.0 → 3.41.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 (561) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/core/geom/3d/quaternion/swing_twist_clamp.d.ts +24 -0
  4. package/src/core/geom/3d/quaternion/swing_twist_clamp.d.ts.map +1 -0
  5. package/src/core/geom/3d/quaternion/swing_twist_clamp.js +62 -0
  6. package/src/core/geom/3d/quaternion/swing_twist_compose.d.ts +15 -0
  7. package/src/core/geom/3d/quaternion/swing_twist_compose.d.ts.map +1 -0
  8. package/src/core/geom/3d/quaternion/swing_twist_compose.js +36 -0
  9. package/src/core/geom/3d/quaternion/swing_twist_error.d.ts +39 -0
  10. package/src/core/geom/3d/quaternion/swing_twist_error.d.ts.map +1 -0
  11. package/src/core/geom/3d/quaternion/swing_twist_error.js +85 -0
  12. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts +11 -6
  13. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts.map +1 -1
  14. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.js +27 -13
  15. package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.d.ts +25 -0
  16. package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.d.ts.map +1 -0
  17. package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.js +166 -0
  18. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts +5 -3
  19. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts.map +1 -1
  20. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.js +5 -3
  21. package/src/engine/EngineHarness.d.ts.map +1 -1
  22. package/src/engine/EngineHarness.js +17 -4
  23. package/src/engine/animation/curve/AnimationCurve.d.ts +3 -0
  24. package/src/engine/animation/curve/AnimationCurve.d.ts.map +1 -1
  25. package/src/engine/animation/curve/AnimationCurve.js +6 -1
  26. package/src/engine/asset/loaders/image/avif/threaded_image_encoder.js +1 -1
  27. package/src/engine/ecs/EntityManager.d.ts +9 -1
  28. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  29. package/src/engine/ecs/EntityManager.js +26 -27
  30. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts +20 -0
  31. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts.map +1 -1
  32. package/src/engine/ecs/gpu/GPUStateAuthority.js +21 -0
  33. package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts +13 -0
  34. package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts.map +1 -0
  35. package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.js +12 -0
  36. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts +6 -0
  37. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts.map +1 -1
  38. package/src/engine/ecs/gpu/gpu_authority_grant.js +7 -1
  39. package/src/engine/ecs/gpu/gpu_authority_held.d.ts +14 -0
  40. package/src/engine/ecs/gpu/gpu_authority_held.d.ts.map +1 -0
  41. package/src/engine/ecs/gpu/gpu_authority_held.js +23 -0
  42. package/src/engine/ecs/gpu/gpu_authority_hold.d.ts +23 -0
  43. package/src/engine/ecs/gpu/gpu_authority_hold.d.ts.map +1 -0
  44. package/src/engine/ecs/gpu/gpu_authority_hold.js +41 -0
  45. package/src/engine/ecs/gpu/gpu_authority_unhold.d.ts +14 -0
  46. package/src/engine/ecs/gpu/gpu_authority_unhold.d.ts.map +1 -0
  47. package/src/engine/ecs/gpu/gpu_authority_unhold.js +32 -0
  48. package/src/engine/ecs/ik/IKGoal.d.ts +59 -0
  49. package/src/engine/ecs/ik/IKGoal.d.ts.map +1 -0
  50. package/src/engine/ecs/ik/IKGoal.js +83 -0
  51. package/src/engine/ecs/ik/IKGoalSystem.d.ts +75 -0
  52. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -0
  53. package/src/engine/ecs/ik/IKGoalSystem.js +1456 -0
  54. package/src/engine/ecs/ik/PLAN.md +179 -0
  55. package/src/engine/ecs/speaker/VoiceSystem.d.ts +2 -2
  56. package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
  57. package/src/engine/ecs/storage/BinaryBufferSerializer.d.ts.map +1 -1
  58. package/src/engine/ecs/storage/BinaryBufferSerializer.js +4 -5
  59. package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +7 -3
  60. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  61. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +5 -2
  62. package/src/engine/ecs/system/orderSystemsByDeclaredAccess.d.ts +33 -0
  63. package/src/engine/ecs/system/orderSystemsByDeclaredAccess.d.ts.map +1 -0
  64. package/src/engine/ecs/system/orderSystemsByDeclaredAccess.js +282 -0
  65. package/src/engine/ecs/transform/T64WorldCache.js +139 -139
  66. package/src/engine/ecs/transform/t64_evaluate_local.d.ts +25 -0
  67. package/src/engine/ecs/transform/t64_evaluate_local.d.ts.map +1 -0
  68. package/src/engine/ecs/transform/t64_evaluate_local.js +35 -0
  69. package/src/engine/ecs/transform/t64_evaluate_world.d.ts +5 -3
  70. package/src/engine/ecs/transform/t64_evaluate_world.d.ts.map +1 -1
  71. package/src/engine/ecs/transform/t64_evaluate_world.js +128 -126
  72. package/src/engine/graphics/ecs/water/Water.d.ts +14 -17
  73. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  74. package/src/engine/graphics/ecs/water/Water.js +100 -110
  75. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
  76. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +36 -38
  77. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts +6 -0
  78. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts.map +1 -0
  79. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.js +10 -0
  80. package/src/engine/graphics/ecs/water/WaterWaves.d.ts +3 -3
  81. package/src/engine/graphics/ecs/water/WaterWaves.js +46 -46
  82. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.d.ts.map +1 -1
  83. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.js +8 -5
  84. package/src/engine/graphics3/AnimationGraphSystem.d.ts +2 -0
  85. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  86. package/src/engine/graphics3/AnimationGraphSystem.js +337 -329
  87. package/src/engine/graphics3/AnimationSystem.d.ts +2 -0
  88. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  89. package/src/engine/graphics3/AnimationSystem.js +360 -352
  90. package/src/engine/graphics3/WaterSystem.d.ts +21 -74
  91. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  92. package/src/engine/graphics3/WaterSystem.js +174 -367
  93. package/src/engine/physics/cloth/MEASUREMENTS.md +130 -0
  94. package/src/engine/physics/cloth/PLAN.md +16 -1
  95. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +5 -6
  96. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
  97. package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +5 -6
  98. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +4 -7
  99. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  100. package/src/engine/physics/cloth/ecs/ClothInstance.js +4 -7
  101. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +4 -3
  102. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  103. package/src/engine/physics/cloth/ecs/ClothSystem.js +4 -3
  104. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  105. package/src/engine/physics/cloth/ecs/ClothWorld.js +10 -0
  106. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +24 -24
  107. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  108. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +46 -43
  109. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +1 -1
  110. package/src/engine/physics/cloth/ecs/cloth_write_back.js +1 -1
  111. package/src/engine/physics/constraint/solve_constraints.d.ts +0 -35
  112. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  113. package/src/engine/physics/constraint/solve_constraints.js +1 -83
  114. package/src/engine/physics/ecs/ContactProbe.d.ts +73 -0
  115. package/src/engine/physics/ecs/ContactProbe.d.ts.map +1 -0
  116. package/src/engine/physics/ecs/ContactProbe.js +103 -0
  117. package/src/engine/physics/ecs/ContactProbeSystem.d.ts +44 -0
  118. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -0
  119. package/src/engine/physics/ecs/ContactProbeSystem.js +397 -0
  120. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +1 -1
  121. package/src/engine/physics/fluid/ecs/FluidComponent.js +1 -1
  122. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  123. package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.d.ts +205 -0
  124. package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.d.ts.map +1 -0
  125. package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.js +245 -0
  126. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.d.ts +21 -0
  127. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.d.ts.map +1 -0
  128. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.js +63 -0
  129. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts +33 -0
  130. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts.map +1 -0
  131. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.js +874 -0
  132. package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.d.ts +27 -0
  133. package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.d.ts.map +1 -0
  134. package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.js +77 -0
  135. package/src/engine/physics/inverse_kinematics/two_bone_path_solve.d.ts +36 -0
  136. package/src/engine/physics/inverse_kinematics/two_bone_path_solve.d.ts.map +1 -0
  137. package/src/engine/physics/inverse_kinematics/two_bone_path_solve.js +97 -0
  138. package/src/engine/physics/inverse_kinematics/two_joint_ik.d.ts +33 -11
  139. package/src/engine/physics/inverse_kinematics/two_joint_ik.d.ts.map +1 -1
  140. package/src/engine/physics/inverse_kinematics/two_joint_ik.js +158 -67
  141. package/src/format/image/avif/api/convert_to_rgba.d.ts +2 -2
  142. package/src/format/image/avif/api/convert_to_rgba.d.ts.map +1 -1
  143. package/src/format/image/avif/api/convert_to_rgba.js +10 -9
  144. package/src/format/image/avif/api/decode_avif.d.ts +2 -2
  145. package/src/format/image/avif/api/decode_avif.d.ts.map +1 -1
  146. package/src/format/image/avif/api/decode_avif.js +1 -1
  147. package/src/shade/playground/ssr_reprojection/README.md +111 -103
  148. package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.js +68 -68
  149. package/src/shade/playground/ssr_reprojection/index.html +80 -79
  150. package/src/shade/playground/ssr_reprojection/main.js +256 -247
  151. package/src/shade/playground/ssr_variance/capture.js +96 -96
  152. package/src/shade/playground/ssr_variance/reference.js +78 -78
  153. package/src/shade/playground/vsm/README.md +96 -0
  154. package/src/shade/playground/vsm/VSMDebugOverlay.d.ts +49 -0
  155. package/src/shade/playground/vsm/VSMDebugOverlay.d.ts.map +1 -0
  156. package/src/shade/playground/vsm/VSMDebugOverlay.js +351 -0
  157. package/src/shade/playground/vsm/clipmap_panel.d.ts +8 -0
  158. package/src/shade/playground/vsm/clipmap_panel.d.ts.map +1 -0
  159. package/src/shade/playground/vsm/clipmap_panel.js +138 -0
  160. package/src/shade/playground/vsm/index.html +170 -0
  161. package/src/shade/playground/vsm/main.d.ts +2 -0
  162. package/src/shade/playground/vsm/main.d.ts.map +1 -0
  163. package/src/shade/playground/vsm/main.js +389 -0
  164. package/src/shade/playground/vsm/scenes.d.ts +52 -0
  165. package/src/shade/playground/vsm/scenes.d.ts.map +1 -0
  166. package/src/shade/playground/vsm/scenes.js +320 -0
  167. package/src/shade/playground/vsm/verify_vsm.d.ts +38 -0
  168. package/src/shade/playground/vsm/verify_vsm.d.ts.map +1 -0
  169. package/src/shade/playground/vsm/verify_vsm.js +305 -0
  170. package/src/shade/playground/water_refraction/README.md +57 -9
  171. package/src/shade/playground/water_refraction/main.js +12 -3
  172. package/src/shade/playground/water_refraction/world.d.ts +1 -0
  173. package/src/shade/playground/water_refraction/world.d.ts.map +1 -1
  174. package/src/shade/playground/water_refraction/world.js +15 -5
  175. package/src/shade/renderer/Renderer.d.ts +19 -0
  176. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  177. package/src/shade/renderer/Renderer.js +72 -1
  178. package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.d.ts.map +1 -1
  179. package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.js +10 -1
  180. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +18 -4
  181. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  182. package/src/shade/renderer/animation/GPUAnimationManager.js +269 -23
  183. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +12 -4
  184. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
  185. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +12 -4
  186. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
  187. package/src/shade/renderer/animation/chunk_pose_accumulator.js +14 -1
  188. package/src/shade/renderer/animation/pose/PoseChannelIndex.d.ts +78 -0
  189. package/src/shade/renderer/animation/pose/PoseChannelIndex.d.ts.map +1 -0
  190. package/src/shade/renderer/animation/pose/PoseChannelIndex.js +274 -0
  191. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +40 -3
  192. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  193. package/src/shade/renderer/animation/pose/PosePlayback.js +77 -3
  194. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts +21 -3
  195. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
  196. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +79 -11
  197. package/src/shade/renderer/animation/shader_animation_apply.js +1 -1
  198. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts +3 -2
  199. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  200. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +187 -176
  201. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +7 -0
  202. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  203. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -0
  204. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts +3 -1
  205. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
  206. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +10 -1
  207. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.d.ts.map +1 -1
  208. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.js +28 -0
  209. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.d.ts.map +1 -1
  210. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.js +31 -1
  211. package/src/shade/renderer/geometry/MeshletGeometry.d.ts +3 -0
  212. package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
  213. package/src/shade/renderer/geometry/MeshletGeometry.js +1 -0
  214. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
  215. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +62 -4
  216. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
  217. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.js +2 -2
  218. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts +2 -2
  219. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts.map +1 -1
  220. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.js +6 -14
  221. package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.d.ts.map +1 -1
  222. package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.js +5 -1
  223. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  224. package/src/shade/renderer/medium/ParticipatingMedium.d.ts +3 -0
  225. package/src/shade/renderer/medium/ParticipatingMedium.d.ts.map +1 -1
  226. package/src/shade/renderer/medium/ParticipatingMedium.js +7 -0
  227. package/src/shade/renderer/object_property/chunk_write_object_property.d.ts +3 -1
  228. package/src/shade/renderer/object_property/chunk_write_object_property.d.ts.map +1 -1
  229. package/src/shade/renderer/object_property/chunk_write_object_property.js +5 -2
  230. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +4 -0
  231. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
  232. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +6 -1
  233. package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.d.ts.map +1 -1
  234. package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.js +5 -35
  235. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  236. package/src/shade/renderer/postprocess/ssr/SSR.d.ts +12 -4
  237. package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
  238. package/src/shade/renderer/postprocess/ssr/SSR.js +36 -8
  239. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts +3 -0
  240. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts.map +1 -0
  241. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.js +2 -0
  242. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts +8 -0
  243. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts.map +1 -0
  244. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.js +40 -0
  245. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
  246. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +150 -137
  247. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts +3 -0
  248. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts.map +1 -0
  249. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.js +44 -0
  250. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts +5 -0
  251. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts.map +1 -0
  252. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.js +35 -0
  253. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts +26 -0
  254. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts.map +1 -0
  255. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.js +42 -0
  256. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +1 -0
  257. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
  258. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +113 -105
  259. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts +2 -0
  260. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  261. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +177 -167
  262. package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.d.ts.map +1 -1
  263. package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.js +10 -0
  264. package/src/shade/renderer/rasterize/RasterizationJob.d.ts +1 -2
  265. package/src/shade/renderer/rasterize/RasterizationJob.d.ts.map +1 -1
  266. package/src/shade/renderer/rasterize/RasterizationJob.js +1 -2
  267. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +5 -6
  268. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
  269. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +5 -6
  270. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +2 -2
  271. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  272. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +1 -1
  273. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.d.ts.map +1 -1
  274. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +11 -0
  275. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts +1 -1
  276. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts.map +1 -1
  277. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.js +135 -73
  278. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts +7 -0
  279. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts.map +1 -1
  280. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js +29 -1
  281. package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.d.ts +19 -0
  282. package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.d.ts.map +1 -0
  283. package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.js +167 -0
  284. package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts +25 -0
  285. package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts.map +1 -0
  286. package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.js +124 -0
  287. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.d.ts +19 -0
  288. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.d.ts.map +1 -0
  289. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.js +48 -0
  290. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +17 -1
  291. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
  292. package/src/shade/renderer/scene/rows/GPUSceneRows.js +29 -3
  293. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.d.ts.map +1 -1
  294. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.js +4 -5
  295. package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.d.ts.map +1 -1
  296. package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.js +1 -5
  297. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts +30 -0
  298. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts.map +1 -0
  299. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.js +54 -0
  300. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
  301. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +3 -2
  302. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts +19 -0
  303. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts.map +1 -0
  304. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.js +27 -0
  305. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +1 -0
  306. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  307. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +4 -0
  308. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +54 -0
  309. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  310. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +502 -10
  311. package/src/shade/renderer/shadow/map/Shadowmap.d.ts +3 -2
  312. package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
  313. package/src/shade/renderer/shadow/map/Shadowmap.js +3 -2
  314. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts +8 -0
  315. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts.map +1 -1
  316. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.js +34 -3
  317. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts +3 -2
  318. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts.map +1 -1
  319. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js +17 -2
  320. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts.map +1 -1
  321. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js +137 -133
  322. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts +15 -0
  323. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts.map +1 -0
  324. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.js +14 -0
  325. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts +16 -0
  326. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts.map +1 -0
  327. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.js +15 -0
  328. package/src/shade/renderer/shadow/vsm/PLAN.md +440 -0
  329. package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +43 -0
  330. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +42 -0
  331. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +1 -0
  332. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.js +153 -0
  333. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +327 -0
  334. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -0
  335. package/src/shade/renderer/shadow/vsm/VSMPageManager.js +1408 -0
  336. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts +14 -0
  337. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts.map +1 -0
  338. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.js +13 -0
  339. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts +63 -0
  340. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts.map +1 -0
  341. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.js +70 -0
  342. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts +11 -0
  343. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts.map +1 -0
  344. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.js +10 -0
  345. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +54 -0
  346. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +1 -0
  347. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.js +75 -0
  348. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts +23 -0
  349. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts.map +1 -0
  350. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.js +85 -0
  351. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts +16 -0
  352. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts.map +1 -0
  353. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.js +29 -0
  354. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts +136 -25
  355. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
  356. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +282 -116
  357. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts +39 -0
  358. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts.map +1 -0
  359. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.js +289 -0
  360. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts +18 -0
  361. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts.map +1 -0
  362. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.js +65 -0
  363. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts +17 -0
  364. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts.map +1 -0
  365. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.js +75 -0
  366. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +14 -0
  367. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +1 -0
  368. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.js +45 -0
  369. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts +17 -0
  370. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts.map +1 -0
  371. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.js +100 -0
  372. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts +15 -0
  373. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts.map +1 -0
  374. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.js +47 -0
  375. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts +26 -0
  376. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts.map +1 -0
  377. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.js +156 -0
  378. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts +13 -0
  379. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts.map +1 -0
  380. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.js +65 -0
  381. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +30 -0
  382. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +1 -0
  383. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.js +184 -0
  384. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +23 -0
  385. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +1 -0
  386. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js +109 -0
  387. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts +56 -0
  388. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts.map +1 -0
  389. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js +211 -0
  390. package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts +1 -1
  391. package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts.map +1 -1
  392. package/src/shade/renderer/texture/format/decode_typed_gpu_data.js +3 -13
  393. package/src/shade/renderer/texture/format/infer_format_from_parameters.d.ts.map +1 -1
  394. package/src/shade/renderer/texture/format/infer_format_from_parameters.js +2 -3
  395. package/src/shade/renderer/texture/texture_write_to_gpu.d.ts.map +1 -1
  396. package/src/shade/renderer/texture/texture_write_to_gpu.js +16 -16
  397. package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts +4 -90
  398. package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts.map +1 -1
  399. package/src/shade/renderer/texture/virtual/VTPhysicalCache.js +6 -210
  400. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts +119 -0
  401. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts.map +1 -0
  402. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.js +245 -0
  403. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts +1 -1
  404. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts.map +1 -1
  405. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js +3 -19
  406. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts +13 -0
  407. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts.map +1 -0
  408. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.js +34 -0
  409. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +7 -2
  410. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  411. package/src/shade/renderer/water/GPUWaterRenderer.js +49 -49
  412. package/src/shade/renderer/water/chunk_water_transport.js +3 -3
  413. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +11 -25
  414. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  415. package/src/shade/renderer/water/medium/GPUWaterBodies.js +64 -116
  416. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts +1 -20
  417. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts.map +1 -1
  418. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.js +10 -42
  419. package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts +3 -0
  420. package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts.map +1 -0
  421. package/src/shade/renderer/water/medium/chunk_water_bodies.js +3 -0
  422. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +1 -5
  423. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +1 -1
  424. package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +32 -30
  425. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +4 -0
  426. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -0
  427. package/src/shade/renderer/water/medium/shader_water_meshlets.js +69 -0
  428. package/src/shade/renderer/water/optics/chunk_water_inscatter.d.ts.map +1 -1
  429. package/src/shade/renderer/water/optics/chunk_water_inscatter.js +124 -123
  430. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
  431. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +75 -74
  432. package/src/shade/renderer/water/shader_water.d.ts +1 -1
  433. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  434. package/src/shade/renderer/water/shader_water.js +490 -406
  435. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +12 -85
  436. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +1 -1
  437. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +128 -408
  438. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +6 -0
  439. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -0
  440. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +23 -0
  441. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +9 -0
  442. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +1 -0
  443. package/src/shade/renderer/water/surface/chunk_water_tessellation.js +144 -0
  444. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +3 -5
  445. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +1 -1
  446. package/src/shade/renderer/water/surface/chunk_water_wave.js +40 -48
  447. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +14 -0
  448. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -0
  449. package/src/shade/renderer/water/surface/graph_water_tessellation.js +34 -0
  450. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +4 -0
  451. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +1 -0
  452. package/src/shade/renderer/water/surface/shader_water_tiles.js +123 -0
  453. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +6 -0
  454. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +1 -0
  455. package/src/shade/renderer/water/surface/shader_water_wave_batch.js +85 -0
  456. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +6 -0
  457. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +1 -0
  458. package/src/shade/renderer/water/surface/shader_water_wave_domain.js +83 -0
  459. package/src/shade/renderer/water/water_height_texture_from_sampler.d.ts.map +1 -1
  460. package/src/shade/renderer/water/water_height_texture_from_sampler.js +4 -3
  461. package/src/engine/ecs/ik/IKConstraint.d.ts +0 -52
  462. package/src/engine/ecs/ik/IKConstraint.d.ts.map +0 -1
  463. package/src/engine/ecs/ik/IKConstraint.js +0 -95
  464. package/src/engine/ecs/ik/IKProblem.d.ts +0 -45
  465. package/src/engine/ecs/ik/IKProblem.d.ts.map +0 -1
  466. package/src/engine/ecs/ik/IKProblem.js +0 -58
  467. package/src/engine/ecs/ik/IKSolver.d.ts +0 -8
  468. package/src/engine/ecs/ik/IKSolver.d.ts.map +0 -1
  469. package/src/engine/ecs/ik/IKSolver.js +0 -9
  470. package/src/engine/ecs/ik/InverseKinematics.d.ts +0 -48
  471. package/src/engine/ecs/ik/InverseKinematics.d.ts.map +0 -1
  472. package/src/engine/ecs/ik/InverseKinematics.js +0 -119
  473. package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.d.ts +0 -19
  474. package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.d.ts.map +0 -1
  475. package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.js +0 -72
  476. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts +0 -54
  477. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +0 -1
  478. package/src/engine/ecs/ik/InverseKinematicsSystem.js +0 -212
  479. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts +0 -8
  480. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts.map +0 -1
  481. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +0 -153
  482. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts +0 -5
  483. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts.map +0 -1
  484. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +0 -120
  485. package/src/engine/ecs/ik/ik_bone_chain.d.ts +0 -64
  486. package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +0 -1
  487. package/src/engine/ecs/ik/ik_bone_chain.js +0 -142
  488. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts +0 -42
  489. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts.map +0 -1
  490. package/src/engine/ecs/ik/ik_probe_terrain_contact.js +0 -123
  491. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +0 -18
  492. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +0 -1
  493. package/src/engine/ecs/ik/ik_write_local_rotation.js +0 -32
  494. package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts +0 -2
  495. package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts.map +0 -1
  496. package/src/engine/graphics/ecs/water/WATER_SIZE.js +0 -1
  497. package/src/shade/renderer/light/GPUViewLightContext.d.ts +0 -22
  498. package/src/shade/renderer/light/GPUViewLightContext.d.ts.map +0 -1
  499. package/src/shade/renderer/light/GPUViewLightContext.js +0 -62
  500. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts +0 -14
  501. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts.map +0 -1
  502. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.js +0 -20
  503. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts +0 -27
  504. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +0 -1
  505. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +0 -147
  506. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts +0 -7
  507. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts.map +0 -1
  508. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.js +0 -10
  509. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts +0 -2
  510. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts.map +0 -1
  511. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.js +0 -1
  512. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts +0 -3
  513. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts.map +0 -1
  514. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.js +0 -8
  515. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts +0 -27
  516. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts.map +0 -1
  517. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.js +0 -102
  518. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts +0 -8
  519. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts.map +0 -1
  520. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.js +0 -34
  521. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts +0 -10
  522. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts.map +0 -1
  523. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.js +0 -64
  524. package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts +0 -11
  525. package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts.map +0 -1
  526. package/src/shade/renderer/shadow/vsm/decode_tile_address.js +0 -26
  527. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts +0 -2
  528. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts.map +0 -1
  529. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.js +0 -11
  530. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts +0 -20
  531. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts.map +0 -1
  532. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.js +0 -184
  533. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts +0 -25
  534. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts.map +0 -1
  535. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.js +0 -230
  536. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts +0 -19
  537. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts.map +0 -1
  538. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.js +0 -127
  539. package/src/shade/renderer/texture/encode/ENCODE_NOTES_2026_09_02.md +0 -462
  540. package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts +0 -23
  541. package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts.map +0 -1
  542. package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts +0 -18
  543. package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts.map +0 -1
  544. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts +0 -12
  545. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts.map +0 -1
  546. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.js +0 -27
  547. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts +0 -14
  548. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts.map +0 -1
  549. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.js +0 -49
  550. package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts +0 -9
  551. package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts.map +0 -1
  552. package/src/shade/renderer/water/surface/chunk_water_wave_grid.js +0 -47
  553. package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts +0 -10
  554. package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts.map +0 -1
  555. package/src/shade/renderer/water/surface/shader_water_surface_write.js +0 -51
  556. package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts +0 -12
  557. package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts.map +0 -1
  558. package/src/shade/renderer/water/surface/shader_water_wave_step.js +0 -54
  559. package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts +0 -13
  560. package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts.map +0 -1
  561. package/src/shade/renderer/water/surface/water_surface_grid_indices.js +0 -39
@@ -26,6 +26,10 @@ import TopDownCameraController from "./graphics/ecs/camera/topdown/TopDownCamera
26
26
  import TopDownCameraControllerSystem from "./graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js";
27
27
  import { Light } from "./graphics/ecs/light/Light.js";
28
28
  import Water from "./graphics/ecs/water/Water.js";
29
+ import { make_plane_geometry } from "../shade/renderer/geometry/primitives/make_plane_geometry.js";
30
+ import { meshlet_geometry_build_from_geometry } from "../shade/renderer/geometry/meshlet_geometry_build_from_geometry.js";
31
+ import { MeshoptClusterizer } from "../shade/renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.js";
32
+ import { StandardAttributes } from "../shade/renderer/geometry/StandardAttributes.js";
29
33
  import { MouseEvents } from "./input/devices/events/MouseEvents.js";
30
34
  import KeyboardCameraController from "./input/ecs/controllers/KeyboardCameraController.js";
31
35
  import InputControllerSystem from "./input/ecs/systems/InputControllerSystem.js";
@@ -565,14 +569,23 @@ export class EngineHarness {
565
569
  if (enableWater) {
566
570
 
567
571
  if (em.getSystem(WaterSystem) === null) {
568
- em.addSystem(new WaterSystem(engine.graphics));
572
+ em.addSystem(new WaterSystem(engine.graphics, EngineHarness.shadeScene(engine)));
569
573
  }
570
574
 
571
575
  const water = new Water();
572
576
 
573
- water.level.set(waterLevel);
574
-
575
- eb.add(water);
577
+ await MeshoptClusterizer.ready;
578
+ const plane = make_plane_geometry(size.x * 2, size.y * 2);
579
+ const positions = plane.getAttribute(StandardAttributes.Position).data;
580
+ const normals = plane.getAttribute(StandardAttributes.Normal).data;
581
+ for (let i = 0; i < positions.length; i += 3) {
582
+ positions[i + 2] = -positions[i + 1]; positions[i + 1] = 0;
583
+ normals[i] = 0; normals[i + 1] = 1; normals[i + 2] = 0;
584
+ }
585
+ const geometry = meshlet_geometry_build_from_geometry(plane);
586
+ const placement = new Transform64();
587
+ placement.setTranslation(size.x, waterLevel, size.y);
588
+ new Entity().add(water).add(geometry).add(placement).build(engine.entityManager.dataset);
576
589
  }
577
590
 
578
591
  eb.build(engine.entityManager.dataset);
@@ -119,12 +119,15 @@ export class AnimationCurve implements Iterable<Keyframe> {
119
119
  * Returns index of a key that is just before or at the time specified.
120
120
  * Useful for insertion and evaluation logic.
121
121
  * Note: if time is past the end of last key - index of the last key will be returned instead
122
+ * With assertions stripped, a NaN time is at or after no key, so like a time before the first key it returns 0.
122
123
  * @param {number} time
123
124
  * @returns {number} index of the key
124
125
  */
125
126
  getKeyIndexLow(time: number): number;
126
127
  /**
127
128
  * Evaluate interpolated value across the curve at a given time.
129
+ * On a curve of two or more keys, a NaN time fails an assertion during development; with assertions stripped it
130
+ * evaluates to NaN, or to the first key's value if the first two keys share a time.
128
131
  * @param {number} time time in seconds
129
132
  * @return {number} value at the specified time
130
133
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationCurve.d.ts","sourceRoot":"","sources":["../../../../../src/engine/animation/curve/AnimationCurve.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,gDANwB,QAAQ;IAuZ5B;;;;OAIG;IACH,kBAHW,QAAQ,EAAE,GACR,cAAc,CAQ1B;IAED;;;;;;;;;OASG;IACH,6BANW,MAAM,eACN,MAAM,YACN,MAAM,aACN,MAAM,GACL,cAAc,CAUzB;IAED;;;;;;OAMG;IACH,4BALW,MAAM,YACN,MAAM,UACN,MAAM,GACL,cAAc,CAOzB;IAED;;;;;;;OAOG;IACH,0BANW,MAAM,eACN,MAAM,YACN,MAAM,aACN,MAAM,GACL,cAAc,CAezB;IApdD;;;;;OAKG;IACH,eAFU,QAAQ,EAAE,CAEV;IAEV;;;;;OAKG;IACH,SAHW,QAAQ,GACN,MAAM,CAuClB;IAED;;;OAGG;IACH,cAFW,QAAQ,EAAE,QAUpB;IAED;;;;OAIG;IACH,YAHW,QAAQ,GACN,OAAO,CAYnB;IAED;;OAEG;IACH,cAEC;IAGD;;;OAGG;IACH,WAFY,OAAO,CAIlB;IAED;;;OAGG;IACH,qBAEC;IAED;;;;OAIG;IACH,yBAUC;IAED;;;;OAIG;IACH,uBAUC;IAED;;;;OAIG;IACH,uBAcC;IAED;;;;;;OAMG;IACH,qBAHW,MAAM,GACJ,MAAM,CAmDlB;IAED;;;;OAIG;IACH,eAHW,MAAM,GACL,MAAM,CAoCjB;IAED;;;;OAIG;IACH,qBAFW,MAAM,QAqChB;IAED;;;;OAIG;IACH,sBAHW,MAAM,UACN,MAAM,QAIhB;IAED;;OAEG;IACH,yBAQC;IAGD;;;OAGG;IACH,YAFW,cAAc,QAIxB;IAED;;;OAGG;IACH,SAFY,cAAc,CAQzB;IAED;;;;OAIG;IACH,cAHW,cAAc,GACb,OAAO,CAIlB;IAED;;;OAGG;IACH,QAFY,MAAM,CAIjB;IAED;;MAIC;IAED;;aAkBC;IAoFL;;;;OAIG;IACH,2BAFU,OAAO,CAEwB;IAGzC;;;OAGG;IACH,mBAA+B;IA9F3B,wDAQC;CAuEJ;yBAjfwB,eAAe"}
1
+ {"version":3,"file":"AnimationCurve.d.ts","sourceRoot":"","sources":["../../../../../src/engine/animation/curve/AnimationCurve.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,gDANwB,QAAQ;IA4Z5B;;;;OAIG;IACH,kBAHW,QAAQ,EAAE,GACR,cAAc,CAQ1B;IAED;;;;;;;;;OASG;IACH,6BANW,MAAM,eACN,MAAM,YACN,MAAM,aACN,MAAM,GACL,cAAc,CAUzB;IAED;;;;;;OAMG;IACH,4BALW,MAAM,YACN,MAAM,UACN,MAAM,GACL,cAAc,CAOzB;IAED;;;;;;;OAOG;IACH,0BANW,MAAM,eACN,MAAM,YACN,MAAM,aACN,MAAM,GACL,cAAc,CAezB;IAzdD;;;;;OAKG;IACH,eAFU,QAAQ,EAAE,CAEV;IAEV;;;;;OAKG;IACH,SAHW,QAAQ,GACN,MAAM,CAuClB;IAED;;;OAGG;IACH,cAFW,QAAQ,EAAE,QAUpB;IAED;;;;OAIG;IACH,YAHW,QAAQ,GACN,OAAO,CAYnB;IAED;;OAEG;IACH,cAEC;IAGD;;;OAGG;IACH,WAFY,OAAO,CAIlB;IAED;;;OAGG;IACH,qBAEC;IAED;;;;OAIG;IACH,yBAUC;IAED;;;;OAIG;IACH,uBAUC;IAED;;;;OAIG;IACH,uBAcC;IAED;;;;;;;OAOG;IACH,qBAHW,MAAM,GACJ,MAAM,CAqDlB;IAED;;;;;;OAMG;IACH,eAHW,MAAM,GACL,MAAM,CAoCjB;IAED;;;;OAIG;IACH,qBAFW,MAAM,QAqChB;IAED;;;;OAIG;IACH,sBAHW,MAAM,UACN,MAAM,QAIhB;IAED;;OAEG;IACH,yBAQC;IAGD;;;OAGG;IACH,YAFW,cAAc,QAIxB;IAED;;;OAGG;IACH,SAFY,cAAc,CAQzB;IAED;;;;OAIG;IACH,cAHW,cAAc,GACb,OAAO,CAIlB;IAED;;;OAGG;IACH,QAFY,MAAM,CAIjB;IAED;;MAIC;IAED;;aAkBC;IAoFL;;;;OAIG;IACH,2BAFU,OAAO,CAEwB;IAGzC;;;OAGG;IACH,mBAA+B;IA9F3B,wDAQC;CAuEJ;yBAtfwB,eAAe"}
@@ -200,6 +200,7 @@ export class AnimationCurve {
200
200
  * Returns index of a key that is just before or at the time specified.
201
201
  * Useful for insertion and evaluation logic.
202
202
  * Note: if time is past the end of last key - index of the last key will be returned instead
203
+ * With assertions stripped, a NaN time is at or after no key, so like a time before the first key it returns 0.
203
204
  * @param {number} time
204
205
  * @returns {number} index of the key
205
206
  */
@@ -239,7 +240,9 @@ export class AnimationCurve {
239
240
  if (key_time <= time) {
240
241
  found_index = pivot;
241
242
  i0 = pivot + 1;
242
- } else if (key_time > time) {
243
+ } else {
244
+ // also where a NaN on either side lands, as it compares false both ways:
245
+ // every iteration has to narrow the range, or the search never ends
243
246
  i1 = pivot - 1;
244
247
  }
245
248
  }
@@ -256,6 +259,8 @@ export class AnimationCurve {
256
259
 
257
260
  /**
258
261
  * Evaluate interpolated value across the curve at a given time.
262
+ * On a curve of two or more keys, a NaN time fails an assertion during development; with assertions stripped it
263
+ * evaluates to NaN, or to the first key's value if the first two keys share a time.
259
264
  * @param {number} time time in seconds
260
265
  * @return {number} value at the specified time
261
266
  */
@@ -229,7 +229,7 @@ export class ThreadedImageEncoder {
229
229
  width: sampler2d.width,
230
230
  height: sampler2d.height,
231
231
  item_size: sampler2d.itemSize,
232
- is_hdr: data instanceof Uint16Array,
232
+ is_hdr: data instanceof Float16Array || data instanceof Uint16Array,
233
233
  quality,
234
234
  speed
235
235
  };
@@ -143,7 +143,15 @@ export class EntityManager {
143
143
  */
144
144
  private __execution_order_needs_update;
145
145
  /**
146
- * Rebuild execution order
146
+ * Rebuild execution order.
147
+ *
148
+ * Nobody writes the order down; it is derived from what each system declares it touches. A
149
+ * system that writes a component runs before every other system in the same pass that reads it
150
+ * (see {@link orderSystemsByDeclaredAccess}, which also says how a cycle is broken). Where those
151
+ * edges leave a choice, the score below decides, then registration order.
152
+ *
153
+ * An explicit `runs_before` / `runs_after` was considered and rejected: it couples systems to
154
+ * each other by name, which is what deriving the order exists to avoid.
147
155
  * @private
148
156
  */
149
157
  private updateExecutionOrder;
@@ -1 +1 @@
1
- {"version":3,"file":"EntityManager.d.ts","sourceRoot":"","sources":["../../../../src/engine/ecs/EntityManager.js"],"names":[],"mappings":"iCAqBU,MAAM;;;;;;;;;AAoBhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH;IAEI;;;;OAIG;IACH,kBAFU,aAAQ,CAEL;IAEb;;;;;;OAMG;IACH,uCAA2B;IAE3B;;;;;OAKG;IACH,iCAA4B;IAE5B;;OAEG;IACH;;;QAGI;;WAEG;;;MAGL;IAEF;;;OAGG;IACH,OAFU,kBAAkB,CAEO;IAEnC;;;;;;;;;OASG;IACH,qBAFU,MAAM,CAEY;IAE5B;;;;;;;;OAQG;IACH,wCAFU,MAAM,CAE4B;IAE5C;;;;;;;;OAQG;IACH,eAFU,MAAM,CAEE;IAElB;;;;;OAKG;IACH,+BAA2B;IAE3B;;;;;;;;;;;;;;OAcG;IACH,oBAFU,MAAM,CAEO;IAEvB;;;;OAIG;IACH,SAFU,sBAAsB,CAEjB;IA8Bf;;;;;OAKG;IACH,uCAAsC;IAEtC;;;OAGG;IACH,6BA4GC;IAED;;;;OAIG;IACH,4BAHW;QAAC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;KAAC,QAavD;IAED;;;OAGG;IACH,8BAHW;QAAC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;KAAC,GAC3C,OAAO,CAYnB;IAoBD;;;OAGG;IACH,uBAFa,KAAK,EAAE,CAuBnB;IAED;;;;;OAKG;IACH,uBAJW,sBAAsB,QA4ChC;IAGD;;;OAGG;IACH,sBA2BC;IAED;;;;OAIG;IACH,qCAFa,OAAO,CAInB;IAED;;;;OAIG;IACH,6CAgBC;IAED;;;;;OAKG;IACH,wCAHW,MAAM,cAkBhB;IAGD;;;OAGG;IACH,2BAFW,MAAM,QA6HhB;IAED;;;;;;;;;OASG;IACH,qBAFa,MAAM,CAKlB;IAED;;;;;OAKG;IACH,6CA6DC;IAED;;;;OAIG;IACH,mCAFa,QAAQ,OAAO,CAAC,CA2C5B;IAED;;;;;OAKG;IACH,mBAsDC;IAED;;;;;OAKG;IACH,oBA4FC;IAED;;;;;OAKG;IACH,kEAyEC;IAED;;;;OAIG;IACH,2BAHW,KAAK,GACH,oBAAgB,CA0B5B;IAED;;;;OAIG;IACH,kCAJW,KAAK,SACL,WAAW,GACT,oBAAgB,CA0B5B;IAED;;;;;OAKG;IACH,mEAmEC;IAGL;;OAEG;IACH,yBA7wBe,sBAAsB,UA6wBA;IACrC;;OAEG;IACH,0BAAqC;IAErC;;OAEG;IACH,+BA5oBe,MAAM,UA4oBW;;CAd/B;6BAnpCY,OAAO,gCAAgC,EAAE,KAAK,CAAC,CAAC,CAAC;uBAN1B,aAAa;mBAR9B,oCAAoC;uCAMhB,6BAA6B;4BAEhC,aAAa"}
1
+ {"version":3,"file":"EntityManager.d.ts","sourceRoot":"","sources":["../../../../src/engine/ecs/EntityManager.js"],"names":[],"mappings":"iCAsBU,MAAM;;;;;;;;;AAoBhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH;IAEI;;;;OAIG;IACH,kBAFU,aAAQ,CAEL;IAEb;;;;;;OAMG;IACH,uCAA2B;IAE3B;;;;;OAKG;IACH,iCAA4B;IAE5B;;OAEG;IACH;;;QAGI;;WAEG;;;MAGL;IAEF;;;OAGG;IACH,OAFU,kBAAkB,CAEO;IAEnC;;;;;;;;;OASG;IACH,qBAFU,MAAM,CAEY;IAE5B;;;;;;;;OAQG;IACH,wCAFU,MAAM,CAE4B;IAE5C;;;;;;;;OAQG;IACH,eAFU,MAAM,CAEE;IAElB;;;;;OAKG;IACH,+BAA2B;IAE3B;;;;;;;;;;;;;;OAcG;IACH,oBAFU,MAAM,CAEO;IAEvB;;;;OAIG;IACH,SAFU,sBAAsB,CAEjB;IA8Bf;;;;;OAKG;IACH,uCAAsC;IAEtC;;;;;;;;;;;OAWG;IACH,6BAkGC;IAED;;;;OAIG;IACH,4BAHW;QAAC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;KAAC,QAavD;IAED;;;OAGG;IACH,8BAHW;QAAC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;KAAC,GAC3C,OAAO,CAYnB;IAoBD;;;OAGG;IACH,uBAFa,KAAK,EAAE,CAuBnB;IAED;;;;;OAKG;IACH,uBAJW,sBAAsB,QA4ChC;IAGD;;;OAGG;IACH,sBA2BC;IAED;;;;OAIG;IACH,qCAFa,OAAO,CAInB;IAED;;;;OAIG;IACH,6CAgBC;IAED;;;;;OAKG;IACH,wCAHW,MAAM,cAkBhB;IAGD;;;OAGG;IACH,2BAFW,MAAM,QA6HhB;IAED;;;;;;;;;OASG;IACH,qBAFa,MAAM,CAKlB;IAED;;;;;OAKG;IACH,6CA6DC;IAED;;;;OAIG;IACH,mCAFa,QAAQ,OAAO,CAAC,CA2C5B;IAED;;;;;OAKG;IACH,mBAsDC;IAED;;;;;OAKG;IACH,oBA4FC;IAED;;;;;OAKG;IACH,kEAyEC;IAED;;;;OAIG;IACH,2BAHW,KAAK,GACH,oBAAgB,CA0B5B;IAED;;;;OAIG;IACH,kCAJW,KAAK,SACL,WAAW,GACT,oBAAgB,CA0B5B;IAED;;;;;OAKG;IACH,mEAmEC;IAGL;;OAEG;IACH,yBA7wBe,sBAAsB,UA6wBA;IACrC;;OAEG;IACH,0BAAqC;IAErC;;OAEG;IACH,+BA5oBe,MAAM,UA4oBW;;CAd/B;6BAjpCY,OAAO,gCAAgC,EAAE,KAAK,CAAC,CAAC,CAAC;uBAP1B,aAAa;mBAR9B,oCAAoC;uCAMhB,6BAA6B;4BAEhC,aAAa"}
@@ -10,6 +10,7 @@ import { EntityComponentDataset } from "./EntityComponentDataset.js";
10
10
  import { EntityObserver } from "./EntityObserver.js";
11
11
  import { System, SystemState } from "./System.js";
12
12
  import { computeSystemComponentDependencyGraph } from "./system/computeSystemComponentDependencyGraph.js";
13
+ import { orderSystemsByDeclaredAccess } from "./system/orderSystemsByDeclaredAccess.js";
13
14
  import { system_validate_class } from "./system_validate_class.js";
14
15
 
15
16
  /**
@@ -216,7 +217,15 @@ export class EntityManager {
216
217
  __execution_order_needs_update = true;
217
218
 
218
219
  /**
219
- * Rebuild execution order
220
+ * Rebuild execution order.
221
+ *
222
+ * Nobody writes the order down; it is derived from what each system declares it touches. A
223
+ * system that writes a component runs before every other system in the same pass that reads it
224
+ * (see {@link orderSystemsByDeclaredAccess}, which also says how a cycle is broken). Where those
225
+ * edges leave a choice, the score below decides, then registration order.
226
+ *
227
+ * An explicit `runs_before` / `runs_after` was considered and rejected: it couples systems to
228
+ * each other by name, which is what deriving the order exists to avoid.
220
229
  * @private
221
230
  */
222
231
  updateExecutionOrder() {
@@ -253,6 +262,11 @@ export class EntityManager {
253
262
 
254
263
 
255
264
  /**
265
+ * Ranks the systems the write→read edges leave free to run in either order, and decides
266
+ * which system of a cycle runs first. It decides nothing an edge decides, and could not:
267
+ * it is a SUM over the components a system references, so a system that reads X and
268
+ * writes Y outscores the plain writer of X it depends on, and sorting by it alone ran that
269
+ * reader first.
256
270
  *
257
271
  * @param {System} system
258
272
  * @returns {number} higher values means it should be scheduled before others
@@ -275,24 +289,13 @@ export class EntityManager {
275
289
  /*
276
290
  The component itself, plus whatever depends on it.
277
291
 
278
- The `+ 1` is the whole of the fix, and the bug it closes is that the multipliers
279
- below were applied to a number the declaring system could not raise.
280
- `computeSystemComponentDependencyGraph` draws its edges from each component a
281
- system WRITES to each one it READS, so a component this system writes collects
282
- OUTgoing edges here and, from this system's own declaration, an in-degree of zero.
283
- Twice zero is zero: `Write` — the lever the whole design rests on — contributed
284
- nothing, a writer scored exactly what a reader scored, and `Array.prototype.sort`'s
285
- stability handed the decision back to registration order.
286
-
287
- Worse than a wrong answer, it was an answer that depended on OTHER systems'
288
- declarations. A port found its camera pose one frame late (GAP-037) only after
289
- reducing to a two-system rig; in the full application `PhysicsSystem` writing
290
- `RigidBody` and reading `Transform` lent `Transform` the incoming edge the camera
291
- system's own declaration did not, so a correct order was resting on a system it has
292
- nothing to do with, and would have inverted silently the day that system moved.
293
-
294
- An explicit `runs_before` / `runs_after` was considered and rejected: it couples
295
- systems to each other by name, which is what deriving the order exists to avoid.
292
+ Without the `+ 1` the multipliers below apply to a number the declaring system
293
+ cannot raise. `computeSystemComponentDependencyGraph` draws its edges from each
294
+ component a system WRITES to each one it READS, so a component this system writes
295
+ collects OUTgoing edges here and, from this system's own declaration, an in-degree
296
+ of zero. Twice zero is zero, and Create, Write and Read stop ranking: a creator and
297
+ a plain writer of one component, which no write→read edge orders, would tie and
298
+ fall to registration order.
296
299
  */
297
300
  const weight = 1 + attached_edge_count;
298
301
 
@@ -311,18 +314,14 @@ export class EntityManager {
311
314
  return result;
312
315
  }
313
316
 
314
- // pre-score systems for faster sorting
315
- const scores = new Map();
317
+ // `order` is still in registration order here, which is what breaks a tie between scores
318
+ const scores = new Float64Array(executable_system_count);
316
319
 
317
320
  for (let i = 0; i < executable_system_count; i++) {
318
- const system = order[i];
319
-
320
- scores.set(system, scoreSystem(system));
321
+ scores[i] = scoreSystem(order[i]);
321
322
  }
322
323
 
323
- order.sort((a, b) => {
324
- return scores.get(b) - scores.get(a);
325
- });
324
+ orderSystemsByDeclaredAccess(order, executable_system_count, scores);
326
325
 
327
326
  // clear update flag
328
327
  this.__execution_order_needs_update = false;
@@ -47,6 +47,26 @@ export class GPUStateAuthority {
47
47
  * @type {number}
48
48
  */
49
49
  flags: number;
50
+ /**
51
+ * Bitwise OR of the {@link GPUStateAuthorityFlags} a CPU writer holds against the GPU: a cloth
52
+ * simulating a cape joint's offset, while a clip may be bound to the same joint.
53
+ *
54
+ * Two writers want one component, and a hold is how the CPU one wins. A held bit is never set
55
+ * in {@link flags}: holding clears it, and a GPU writer's grant does not set it while the hold
56
+ * lasts. Whoever writes on the GPU hears of the hold (see
57
+ * {@link GPU_AUTHORITY_EVENT_HOLD_CHANGE}) and stops, and takes the component back when it
58
+ * ends. So {@link flags} stays the one statement of who writes, and what is held is why the GPU
59
+ * does not.
60
+ *
61
+ * One holder per component: a second CPU writer of the same component is the same race in
62
+ * another place, and holding twice is an error.
63
+ *
64
+ * Read it through {@link gpu_authority_held} and write it through {@link gpu_authority_hold} /
65
+ * {@link gpu_authority_unhold}.
66
+ *
67
+ * @type {number}
68
+ */
69
+ held: number;
50
70
  }
51
71
  export namespace GPUStateAuthority {
52
72
  let typeName: string;
@@ -1 +1 @@
1
- {"version":3,"file":"GPUStateAuthority.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/gpu/GPUStateAuthority.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH;IAYI;;;OAGG;IACH,oBAHW,MAAM,GACJ,iBAAiB,CAQ7B;IArBD;;;;;;;;OAQG;IACH,OAFU,MAAM,CAEN;CAab;;kBAIS,MAAM;sBASN,OAAO"}
1
+ {"version":3,"file":"GPUStateAuthority.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/gpu/GPUStateAuthority.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH;IAiCI;;;OAGG;IACH,oBAHW,MAAM,GACJ,iBAAiB,CAQ7B;IA1CD;;;;;;;;OAQG;IACH,OAFU,MAAM,CAEN;IAEV;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAFU,MAAM,CAEP;CAaZ;;kBAIS,MAAM;sBASN,OAAO"}
@@ -43,6 +43,27 @@ export class GPUStateAuthority {
43
43
  */
44
44
  flags = 0;
45
45
 
46
+ /**
47
+ * Bitwise OR of the {@link GPUStateAuthorityFlags} a CPU writer holds against the GPU: a cloth
48
+ * simulating a cape joint's offset, while a clip may be bound to the same joint.
49
+ *
50
+ * Two writers want one component, and a hold is how the CPU one wins. A held bit is never set
51
+ * in {@link flags}: holding clears it, and a GPU writer's grant does not set it while the hold
52
+ * lasts. Whoever writes on the GPU hears of the hold (see
53
+ * {@link GPU_AUTHORITY_EVENT_HOLD_CHANGE}) and stops, and takes the component back when it
54
+ * ends. So {@link flags} stays the one statement of who writes, and what is held is why the GPU
55
+ * does not.
56
+ *
57
+ * One holder per component: a second CPU writer of the same component is the same race in
58
+ * another place, and holding twice is an error.
59
+ *
60
+ * Read it through {@link gpu_authority_held} and write it through {@link gpu_authority_hold} /
61
+ * {@link gpu_authority_unhold}.
62
+ *
63
+ * @type {number}
64
+ */
65
+ held = 0;
66
+
46
67
  /**
47
68
  * @param {number} [flags]
48
69
  * @returns {GPUStateAuthority}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Sent on an entity when a CPU writer takes or gives back a component it holds against the GPU —
3
+ * see {@link GPUStateAuthority#held}. The payload is the entity.
4
+ *
5
+ * What a GPU writer listens for on the entities it drives: a hold means stop writing, and the end of
6
+ * one means it may take the component back. Read the state off the entity rather than off the
7
+ * event; one event names both transitions.
8
+ *
9
+ * @author Alex Goldring
10
+ * @copyright Company Named Limited (c) 2026
11
+ */
12
+ export const GPU_AUTHORITY_EVENT_HOLD_CHANGE: "@gpu_authority/hold_change";
13
+ //# sourceMappingURL=GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.js"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,2EAA4E"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Sent on an entity when a CPU writer takes or gives back a component it holds against the GPU —
3
+ * see {@link GPUStateAuthority#held}. The payload is the entity.
4
+ *
5
+ * What a GPU writer listens for on the entities it drives: a hold means stop writing, and the end of
6
+ * one means it may take the component back. Read the state off the entity rather than off the
7
+ * event; one event names both transitions.
8
+ *
9
+ * @author Alex Goldring
10
+ * @copyright Company Named Limited (c) 2026
11
+ */
12
+ export const GPU_AUTHORITY_EVENT_HOLD_CHANGE = "@gpu_authority/hold_change";
@@ -6,10 +6,16 @@
6
6
  * declaration site that was missed, and adding the component here to paper over it is exactly the
7
7
  * structural churn the declaration exists to avoid.
8
8
  *
9
+ * **A component a CPU writer holds is not granted** (see {@link GPUStateAuthority#held}). The hold
10
+ * is the reason, stated on the same component, and the GPU side takes the bit when the hold ends —
11
+ * {@link gpu_authority_unhold} says so on the entity. A clip binding a cloth's cape joint grants
12
+ * the joint's world and not its offset.
13
+ *
9
14
  * @param {EntityComponentDataset} dataset
10
15
  * @param {number} entity
11
16
  * @param {number} flags one or more {@link GPUStateAuthorityFlags}
12
17
  * @returns {boolean} whether anything changed — `false` when the GPU already owned all of them
18
+ * that are not held
13
19
  */
14
20
  export function gpu_authority_grant(dataset: EntityComponentDataset, entity: number, flags: number): boolean;
15
21
  //# sourceMappingURL=gpu_authority_grant.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gpu_authority_grant.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/gpu/gpu_authority_grant.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AACH,6EAJW,MAAM,SACN,MAAM,GACJ,OAAO,CAsBnB"}
1
+ {"version":3,"file":"gpu_authority_grant.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/gpu/gpu_authority_grant.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AACH,6EALW,MAAM,SACN,MAAM,GACJ,OAAO,CAuBnB"}
@@ -10,10 +10,16 @@ import { GPU_STATE_AUTHORITY_FLAGS_ALL, gpu_state_authority_flag_names } from ".
10
10
  * declaration site that was missed, and adding the component here to paper over it is exactly the
11
11
  * structural churn the declaration exists to avoid.
12
12
  *
13
+ * **A component a CPU writer holds is not granted** (see {@link GPUStateAuthority#held}). The hold
14
+ * is the reason, stated on the same component, and the GPU side takes the bit when the hold ends —
15
+ * {@link gpu_authority_unhold} says so on the entity. A clip binding a cloth's cape joint grants
16
+ * the joint's world and not its offset.
17
+ *
13
18
  * @param {EntityComponentDataset} dataset
14
19
  * @param {number} entity
15
20
  * @param {number} flags one or more {@link GPUStateAuthorityFlags}
16
21
  * @returns {boolean} whether anything changed — `false` when the GPU already owned all of them
22
+ * that are not held
17
23
  */
18
24
  export function gpu_authority_grant(dataset, entity, flags) {
19
25
  assert.defined(dataset, 'dataset');
@@ -26,7 +32,7 @@ export function gpu_authority_grant(dataset, entity, flags) {
26
32
  assert.ok(authority !== undefined && authority !== null, `entity ${entity} has no GPUStateAuthority — it must be declared at creation, see gpu_authority_declare`);
27
33
 
28
34
  const before = authority.flags;
29
- const after = before | flags;
35
+ const after = before | (flags & ~authority.held);
30
36
 
31
37
  if (after === before) {
32
38
  return false;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Does a CPU writer hold component X of entity E against the GPU? See
3
+ * {@link GPUStateAuthority#held}.
4
+ *
5
+ * Asks for **all** of `flags`, as {@link gpu_authority_has} does. No component means nothing is
6
+ * held.
7
+ *
8
+ * @param {EntityComponentDataset} dataset
9
+ * @param {number} entity
10
+ * @param {number} flags one or more {@link GPUStateAuthorityFlags}
11
+ * @returns {boolean}
12
+ */
13
+ export function gpu_authority_held(dataset: EntityComponentDataset, entity: number, flags: number): boolean;
14
+ //# sourceMappingURL=gpu_authority_held.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpu_authority_held.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/gpu/gpu_authority_held.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,4EAJW,MAAM,SACN,MAAM,GACJ,OAAO,CAUnB"}
@@ -0,0 +1,23 @@
1
+ import { GPUStateAuthority } from "./GPUStateAuthority.js";
2
+
3
+ /**
4
+ * Does a CPU writer hold component X of entity E against the GPU? See
5
+ * {@link GPUStateAuthority#held}.
6
+ *
7
+ * Asks for **all** of `flags`, as {@link gpu_authority_has} does. No component means nothing is
8
+ * held.
9
+ *
10
+ * @param {EntityComponentDataset} dataset
11
+ * @param {number} entity
12
+ * @param {number} flags one or more {@link GPUStateAuthorityFlags}
13
+ * @returns {boolean}
14
+ */
15
+ export function gpu_authority_held(dataset, entity, flags) {
16
+ const authority = dataset.getComponent(entity, GPUStateAuthority);
17
+
18
+ if (authority === undefined || authority === null) {
19
+ return false;
20
+ }
21
+
22
+ return (authority.held & flags) === flags;
23
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Take these components for a CPU writer, against whatever writes them on the GPU, for as long as
3
+ * the hold lasts.
4
+ *
5
+ * A revoke says the GPU stopped writing. A hold says the CPU needs the component **whether or not
6
+ * the GPU wants it**: a cloth over a cape whose clip keys the same joints. The bits clear, the GPU
7
+ * side cannot grant them back until {@link gpu_authority_unhold}, and
8
+ * {@link GPU_AUTHORITY_EVENT_HOLD_CHANGE} tells a GPU writer already driving the entity to stop.
9
+ *
10
+ * Declares the entity if it never was. A hold is a claim and has to be visible on the entity; an
11
+ * entity no clip has ever been able to target carries no {@link GPUStateAuthority}, and a clip that
12
+ * binds it later must find the hold there. Seeding a garment is that entity's moment, as binding is
13
+ * for a joint attached under an animated one.
14
+ *
15
+ * **Holding does not seed a value.** The component holds what the CPU last wrote, which for a joint
16
+ * a clip was resolving is not this frame's pose; the holder writes its own before anything reads it.
17
+ *
18
+ * @param {EntityComponentDataset} dataset
19
+ * @param {number} entity
20
+ * @param {number} flags one or more {@link GPUStateAuthorityFlags}, none of them already held
21
+ */
22
+ export function gpu_authority_hold(dataset: EntityComponentDataset, entity: number, flags: number): void;
23
+ //# sourceMappingURL=gpu_authority_hold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpu_authority_hold.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/gpu/gpu_authority_hold.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,4EAHW,MAAM,SACN,MAAM,QAgBhB"}
@@ -0,0 +1,41 @@
1
+ import { assert } from "../../../core/assert.js";
2
+ import { GPU_AUTHORITY_EVENT_HOLD_CHANGE } from "./GPU_AUTHORITY_EVENT_HOLD_CHANGE.js";
3
+ import { GPU_STATE_AUTHORITY_FLAGS_ALL, gpu_state_authority_flag_names } from "./GPUStateAuthorityFlags.js";
4
+ import { gpu_authority_declare } from "./gpu_authority_declare.js";
5
+
6
+ /**
7
+ * Take these components for a CPU writer, against whatever writes them on the GPU, for as long as
8
+ * the hold lasts.
9
+ *
10
+ * A revoke says the GPU stopped writing. A hold says the CPU needs the component **whether or not
11
+ * the GPU wants it**: a cloth over a cape whose clip keys the same joints. The bits clear, the GPU
12
+ * side cannot grant them back until {@link gpu_authority_unhold}, and
13
+ * {@link GPU_AUTHORITY_EVENT_HOLD_CHANGE} tells a GPU writer already driving the entity to stop.
14
+ *
15
+ * Declares the entity if it never was. A hold is a claim and has to be visible on the entity; an
16
+ * entity no clip has ever been able to target carries no {@link GPUStateAuthority}, and a clip that
17
+ * binds it later must find the hold there. Seeding a garment is that entity's moment, as binding is
18
+ * for a joint attached under an animated one.
19
+ *
20
+ * **Holding does not seed a value.** The component holds what the CPU last wrote, which for a joint
21
+ * a clip was resolving is not this frame's pose; the holder writes its own before anything reads it.
22
+ *
23
+ * @param {EntityComponentDataset} dataset
24
+ * @param {number} entity
25
+ * @param {number} flags one or more {@link GPUStateAuthorityFlags}, none of them already held
26
+ */
27
+ export function gpu_authority_hold(dataset, entity, flags) {
28
+ assert.defined(dataset, 'dataset');
29
+ assert.isNonNegativeInteger(entity, 'entity');
30
+ assert.isNonNegativeInteger(flags, 'flags');
31
+ assert.equal(flags & ~GPU_STATE_AUTHORITY_FLAGS_ALL, 0, `flags (${gpu_state_authority_flag_names(flags)}) contains bits GPUStateAuthorityFlags does not assign`);
32
+
33
+ const authority = gpu_authority_declare(dataset, entity);
34
+
35
+ assert.equal(authority.held & flags, 0, `entity ${entity} is already held for ${gpu_state_authority_flag_names(authority.held & flags)}: two CPU writers of one component`);
36
+
37
+ authority.held |= flags;
38
+ authority.flags &= ~flags;
39
+
40
+ dataset.sendEvent(entity, GPU_AUTHORITY_EVENT_HOLD_CHANGE, entity);
41
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * End a CPU writer's hold on these components — the reverse of {@link gpu_authority_hold}.
3
+ *
4
+ * **Grants nothing.** Whether the GPU writes the component now is not the holder's to say: a clip
5
+ * may have bound the joint during the hold, or left it. The event tells whatever drives the entity
6
+ * on the GPU, and that writer takes the component back if it still wants it. With nothing driving
7
+ * it, it stays the CPU's, holding what the holder last wrote.
8
+ *
9
+ * @param {EntityComponentDataset} dataset
10
+ * @param {number} entity
11
+ * @param {number} flags one or more {@link GPUStateAuthorityFlags}, every one of them held
12
+ */
13
+ export function gpu_authority_unhold(dataset: EntityComponentDataset, entity: number, flags: number): void;
14
+ //# sourceMappingURL=gpu_authority_unhold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpu_authority_unhold.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/gpu/gpu_authority_unhold.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,8EAHW,MAAM,SACN,MAAM,QAgBhB"}
@@ -0,0 +1,32 @@
1
+ import { assert } from "../../../core/assert.js";
2
+ import { GPU_AUTHORITY_EVENT_HOLD_CHANGE } from "./GPU_AUTHORITY_EVENT_HOLD_CHANGE.js";
3
+ import { GPUStateAuthority } from "./GPUStateAuthority.js";
4
+ import { GPU_STATE_AUTHORITY_FLAGS_ALL, gpu_state_authority_flag_names } from "./GPUStateAuthorityFlags.js";
5
+
6
+ /**
7
+ * End a CPU writer's hold on these components — the reverse of {@link gpu_authority_hold}.
8
+ *
9
+ * **Grants nothing.** Whether the GPU writes the component now is not the holder's to say: a clip
10
+ * may have bound the joint during the hold, or left it. The event tells whatever drives the entity
11
+ * on the GPU, and that writer takes the component back if it still wants it. With nothing driving
12
+ * it, it stays the CPU's, holding what the holder last wrote.
13
+ *
14
+ * @param {EntityComponentDataset} dataset
15
+ * @param {number} entity
16
+ * @param {number} flags one or more {@link GPUStateAuthorityFlags}, every one of them held
17
+ */
18
+ export function gpu_authority_unhold(dataset, entity, flags) {
19
+ assert.defined(dataset, 'dataset');
20
+ assert.isNonNegativeInteger(entity, 'entity');
21
+ assert.isNonNegativeInteger(flags, 'flags');
22
+ assert.equal(flags & ~GPU_STATE_AUTHORITY_FLAGS_ALL, 0, `flags (${gpu_state_authority_flag_names(flags)}) contains bits GPUStateAuthorityFlags does not assign`);
23
+
24
+ const authority = dataset.getComponent(entity, GPUStateAuthority);
25
+
26
+ assert.ok(authority !== undefined && authority !== null, `entity ${entity} has no GPUStateAuthority, so nothing holds it`);
27
+ assert.equal(authority.held & flags, flags, `entity ${entity} is not held for ${gpu_state_authority_flag_names(flags & ~authority.held)}`);
28
+
29
+ authority.held &= ~flags;
30
+
31
+ dataset.sendEvent(entity, GPU_AUTHORITY_EVENT_HOLD_CHANGE, entity);
32
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * A goal for the bone it sits on, the effector: bring it to where its target entity is, turning the
3
+ * bones from it up to {@link chain_root}. {@link IKGoalSystem} solves it.
4
+ *
5
+ * The tree is the {@link TransformAttachment} hierarchy, and the goal's path runs from the effector
6
+ * up to its chain root. A link of the path turns; the chain root turns and never moves. Joint limits
7
+ * are the physics `Joint` on each bone of the path.
8
+ *
9
+ * - The references are entities and are fixed while the component is attached: remove it and add it
10
+ * back to change them.
11
+ * - The goal removes itself when its target or any bone of its path is destroyed.
12
+ * - Weights are 0..1. Position weight 0 gives the pose the bones would have without the goal, and the
13
+ * pose is continuous in it. Rotation weight 0 leaves the effector's rotation riding its chain; 1
14
+ * gives it the target's.
15
+ *
16
+ * Bones are spawned with their model and never saved, and an entity id means nothing in a save, so
17
+ * neither is this.
18
+ *
19
+ * @author Alex Goldring
20
+ * @copyright Company Named Limited (c) 2026
21
+ */
22
+ export class IKGoal {
23
+ /**
24
+ * @param {{target:number, chain_root:number, position_weight:number, rotation_weight:number}} options
25
+ * every field required
26
+ * @returns {IKGoal}
27
+ */
28
+ static from({ target, chain_root, position_weight, rotation_weight }: {
29
+ target: number;
30
+ chain_root: number;
31
+ position_weight: number;
32
+ rotation_weight: number;
33
+ }): IKGoal;
34
+ /**
35
+ * The entity whose world pose the effector is brought to.
36
+ * @type {number}
37
+ */
38
+ target: number;
39
+ /**
40
+ * The highest bone the goal turns: the effector itself or one of its ancestors.
41
+ * @type {number}
42
+ */
43
+ chain_root: number;
44
+ /**
45
+ * How far toward the target the effector is pulled, 0..1.
46
+ * @type {number}
47
+ */
48
+ position_weight: number;
49
+ /**
50
+ * How far toward the target's rotation the effector is turned, 0..1.
51
+ * @type {number}
52
+ */
53
+ rotation_weight: number;
54
+ }
55
+ export namespace IKGoal {
56
+ let typeName: string;
57
+ let serializable: boolean;
58
+ }
59
+ //# sourceMappingURL=IKGoal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IKGoal.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/ik/IKGoal.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;IAyBI;;;;OAIG;IACH,sEAJW;QAAC,MAAM,EAAC,MAAM,CAAC;QAAC,UAAU,EAAC,MAAM,CAAC;QAAC,eAAe,EAAC,MAAM,CAAC;QAAC,eAAe,EAAC,MAAM,CAAA;KAAC,GAEhF,MAAM,CAkBlB;IA7CD;;;OAGG;IACH,QAFU,MAAM,CAEJ;IAEZ;;;OAGG;IACH,YAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,iBAFU,MAAM,CAEI;IAEpB;;;OAGG;IACH,iBAFU,MAAM,CAEI;CAwBvB;;kBAIS,MAAM;sBAMN,OAAO"}