@woosh/meep-engine 3.52.0 → 3.53.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 (370) hide show
  1. package/package.json +1 -1
  2. package/src/engine/ecs/animation/Animation.d.ts +4 -25
  3. package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
  4. package/src/engine/ecs/animation/Animation.js +9 -41
  5. package/src/engine/ecs/ik/IKGoalSystem.d.ts +4 -5
  6. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
  7. package/src/engine/ecs/ik/IKGoalSystem.js +4 -6
  8. package/src/engine/graphics/ecs/mesh/assetTypeByPath.js +1 -1
  9. package/src/engine/graphics3/AnimationGraphSystem.d.ts +9 -22
  10. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  11. package/src/engine/graphics3/AnimationGraphSystem.js +58 -203
  12. package/src/engine/graphics3/AnimationSystem.d.ts +7 -18
  13. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  14. package/src/engine/graphics3/AnimationSystem.js +62 -243
  15. package/src/engine/graphics3/FoliageWindSystem.d.ts +67 -0
  16. package/src/engine/graphics3/FoliageWindSystem.d.ts.map +1 -0
  17. package/src/engine/graphics3/FoliageWindSystem.js +257 -0
  18. package/src/engine/graphics3/GPUFluidSystem.d.ts +7 -0
  19. package/src/engine/graphics3/GPUFluidSystem.d.ts.map +1 -1
  20. package/src/engine/graphics3/GPUFluidSystem.js +39 -1
  21. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +0 -1
  22. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  23. package/src/engine/graphics3/GPUParticleEmitterSystem.js +19 -5
  24. package/src/engine/graphics3/animation/AnimationClips.d.ts +107 -13
  25. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -1
  26. package/src/engine/graphics3/animation/AnimationClips.js +207 -10
  27. package/src/engine/graphics3/animation/AnimationClipsSink.d.ts +89 -0
  28. package/src/engine/graphics3/animation/AnimationClipsSink.d.ts.map +1 -0
  29. package/src/engine/graphics3/animation/AnimationClipsSink.js +205 -0
  30. package/src/engine/graphics3/animation/FoliageWindRigs.d.ts +43 -0
  31. package/src/engine/graphics3/animation/FoliageWindRigs.d.ts.map +1 -0
  32. package/src/engine/graphics3/animation/FoliageWindRigs.js +69 -0
  33. package/src/engine/graphics3/animation/write_clip_playback.d.ts +17 -11
  34. package/src/engine/graphics3/animation/write_clip_playback.d.ts.map +1 -1
  35. package/src/engine/graphics3/animation/write_clip_playback.js +36 -27
  36. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
  37. package/src/engine/graphics3/decal/GPUDecalRenderer.js +8 -6
  38. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  39. package/src/engine/graphics3/decal/shader_decal_composite.js +11 -5
  40. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts +7 -7
  41. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts.map +1 -1
  42. package/src/engine/graphics3/pose/collect_entity_playbacks.js +14 -15
  43. package/src/engine/graphics3/prefab/Prefab.d.ts +6 -0
  44. package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -1
  45. package/src/engine/graphics3/prefab/Prefab.js +169 -162
  46. package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -1
  47. package/src/engine/graphics3/prefab/prefab_compile.js +369 -334
  48. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
  49. package/src/engine/graphics3/prefab/prefab_instantiate.js +43 -2
  50. package/src/engine/graphics3/terrain/chunk_terrain_material_surface.js +2 -2
  51. package/src/engine/physics/ecs/ContactProbeSystem.d.ts +2 -3
  52. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
  53. package/src/engine/physics/ecs/ContactProbeSystem.js +2 -4
  54. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  55. package/src/engine/sound/simulation/PROBE_PLACEMENT.md +4 -4
  56. package/src/engine/sound/simulation/README.md +1 -1
  57. package/src/engine/sound/simulation/probe/bakeProbeField.d.ts +22 -8
  58. package/src/engine/sound/simulation/probe/bakeProbeField.d.ts.map +1 -1
  59. package/src/engine/sound/simulation/probe/bakeProbeField.js +60 -15
  60. package/src/engine/sound/simulation/probe/bakeProbeReflectors.d.ts.map +1 -1
  61. package/src/engine/sound/simulation/probe/bakeProbeReflectors.js +19 -23
  62. package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts +63 -17
  63. package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts.map +1 -1
  64. package/src/engine/sound/simulation/probe/probe_sdf_grid.js +67 -17
  65. package/src/generation/foliage/FOLIAGE_DESIGN.md +318 -0
  66. package/src/generation/foliage/FOLIAGE_PLAN.md +198 -0
  67. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +20 -0
  68. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -0
  69. package/src/generation/foliage/animation/build_tree_wind_rig.js +108 -0
  70. package/src/generation/foliage/asset/TreeAsset.d.ts +86 -0
  71. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -0
  72. package/src/generation/foliage/asset/TreeAsset.js +111 -0
  73. package/src/generation/foliage/asset/TreeLODAsset.d.ts +115 -0
  74. package/src/generation/foliage/asset/TreeLODAsset.d.ts.map +1 -0
  75. package/src/generation/foliage/asset/TreeLODAsset.js +346 -0
  76. package/src/generation/foliage/asset/generate_tree.d.ts +15 -0
  77. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -0
  78. package/src/generation/foliage/asset/generate_tree.js +93 -0
  79. package/src/generation/foliage/asset/place_tree.d.ts +82 -0
  80. package/src/generation/foliage/asset/place_tree.d.ts.map +1 -0
  81. package/src/generation/foliage/asset/place_tree.js +194 -0
  82. package/src/generation/foliage/config/BarkMaterialConfig.d.ts +120 -0
  83. package/src/generation/foliage/config/BarkMaterialConfig.d.ts.map +1 -0
  84. package/src/generation/foliage/config/BarkMaterialConfig.js +250 -0
  85. package/src/generation/foliage/config/BranchLevelConfig.d.ts +288 -0
  86. package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +1 -0
  87. package/src/generation/foliage/config/BranchLevelConfig.js +536 -0
  88. package/src/generation/foliage/config/CrownConfig.d.ts +100 -0
  89. package/src/generation/foliage/config/CrownConfig.d.ts.map +1 -0
  90. package/src/generation/foliage/config/CrownConfig.js +186 -0
  91. package/src/generation/foliage/config/CrownEnvelopeType.d.ts +16 -0
  92. package/src/generation/foliage/config/CrownEnvelopeType.d.ts.map +1 -0
  93. package/src/generation/foliage/config/CrownEnvelopeType.js +17 -0
  94. package/src/generation/foliage/config/FoliageCardType.d.ts +12 -0
  95. package/src/generation/foliage/config/FoliageCardType.d.ts.map +1 -0
  96. package/src/generation/foliage/config/FoliageCardType.js +18 -0
  97. package/src/generation/foliage/config/FoliageConfig.d.ts +151 -0
  98. package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -0
  99. package/src/generation/foliage/config/FoliageConfig.js +283 -0
  100. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +90 -0
  101. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -0
  102. package/src/generation/foliage/config/FoliageMaterialConfig.js +181 -0
  103. package/src/generation/foliage/config/PhyllotaxisMode.d.ts +13 -0
  104. package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -0
  105. package/src/generation/foliage/config/PhyllotaxisMode.js +20 -0
  106. package/src/generation/foliage/config/TreeLODConfig.d.ts +87 -0
  107. package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -0
  108. package/src/generation/foliage/config/TreeLODConfig.js +211 -0
  109. package/src/generation/foliage/config/TreePreset.d.ts +16 -0
  110. package/src/generation/foliage/config/TreePreset.d.ts.map +1 -0
  111. package/src/generation/foliage/config/TreePreset.js +17 -0
  112. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +109 -0
  113. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -0
  114. package/src/generation/foliage/config/TreeSpeciesConfig.js +400 -0
  115. package/src/generation/foliage/config/TreeWindConfig.d.ts +84 -0
  116. package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -0
  117. package/src/generation/foliage/config/TreeWindConfig.js +157 -0
  118. package/src/generation/foliage/index.d.ts +38 -0
  119. package/src/generation/foliage/index.d.ts.map +1 -0
  120. package/src/generation/foliage/index.js +43 -0
  121. package/src/generation/foliage/material/make_bark_material.d.ts +37 -0
  122. package/src/generation/foliage/material/make_bark_material.d.ts.map +1 -0
  123. package/src/generation/foliage/material/make_bark_material.js +802 -0
  124. package/src/generation/foliage/material/make_foliage_material.d.ts +14 -0
  125. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -0
  126. package/src/generation/foliage/material/make_foliage_material.js +359 -0
  127. package/src/generation/foliage/mesh/branch_collar_project.d.ts +42 -0
  128. package/src/generation/foliage/mesh/branch_collar_project.d.ts.map +1 -0
  129. package/src/generation/foliage/mesh/branch_collar_project.js +203 -0
  130. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts +35 -0
  131. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts.map +1 -0
  132. package/src/generation/foliage/mesh/branch_ring_triangulate.js +72 -0
  133. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +80 -0
  134. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -0
  135. package/src/generation/foliage/mesh/foliage_collect_attachments.js +502 -0
  136. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts +19 -0
  137. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts.map +1 -0
  138. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.js +150 -0
  139. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts +55 -0
  140. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -0
  141. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1047 -0
  142. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +21 -0
  143. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -0
  144. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +415 -0
  145. package/src/generation/foliage/presets/make_tree_species_preset.d.ts +13 -0
  146. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -0
  147. package/src/generation/foliage/presets/make_tree_species_preset.js +837 -0
  148. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +443 -0
  149. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -0
  150. package/src/generation/foliage/skeleton/TreeSkeleton.js +1100 -0
  151. package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts +27 -0
  152. package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts.map +1 -0
  153. package/src/generation/foliage/skeleton/crown_envelope_evaluate.js +121 -0
  154. package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts +32 -0
  155. package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts.map +1 -0
  156. package/src/generation/foliage/skeleton/spine_frame_double_reflection.js +87 -0
  157. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +33 -0
  158. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -0
  159. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +205 -0
  160. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts +14 -0
  161. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -0
  162. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +179 -0
  163. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +18 -0
  164. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -0
  165. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +1104 -0
  166. package/src/shade/playground/additive_blending/index.html +197 -0
  167. package/src/shade/playground/additive_blending/main.d.ts +2 -0
  168. package/src/shade/playground/additive_blending/main.d.ts.map +1 -0
  169. package/src/shade/playground/additive_blending/main.js +529 -0
  170. package/src/shade/playground/foliage_wind/README.md +18 -0
  171. package/src/shade/playground/foliage_wind/foliage_world.d.ts +127 -0
  172. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -0
  173. package/src/shade/playground/foliage_wind/foliage_world.js +593 -0
  174. package/src/shade/playground/foliage_wind/index.html +254 -0
  175. package/src/shade/playground/foliage_wind/main.d.ts +2 -0
  176. package/src/shade/playground/foliage_wind/main.d.ts.map +1 -0
  177. package/src/shade/playground/foliage_wind/main.js +263 -0
  178. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  179. package/src/shade/renderer/Renderer.js +45 -16
  180. package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +145 -0
  181. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts +9 -1
  182. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts.map +1 -1
  183. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.js +53 -1
  184. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts +8 -0
  185. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts.map +1 -0
  186. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.js +71 -0
  187. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts +11 -0
  188. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts.map +1 -0
  189. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.js +32 -0
  190. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +30 -3
  191. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  192. package/src/shade/renderer/animation/GPUAnimationManager.js +532 -79
  193. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +19 -12
  194. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
  195. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +20 -13
  196. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +35 -8
  197. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
  198. package/src/shade/renderer/animation/ShadeAnimationClip.js +433 -2
  199. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
  200. package/src/shade/renderer/animation/chunk_pose_accumulator.js +40 -32
  201. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +97 -0
  202. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -0
  203. package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +161 -0
  204. package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts +65 -0
  205. package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts.map +1 -0
  206. package/src/shade/renderer/animation/foliage/FoliageWindRig.js +89 -0
  207. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts +19 -0
  208. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -0
  209. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +143 -0
  210. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts +14 -0
  211. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts.map +1 -0
  212. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.js +116 -0
  213. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
  214. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +39 -29
  215. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +37 -37
  216. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +2 -2
  217. package/src/shade/renderer/extension/RenderExtension.d.ts +7 -0
  218. package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
  219. package/src/shade/renderer/extension/RenderExtension.js +9 -0
  220. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +6 -0
  221. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
  222. package/src/shade/renderer/extension/RenderExtensionRegistry.js +15 -0
  223. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +7 -0
  224. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  225. package/src/shade/renderer/fluid/GPUFluidCascade.js +15 -0
  226. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +7 -0
  227. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
  228. package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +11 -0
  229. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  230. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +51 -48
  231. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -0
  232. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  233. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +16 -0
  234. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
  235. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +15 -3
  236. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
  237. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +102 -96
  238. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +12 -12
  239. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +12 -12
  240. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +7 -0
  241. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
  242. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +16 -0
  243. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts +7 -0
  244. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts.map +1 -1
  245. package/src/shade/renderer/fluid/publish/FluidWindPublish.js +10 -0
  246. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +2 -2
  247. package/src/shade/renderer/loader/SceneBundle.d.ts +7 -0
  248. package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
  249. package/src/shade/renderer/loader/SceneBundle.js +119 -111
  250. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts +4 -0
  251. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
  252. package/src/shade/renderer/material/standard/fragment_gbuffer.js +6 -5
  253. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +8 -7
  254. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
  255. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +9 -8
  256. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  257. package/src/shade/renderer/particles/GPUParticleSystem.js +3 -1
  258. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  259. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +9 -4
  260. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  261. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +9 -7
  262. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.d.ts.map +1 -1
  263. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.js +15 -7
  264. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -1
  265. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +6 -4
  266. package/src/shade/renderer/rasterize/native/oit/oit_resolve_fragment_body.js +3 -3
  267. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.d.ts.map +1 -1
  268. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +8 -5
  269. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  270. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +4 -3
  271. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1 -1
  272. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts +9 -0
  273. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts.map +1 -0
  274. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.js +17 -0
  275. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts +8 -0
  276. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts.map +1 -1
  277. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.js +28 -20
  278. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts +8 -0
  279. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts.map +1 -0
  280. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.js +15 -0
  281. package/src/shade/renderer/view/chunk_view_mip_bias.d.ts +21 -0
  282. package/src/shade/renderer/view/chunk_view_mip_bias.d.ts.map +1 -0
  283. package/src/shade/renderer/view/chunk_view_mip_bias.js +44 -0
  284. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +1 -1
  285. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  286. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +105 -26
  287. package/src/engine/graphics/composit/CompositingStages.d.ts +0 -6
  288. package/src/engine/graphics/composit/CompositingStages.d.ts.map +0 -1
  289. package/src/engine/graphics/composit/CompositingStages.js +0 -8
  290. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +0 -7
  291. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +0 -1
  292. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +0 -24
  293. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts +0 -8
  294. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts.map +0 -1
  295. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.js +0 -17
  296. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +0 -8
  297. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +0 -1
  298. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +0 -60
  299. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +0 -7
  300. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +0 -1
  301. package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +0 -26
  302. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +0 -7
  303. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +0 -1
  304. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +0 -23
  305. package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts +0 -7
  306. package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts.map +0 -1
  307. package/src/engine/graphics/geometry/instancing/geometry_copy.js +0 -15
  308. package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts +0 -2
  309. package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts.map +0 -1
  310. package/src/engine/graphics/geometry/instancing/rewriteMaterial.js +0 -57
  311. package/src/engine/graphics/geometry/ribbon/Quad.d.ts +0 -96
  312. package/src/engine/graphics/geometry/ribbon/Quad.d.ts.map +0 -1
  313. package/src/engine/graphics/geometry/ribbon/Quad.js +0 -213
  314. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +0 -9
  315. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +0 -1
  316. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +0 -12
  317. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +0 -10
  318. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +0 -1
  319. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +0 -17
  320. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +0 -10
  321. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +0 -1
  322. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +0 -13
  323. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +0 -11
  324. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +0 -1
  325. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +0 -24
  326. package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts +0 -6
  327. package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts.map +0 -1
  328. package/src/engine/graphics/geometry/ribbon/rotateRibbon.js +0 -37
  329. package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts +0 -9
  330. package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts.map +0 -1
  331. package/src/engine/graphics/geometry/ribbon/updateTipPosition.js +0 -52
  332. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts +0 -8
  333. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts.map +0 -1
  334. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.js +0 -54
  335. package/src/engine/graphics/render/RenderPassType.d.ts +0 -6
  336. package/src/engine/graphics/render/RenderPassType.d.ts.map +0 -1
  337. package/src/engine/graphics/render/RenderPassType.js +0 -8
  338. package/src/engine/graphics/render/layers/RenderLayer.d.ts +0 -78
  339. package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +0 -1
  340. package/src/engine/graphics/render/layers/RenderLayer.js +0 -95
  341. package/src/engine/graphics/render/layers/RenderLayerManager.d.ts +0 -72
  342. package/src/engine/graphics/render/layers/RenderLayerManager.d.ts.map +0 -1
  343. package/src/engine/graphics/render/layers/RenderLayerManager.js +0 -160
  344. package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts +0 -18
  345. package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts.map +0 -1
  346. package/src/engine/graphics/render/layers/RenderLayerManagerState.js +0 -48
  347. package/src/engine/graphics/render/layers/RenderLayerState.d.ts +0 -18
  348. package/src/engine/graphics/render/layers/RenderLayerState.d.ts.map +0 -1
  349. package/src/engine/graphics/render/layers/RenderLayerState.js +0 -27
  350. package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts +0 -8
  351. package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts.map +0 -1
  352. package/src/engine/graphics/render/layers/RenderLayerUtils.js +0 -103
  353. package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts +0 -10
  354. package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts.map +0 -1
  355. package/src/engine/graphics/render/make_bvh_visibility_builder.js +0 -64
  356. package/src/engine/graphics/render/view/CameraViewFlags.d.ts +0 -7
  357. package/src/engine/graphics/render/view/CameraViewFlags.d.ts.map +0 -1
  358. package/src/engine/graphics/render/view/CameraViewFlags.js +0 -9
  359. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts +0 -143
  360. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts.map +0 -1
  361. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.js +0 -328
  362. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +0 -39
  363. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts.map +0 -1
  364. package/src/engine/graphics/render/visibility/VisibilityComputer.js +0 -80
  365. package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts +0 -29
  366. package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts.map +0 -1
  367. package/src/engine/graphics/render/visibility/VisibilityFilter.js +0 -37
  368. package/src/engine/graphics3/animation/write_graph_playback.d.ts +0 -24
  369. package/src/engine/graphics3/animation/write_graph_playback.d.ts.map +0 -1
  370. package/src/engine/graphics3/animation/write_graph_playback.js +0 -48
