@woosh/meep-engine 3.23.0 → 3.24.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 (522) hide show
  1. package/editor/entity_world_bounds.d.ts +9 -3
  2. package/editor/entity_world_bounds.d.ts.map +1 -1
  3. package/editor/entity_world_bounds.js +61 -4
  4. package/package.json +1 -1
  5. package/src/core/binary/allocator/OffsetAllocator.d.ts +40 -2
  6. package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
  7. package/src/core/binary/allocator/OffsetAllocator.js +124 -29
  8. package/src/core/collection/map/u32_index.d.ts +83 -0
  9. package/src/core/collection/map/u32_index.d.ts.map +1 -0
  10. package/src/core/collection/map/u32_index.js +247 -0
  11. package/src/engine/asset/loaders/GLTFSceneBundleAssetLoader.d.ts +2 -2
  12. package/src/engine/asset/loaders/GLTFSceneBundleAssetLoader.js +2 -2
  13. package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts +1 -2
  14. package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts.map +1 -1
  15. package/src/engine/asset/loaders/USDSceneBundleAssetLoader.js +4 -12
  16. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts +55 -0
  17. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts.map +1 -0
  18. package/src/engine/ecs/gpu/GPUStateAuthority.js +72 -0
  19. package/src/engine/ecs/gpu/GPUStateAuthorityFlags.d.ts +40 -0
  20. package/src/engine/ecs/gpu/GPUStateAuthorityFlags.d.ts.map +1 -0
  21. package/src/engine/ecs/gpu/GPUStateAuthorityFlags.js +79 -0
  22. package/src/engine/ecs/gpu/gpu_authority_assert_cpu.d.ts +18 -0
  23. package/src/engine/ecs/gpu/gpu_authority_assert_cpu.d.ts.map +1 -0
  24. package/src/engine/ecs/gpu/gpu_authority_assert_cpu.js +27 -0
  25. package/src/engine/ecs/gpu/gpu_authority_declare.d.ts +23 -0
  26. package/src/engine/ecs/gpu/gpu_authority_declare.d.ts.map +1 -0
  27. package/src/engine/ecs/gpu/gpu_authority_declare.js +39 -0
  28. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts +15 -0
  29. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts.map +1 -0
  30. package/src/engine/ecs/gpu/gpu_authority_grant.js +38 -0
  31. package/src/engine/ecs/gpu/gpu_authority_has.d.ts +18 -0
  32. package/src/engine/ecs/gpu/gpu_authority_has.d.ts.map +1 -0
  33. package/src/engine/ecs/gpu/gpu_authority_has.js +28 -0
  34. package/src/engine/ecs/gpu/gpu_authority_revoke.d.ts +24 -0
  35. package/src/engine/ecs/gpu/gpu_authority_revoke.d.ts.map +1 -0
  36. package/src/engine/ecs/gpu/gpu_authority_revoke.js +49 -0
  37. package/src/engine/ecs/ik/IKProblem.d.ts +14 -0
  38. package/src/engine/ecs/ik/IKProblem.d.ts.map +1 -1
  39. package/src/engine/ecs/ik/IKProblem.js +16 -0
  40. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +1 -1
  41. package/src/engine/ecs/ik/InverseKinematicsSystem.js +19 -0
  42. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +2 -2
  43. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +2 -2
  44. package/src/engine/ecs/ik/ik_bone_chain.d.ts +11 -2
  45. package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +1 -1
  46. package/src/engine/ecs/ik/ik_bone_chain.js +47 -2
  47. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -1
  48. package/src/engine/ecs/ik/ik_write_local_rotation.js +6 -0
  49. package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
  50. package/src/engine/ecs/speaker/VoiceSystem.js +6 -0
  51. package/src/engine/ecs/transform/T64WorldCache.d.ts +50 -0
  52. package/src/engine/ecs/transform/T64WorldCache.d.ts.map +1 -0
  53. package/src/engine/ecs/transform/T64WorldCache.js +139 -0
  54. package/src/engine/ecs/transform/t64_evaluate_world.d.ts +31 -0
  55. package/src/engine/ecs/transform/t64_evaluate_world.d.ts.map +1 -0
  56. package/src/engine/ecs/transform/t64_evaluate_world.js +126 -0
  57. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts +8 -0
  58. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
  59. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +59 -30
  60. package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.d.ts.map +1 -1
  61. package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.js +4 -11
  62. package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.d.ts +14 -0
  63. package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.d.ts.map +1 -0
  64. package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.js +13 -0
  65. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +2 -14
  66. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts.map +1 -1
  67. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +11 -21
  68. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.d.ts +1 -0
  69. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.js +7 -0
  70. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.d.ts +5 -6
  71. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.d.ts.map +1 -1
  72. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.js +13 -11
  73. package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.d.ts +14 -0
  74. package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.d.ts.map +1 -0
  75. package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.js +21 -0
  76. package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +1 -1
  77. package/src/engine/graphics/ecs/particles/ParticleEffect.js +1 -1
  78. package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.d.ts +1 -1
  79. package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.js +1 -1
  80. package/src/engine/graphics3/AnimationGraphSystem.js +3 -3
  81. package/src/engine/graphics3/AnimationSystem.js +2 -2
  82. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
  83. package/src/engine/graphics3/DebugDrawSystem.js +2 -4
  84. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +34 -27
  85. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  86. package/src/engine/graphics3/GPUParticleEmitterSystem.js +185 -85
  87. package/src/engine/graphics3/HighlightOutlineSystem.d.ts +4 -3
  88. package/src/engine/graphics3/HighlightOutlineSystem.d.ts.map +1 -1
  89. package/src/engine/graphics3/HighlightOutlineSystem.js +7 -9
  90. package/src/engine/graphics3/LightSystem.d.ts +7 -5
  91. package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
  92. package/src/engine/graphics3/LightSystem.js +36 -22
  93. package/src/engine/graphics3/MeshSystem.d.ts +43 -39
  94. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  95. package/src/engine/graphics3/MeshSystem.js +324 -331
  96. package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -1
  97. package/src/engine/graphics3/PathDisplaySystem.js +2 -4
  98. package/src/engine/graphics3/PickingQuery.d.ts +15 -21
  99. package/src/engine/graphics3/PickingQuery.d.ts.map +1 -1
  100. package/src/engine/graphics3/PickingQuery.js +21 -25
  101. package/src/engine/graphics3/PickingSystem.d.ts +60 -31
  102. package/src/engine/graphics3/PickingSystem.d.ts.map +1 -1
  103. package/src/engine/graphics3/PickingSystem.js +416 -273
  104. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +22 -12
  105. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  106. package/src/engine/graphics3/ShadedGeometrySystem.js +309 -174
  107. package/src/engine/graphics3/TerrainSystem.d.ts +19 -11
  108. package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -1
  109. package/src/engine/graphics3/TerrainSystem.js +102 -53
  110. package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -1
  111. package/src/engine/graphics3/TooltipComponentSystem.js +2 -14
  112. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
  113. package/src/engine/graphics3/Trail3DSystem.js +2 -4
  114. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +4 -4
  115. package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
  116. package/src/engine/graphics3/animation/ClipListPlayer.js +2 -2
  117. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +9 -11
  118. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
  119. package/src/engine/graphics3/highlight/pack_highlight_table.js +11 -18
  120. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +4 -3
  121. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
  122. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +75 -74
  123. package/src/engine/graphics3/prefab/Prefab.d.ts +130 -0
  124. package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -0
  125. package/src/engine/graphics3/prefab/Prefab.js +162 -0
  126. package/src/engine/graphics3/prefab/PrefabInstance.d.ts +72 -0
  127. package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -0
  128. package/src/engine/graphics3/prefab/PrefabInstance.js +80 -0
  129. package/src/engine/graphics3/prefab/prefab_compile.d.ts +23 -0
  130. package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -0
  131. package/src/engine/graphics3/prefab/prefab_compile.js +334 -0
  132. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +46 -0
  133. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -0
  134. package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -0
  135. package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.d.ts +70 -0
  136. package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.d.ts.map +1 -0
  137. package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.js +210 -0
  138. package/src/engine/graphics3/prefab/prefab_place.d.ts +60 -0
  139. package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -0
  140. package/src/engine/graphics3/prefab/prefab_place.js +130 -0
  141. package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.d.ts +60 -0
  142. package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.d.ts.map +1 -0
  143. package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.js +128 -0
  144. package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts +40 -0
  145. package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts.map +1 -0
  146. package/src/engine/graphics3/prefab/prefab_skin_frame.js +116 -0
  147. package/src/engine/graphics3/preview/make_model_preview_scene.d.ts +16 -14
  148. package/src/engine/graphics3/preview/make_model_preview_scene.d.ts.map +1 -1
  149. package/src/engine/graphics3/preview/make_model_preview_scene.js +126 -154
  150. package/src/engine/graphics3/preview/make_model_thumbnail.js +1 -1
  151. package/src/engine/graphics3/register_instance_animation.d.ts +6 -6
  152. package/src/engine/graphics3/register_instance_animation.d.ts.map +1 -1
  153. package/src/engine/graphics3/register_instance_animation.js +4 -4
  154. package/src/engine/graphics3/shade_bundle_bounds.d.ts +2 -6
  155. package/src/engine/graphics3/shade_bundle_bounds.d.ts.map +1 -1
  156. package/src/engine/graphics3/shade_bundle_bounds.js +47 -55
  157. package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts +11 -18
  158. package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts.map +1 -1
  159. package/src/engine/graphics3/terrain/pack_terrain_row_table.js +48 -53
  160. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +17 -2
  161. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  162. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +284 -256
  163. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +13 -15
  164. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  165. package/src/engine/physics/cloth/ecs/ClothInstance.js +12 -14
  166. package/src/engine/physics/cloth/ecs/ClothRig.d.ts +7 -8
  167. package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
  168. package/src/engine/physics/cloth/ecs/ClothRig.js +7 -8
  169. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +5 -4
  170. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  171. package/src/engine/physics/cloth/ecs/ClothSystem.js +11 -12
  172. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +19 -23
  173. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  174. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +201 -199
  175. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
  176. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +8 -0
  177. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts +18 -34
  178. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
  179. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +58 -115
  180. package/src/engine/physics/cloth/playground/README.md +11 -11
  181. package/src/engine/physics/cloth/playground/garment_build.d.ts +0 -1
  182. package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
  183. package/src/engine/physics/cloth/playground/garment_build.js +64 -58
  184. package/src/engine/physics/cloth/playground/garment_main.js +59 -33
  185. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  186. package/src/shade/RENDERER_CONTRACT.md +85 -53
  187. package/src/shade/device/ShadeGPUCommandContext.d.ts +23 -0
  188. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  189. package/src/shade/device/ShadeGPUCommandContext.js +36 -0
  190. package/src/shade/playground/add_random_meshes.d.ts +4 -4
  191. package/src/shade/playground/add_random_meshes.d.ts.map +1 -1
  192. package/src/shade/playground/add_random_meshes.js +20 -16
  193. package/src/shade/playground/avboit/main.d.ts +1 -0
  194. package/src/shade/playground/avboit/main.d.ts.map +1 -1
  195. package/src/shade/playground/avboit/main.js +916 -875
  196. package/src/shade/playground/basis_textures/main.d.ts.map +1 -1
  197. package/src/shade/playground/basis_textures/main.js +22 -8
  198. package/src/shade/playground/basis_textures/texture_inventory.d.ts +2 -2
  199. package/src/shade/playground/basis_textures/texture_inventory.d.ts.map +1 -1
  200. package/src/shade/playground/basis_textures/texture_inventory.js +6 -7
  201. package/src/shade/playground/ground_seam/main.d.ts.map +1 -1
  202. package/src/shade/playground/ground_seam/main.js +13 -4
  203. package/src/shade/playground/ground_seam/make_ground.d.ts +13 -4
  204. package/src/shade/playground/ground_seam/make_ground.d.ts.map +1 -1
  205. package/src/shade/playground/ground_seam/make_ground.js +21 -16
  206. package/src/shade/playground/particle_ecs/bonfire_editor.js +3 -3
  207. package/src/shade/playground/particle_system/main.js +11 -10
  208. package/src/shade/playground/particle_system/particle_prototype.d.ts +15 -10
  209. package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
  210. package/src/shade/playground/particle_system/particle_prototype.js +56 -15
  211. package/src/shade/playground/particle_system/particle_scene.d.ts +68 -28
  212. package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
  213. package/src/shade/playground/particle_system/particle_scene.js +149 -53
  214. package/src/shade/playground/readback_crossover/index.html +41 -0
  215. package/src/shade/playground/readback_crossover/main.d.ts +2 -0
  216. package/src/shade/playground/readback_crossover/main.d.ts.map +1 -0
  217. package/src/shade/playground/readback_crossover/main.js +372 -0
  218. package/src/shade/playground/skinned_blas_refit/README.md +11 -7
  219. package/src/shade/playground/skinned_blas_refit/add_floor.d.ts +13 -44
  220. package/src/shade/playground/skinned_blas_refit/add_floor.d.ts.map +1 -1
  221. package/src/shade/playground/skinned_blas_refit/add_floor.js +19 -59
  222. package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
  223. package/src/shade/playground/skinned_blas_refit/main.js +67 -58
  224. package/src/shade/playground/skinned_blas_refit/place_character.d.ts +40 -54
  225. package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
  226. package/src/shade/playground/skinned_blas_refit/place_character.js +47 -74
  227. package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts +3 -3
  228. package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts.map +1 -1
  229. package/src/shade/playground/skinned_blas_refit/sweep_views.js +4 -3
  230. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts +3 -3
  231. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts.map +1 -1
  232. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.js +11 -4
  233. package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.d.ts.map +1 -1
  234. package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.js +38 -9
  235. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts +3 -3
  236. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
  237. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +9 -6
  238. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts +3 -3
  239. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts.map +1 -1
  240. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +3 -3
  241. package/src/shade/playground/skinned_mesh_soup/README.md +6 -6
  242. package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
  243. package/src/shade/playground/skinned_mesh_soup/main.js +44 -102
  244. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts +5 -5
  245. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
  246. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +42 -33
  247. package/src/shade/playground/sponza_path_trace/main.d.ts +1 -0
  248. package/src/shade/playground/sponza_path_trace/main.d.ts.map +1 -1
  249. package/src/shade/playground/sponza_path_trace/main.js +393 -363
  250. package/src/shade/playground/ssr_reprojection/main.js +11 -9
  251. package/src/shade/playground/ssr_reprojection/scene.d.ts +15 -4
  252. package/src/shade/playground/ssr_reprojection/scene.d.ts.map +1 -1
  253. package/src/shade/playground/ssr_reprojection/scene.js +32 -11
  254. package/src/shade/playground/ssr_variance/main.js +1 -1
  255. package/src/shade/playground/ssr_variance/scene.d.ts +10 -4
  256. package/src/shade/playground/ssr_variance/scene.d.ts.map +1 -1
  257. package/src/shade/playground/ssr_variance/scene.js +39 -15
  258. package/src/shade/playground/vgeo_viewer/main.js +6 -2
  259. package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
  260. package/src/shade/playground/volumetrics_froxel/main.js +936 -922
  261. package/src/shade/renderer/GraphicsContext.d.ts +7 -0
  262. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  263. package/src/shade/renderer/GraphicsContext.js +11 -0
  264. package/src/shade/renderer/Renderer.d.ts +3 -2
  265. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  266. package/src/shade/renderer/Renderer.js +3 -2
  267. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +39 -47
  268. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  269. package/src/shade/renderer/animation/GPUAnimationManager.js +319 -256
  270. package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts +26 -22
  271. package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts.map +1 -1
  272. package/src/shade/renderer/animation/ShadeAnimationChannel.js +28 -23
  273. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +14 -6
  274. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
  275. package/src/shade/renderer/animation/ShadeAnimationClip.js +20 -8
  276. package/src/shade/renderer/animation/Skin.d.ts +19 -19
  277. package/src/shade/renderer/animation/Skin.d.ts.map +1 -1
  278. package/src/shade/renderer/animation/Skin.js +15 -13
  279. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts +6 -5
  280. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
  281. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +9 -9
  282. package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts +5 -59
  283. package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts.map +1 -1
  284. package/src/shade/renderer/animation/skin_clip_scale_conflicts.js +8 -132
  285. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +65 -62
  286. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  287. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +148 -194
  288. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
  289. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +4 -7
  290. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts +2 -2
  291. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.js +2 -2
  292. package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts +74 -0
  293. package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts.map +1 -0
  294. package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.js +240 -0
  295. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts +14 -0
  296. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  297. package/src/shade/renderer/buffer/table/GPUDatabase.js +64 -6
  298. package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts +190 -0
  299. package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts.map +1 -0
  300. package/src/shade/renderer/buffer/table/GPUDatabaseReadback.js +1323 -0
  301. package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts +10 -0
  302. package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts.map +1 -1
  303. package/src/shade/renderer/buffer/table/GPUPageMetadata.js +12 -0
  304. package/src/shade/renderer/buffer/table/GPUReadbackStagingRing.d.ts +96 -0
  305. package/src/shade/renderer/buffer/table/GPUReadbackStagingRing.d.ts.map +1 -0
  306. package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts +15 -0
  307. package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts.map +1 -0
  308. package/src/shade/renderer/buffer/table/GPUReadbackStatus.js +34 -0
  309. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts +75 -7
  310. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  311. package/src/shade/renderer/buffer/table/GPUTypedTable.js +518 -135
  312. package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts +19 -0
  313. package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts.map +1 -0
  314. package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.js +18 -0
  315. package/src/shade/renderer/buffer/table/WordViews.d.ts +39 -0
  316. package/src/shade/renderer/buffer/table/WordViews.d.ts.map +1 -0
  317. package/src/shade/renderer/buffer/table/WordViews.js +62 -0
  318. package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts +27 -0
  319. package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts.map +1 -0
  320. package/src/shade/renderer/buffer/table/gpu_table_gather_shader.js +117 -0
  321. package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts +121 -0
  322. package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts.map +1 -0
  323. package/src/shade/renderer/buffer/table/serde/generate_record_writer.js +395 -0
  324. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  325. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +70 -20
  326. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +1 -1
  327. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  328. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +6 -5
  329. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +3 -3
  330. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  331. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +15 -11
  332. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.d.ts +1 -1
  333. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.js +4 -4
  334. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts +1 -3
  335. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts.map +1 -1
  336. package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.js +5 -4
  337. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +1 -1
  338. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
  339. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +1 -4
  340. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts +8 -3
  341. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
  342. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +19 -14
  343. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.d.ts.map +1 -1
  344. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +9 -1
  345. package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts +3 -3
  346. package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts.map +1 -1
  347. package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.js +12 -5
  348. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +1 -1
  349. package/src/shade/renderer/light/GPULightCollection.d.ts +29 -0
  350. package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
  351. package/src/shade/renderer/light/GPULightCollection.js +444 -329
  352. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
  353. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +7 -1
  354. package/src/shade/renderer/light/LightCollection.d.ts +29 -1
  355. package/src/shade/renderer/light/LightCollection.d.ts.map +1 -1
  356. package/src/shade/renderer/light/LightCollection.js +50 -1
  357. package/src/shade/renderer/light/make_sunlight.js +2 -2
  358. package/src/shade/renderer/light/model/Light.d.ts +29 -2
  359. package/src/shade/renderer/light/model/Light.d.ts.map +1 -1
  360. package/src/shade/renderer/light/model/Light.js +30 -2
  361. package/src/shade/renderer/light/model/io/light_record_directional.d.ts +3 -1
  362. package/src/shade/renderer/light/model/io/light_record_directional.d.ts.map +1 -1
  363. package/src/shade/renderer/light/model/io/light_record_directional.js +8 -5
  364. package/src/shade/renderer/light/model/io/light_record_point.d.ts +3 -1
  365. package/src/shade/renderer/light/model/io/light_record_point.d.ts.map +1 -1
  366. package/src/shade/renderer/light/model/io/light_record_point.js +5 -2
  367. package/src/shade/renderer/light/model/io/light_record_spot.d.ts +4 -1
  368. package/src/shade/renderer/light/model/io/light_record_spot.d.ts.map +1 -1
  369. package/src/shade/renderer/light/model/io/light_record_spot.js +10 -6
  370. package/src/shade/renderer/light/place_light.d.ts +16 -0
  371. package/src/shade/renderer/light/place_light.d.ts.map +1 -0
  372. package/src/shade/renderer/light/place_light.js +36 -0
  373. package/src/shade/renderer/light/shader_refresh_light_poses.d.ts +44 -0
  374. package/src/shade/renderer/light/shader_refresh_light_poses.d.ts.map +1 -0
  375. package/src/shade/renderer/light/shader_refresh_light_poses.js +154 -0
  376. package/src/shade/renderer/lightmap/GPULightMap.js +1 -1
  377. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
  378. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +12 -14
  379. package/src/shade/renderer/loader/SceneBundle.d.ts +53 -28
  380. package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
  381. package/src/shade/renderer/loader/SceneBundle.js +111 -56
  382. package/src/shade/renderer/loader/SceneNode.d.ts +81 -0
  383. package/src/shade/renderer/loader/SceneNode.d.ts.map +1 -0
  384. package/src/shade/renderer/loader/SceneNode.js +114 -0
  385. package/src/shade/renderer/loader/gltf/load_gltf.d.ts +3 -2
  386. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  387. package/src/shade/renderer/loader/gltf/load_gltf.js +110 -142
  388. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  389. package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts +4 -4
  390. package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts.map +1 -1
  391. package/src/shade/renderer/loader/usd/UsdExtensionRegistry.js +2 -2
  392. package/src/shade/renderer/loader/usd/load_usd.d.ts +3 -2
  393. package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
  394. package/src/shade/renderer/loader/usd/load_usd.js +4 -5
  395. package/src/shade/renderer/loader/usd/usd_build_scene.d.ts +3 -3
  396. package/src/shade/renderer/loader/usd/usd_build_scene.d.ts.map +1 -1
  397. package/src/shade/renderer/loader/usd/usd_build_scene.js +47 -55
  398. package/src/shade/renderer/material/GPUMaterialManager.js +1 -1
  399. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +5 -4
  400. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  401. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +8 -15
  402. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts +15 -13
  403. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
  404. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +40 -21
  405. package/src/shade/renderer/particles/DESIGN.md +53 -50
  406. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +31 -17
  407. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  408. package/src/shade/renderer/particles/GPUParticleSystem.js +54 -91
  409. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +12 -11
  410. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  411. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +12 -11
  412. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +13 -19
  413. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
  414. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +19 -25
  415. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +34 -24
  416. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  417. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +53 -40
  418. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +1 -1
  419. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +1 -1
  420. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  421. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts.map +1 -1
  422. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.js +2 -1
  423. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.d.ts.map +1 -1
  424. package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.js +5 -2
  425. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +1 -1
  426. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
  427. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +1 -1
  428. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +1 -1
  429. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +1 -1
  430. package/src/shade/renderer/scene/DynamicMesh.d.ts +13 -4
  431. package/src/shade/renderer/scene/DynamicMesh.d.ts.map +1 -1
  432. package/src/shade/renderer/scene/DynamicMesh.js +14 -4
  433. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +38 -18
  434. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  435. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +112 -60
  436. package/src/shade/renderer/scene/GPUSceneContext.d.ts +55 -48
  437. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  438. package/src/shade/renderer/scene/GPUSceneContext.js +594 -928
  439. package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts +5 -5
  440. package/src/shade/renderer/scene/NODE3D_STRUCT.js +5 -5
  441. package/src/shade/renderer/scene/Node3D.d.ts +27 -8
  442. package/src/shade/renderer/scene/Node3D.d.ts.map +1 -1
  443. package/src/shade/renderer/scene/Node3DDirtyList.d.ts +59 -0
  444. package/src/shade/renderer/scene/Node3DDirtyList.d.ts.map +1 -0
  445. package/src/shade/renderer/scene/Scene.d.ts +18 -60
  446. package/src/shade/renderer/scene/Scene.d.ts.map +1 -1
  447. package/src/shade/renderer/scene/Scene.js +53 -146
  448. package/src/shade/renderer/scene/SkinnedMesh.d.ts +10 -93
  449. package/src/shade/renderer/scene/SkinnedMesh.d.ts.map +1 -1
  450. package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts +24 -3
  451. package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts.map +1 -1
  452. package/src/shade/renderer/scene/bvh/StaticSceneBVH.js +53 -13
  453. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts +5 -6
  454. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts.map +1 -1
  455. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.js +5 -6
  456. package/src/shade/renderer/scene/optimization/scene_optimize.d.ts +10 -2
  457. package/src/shade/renderer/scene/optimization/scene_optimize.d.ts.map +1 -1
  458. package/src/shade/renderer/scene/optimization/scene_optimize.js +266 -230
  459. package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts +53 -0
  460. package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts.map +1 -0
  461. package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.js +144 -0
  462. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +227 -0
  463. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -0
  464. package/src/shade/renderer/scene/rows/GPUSceneRows.js +1136 -0
  465. package/src/shade/renderer/scene/rows/place_primitive.d.ts +48 -0
  466. package/src/shade/renderer/scene/rows/place_primitive.d.ts.map +1 -0
  467. package/src/shade/renderer/scene/rows/place_primitive.js +98 -0
  468. package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts +10 -8
  469. package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts.map +1 -1
  470. package/src/shade/renderer/scene/serialization/deserialize_scene.js +24 -27
  471. package/src/shade/renderer/scene/serialization/serialize_scene.d.ts +9 -2
  472. package/src/shade/renderer/scene/serialization/serialize_scene.d.ts.map +1 -1
  473. package/src/shade/renderer/scene/serialization/serialize_scene.js +25 -4
  474. package/src/shade/renderer/scene/verify_gpu_tlas_build.js +2 -2
  475. package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.d.ts.map +1 -1
  476. package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.js +5 -0
  477. package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.d.ts.map +1 -1
  478. package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.js +5 -0
  479. package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.d.ts.map +1 -1
  480. package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.js +5 -0
  481. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +39 -0
  482. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  483. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +112 -64
  484. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +7 -0
  485. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  486. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1541 -1352
  487. package/src/shade/renderer/shadow/map/PointLightShadowmap.js +1 -1
  488. package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +1 -1
  489. package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +1 -1
  490. package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts +29 -0
  491. package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts.map +1 -0
  492. package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.js +43 -0
  493. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts +13 -0
  494. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts.map +1 -0
  495. package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.js +12 -0
  496. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts +49 -0
  497. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts.map +1 -0
  498. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +194 -0
  499. package/src/shade/renderer/shadow/map/csm_debug_draw_preview.js +1 -1
  500. package/src/shade/renderer/shadow/map/shadowmap_update_score.js +1 -1
  501. package/src/shade/renderer/shadow/ray/RTXShadows.js +1 -1
  502. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +1 -1
  503. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
  504. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +3 -1
  505. package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.js +8 -8
  506. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  507. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +4 -3
  508. package/src/engine/graphics3/instantiate_scene_bundle.js +0 -164
  509. package/src/engine/graphics3/shade_node_to_entity_composition.js +0 -88
  510. package/src/shade/renderer/animation/compute_skin_world_bounds.js +0 -146
  511. package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.js +0 -531
  512. package/src/shade/renderer/animation/pose/pose_evaluate_world.js +0 -76
  513. package/src/shade/renderer/animation/skin_bind_transform.js +0 -33
  514. package/src/shade/renderer/animation/skin_frame_defect.js +0 -132
  515. package/src/shade/renderer/animation/skin_joint_matrix.js +0 -46
  516. package/src/shade/renderer/animation/skin_normalize_mesh_frame.js +0 -216
  517. package/src/shade/renderer/scene/InstanceBatch.js +0 -235
  518. package/src/shade/renderer/scene/Mesh.js +0 -168
  519. package/src/shade/renderer/scene/Node3D.js +0 -263
  520. package/src/shade/renderer/scene/SceneNodeBinding.js +0 -56
  521. package/src/shade/renderer/scene/SkinnedMesh.js +0 -170
  522. package/src/shade/renderer/scene/TransformAuthority.js +0 -33