@@ -11,22 +11,27 @@
11
11
  * Per-axis dirty bits live in a single dirty u32 (atomicOr to set,
12
12
  * atomicLoad in resolve, atomicStore(0) to clear).
13
13
  *
14
- * Layout in u32 indices (slot stride = 16 u32s = 64 bytes — one u32 of
15
- * tail padding gives the slot a power-of-two stride so addressing is a
14
+ * Layout in u32 indices (slot stride = 32 u32s = 128 bytes — 11 u32s of
15
+ * tail padding give the slot a power-of-two stride so addressing is a
16
16
  * shift, not a multiply):
17
17
  *
18
- * [0..3] translation.xyz (3 atomic<u32>, f32 bitcast)
19
- * [3..7] rotation.xyzw (4 atomic<u32>, f32 bitcast)
20
- * [7..10] scale.xyz (3 atomic<u32>, f32 bitcast)
18
+ * [0..3] translation.xyz (3 atomic<u32>, f32 bitcast, weighted delta from rest)
19
+ * [3..7] rotation.xyzw (4 atomic<u32>, f32 bitcast, weighted delta from rest)
20
+ * [7..10] scale.xyz (3 atomic<u32>, f32 bitcast, weighted delta from rest)
21
21
  * [10] dirty_mask (atomic<u32>, see flag bits below)
22
22
  * [11..15] rest_rotation.xyzw (4 atomic<u32>, f32 bitcast)
23
- * [15] padding
23
+ * [15..18] rest_translation.xyz (3 atomic<u32>, f32 bitcast)
24
+ * [18..21] rest_scale.xyz (3 atomic<u32>, f32 bitcast)
25
+ * [21..32] padding
24
26
  *
25
- * `rest_rotation` is not a sum. Every rotation contribution stores its
26
- * target's rest rotation there, whatever its weight, and the resolve
27
- * writes it to the row when the rotation sum has length zero. It is not
28
- * drained: a row is only rotation-dirty in a frame some contribution
29
- * stored it afresh.
27
+ * `rest_rotation`, `rest_translation`, and `rest_scale` are not sums.
28
+ * Every contribution stores its target's rest value there, whatever its
29
+ * weight, and the resolve adds the accumulated delta to the rest value:
30
+ * V_final = V_rest + sum(w_i * (V_i - V_rest))
31
+ * Because every clip accumulates a delta from rest, normal blending
32
+ * (weights summing to 1), fade-to-rest (single clip with weight < 1),
33
+ * and additive layering (any number of extra clips on top of a base pose)
34
+ * all use the exact same equation with zero runtime mode flags.
30
35
  *
31
36
  * `dirty_mask` bit layout:
32
37
  * bits 0–2: translation x/y/z written this frame
@@ -42,7 +47,7 @@
42
47
  */
43
48
  /**
44
49
  * u32-stride per pose-accumulator slot. Picked to be a power of two so
45
- * `row << 4` works as the slot offset. 15 u32s are used, 1 is padding.
50
+ * `row << 5` works as the slot offset. 21 u32s are used, 11 are padding.
46
51
  * @type {number}
47
52
  */
48
53
  export const POSE_ACCUMULATOR_STRIDE: number;
@@ -59,6 +64,8 @@ export const POSE_ACCUMULATOR_OFFSET_ROTATION: 3;
59
64
  export const POSE_ACCUMULATOR_OFFSET_SCALE: 7;
60
65
  export const POSE_ACCUMULATOR_OFFSET_DIRTY: 10;
61
66
  export const POSE_ACCUMULATOR_OFFSET_REST_ROTATION: 11;
67
+ export const POSE_ACCUMULATOR_OFFSET_REST_TRANSLATION: 15;
68
+ export const POSE_ACCUMULATOR_OFFSET_REST_SCALE: 18;
62
69
  /**
63
70
  * Dirty-mask bit layout. Per-axis for T/S, single bit for R.
64
71
  */
@@ -1 +1 @@
1
- {"version":3,"file":"POSE_ACCUMULATOR_LAYOUT.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH;;;;GAIG;AACH,sCAFU,MAAM,CAE0B;AAE1C;;;;;GAKG;AACH,0CAFU,MAAM,CAEuD;AAEvE,gDAAgD;AAChD,oDAAqD;AACrD,iDAAkD;AAClD,8CAA+C;AAC/C,+CAAgD;AAChD,uDAAwD;AAExD;;GAEG;AACH,mCAAoC;AACpC,mCAAoC;AACpC,mCAAoC;AACpC,kCAAmC;AACnC,mCAAoC;AACpC,mCAAoC;AACpC,mCAAoC"}
1
+ {"version":3,"file":"POSE_ACCUMULATOR_LAYOUT.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH;;;;GAIG;AACH,sCAFU,MAAM,CAE0B;AAE1C;;;;;GAKG;AACH,0CAFU,MAAM,CAEuD;AAEvE,gDAAgD;AAChD,oDAAqD;AACrD,iDAAkD;AAClD,8CAA+C;AAC/C,+CAAgD;AAChD,uDAAwD;AACxD,0DAA2D;AAC3D,oDAAqD;AAErD;;GAEG;AACH,mCAAoC;AACpC,mCAAoC;AACpC,mCAAoC;AACpC,kCAAmC;AACnC,mCAAoC;AACpC,mCAAoC;AACpC,mCAAoC"}
@@ -11,22 +11,27 @@
11
11
  * Per-axis dirty bits live in a single dirty u32 (atomicOr to set,
12
12
  * atomicLoad in resolve, atomicStore(0) to clear).
13
13
  *
14
- * Layout in u32 indices (slot stride = 16 u32s = 64 bytes — one u32 of
15
- * tail padding gives the slot a power-of-two stride so addressing is a
14
+ * Layout in u32 indices (slot stride = 32 u32s = 128 bytes — 11 u32s of
15
+ * tail padding give the slot a power-of-two stride so addressing is a
16
16
  * shift, not a multiply):
17
17
  *
18
- * [0..3] translation.xyz (3 atomic<u32>, f32 bitcast)
19
- * [3..7] rotation.xyzw (4 atomic<u32>, f32 bitcast)
20
- * [7..10] scale.xyz (3 atomic<u32>, f32 bitcast)
18
+ * [0..3] translation.xyz (3 atomic<u32>, f32 bitcast, weighted delta from rest)
19
+ * [3..7] rotation.xyzw (4 atomic<u32>, f32 bitcast, weighted delta from rest)
20
+ * [7..10] scale.xyz (3 atomic<u32>, f32 bitcast, weighted delta from rest)
21
21
  * [10] dirty_mask (atomic<u32>, see flag bits below)
22
22
  * [11..15] rest_rotation.xyzw (4 atomic<u32>, f32 bitcast)
23
- * [15] padding
23
+ * [15..18] rest_translation.xyz (3 atomic<u32>, f32 bitcast)
24
+ * [18..21] rest_scale.xyz (3 atomic<u32>, f32 bitcast)
25
+ * [21..32] padding
24
26
  *
25
- * `rest_rotation` is not a sum. Every rotation contribution stores its
26
- * target's rest rotation there, whatever its weight, and the resolve
27
- * writes it to the row when the rotation sum has length zero. It is not
28
- * drained: a row is only rotation-dirty in a frame some contribution
29
- * stored it afresh.
27
+ * `rest_rotation`, `rest_translation`, and `rest_scale` are not sums.
28
+ * Every contribution stores its target's rest value there, whatever its
29
+ * weight, and the resolve adds the accumulated delta to the rest value:
30
+ * V_final = V_rest + sum(w_i * (V_i - V_rest))
31
+ * Because every clip accumulates a delta from rest, normal blending
32
+ * (weights summing to 1), fade-to-rest (single clip with weight < 1),
33
+ * and additive layering (any number of extra clips on top of a base pose)
34
+ * all use the exact same equation with zero runtime mode flags.
30
35
  *
31
36
  * `dirty_mask` bit layout:
32
37
  * bits 0–2: translation x/y/z written this frame
@@ -43,10 +48,10 @@
43
48
 
44
49
  /**
45
50
  * u32-stride per pose-accumulator slot. Picked to be a power of two so
46
- * `row << 4` works as the slot offset. 15 u32s are used, 1 is padding.
51
+ * `row << 5` works as the slot offset. 21 u32s are used, 11 are padding.
47
52
  * @type {number}
48
53
  */
49
- export const POSE_ACCUMULATOR_STRIDE = 16;
54
+ export const POSE_ACCUMULATOR_STRIDE = 32;
50
55
 
51
56
  /**
52
57
  * Byte size of one slot. Convenience for buffer-size math; the GPU
@@ -62,6 +67,8 @@ export const POSE_ACCUMULATOR_OFFSET_ROTATION = 3;
62
67
  export const POSE_ACCUMULATOR_OFFSET_SCALE = 7;
63
68
  export const POSE_ACCUMULATOR_OFFSET_DIRTY = 10;
64
69
  export const POSE_ACCUMULATOR_OFFSET_REST_ROTATION = 11;
70
+ export const POSE_ACCUMULATOR_OFFSET_REST_TRANSLATION = 15;
71
+ export const POSE_ACCUMULATOR_OFFSET_REST_SCALE = 18;
65
72
 
66
73
  /**
67
74
  * Dirty-mask bit layout. Per-axis for T/S, single bit for R.
@@ -1,9 +1,3 @@
1
- /**
2
- * @typedef {import("../../../engine/ecs/transform/Transform64.js").Transform64} Transform64
3
- */
4
- /**
5
- * @typedef {import("./ShadeAnimationChannel.js").ShadeAnimationChannel} ShadeAnimationChannel
6
- */
7
1
  /**
8
2
  * A bundle of {@link ShadeAnimationChannel}s sharing one playback
9
3
  * clock — the GPU-driven equivalent of an animation "clip". Each
@@ -32,6 +26,39 @@ export class ShadeAnimationClip {
32
26
  name?: string;
33
27
  channels: ShadeAnimationChannel[];
34
28
  }): ShadeAnimationClip;
29
+ /**
30
+ * Build a rest-anchored additive clip by extracting the motion delta of `source_clip`
31
+ * relative to `reference_clip` sampled at `reference_time`, rebased onto each target's
32
+ * rest pose (`rest_of`).
33
+ *
34
+ * Because the runtime pose pipeline accumulates rest-anchored deltas
35
+ * (`V_final = V_rest + sum(w_i * (V_i(t) - V_rest))`), rebasing `source_clip` so that
36
+ * its delta from `V_rest` equals its authored delta from `V_ref` requires zero runtime
37
+ * flags or shader branches:
38
+ * - Translation: `T_rebased(t) = T_rest + (T_src(t) - T_ref)`
39
+ * - Scale: `S_rebased(t) = S_rest + (S_src(t) - S_ref)`
40
+ * - Rotation: `R_rebased(t) = (R_rest * R_ref^-1) * R_src(t)`, sign-canonicalised
41
+ * against `R_rest` via {@link quat3_canonicalize_sign_run}
42
+ *
43
+ * Any per-axis curve or rotation channel whose delta from `V_ref` is constant zero across
44
+ * the clip is automatically stripped. This means an upper-body gesture exported as a
45
+ * full-body clip where the lower body stands still at the reference frame automatically
46
+ * drops all lower-body bindings without needing a bone mask.
47
+ *
48
+ * @param {ShadeAnimationClip} source_clip
49
+ * @param {object} [options]
50
+ * @param {ShadeAnimationClip} [options.reference_clip=source_clip] clip to sample the reference pose from
51
+ * @param {number} [options.reference_time] time within `reference_clip` (defaults to `reference_clip.start_time`)
52
+ * @param {function(number): (Transform64|undefined)} [options.rest_of] target node rest transform lookup
53
+ * @param {string} [options.name] optional name for the resulting clip
54
+ * @returns {ShadeAnimationClip}
55
+ */
56
+ static from_additive(source_clip: ShadeAnimationClip, { reference_clip, reference_time, rest_of, name, }?: {
57
+ reference_clip?: ShadeAnimationClip;
58
+ reference_time?: number;
59
+ rest_of?: (arg0: number) => (Transform64 | undefined);
60
+ name?: string;
61
+ }): ShadeAnimationClip;
35
62
  /**
36
63
  * Human-readable name. Optional; empty by default.
37
64
  *
@@ -134,6 +161,6 @@ export class ShadeAnimationClip {
134
161
  */
135
162
  readonly isShadeAnimationClip: boolean;
136
163
  }
137
- export type Transform64 = import("../../../engine/ecs/transform/Transform64.js").Transform64;
138
- export type ShadeAnimationChannel = import("./ShadeAnimationChannel.js").ShadeAnimationChannel;
164
+ import { ShadeAnimationChannel } from "./ShadeAnimationChannel.js";
165
+ import { Transform64 } from "../../../engine/ecs/transform/Transform64.js";
139
166
  //# sourceMappingURL=ShadeAnimationClip.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ShadeAnimationClip.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/ShadeAnimationClip.js"],"names":[],"mappings":"AAEA;;GAEG;AAEH;;GAEG;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH;IA+DI;;;OAGG;IACH,gCAHW;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,qBAAqB,EAAE,CAAA;KAAE,GAClD,kBAAkB,CAU9B;IAzED;;;;OAIG;IACH,MAFU,MAAM,CAEN;IAEV;;;;;;OAMG;IACH,UAFU,qBAAqB,EAAE,CAEnB;IAEd;;;;;OAKG;IACH,yBAWC;IAED;;;;;OAKG;IACH,uBAWC;IAED;;OAEG;IACH,uBAEC;IAgBD;;;;;;;;;;;;;;OAcG;IACH,YAFW,kBAAkB,QAY5B;IAED;;;;;OAKG;IACH,SAFa,kBAAkB,CAM9B;IAED;;;;;;;;;;;;;;;OAeG;IACH,SAHW,MAAM,uBACG,MAAM,KAAG,WAAW,QAYvC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,0BAHoB,MAAM,KAAG,CAAC,WAAW,GAAC,SAAS,CAAC,QAcnD;IAGL;;;OAGG;IACH,+BAFU,OAAO,CAEgC;CANhD;0BA7MY,OAAO,8CAA8C,EAAE,WAAW;oCAIlE,OAAO,4BAA4B,EAAE,qBAAqB"}
1
+ {"version":3,"file":"ShadeAnimationClip.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/ShadeAnimationClip.js"],"names":[],"mappings":"AA6TA;;;;;;;;;;;;;;;;;;GAkBG;AACH;IA+DI;;;OAGG;IACH,gCAHW;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,qBAAqB,EAAE,CAAA;KAAE,GAClD,kBAAkB,CAU9B;IAyGD;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,kCARW,kBAAkB;QAEW,cAAc,GAA3C,kBAAkB;QACD,cAAc,GAA/B,MAAM;QAC8C,OAAO,UAAlD,MAAM,KAAG,CAAC,WAAW,GAAC,SAAS,CAAC;QACxB,IAAI,GAArB,MAAM;QACJ,kBAAkB,CAiG9B;IA5SD;;;;OAIG;IACH,MAFU,MAAM,CAEN;IAEV;;;;;;OAMG;IACH,UAFU,qBAAqB,EAAE,CAEnB;IAEd;;;;;OAKG;IACH,yBAWC;IAED;;;;;OAKG;IACH,uBAWC;IAED;;OAEG;IACH,uBAEC;IAgBD;;;;;;;;;;;;;;OAcG;IACH,YAFW,kBAAkB,QAY5B;IAED;;;;;OAKG;IACH,SAFa,kBAAkB,CAM9B;IAED;;;;;;;;;;;;;;;OAeG;IACH,SAHW,MAAM,uBACG,MAAM,KAAG,WAAW,QAYvC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,0BAHoB,MAAM,KAAG,CAAC,WAAW,GAAC,SAAS,CAAC,QAcnD;IA+HL;;;OAGG;IACH,+BAFU,OAAO,CAEgC;CANhD;sCAxnBqC,4BAA4B;4BAFtC,8CAA8C"}
@@ -1,12 +1,319 @@
1
1
  import { assert } from "../../../core/assert.js";
2
+ import { quat3_canonicalize_sign_run } from "../../../core/geom/3d/quaternion/quat3_canonicalize_sign_run.js";
3
+ import { AnimationCurve } from "../../../engine/animation/curve/AnimationCurve.js";
4
+ import { animation_curve_optimize } from "../../../engine/animation/curve/animation_curve_optimize.js";
5
+ import { Keyframe } from "../../../engine/animation/curve/Keyframe.js";
6
+ import { Transform64 } from "../../../engine/ecs/transform/Transform64.js";
7
+ import { Node3DProperty } from "../object_property/Node3DProperty.js";
8
+ import { ShadeAnimationChannel } from "./ShadeAnimationChannel.js";
9
+
10
+ const ADDITIVE_EPSILON = 1e-5;
11
+ const DEFAULT_REST = new Transform64();
2
12
 
3
13
  /**
4
- * @typedef {import("../../../engine/ecs/transform/Transform64.js").Transform64} Transform64
14
+ * @param {AnimationCurve} curve
15
+ * @param {number} expected_value
16
+ * @returns {boolean}
17
+ */
18
+ function is_curve_constant_at(curve, expected_value) {
19
+ const keys = curve.keys;
20
+ for (let i = 0; i < keys.length; i++) {
21
+ const k = keys[i];
22
+ if (Math.abs(k.value - expected_value) > ADDITIVE_EPSILON) return false;
23
+ if (Math.abs(k.inTangent) > ADDITIVE_EPSILON) return false;
24
+ if (Math.abs(k.outTangent) > ADDITIVE_EPSILON) return false;
25
+ }
26
+ return true;
27
+ }
28
+
29
+ /**
30
+ * Clone a scalar curve and shift every keyframe's value by `offset`.
31
+ * Returns `undefined` when the resulting curve is constant at `rest_value`.
32
+ *
33
+ * @param {AnimationCurve|undefined} curve
34
+ * @param {number} offset
35
+ * @param {number} rest_value
36
+ * @returns {AnimationCurve|undefined}
5
37
  */