@@ -0,0 +1,210 @@
1
+ import { assert } from "../../../core/assert.js";
2
+ import { m4_invert } from "../../../core/geom/3d/mat4/m4_invert.js";
3
+ import { m4_multiply } from "../../../core/geom/3d/mat4/m4_multiply.js";
4
+ import { m4_rigidity_defect } from "../../../core/geom/3d/mat4/m4_rigidity_defect.js";
5
+ import { Transform64 } from "../../ecs/transform/Transform64.js";
6
+ import { prefab_skin_bind_transform, prefab_skin_frame_defect } from "./prefab_skin_frame.js";
7
+
8
+ /**
9
+ * @typedef {import("./Prefab.js").Prefab} Prefab
10
+ * @typedef {import("../../../shade/renderer/animation/Skin.js").Skin} Skin
11
+ */
12
+
13
+ /**
14
+ * How far from the bind transform a mesh node may sit and still be left alone, and how large a
15
+ * residual counts as landed. A `Transform64` recomposes its matrix from TRS components, and the
16
+ * correction is applied through that round trip, so the frame arrives with rounding on it; this
17
+ * is far above the rounding and far below anything that shows.
18
+ *
19
+ * @type {number}
20
+ */
21
+ const TOLERANCE = 1e-4;
22
+
23
+ const IDENTITY = new Float64Array([
24
+ 1, 0, 0, 0,
25
+ 0, 1, 0, 0,
26
+ 0, 0, 1, 0,
27
+ 0, 0, 0, 1,
28
+ ]);
29
+
30
+ /**
31
+ * @typedef {object} PrefabSkinFrameReport
32
+ * @property {number} frame_defect how far the skin is from being deformable in *any* frame; zero
33
+ * when it is fine
34
+ * @property {number} absorbed how far from rigid the largest correction was — for a violation,
35
+ * the number the soup was made of
36
+ * @property {number} corrected meshes moved
37
+ * @property {number} unchanged meshes already right
38
+ * @property {number} residual the worst `|mesh.world − bind|` left afterwards
39
+ * @property {number[]} obstructed corrected mesh nodes that have children, which inherit a
40
+ * transform nobody asked for
41
+ */
42
+
43
+ /**
44
+ * Put every skin's meshes into the frame the skin deforms in, once, on the prefab.
45
+ *
46
+ * The skinning pass writes each clone's vertices in `inverse(mesh.global)` space and the
47
+ * rasterizer re-applies `mesh.global`, so `mesh.global` is the *frame* a skinned mesh's vertices
48
+ * live in — and the pass gets there by folding `inverse(mesh.global) × joint.global ×
49
+ * inverse_bind` into a dual quaternion, which carries a rotation and a translation and nothing
50
+ * else. glTF says a skinned mesh's node transform is ignored, so the frame is the engine's to
51
+ * choose, and the one that is guaranteed to fold rigidly is the skin's own bind transform,
52
+ * `joint.global × inverse_bind` at rest ({@link prefab_skin_bind_transform}). After this the fold
53
+ * is the joint's displacement from bind, rigid whenever the clip rotates and translates and does
54
+ * not scale. `SKINNING_FRAME_PLAN.md` is the whole argument.
55
+ *
56
+ * Done here rather than on registration because the correction is placement-invariant and
57
+ * idempotent: it is a property of the asset, so it belongs to the compiled model and not to each
58
+ * of its placements. A file whose inverse-bind matrices already agree with its node transforms is
59
+ * not touched. A skin whose own bind frame does not fold — a rest pose carrying a non-uniform
60
+ * scale or a shear — is reported and left as the asset had it.
61
+ *
62
+ * The correction goes on the mesh node's **local** transform, and its descendants' worlds are
63
+ * recomposed, so the prefab's {@link Prefab.world} stays consistent with its {@link Prefab.local}.
64
+ *
65
+ * @param {Prefab} prefab
66
+ * @returns {PrefabSkinFrameReport[]} one report per skin
67
+ */
68
+ export function prefab_normalize_skin_frames(prefab) {
69
+ assert.defined(prefab, 'prefab');
70
+ assert.equal(prefab.isPrefab, true, 'prefab.isPrefab !== true');
71
+
72
+ return prefab.skins.map(skin => normalize_skin(prefab, skin));
73
+ }
74
+
75
+ /**
76
+ * @param {Prefab} prefab
77
+ * @param {Skin} skin
78
+ * @returns {PrefabSkinFrameReport}
79
+ */
80
+ function normalize_skin(prefab, skin) {
81
+ const report = {
82
+ frame_defect: 0,
83
+ absorbed: 0,
84
+ corrected: 0,
85
+ unchanged: 0,
86
+ residual: 0,
87
+ obstructed: [],
88
+ };
89
+
90
+ const bind = new Float64Array(16);
91
+
92
+ prefab_skin_bind_transform(bind, prefab, skin);
93
+
94
+ report.frame_defect = prefab_skin_frame_defect(prefab, skin, bind);
95
+
96
+ if (!(report.frame_defect <= TOLERANCE)) {
97
+ // `!(x <= t)` rather than `x > t` so that a NaN — a singular joint matrix — lands here too
98
+ return report;
99
+ }
100
+
101
+ const inverse_world = new Float64Array(16);
102
+ const correction_matrix = new Float64Array(16);
103
+ const correction = new Transform64();
104
+
105
+ for (const mesh of skin.meshes) {
106
+ const world = prefab.world[mesh];
107
+
108
+ if (!m4_invert(inverse_world, world)) {
109
+ // a mesh node with no inverse is not a frame either; the skinning pass inverts this
110
+ report.residual = Infinity;
111
+
112
+ continue;
113
+ }
114
+
115
+ m4_multiply(correction_matrix, inverse_world, bind);
116
+
117
+ const absorbed = m4_rigidity_defect(correction_matrix);
118
+
119
+ report.absorbed = Math.max(report.absorbed, absorbed);
120
+
121
+ if (matrix_distance(correction_matrix, IDENTITY) <= TOLERANCE) {
122
+ report.unchanged++;
123
+
124
+ continue;
125
+ }
126
+
127
+ correction.fromMatrix(correction_matrix);
128
+
129
+ prefab.local[mesh].multiply(correction);
130
+
131
+ recompose_subtree(prefab, mesh);
132
+
133
+ report.corrected++;
134
+ report.residual = Math.max(report.residual, matrix_distance(prefab.world[mesh], bind));
135
+
136
+ if (has_children(prefab, mesh)) {
137
+ report.obstructed.push(mesh);
138
+ }
139
+ }
140
+
141
+ return report;
142
+ }
143
+
144
+ /**
145
+ * Recompose the world of `node` and of every node under it from their locals. Children follow
146
+ * their parents in index order, so one forward pass from `node` is enough.
147
+ *
148
+ * @param {Prefab} prefab
149
+ * @param {number} node
150
+ */
151
+ function recompose_subtree(prefab, node) {
152
+ const parent = prefab.parent;
153
+ const world = prefab.world;
154
+ const local = prefab.local;
155
+
156
+ /**
157
+ * @type {Set<number>}
158
+ */
159
+ const inside = new Set([node]);
160
+
161
+ m4_multiply(world[node], world[parent[node]], local[node]);
162
+
163
+ for (let i = node + 1; i < prefab.node_count; i++) {
164
+ const p = parent[i];
165
+
166
+ if (!inside.has(p)) {
167
+ continue;
168
+ }
169
+
170
+ inside.add(i);
171
+
172
+ m4_multiply(world[i], world[p], local[i]);
173
+ }
174
+ }
175
+
176
+ /**
177
+ * @param {Prefab} prefab
178
+ * @param {number} node
179
+ * @returns {boolean}
180
+ */
181
+ function has_children(prefab, node) {
182
+ const parent = prefab.parent;
183
+
184
+ for (let i = node + 1; i < prefab.node_count; i++) {
185
+ if (parent[i] === node) {
186
+ return true;
187
+ }
188
+ }
189
+
190
+ return false;
191
+ }
192
+
193
+ /**
194
+ * @param {ArrayLike<number>} a
195
+ * @param {ArrayLike<number>} b
196
+ * @returns {number}
197
+ */
198
+ function matrix_distance(a, b) {
199
+ let worst = 0;
200
+
201
+ for (let i = 0; i < 16; i++) {
202
+ const difference = Math.abs(a[i] - b[i]);
203
+
204
+ if (difference > worst) {
205
+ worst = difference;
206
+ }
207
+ }
208
+
209
+ return worst;
210
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @typedef {import("./Prefab.js").Prefab} Prefab
3
+ * @typedef {import("./PrefabInstance.js").PrefabInstance} PrefabInstance
4
+ * @typedef {import("../../ecs/EntityComponentDataset.js").EntityComponentDataset} EntityComponentDataset
5
+ * @typedef {import("../../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
6
+ * @typedef {import("../register_instance_animation.js").InstanceAnimationRegistration} InstanceAnimationRegistration
7
+ */
8
+ /**
9
+ * Put a model into a scene that has no systems: a playground, a preview, a tool.
10
+ *
11
+ * A game does this in two systems — `MeshSystem` spawns the prefab under the entity that wears
12
+ * it, and `ShadedGeometrySystem` takes a mesh row for every primitive as its component appears.
13
+ * A scene bound to a bare dataset has neither, so this does the same by hand, in one call: a root
14
+ * entity carrying `placement`, the prefab spawned under it, a `transforms` row acquired for every
15
+ * entity of the instance, a `meshes` row attached for every primitive (over a clone of its geometry
16
+ * where the primitive is skinned), and the instance's skins and clips registered with the
17
+ * animation manager — unless told otherwise.
18
+ *
19
+ * @param {GPUSceneContext} scene_context the scene's context — its rows are where the instance goes
20
+ * @param {EntityComponentDataset} dataset the dataset the scene is bound to
21
+ * @param {Prefab} prefab the model, compiled once
22
+ * @param {Transform64} placement where the model's root goes; copied
23
+ * @param {object} [options]
24
+ * @param {boolean} [options.register_animation] whether the instance's skins and clips are
25
+ * registered; off leaves a skinned primitive's clone undeformed
26
+ * @param {boolean} [options.skinned] whether skinned primitives take a row at all; a preview that
27
+ * registers no skin has nothing to pose them with and leaves them out
28
+ * @returns {{root: number, instance: PrefabInstance, animation: InstanceAnimationRegistration|null, drawn: number}}
29
+ * `drawn` is how many primitives took a row
30
+ */
31
+ export function prefab_place(scene_context: GPUSceneContext, dataset: EntityComponentDataset, prefab: Prefab, placement: Transform64, { register_animation, skinned }?: {
32
+ register_animation?: boolean;
33
+ skinned?: boolean;
34
+ }): {
35
+ root: number;
36
+ instance: PrefabInstance;
37
+ animation: InstanceAnimationRegistration | null;
38
+ drawn: number;
39
+ };
40
+ /**
41
+ * Take a placed model out again: its rows given back, its animation unregistered, its entities
42
+ * removed — the root included, since {@link prefab_place} made it.
43
+ *
44
+ * @param {GPUSceneContext} scene_context
45
+ * @param {EntityComponentDataset} dataset
46
+ * @param {{root: number, instance: PrefabInstance, animation: InstanceAnimationRegistration|null}} placed
47
+ * what {@link prefab_place} answered
48
+ */
49
+ export function prefab_unplace(scene_context: GPUSceneContext, dataset: EntityComponentDataset, placed: {
50
+ root: number;
51
+ instance: PrefabInstance;
52
+ animation: InstanceAnimationRegistration | null;
53
+ }): void;
54
+ export type Prefab = import("./Prefab.js").Prefab;
55
+ export type PrefabInstance = import("./PrefabInstance.js").PrefabInstance;
56
+ export type EntityComponentDataset = import("../../ecs/EntityComponentDataset.js").EntityComponentDataset;
57
+ export type GPUSceneContext = import("../../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext;
58
+ export type InstanceAnimationRegistration = import("../register_instance_animation.js").InstanceAnimationRegistration;
59
+ import { Transform64 } from "../../ecs/transform/Transform64.js";
60
+ //# sourceMappingURL=prefab_place.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefab_place.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/prefab/prefab_place.js"],"names":[],"mappings":"AAOA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,4CAZW,eAAe,WACf,sBAAsB,UACtB,MAAM,aACN,WAAW;IAEO,kBAAkB,GAApC,OAAO;IAEW,OAAO,GAAzB,OAAO;IAEL;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,6BAA6B,GAAC,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAyDlH;AAED;;;;;;;;GAQG;AACH,8CALW,eAAe,WACf,sBAAsB,UACtB;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,6BAA6B,GAAC,IAAI,CAAA;CAAC,QA6BjG;qBAzHY,OAAO,aAAa,EAAE,MAAM;6BAC5B,OAAO,qBAAqB,EAAE,cAAc;qCAC5C,OAAO,qCAAqC,EAAE,sBAAsB;8BACpE,OAAO,kDAAkD,EAAE,eAAe;4CAC1E,OAAO,mCAAmC,EAAE,6BAA6B;4BAX1D,oCAAoC"}
@@ -0,0 +1,130 @@
1
+ import { assert } from "../../../core/assert.js";
2
+ import { Transform64 } from "../../ecs/transform/Transform64.js";
3
+ import { ShadedGeometry } from "../../graphics/ecs/mesh-v2/ShadedGeometry.js";
4
+ import { ShadedGeometryFlags } from "../../graphics/ecs/mesh-v2/ShadedGeometryFlags.js";
5
+ import { register_instance_animation, unregister_instance_animation } from "../register_instance_animation.js";
6
+ import { prefab_instance_destroy, prefab_instantiate } from "./prefab_instantiate.js";
7
+
8
+ /**
9
+ * @typedef {import("./Prefab.js").Prefab} Prefab
10
+ * @typedef {import("./PrefabInstance.js").PrefabInstance} PrefabInstance
11
+ * @typedef {import("../../ecs/EntityComponentDataset.js").EntityComponentDataset} EntityComponentDataset
12
+ * @typedef {import("../../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
13
+ * @typedef {import("../register_instance_animation.js").InstanceAnimationRegistration} InstanceAnimationRegistration
14
+ */
15
+
16
+ /**
17
+ * Put a model into a scene that has no systems: a playground, a preview, a tool.
18
+ *
19
+ * A game does this in two systems — `MeshSystem` spawns the prefab under the entity that wears
20
+ * it, and `ShadedGeometrySystem` takes a mesh row for every primitive as its component appears.
21
+ * A scene bound to a bare dataset has neither, so this does the same by hand, in one call: a root
22
+ * entity carrying `placement`, the prefab spawned under it, a `transforms` row acquired for every
23
+ * entity of the instance, a `meshes` row attached for every primitive (over a clone of its geometry
24
+ * where the primitive is skinned), and the instance's skins and clips registered with the
25
+ * animation manager — unless told otherwise.
26
+ *
27
+ * @param {GPUSceneContext} scene_context the scene's context — its rows are where the instance goes
28
+ * @param {EntityComponentDataset} dataset the dataset the scene is bound to
29
+ * @param {Prefab} prefab the model, compiled once
30
+ * @param {Transform64} placement where the model's root goes; copied
31
+ * @param {object} [options]
32
+ * @param {boolean} [options.register_animation] whether the instance's skins and clips are
33
+ * registered; off leaves a skinned primitive's clone undeformed
34
+ * @param {boolean} [options.skinned] whether skinned primitives take a row at all; a preview that
35
+ * registers no skin has nothing to pose them with and leaves them out
36
+ * @returns {{root: number, instance: PrefabInstance, animation: InstanceAnimationRegistration|null, drawn: number}}
37
+ * `drawn` is how many primitives took a row
38
+ */
39
+ export function prefab_place(scene_context, dataset, prefab, placement, { register_animation = true, skinned = true } = {}) {
40
+ assert.defined(scene_context, 'scene_context');
41
+ assert.defined(dataset, 'dataset');
42
+ assert.equal(dataset.isEntityComponentDataset, true, 'dataset.isEntityComponentDataset !== true');
43
+ assert.defined(prefab, 'prefab');
44
+ assert.equal(prefab.isPrefab, true, 'prefab.isPrefab !== true');
45
+ assert.defined(placement, 'placement');
46
+ assert.isBoolean(register_animation, 'register_animation');
47
+ assert.isBoolean(skinned, 'skinned');
48
+
49
+ // a fresh dataset knows no component types; the prefab registers its own, and the root is
50
+ // placed before the prefab is spawned
51
+ dataset.registerManyComponentTypes([Transform64]);
52
+
53
+ const root = dataset.createEntity();
54
+ const transform = new Transform64();
55
+
56
+ transform.copy(placement);
57
+ transform.updateMatrix();
58
+
59
+ dataset.addComponentToEntity(root, transform);
60
+
61
+ const instance = prefab_instantiate(prefab, dataset, root);
62
+
63
+ const rows = scene_context.rows;
64
+ const entities = instance.entities;
65
+
66
+ for (let i = 0; i < entities.length; i++) {
67
+ rows.acquire(entities[i]);
68
+ }
69
+
70
+ const mesh_entities = instance.mesh_entities;
71
+
72
+ let drawn = 0;
73
+
74
+ for (let i = 0; i < mesh_entities.length; i++) {
75
+ const entity = mesh_entities[i];
76
+ const geometry = dataset.getComponent(entity, ShadedGeometry);
77
+ const is_skinned = geometry.getFlag(ShadedGeometryFlags.Skinned);
78
+
79
+ if (is_skinned && !skinned) {
80
+ continue;
81
+ }
82
+
83
+ rows.attach_mesh(entity, geometry.geometry, geometry.material, is_skinned);
84
+
85
+ drawn++;
86
+ }
87
+
88
+ const animation = register_animation
89
+ ? register_instance_animation(scene_context, instance)
90
+ : null;
91
+
92
+ return { root, instance, animation, drawn };
93
+ }
94
+
95
+ /**
96
+ * Take a placed model out again: its rows given back, its animation unregistered, its entities
97
+ * removed — the root included, since {@link prefab_place} made it.
98
+ *
99
+ * @param {GPUSceneContext} scene_context
100
+ * @param {EntityComponentDataset} dataset
101
+ * @param {{root: number, instance: PrefabInstance, animation: InstanceAnimationRegistration|null}} placed
102
+ * what {@link prefab_place} answered
103
+ */
104
+ export function prefab_unplace(scene_context, dataset, placed) {
105
+ assert.defined(scene_context, 'scene_context');
106
+ assert.defined(dataset, 'dataset');
107
+ assert.defined(placed, 'placed');
108
+
109
+ if (placed.animation !== null) {
110
+ unregister_instance_animation(placed.animation);
111
+ }
112
+
113
+ const rows = scene_context.rows;
114
+ const instance = placed.instance;
115
+ const mesh_entities = instance.mesh_entities;
116
+
117
+ for (let i = 0; i < mesh_entities.length; i++) {
118
+ // safe on a skinned primitive that took no row
119
+ rows.detach_mesh(mesh_entities[i]);
120
+ }
121
+
122
+ const entities = instance.entities;
123
+
124
+ for (let i = 0; i < entities.length; i++) {
125
+ rows.release(entities[i]);
126
+ }
127
+
128
+ prefab_instance_destroy(dataset, instance);
129
+ dataset.removeEntity(placed.root);
130
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @typedef {import("./Prefab.js").Prefab} Prefab
3
+ * @typedef {import("../../../shade/renderer/animation/Skin.js").Skin} Skin
4
+ * @typedef {import("../../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip} ShadeAnimationClip
5
+ * @typedef {import("../../../shade/renderer/animation/ShadeAnimationChannel.js").ShadeAnimationChannel} ShadeAnimationChannel
6
+ */
7
+ /**
8
+ * @typedef {object} PrefabSkinScaleConflict
9
+ * @property {ShadeAnimationChannel} channel the scaling channel
10
+ * @property {number} node the node it scales
11
+ * @property {boolean} uniform whether the scale is the same on every axis
12
+ * @property {number} joints_reached how many of the skin's joints sit under the node
13
+ * @property {boolean} reaches_mesh whether any of the skin's meshes sit under the node
14
+ */
15
+ /**
16
+ * The scale channels of `clip` that reach some of a skin's joints and meshes but not all of them.
17
+ *
18
+ * The frame {@link prefab_normalize_skin_frames} chooses is fixed at compile, and it is sound
19
+ * because the joints and the mesh share their scaling ancestors. A scale that reaches only some
20
+ * of them — a joint's own scale, a scale on a bone above half the skeleton — breaks that every
21
+ * frame it plays, on the GPU, where nothing can see it: the scale enters the joint matrices and
22
+ * not the frame they are folded against, and a dual quaternion cannot carry it. A scale on the
23
+ * character's root reaches the mesh and every joint and cancels; a scale on a node the skin has
24
+ * nothing to do with reaches nothing.
25
+ *
26
+ * The same question `skin_clip_scale_conflicts` asked of a node tree, asked of parent indices.
27
+ *
28
+ * @param {Prefab} prefab
29
+ * @param {Skin} skin joints and meshes as node indices
30
+ * @param {ShadeAnimationClip} clip channels targeting node indices
31
+ * @returns {PrefabSkinScaleConflict[]}
32
+ */
33
+ export function prefab_skin_clip_scale_conflicts(prefab: Prefab, skin: Skin, clip: ShadeAnimationClip): PrefabSkinScaleConflict[];
34
+ export type Prefab = import("./Prefab.js").Prefab;
35
+ export type Skin = import("../../../shade/renderer/animation/Skin.js").Skin;
36
+ export type ShadeAnimationClip = import("../../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip;
37
+ export type ShadeAnimationChannel = import("../../../shade/renderer/animation/ShadeAnimationChannel.js").ShadeAnimationChannel;
38
+ export type PrefabSkinScaleConflict = {
39
+ /**
40
+ * the scaling channel
41
+ */
42
+ channel: ShadeAnimationChannel;
43
+ /**
44
+ * the node it scales
45
+ */
46
+ node: number;
47
+ /**
48
+ * whether the scale is the same on every axis
49
+ */
50
+ uniform: boolean;
51
+ /**
52
+ * how many of the skin's joints sit under the node
53
+ */
54
+ joints_reached: number;
55
+ /**
56
+ * whether any of the skin's meshes sit under the node
57
+ */
58
+ reaches_mesh: boolean;
59
+ };
60
+ //# sourceMappingURL=prefab_skin_clip_scale_conflicts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefab_skin_clip_scale_conflicts.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH;;;;;;;GAOG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,yDALW,MAAM,QACN,IAAI,QACJ,kBAAkB,GAChB,uBAAuB,EAAE,CAqDrC;qBApFY,OAAO,aAAa,EAAE,MAAM;mBAC5B,OAAO,2CAA2C,EAAE,IAAI;iCACxD,OAAO,yDAAyD,EAAE,kBAAkB;oCACpF,OAAO,4DAA4D,EAAE,qBAAqB;;;;;aAKzF,qBAAqB;;;;UACrB,MAAM;;;;aACN,OAAO;;;;oBACP,MAAM;;;;kBACN,OAAO"}
@@ -0,0 +1,128 @@
1
+ import { assert } from "../../../core/assert.js";
2
+ import { clip_scale_channels } from "../../../shade/renderer/animation/skin_clip_scale_conflicts.js";
3
+
4
+ /**
5
+ * @typedef {import("./Prefab.js").Prefab} Prefab
6
+ * @typedef {import("../../../shade/renderer/animation/Skin.js").Skin} Skin
7
+ * @typedef {import("../../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip} ShadeAnimationClip
8
+ * @typedef {import("../../../shade/renderer/animation/ShadeAnimationChannel.js").ShadeAnimationChannel} ShadeAnimationChannel
9
+ */
10
+
11
+ /**
12
+ * @typedef {object} PrefabSkinScaleConflict
13
+ * @property {ShadeAnimationChannel} channel the scaling channel
14
+ * @property {number} node the node it scales
15
+ * @property {boolean} uniform whether the scale is the same on every axis
16
+ * @property {number} joints_reached how many of the skin's joints sit under the node
17
+ * @property {boolean} reaches_mesh whether any of the skin's meshes sit under the node
18
+ */
19
+
20
+ /**
21
+ * The scale channels of `clip` that reach some of a skin's joints and meshes but not all of them.
22
+ *
23
+ * The frame {@link prefab_normalize_skin_frames} chooses is fixed at compile, and it is sound
24
+ * because the joints and the mesh share their scaling ancestors. A scale that reaches only some
25
+ * of them — a joint's own scale, a scale on a bone above half the skeleton — breaks that every
26
+ * frame it plays, on the GPU, where nothing can see it: the scale enters the joint matrices and
27
+ * not the frame they are folded against, and a dual quaternion cannot carry it. A scale on the
28
+ * character's root reaches the mesh and every joint and cancels; a scale on a node the skin has
29
+ * nothing to do with reaches nothing.
30
+ *
31
+ * The same question `skin_clip_scale_conflicts` asked of a node tree, asked of parent indices.
32
+ *
33
+ * @param {Prefab} prefab
34
+ * @param {Skin} skin joints and meshes as node indices
35
+ * @param {ShadeAnimationClip} clip channels targeting node indices
36
+ * @returns {PrefabSkinScaleConflict[]}
37
+ */
38
+ export function prefab_skin_clip_scale_conflicts(prefab, skin, clip) {
39
+ assert.defined(prefab, 'prefab');
40
+ assert.equal(prefab.isPrefab, true, 'prefab.isPrefab !== true');
41
+ assert.defined(skin, 'skin');
42
+ assert.equal(skin.isSkin, true, 'skin.isSkin !== true');
43
+ assert.defined(clip, 'clip');
44
+
45
+ const scaling = clip_scale_channels(clip);
46
+
47
+ const conflicts = [];
48
+
49
+ if (scaling.length === 0) {
50
+ return conflicts;
51
+ }
52
+
53
+ const joints = new Set(skin.joints);
54
+ const meshes = new Set(skin.meshes);
55
+
56
+ for (const channel of scaling) {
57
+ const target = channel.target;
58
+
59
+ let joints_reached = 0;
60
+ let meshes_reached = 0;
61
+
62
+ for (const node of subtree(prefab, target)) {
63
+ if (joints.has(node)) {
64
+ joints_reached++;
65
+ }
66
+
67
+ if (meshes.has(node)) {
68
+ meshes_reached++;
69
+ }
70
+ }
71
+
72
+ const reaches_everything = joints_reached === joints.size && meshes_reached === meshes.size;
73
+ const reaches_nothing = joints_reached === 0 && meshes_reached === 0;
74
+
75
+ if (reaches_everything || reaches_nothing) {
76
+ continue;
77
+ }
78
+
79
+ conflicts.push({
80
+ channel,
81
+ node: target,
82
+ uniform: is_uniform(channel),
83
+ joints_reached,
84
+ reaches_mesh: meshes_reached > 0,
85
+ });
86
+ }
87
+
88
+ return conflicts;
89
+ }
90
+
91
+ /**
92
+ * `node` and every node under it. Children follow their parents in index order, so a forward
93
+ * pass from `node` with a membership set finds them all.
94
+ *
95
+ * @param {Prefab} prefab
96
+ * @param {number} node
97
+ * @returns {number[]}
98
+ */
99
+ function subtree(prefab, node) {
100
+ const parent = prefab.parent;
101
+ const inside = new Set([node]);
102
+ const found = [node];
103
+
104
+ for (let i = node + 1; i < prefab.node_count; i++) {
105
+ if (inside.has(parent[i])) {
106
+ inside.add(i);
107
+ found.push(i);
108
+ }
109
+ }
110
+
111
+ return found;
112
+ }
113
+
114
+ /**
115
+ * @param {ShadeAnimationChannel} channel
116
+ * @returns {boolean}
117
+ */
118
+ function is_uniform(channel) {
119
+ const { x, y, z } = channel.curves;
120
+
121
+ if (x === undefined || y === undefined || z === undefined) {
122
+ // an axis left unanimated keeps whatever the node's own scale holds while the others move,
123
+ // which is a non-uniform scale however uniform the curves that are there
124
+ return false;
125
+ }
126
+
127
+ return (x === y || x.equals(y)) && (x === z || x.equals(z));
128
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * A joint's skinning matrix at the prefab's rest pose: the joint's world under the root, times
3
+ * its inverse-bind matrix. What the skin matrix prep pass computes on the GPU from the row's
4
+ * `global`, computed here from the prefab's own composition.
5
+ *
6
+ * @param {Float64Array} out
7
+ * @param {Prefab} prefab
8
+ * @param {Skin} skin joints as node indices
9
+ * @param {number} joint_index
10
+ * @returns {Float64Array} `out`
11
+ */
12
+ export function prefab_skin_joint_matrix(out: Float64Array, prefab: Prefab, skin: Skin, joint_index: number): Float64Array;
13
+ /**
14
+ * The frame a skin's meshes are deformed in: its first joint's skinning matrix at rest. For a
15
+ * skin whose rest pose is rigid every joint gives the same answer, and the first is as good as any.
16
+ *
17
+ * @param {Float64Array} out
18
+ * @param {Prefab} prefab
19
+ * @param {Skin} skin
20
+ * @returns {Float64Array} `out`
21
+ */
22
+ export function prefab_skin_bind_transform(out: Float64Array, prefab: Prefab, skin: Skin): Float64Array;
23
+ /**
24
+ * How far a skin is from being deformable in `frame`: the worst rigidity defect of
25
+ * `inverse(frame) × joint.world × inverse_bind` over its joints, at rest. Zero for a skin that
26
+ * folds rigidly, `Infinity` for a frame with no inverse or a joint that reflects.
27
+ *
28
+ * A reflection scores perfectly on orthonormality, which is why it is caught by its determinant
29
+ * rather than by the defect: a dual quaternion would answer it with a rotation, silently, which is
30
+ * precisely the class of failure this exists to end.
31
+ *
32
+ * @param {Prefab} prefab
33
+ * @param {Skin} skin
34
+ * @param {ArrayLike<number>} frame
35
+ * @returns {number}
36
+ */
37
+ export function prefab_skin_frame_defect(prefab: Prefab, skin: Skin, frame: ArrayLike<number>): number;
38
+ export type Prefab = import("./Prefab.js").Prefab;
39
+ export type Skin = import("../../../shade/renderer/animation/Skin.js").Skin;
40
+ //# sourceMappingURL=prefab_skin_frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefab_skin_frame.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/prefab/prefab_skin_frame.js"],"names":[],"mappings":"AAcA;;;;;;;;;;GAUG;AACH,8CANW,YAAY,UACZ,MAAM,QACN,IAAI,eACJ,MAAM,GACJ,YAAY,CAqBxB;AAED;;;;;;;;GAQG;AACH,gDALW,YAAY,UACZ,MAAM,QACN,IAAI,GACF,YAAY,CAMxB;AAED;;;;;;;;;;;;;GAaG;AACH,iDALW,MAAM,QACN,IAAI,SACJ,UAAU,MAAM,CAAC,GACf,MAAM,CA8BlB;qBAjGY,OAAO,aAAa,EAAE,MAAM;mBAC5B,OAAO,2CAA2C,EAAE,IAAI"}