38
+ function rebase_scalar_curve(curve, offset, rest_value) {
39
+ if (curve === undefined) {
40
+ return undefined;
41
+ }
42
+
43
+ const rebased = curve.clone();
44
+ if (offset !== 0) {
45
+ const keys = rebased.keys;
46
+ for (let i = 0; i < keys.length; i++) {
47
+ keys[i].value += offset;
48
+ }
49
+ }
50
+
51
+ if (is_curve_constant_at(rebased, rest_value)) {
52
+ return undefined;
53
+ }
54
+
55
+ animation_curve_optimize(rebased);
56
+ return rebased;
57
+ }
58
+
59
+ /**
60
+ * Collect sorted unique keyframe timestamps across a rotation channel's curves,
61
+ * and check whether all four curves are present with identical timestamps.
62
+ *
63
+ * @param {import("./ShadeAnimationChannel.js").ChannelCurves} curves
64
+ * @returns {{ aligned: boolean, times: number[] }}
65
+ */
66
+ function collect_rotation_times(curves) {
67
+ const present = [];
68
+ if (curves.x !== undefined) present.push(curves.x);
69
+ if (curves.y !== undefined) present.push(curves.y);
70
+ if (curves.z !== undefined) present.push(curves.z);
71
+ if (curves.w !== undefined) present.push(curves.w);
72
+
73
+ if (present.length === 0) {
74
+ return { aligned: true, times: [] };
75
+ }
76
+
77
+ const first_keys = present[0].keys;
78
+ const n = first_keys.length;
79
+ let aligned = true;
80
+ for (let c = 1; c < present.length; c++) {
81
+ if (present[c].keys.length !== n) {
82
+ aligned = false;
83
+ break;
84
+ }
85
+ }
86
+
87
+ if (aligned) {
88
+ const times = new Array(n);
89
+ for (let i = 0; i < n; i++) {
90
+ const t = first_keys[i].time;
91
+ for (let c = 1; c < present.length; c++) {
92
+ if (present[c].keys[i].time !== t) {
93
+ aligned = false;
94
+ break;
95
+ }
96
+ }
97
+ if (!aligned) break;
98
+ times[i] = t;
99
+ }
100
+ if (aligned) {
101
+ return { aligned: true, times };
102
+ }
103
+ }
104
+
105
+ const time_set = new Set();
106
+ for (let c = 0; c < present.length; c++) {
107
+ const keys = present[c].keys;
108
+ for (let i = 0; i < keys.length; i++) {
109
+ time_set.add(keys[i].time);
110
+ }
111
+ }
112
+
113
+ const times = Array.from(time_set);
114
+ times.sort((a, b) => a - b);
115
+ return { aligned: false, times };
116
+ }
6
117
 
7
118
  /**
8
- * @typedef {import("./ShadeAnimationChannel.js").ShadeAnimationChannel} ShadeAnimationChannel
119
+ * Hamilton product `q * v` written into `out` at `offset`.
120
+ *
121
+ * @param {Float64Array} out
122
+ * @param {number} offset
123
+ * @param {number} qx
124
+ * @param {number} qy
125
+ * @param {number} qz
126
+ * @param {number} qw
127
+ * @param {number} vx
128
+ * @param {number} vy
129
+ * @param {number} vz
130
+ * @param {number} vw
9
131
  */
132
+ function quat_mul_into(out, offset, qx, qy, qz, qw, vx, vy, vz, vw) {
133
+ out[offset + 0] = qw * vx + qx * vw + qy * vz - qz * vy;
134
+ out[offset + 1] = qw * vy - qx * vz + qy * vw + qz * vx;
135
+ out[offset + 2] = qw * vz + qx * vy - qy * vx + qz * vw;
136
+ out[offset + 3] = qw * vw - qx * vx - qy * vy - qz * vz;
137
+ }
138
+
139
+ /**
140
+ * Rebase a rotation channel from its reference orientation `ref_pose` onto `rest`.
141
+ * Returns `undefined` when the rebased rotation is constant at `rest`.
142
+ *
143
+ * @param {ShadeAnimationChannel} channel
144
+ * @param {Transform64} ref_pose
145
+ * @param {Transform64} rest
146
+ * @returns {ShadeAnimationChannel|undefined}
147
+ */
148
+ function rebase_rotation_channel(channel, ref_pose, rest) {
149
+ const curves = channel.curves;
150
+ const { aligned, times } = collect_rotation_times(curves);
151
+ const key_count = times.length;
152
+ if (key_count === 0) {
153
+ return undefined;
154
+ }
155
+
156
+ const rest_rx = rest.rotation_x;
157
+ const rest_ry = rest.rotation_y;
158
+ const rest_rz = rest.rotation_z;
159
+ const rest_rw = rest.rotation_w;
160
+
161
+ const ref_rx = ref_pose.rotation_x;
162
+ const ref_ry = ref_pose.rotation_y;
163
+ const ref_rz = ref_pose.rotation_z;
164
+ const ref_rw = ref_pose.rotation_w;
165
+
166
+ // Q_shift = R_rest * (R_ref)^-1, where (R_ref)^-1 = (-ref_rx, -ref_ry, -ref_rz, ref_rw).
167
+ // Left-multiplying R_src(t) = R_ref * delta_R(t) by Q_shift yields R_rest * delta_R(t).
168
+ let sx = rest_rw * (-ref_rx) + rest_rx * ref_rw + rest_ry * (-ref_rz) - rest_rz * (-ref_ry);
169
+ let sy = rest_rw * (-ref_ry) - rest_rx * (-ref_rz) + rest_ry * ref_rw + rest_rz * (-ref_rx);
170
+ let sz = rest_rw * (-ref_rz) + rest_rx * (-ref_ry) - rest_ry * (-ref_rx) + rest_rz * ref_rw;
171
+ let sw = rest_rw * ref_rw - rest_rx * (-ref_rx) - rest_ry * (-ref_ry) - rest_rz * (-ref_rz);
172
+ const s_len = Math.hypot(sx, sy, sz, sw);
173
+ if (s_len > 0) {
174
+ sx /= s_len;
175
+ sy /= s_len;
176
+ sz /= s_len;
177
+ sw /= s_len;
178
+ } else {
179
+ sx = 0;
180
+ sy = 0;
181
+ sz = 0;
182
+ sw = 1;
183
+ }
184
+
185
+ // Each keyframe block holds 12 floats: [inTangent(4), value(4), outTangent(4)].
186
+ const blocks = new Float64Array(key_count * 12);
187
+
188
+ if (aligned) {
189
+ const kx = curves.x !== undefined ? curves.x.keys : undefined;
190
+ const ky = curves.y !== undefined ? curves.y.keys : undefined;
191
+ const kz = curves.z !== undefined ? curves.z.keys : undefined;
192
+ const kw = curves.w !== undefined ? curves.w.keys : undefined;
193
+
194
+ for (let k = 0; k < key_count; k++) {
195
+ const base = k * 12;
196
+ const ix = kx !== undefined ? kx[k].inTangent : 0;
197
+ const iy = ky !== undefined ? ky[k].inTangent : 0;
198
+ const iz = kz !== undefined ? kz[k].inTangent : 0;
199
+ const iw = kw !== undefined ? kw[k].inTangent : 0;
200
+
201
+ const vx = kx !== undefined ? kx[k].value : 0;
202
+ const vy = ky !== undefined ? ky[k].value : 0;
203
+ const vz = kz !== undefined ? kz[k].value : 0;
204
+ const vw = kw !== undefined ? kw[k].value : 1;
205
+
206
+ const ox = kx !== undefined ? kx[k].outTangent : 0;
207
+ const oy = ky !== undefined ? ky[k].outTangent : 0;
208
+ const oz = kz !== undefined ? kz[k].outTangent : 0;
209
+ const ow = kw !== undefined ? kw[k].outTangent : 0;
210
+
211
+ quat_mul_into(blocks, base + 0, sx, sy, sz, sw, ix, iy, iz, iw);
212
+ quat_mul_into(blocks, base + 4, sx, sy, sz, sw, vx, vy, vz, vw);
213
+ quat_mul_into(blocks, base + 8, sx, sy, sz, sw, ox, oy, oz, ow);
214
+
215
+ const v_len = Math.hypot(blocks[base + 4], blocks[base + 5], blocks[base + 6], blocks[base + 7]);
216
+ if (v_len > 0 && Math.abs(v_len - 1) > 1e-6) {
217
+ const inv = 1 / v_len;
218
+ for (let j = 0; j < 12; j++) {
219
+ blocks[base + j] *= inv;
220
+ }
221
+ }
222
+ }
223
+ } else {
224
+ const cx = curves.x;
225
+ const cy = curves.y;
226
+ const cz = curves.z;
227
+ const cw = curves.w;
228
+
229
+ for (let k = 0; k < key_count; k++) {
230
+ const t = times[k];
231
+ const base = k * 12;
232
+ const vx = cx !== undefined ? cx.evaluate(t) : 0;
233
+ const vy = cy !== undefined ? cy.evaluate(t) : 0;
234
+ const vz = cz !== undefined ? cz.evaluate(t) : 0;
235
+ const vw = cw !== undefined ? cw.evaluate(t) : 1;
236
+
237
+ quat_mul_into(blocks, base + 4, sx, sy, sz, sw, vx, vy, vz, vw);
238
+ const v_len = Math.hypot(blocks[base + 4], blocks[base + 5], blocks[base + 6], blocks[base + 7]);
239
+ if (v_len > 0) {
240
+ const inv = 1 / v_len;
241
+ blocks[base + 4] *= inv;
242
+ blocks[base + 5] *= inv;
243
+ blocks[base + 6] *= inv;
244
+ blocks[base + 7] *= inv;
245
+ }
246
+ }
247
+ }
248
+
249
+ quat3_canonicalize_sign_run(blocks, key_count, 12, 4, {
250
+ x: rest_rx,
251
+ y: rest_ry,
252
+ z: rest_rz,
253
+ w: rest_rw,
254
+ });
255
+
256
+ let is_constant_rest = true;
257
+ for (let k = 0; k < key_count; k++) {
258
+ const base = k * 12;
259
+ if (
260
+ Math.abs(blocks[base + 4] - rest_rx) > ADDITIVE_EPSILON ||
261
+ Math.abs(blocks[base + 5] - rest_ry) > ADDITIVE_EPSILON ||
262
+ Math.abs(blocks[base + 6] - rest_rz) > ADDITIVE_EPSILON ||
263
+ Math.abs(blocks[base + 7] - rest_rw) > ADDITIVE_EPSILON ||
264
+ Math.abs(blocks[base + 0]) > ADDITIVE_EPSILON ||
265
+ Math.abs(blocks[base + 1]) > ADDITIVE_EPSILON ||
266
+ Math.abs(blocks[base + 2]) > ADDITIVE_EPSILON ||
267
+ Math.abs(blocks[base + 3]) > ADDITIVE_EPSILON ||
268
+ Math.abs(blocks[base + 8]) > ADDITIVE_EPSILON ||
269
+ Math.abs(blocks[base + 9]) > ADDITIVE_EPSILON ||
270
+ Math.abs(blocks[base + 10]) > ADDITIVE_EPSILON ||
271
+ Math.abs(blocks[base + 11]) > ADDITIVE_EPSILON
272
+ ) {
273
+ is_constant_rest = false;
274
+ break;
275
+ }
276
+ }
277
+
278
+ if (is_constant_rest) {
279
+ return undefined;
280
+ }
281
+
282
+ const keys_x = new Array(key_count);
283
+ const keys_y = new Array(key_count);
284
+ const keys_z = new Array(key_count);
285
+ const keys_w = new Array(key_count);
286
+
287
+ for (let k = 0; k < key_count; k++) {
288
+ const t = times[k];
289
+ const base = k * 12;
290
+ keys_x[k] = Keyframe.from(t, blocks[base + 4], blocks[base + 0], blocks[base + 8]);
291
+ keys_y[k] = Keyframe.from(t, blocks[base + 5], blocks[base + 1], blocks[base + 9]);
292
+ keys_z[k] = Keyframe.from(t, blocks[base + 6], blocks[base + 2], blocks[base + 10]);
293
+ keys_w[k] = Keyframe.from(t, blocks[base + 7], blocks[base + 3], blocks[base + 11]);
294
+ }
295
+
296
+ const rx_curve = AnimationCurve.from(keys_x);
297
+ const ry_curve = AnimationCurve.from(keys_y);
298
+ const rz_curve = AnimationCurve.from(keys_z);
299
+ const rw_curve = AnimationCurve.from(keys_w);
300
+
301
+ animation_curve_optimize(rx_curve);
302
+ animation_curve_optimize(ry_curve);
303
+ animation_curve_optimize(rz_curve);
304
+ animation_curve_optimize(rw_curve);
305
+
306
+ return ShadeAnimationChannel.from({
307
+ target: channel.target,
308
+ property: Node3DProperty.Rotation,
309
+ curves: {
310
+ x: rx_curve,
311
+ y: ry_curve,
312
+ z: rz_curve,
313
+ w: rw_curve,
314
+ },
315
+ });
316
+ }
10
317
 
11
318
  /**
12
319
  * A bundle of {@link ShadeAnimationChannel}s sharing one playback
@@ -206,6 +513,130 @@ export class ShadeAnimationClip {
206
513
  }
207
514
  this.channels = kept;
208
515
  }
516
+
517
+ /**
518
+ * Build a rest-anchored additive clip by extracting the motion delta of `source_clip`
519
+ * relative to `reference_clip` sampled at `reference_time`, rebased onto each target's
520
+ * rest pose (`rest_of`).
521
+ *
522
+ * Because the runtime pose pipeline accumulates rest-anchored deltas
523
+ * (`V_final = V_rest + sum(w_i * (V_i(t) - V_rest))`), rebasing `source_clip` so that
524
+ * its delta from `V_rest` equals its authored delta from `V_ref` requires zero runtime
525
+ * flags or shader branches:
526
+ * - Translation: `T_rebased(t) = T_rest + (T_src(t) - T_ref)`
527
+ * - Scale: `S_rebased(t) = S_rest + (S_src(t) - S_ref)`
528
+ * - Rotation: `R_rebased(t) = (R_rest * R_ref^-1) * R_src(t)`, sign-canonicalised
529
+ * against `R_rest` via {@link quat3_canonicalize_sign_run}
530
+ *
531
+ * Any per-axis curve or rotation channel whose delta from `V_ref` is constant zero across
532
+ * the clip is automatically stripped. This means an upper-body gesture exported as a
533
+ * full-body clip where the lower body stands still at the reference frame automatically
534
+ * drops all lower-body bindings without needing a bone mask.
535
+ *
536
+ * @param {ShadeAnimationClip} source_clip
537
+ * @param {object} [options]
538
+ * @param {ShadeAnimationClip} [options.reference_clip=source_clip] clip to sample the reference pose from
539
+ * @param {number} [options.reference_time] time within `reference_clip` (defaults to `reference_clip.start_time`)
540
+ * @param {function(number): (Transform64|undefined)} [options.rest_of] target node rest transform lookup
541
+ * @param {string} [options.name] optional name for the resulting clip
542
+ * @returns {ShadeAnimationClip}
543
+ */
544
+ static from_additive(
545
+ source_clip,
546
+ {
547
+ reference_clip = source_clip,
548
+ reference_time,
549
+ rest_of,
550
+ name,
551
+ } = {}
552
+ ) {
553
+ assert.defined(source_clip, 'source_clip');
554
+ assert.equal(source_clip.isShadeAnimationClip, true, 'source_clip.isShadeAnimationClip !== true');
555
+ assert.defined(reference_clip, 'reference_clip');
556
+ assert.equal(reference_clip.isShadeAnimationClip, true, 'reference_clip.isShadeAnimationClip !== true');
557
+
558
+ const ref_time = reference_time !== undefined ? reference_time : reference_clip.start_time;
559
+
560
+ /** @type {Map<number, { rest: Transform64, ref: Transform64 }>} */
561
+ const poses_by_target = new Map();
562
+
563
+ const src_channels = source_clip.channels;
564
+ for (let i = 0; i < src_channels.length; i++) {
565
+ const target = src_channels[i].target;
566
+ if (!poses_by_target.has(target)) {
567
+ const rest = (rest_of !== undefined ? rest_of(target) : undefined) ?? DEFAULT_REST;
568
+ const ref = new Transform64();
569
+ ref.copy(rest);
570
+ poses_by_target.set(target, { rest, ref });
571
+ }
572
+ }
573
+
574
+ const ref_channels = reference_clip.channels;
575
+ for (let i = 0; i < ref_channels.length; i++) {
576
+ const ref_ch = ref_channels[i];
577
+ const entry = poses_by_target.get(ref_ch.target);
578
+ if (entry !== undefined) {
579
+ ref_ch.apply(ref_time, entry.ref);
580
+ }
581
+ }
582
+
583
+ const out_channels = [];
584
+
585
+ for (let i = 0; i < src_channels.length; i++) {
586
+ const ch = src_channels[i];
587
+ const { rest, ref } = poses_by_target.get(ch.target);
588
+
589
+ switch (ch.property) {
590
+ case Node3DProperty.Translation: {
591
+ const curves = ch.curves;
592
+ const x = rebase_scalar_curve(curves.x, rest.translation_x - ref.translation_x, rest.translation_x);
593
+ const y = rebase_scalar_curve(curves.y, rest.translation_y - ref.translation_y, rest.translation_y);
594
+ const z = rebase_scalar_curve(curves.z, rest.translation_z - ref.translation_z, rest.translation_z);
595
+
596
+ if (x !== undefined || y !== undefined || z !== undefined) {
597
+ out_channels.push(ShadeAnimationChannel.from({
598
+ target: ch.target,
599
+ property: Node3DProperty.Translation,
600
+ curves: { x, y, z },
601
+ }));
602
+ }
603
+ break;
604
+ }
605
+
606
+ case Node3DProperty.Scale: {
607
+ const curves = ch.curves;
608
+ const x = rebase_scalar_curve(curves.x, rest.scale_x - ref.scale_x, rest.scale_x);
609
+ const y = rebase_scalar_curve(curves.y, rest.scale_y - ref.scale_y, rest.scale_y);
610
+ const z = rebase_scalar_curve(curves.z, rest.scale_z - ref.scale_z, rest.scale_z);
611
+
612
+ if (x !== undefined || y !== undefined || z !== undefined) {
613
+ out_channels.push(ShadeAnimationChannel.from({
614
+ target: ch.target,
615
+ property: Node3DProperty.Scale,
616
+ curves: { x, y, z },
617
+ }));
618
+ }
619
+ break;
620
+ }
621
+
622
+ case Node3DProperty.Rotation: {
623
+ const rebased_rot = rebase_rotation_channel(ch, ref, rest);
624
+ if (rebased_rot !== undefined) {
625
+ out_channels.push(rebased_rot);
626
+ }
627
+ break;
628
+ }
629
+
630
+ default:
631
+ break;
632
+ }
633
+ }
634
+
635
+ const result = new ShadeAnimationClip();
636
+ result.name = name !== undefined ? name : `${source_clip.name}_additive`;
637
+ result.channels = out_channels;
638
+ return result;
639
+ }
209
640
  }
210
641
 
211
642
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_pose_accumulator.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/chunk_pose_accumulator.js"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;;;;GAgBG;AACH,qCAFU,SAAS,CAwGgB;0BAzIT,iCAAiC"}
1
+ {"version":3,"file":"chunk_pose_accumulator.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/chunk_pose_accumulator.js"],"names":[],"mappings":"AAoBA;;;;;;;;;;;;;;;;GAgBG;AACH,qCAFU,SAAS,CA8GgB;0BAjJT,iCAAiC"}