@woosh/meep-engine 3.52.0 → 3.54.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 (515) hide show
  1. package/package.json +1 -1
  2. package/src/core/math/noise/worley_noise_2d.d.ts +14 -0
  3. package/src/core/math/noise/worley_noise_2d.d.ts.map +1 -0
  4. package/src/core/math/noise/worley_noise_2d.js +74 -0
  5. package/src/engine/ecs/animation/Animation.d.ts +4 -25
  6. package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
  7. package/src/engine/ecs/animation/Animation.js +9 -41
  8. package/src/engine/ecs/ik/IKGoalSystem.d.ts +4 -5
  9. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
  10. package/src/engine/ecs/ik/IKGoalSystem.js +4 -6
  11. package/src/engine/graphics/ecs/mesh/assetTypeByPath.js +1 -1
  12. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts +6 -1
  13. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts.map +1 -1
  14. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.js +363 -325
  15. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts +93 -14
  16. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts.map +1 -1
  17. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.js +322 -183
  18. package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts +9 -0
  19. package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts.map +1 -1
  20. package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.js +110 -83
  21. package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts +42 -0
  22. package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts.map +1 -0
  23. package/src/engine/{graphics3/decal/DecalAtlas.js → graphics/texture/atlas/SpriteAtlas.js} +202 -194
  24. package/src/engine/graphics/texture/atlas/SpriteAtlasFill.d.ts +12 -0
  25. package/src/engine/graphics/texture/atlas/SpriteAtlasFill.d.ts.map +1 -0
  26. package/src/engine/graphics/texture/atlas/SpriteAtlasFill.js +30 -0
  27. package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts +7 -0
  28. package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts.map +1 -1
  29. package/src/engine/graphics/texture/atlas/TextureAtlas.js +11 -1
  30. package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts +52 -0
  31. package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts.map +1 -0
  32. package/src/engine/{graphics3/decal/decal_atlas_border.js → graphics/texture/atlas/sprite_atlas_border.js} +69 -69
  33. package/src/engine/graphics3/AnimationGraphSystem.d.ts +9 -22
  34. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  35. package/src/engine/graphics3/AnimationGraphSystem.js +58 -203
  36. package/src/engine/graphics3/AnimationSystem.d.ts +7 -18
  37. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  38. package/src/engine/graphics3/AnimationSystem.js +62 -243
  39. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
  40. package/src/engine/graphics3/DecalSystem.js +447 -450
  41. package/src/engine/graphics3/FoliageWindSystem.d.ts +67 -0
  42. package/src/engine/graphics3/FoliageWindSystem.d.ts.map +1 -0
  43. package/src/engine/graphics3/FoliageWindSystem.js +257 -0
  44. package/src/engine/graphics3/GPUFluidSystem.d.ts +7 -0
  45. package/src/engine/graphics3/GPUFluidSystem.d.ts.map +1 -1
  46. package/src/engine/graphics3/GPUFluidSystem.js +39 -1
  47. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +9 -23
  48. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  49. package/src/engine/graphics3/GPUParticleEmitterSystem.js +904 -949
  50. package/src/engine/graphics3/animation/AnimationClips.d.ts +107 -13
  51. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -1
  52. package/src/engine/graphics3/animation/AnimationClips.js +207 -10
  53. package/src/engine/graphics3/animation/AnimationClipsSink.d.ts +89 -0
  54. package/src/engine/graphics3/animation/AnimationClipsSink.d.ts.map +1 -0
  55. package/src/engine/graphics3/animation/AnimationClipsSink.js +205 -0
  56. package/src/engine/graphics3/animation/FoliageWindRigs.d.ts +43 -0
  57. package/src/engine/graphics3/animation/FoliageWindRigs.d.ts.map +1 -0
  58. package/src/engine/graphics3/animation/FoliageWindRigs.js +69 -0
  59. package/src/engine/graphics3/animation/write_clip_playback.d.ts +17 -11
  60. package/src/engine/graphics3/animation/write_clip_playback.d.ts.map +1 -1
  61. package/src/engine/graphics3/animation/write_clip_playback.js +36 -27
  62. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
  63. package/src/engine/graphics3/decal/GPUDecalRenderer.js +8 -6
  64. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  65. package/src/engine/graphics3/decal/shader_decal_composite.js +11 -5
  66. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts +7 -7
  67. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts.map +1 -1
  68. package/src/engine/graphics3/pose/collect_entity_playbacks.js +14 -15
  69. package/src/engine/graphics3/prefab/Prefab.d.ts +6 -0
  70. package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -1
  71. package/src/engine/graphics3/prefab/Prefab.js +169 -162
  72. package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -1
  73. package/src/engine/graphics3/prefab/prefab_compile.js +369 -334
  74. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
  75. package/src/engine/graphics3/prefab/prefab_instantiate.js +43 -2
  76. package/src/engine/graphics3/terrain/chunk_terrain_material_surface.js +2 -2
  77. package/src/engine/physics/ecs/ContactProbeSystem.d.ts +2 -3
  78. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
  79. package/src/engine/physics/ecs/ContactProbeSystem.js +2 -4
  80. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  81. package/src/engine/sound/simulation/PROBE_PLACEMENT.md +4 -4
  82. package/src/engine/sound/simulation/README.md +1 -1
  83. package/src/engine/sound/simulation/probe/bakeProbeField.d.ts +22 -8
  84. package/src/engine/sound/simulation/probe/bakeProbeField.d.ts.map +1 -1
  85. package/src/engine/sound/simulation/probe/bakeProbeField.js +60 -15
  86. package/src/engine/sound/simulation/probe/bakeProbeReflectors.d.ts.map +1 -1
  87. package/src/engine/sound/simulation/probe/bakeProbeReflectors.js +19 -23
  88. package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts +63 -17
  89. package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts.map +1 -1
  90. package/src/engine/sound/simulation/probe/probe_sdf_grid.js +67 -17
  91. package/src/generation/foliage/FOLIAGE_DESIGN.md +319 -0
  92. package/src/generation/foliage/FOLIAGE_PLAN.md +198 -0
  93. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +20 -0
  94. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -0
  95. package/src/generation/foliage/animation/build_tree_wind_rig.js +108 -0
  96. package/src/generation/foliage/asset/TreeAsset.d.ts +86 -0
  97. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -0
  98. package/src/generation/foliage/asset/TreeAsset.js +111 -0
  99. package/src/generation/foliage/asset/TreeLODAsset.d.ts +115 -0
  100. package/src/generation/foliage/asset/TreeLODAsset.d.ts.map +1 -0
  101. package/src/generation/foliage/asset/TreeLODAsset.js +346 -0
  102. package/src/generation/foliage/asset/generate_tree.d.ts +15 -0
  103. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -0
  104. package/src/generation/foliage/asset/generate_tree.js +93 -0
  105. package/src/generation/foliage/asset/place_tree.d.ts +82 -0
  106. package/src/generation/foliage/asset/place_tree.d.ts.map +1 -0
  107. package/src/generation/foliage/asset/place_tree.js +194 -0
  108. package/src/generation/foliage/config/BarkMaterialConfig.d.ts +121 -0
  109. package/src/generation/foliage/config/BarkMaterialConfig.d.ts.map +1 -0
  110. package/src/generation/foliage/config/BarkMaterialConfig.js +250 -0
  111. package/src/generation/foliage/config/BranchLevelConfig.d.ts +288 -0
  112. package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +1 -0
  113. package/src/generation/foliage/config/BranchLevelConfig.js +536 -0
  114. package/src/generation/foliage/config/CrownConfig.d.ts +100 -0
  115. package/src/generation/foliage/config/CrownConfig.d.ts.map +1 -0
  116. package/src/generation/foliage/config/CrownConfig.js +186 -0
  117. package/src/generation/foliage/config/CrownEnvelopeType.d.ts +16 -0
  118. package/src/generation/foliage/config/CrownEnvelopeType.d.ts.map +1 -0
  119. package/src/generation/foliage/config/CrownEnvelopeType.js +17 -0
  120. package/src/generation/foliage/config/FoliageBarkType.d.ts +11 -0
  121. package/src/generation/foliage/config/FoliageBarkType.d.ts.map +1 -0
  122. package/src/generation/foliage/config/FoliageBarkType.js +16 -0
  123. package/src/generation/foliage/config/FoliageCardType.d.ts +12 -0
  124. package/src/generation/foliage/config/FoliageCardType.d.ts.map +1 -0
  125. package/src/generation/foliage/config/FoliageCardType.js +18 -0
  126. package/src/generation/foliage/config/FoliageConfig.d.ts +151 -0
  127. package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -0
  128. package/src/generation/foliage/config/FoliageConfig.js +283 -0
  129. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +143 -0
  130. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -0
  131. package/src/generation/foliage/config/FoliageMaterialConfig.js +279 -0
  132. package/src/generation/foliage/config/PhyllotaxisMode.d.ts +13 -0
  133. package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -0
  134. package/src/generation/foliage/config/PhyllotaxisMode.js +20 -0
  135. package/src/generation/foliage/config/TreeLODConfig.d.ts +87 -0
  136. package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -0
  137. package/src/generation/foliage/config/TreeLODConfig.js +211 -0
  138. package/src/generation/foliage/config/TreePreset.d.ts +16 -0
  139. package/src/generation/foliage/config/TreePreset.d.ts.map +1 -0
  140. package/src/generation/foliage/config/TreePreset.js +17 -0
  141. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +109 -0
  142. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -0
  143. package/src/generation/foliage/config/TreeSpeciesConfig.js +400 -0
  144. package/src/generation/foliage/config/TreeWindConfig.d.ts +84 -0
  145. package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -0
  146. package/src/generation/foliage/config/TreeWindConfig.js +157 -0
  147. package/src/generation/foliage/index.d.ts +39 -0
  148. package/src/generation/foliage/index.d.ts.map +1 -0
  149. package/src/generation/foliage/index.js +44 -0
  150. package/src/generation/foliage/material/make_bark_material.d.ts +37 -0
  151. package/src/generation/foliage/material/make_bark_material.d.ts.map +1 -0
  152. package/src/generation/foliage/material/make_bark_material.js +730 -0
  153. package/src/generation/foliage/material/make_foliage_material.d.ts +40 -0
  154. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -0
  155. package/src/generation/foliage/material/make_foliage_material.js +605 -0
  156. package/src/generation/foliage/mesh/branch_collar_project.d.ts +42 -0
  157. package/src/generation/foliage/mesh/branch_collar_project.d.ts.map +1 -0
  158. package/src/generation/foliage/mesh/branch_collar_project.js +205 -0
  159. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts +35 -0
  160. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts.map +1 -0
  161. package/src/generation/foliage/mesh/branch_ring_triangulate.js +72 -0
  162. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +95 -0
  163. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -0
  164. package/src/generation/foliage/mesh/foliage_collect_attachments.js +569 -0
  165. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts +19 -0
  166. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts.map +1 -0
  167. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.js +150 -0
  168. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts +55 -0
  169. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -0
  170. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1049 -0
  171. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +22 -0
  172. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -0
  173. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +454 -0
  174. package/src/generation/foliage/presets/make_tree_species_preset.d.ts +13 -0
  175. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -0
  176. package/src/generation/foliage/presets/make_tree_species_preset.js +870 -0
  177. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +443 -0
  178. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -0
  179. package/src/generation/foliage/skeleton/TreeSkeleton.js +1100 -0
  180. package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts +27 -0
  181. package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts.map +1 -0
  182. package/src/generation/foliage/skeleton/crown_envelope_evaluate.js +121 -0
  183. package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts +32 -0
  184. package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts.map +1 -0
  185. package/src/generation/foliage/skeleton/spine_frame_double_reflection.js +87 -0
  186. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +33 -0
  187. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -0
  188. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +205 -0
  189. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts +17 -0
  190. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -0
  191. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +206 -0
  192. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +18 -0
  193. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -0
  194. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +1871 -0
  195. package/src/shade/playground/additive_blending/index.html +197 -0
  196. package/src/shade/playground/additive_blending/main.d.ts +2 -0
  197. package/src/shade/playground/additive_blending/main.d.ts.map +1 -0
  198. package/src/shade/playground/additive_blending/main.js +529 -0
  199. package/src/shade/playground/foliage_wind/README.md +18 -0
  200. package/src/shade/playground/foliage_wind/foliage_world.d.ts +133 -0
  201. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -0
  202. package/src/shade/playground/foliage_wind/foliage_world.js +602 -0
  203. package/src/shade/playground/foliage_wind/index.html +260 -0
  204. package/src/shade/playground/foliage_wind/main.d.ts +2 -0
  205. package/src/shade/playground/foliage_wind/main.d.ts.map +1 -0
  206. package/src/shade/playground/foliage_wind/main.js +275 -0
  207. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  208. package/src/shade/renderer/Renderer.js +45 -16
  209. package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +145 -0
  210. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts +9 -1
  211. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts.map +1 -1
  212. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.js +53 -1
  213. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts +8 -0
  214. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts.map +1 -0
  215. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.js +71 -0
  216. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts +11 -0
  217. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts.map +1 -0
  218. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.js +32 -0
  219. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +30 -3
  220. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  221. package/src/shade/renderer/animation/GPUAnimationManager.js +532 -79
  222. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +19 -12
  223. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
  224. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +20 -13
  225. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +35 -8
  226. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
  227. package/src/shade/renderer/animation/ShadeAnimationClip.js +433 -2
  228. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
  229. package/src/shade/renderer/animation/chunk_pose_accumulator.js +40 -32
  230. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +97 -0
  231. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -0
  232. package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +161 -0
  233. package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts +65 -0
  234. package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts.map +1 -0
  235. package/src/shade/renderer/animation/foliage/FoliageWindRig.js +89 -0
  236. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts +19 -0
  237. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -0
  238. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +143 -0
  239. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts +14 -0
  240. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts.map +1 -0
  241. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.js +116 -0
  242. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
  243. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +39 -29
  244. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +37 -37
  245. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +2 -2
  246. package/src/shade/renderer/extension/RenderExtension.d.ts +7 -0
  247. package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
  248. package/src/shade/renderer/extension/RenderExtension.js +9 -0
  249. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +6 -0
  250. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
  251. package/src/shade/renderer/extension/RenderExtensionRegistry.js +15 -0
  252. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +10 -3
  253. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  254. package/src/shade/renderer/fluid/GPUFluidCascade.js +15 -0
  255. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +8 -1
  256. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
  257. package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +11 -0
  258. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  259. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +51 -48
  260. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  261. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -0
  262. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  263. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +16 -0
  264. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
  265. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +15 -3
  266. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
  267. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +102 -96
  268. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +12 -12
  269. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +12 -12
  270. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +8 -1
  271. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
  272. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +16 -0
  273. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts +7 -0
  274. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts.map +1 -1
  275. package/src/shade/renderer/fluid/publish/FluidWindPublish.js +10 -0
  276. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  277. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +2 -2
  278. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +1 -1
  279. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +3 -3
  280. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  281. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +350 -294
  282. package/src/shade/renderer/hiz/generate_downsampler_code.d.ts +0 -2
  283. package/src/shade/renderer/hiz/generate_downsampler_code.d.ts.map +1 -1
  284. package/src/shade/renderer/hiz/generate_downsampler_code.js +99 -100
  285. package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts +15 -0
  286. package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts.map +1 -0
  287. package/src/shade/renderer/hiz/hzb_pick_alignment.js +148 -0
  288. package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts +28 -0
  289. package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts.map +1 -0
  290. package/src/shade/renderer/hiz/hzb_plan_reduction_steps.js +58 -0
  291. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +5 -5
  292. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  293. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +57 -67
  294. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +3 -3
  295. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
  296. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +111 -112
  297. package/src/shade/renderer/hiz/shader_hzb_spd.d.ts +5 -0
  298. package/src/shade/renderer/hiz/shader_hzb_spd.d.ts.map +1 -0
  299. package/src/shade/renderer/hiz/shader_hzb_spd.js +160 -0
  300. package/src/shade/renderer/light/GPULightCollection.d.ts +8 -0
  301. package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
  302. package/src/shade/renderer/light/GPULightCollection.js +67 -0
  303. package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts +7 -0
  304. package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts.map +1 -0
  305. package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.js +13 -0
  306. package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts +10 -0
  307. package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts.map +1 -0
  308. package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.js +72 -0
  309. package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts +39 -0
  310. package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts.map +1 -0
  311. package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.js +90 -0
  312. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts +12 -0
  313. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts.map +1 -0
  314. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.js +56 -0
  315. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts +31 -0
  316. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts.map +1 -0
  317. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js +196 -0
  318. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts +10 -0
  319. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts.map +1 -0
  320. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js +163 -0
  321. package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts +4 -0
  322. package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts.map +1 -0
  323. package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.js +137 -0
  324. package/src/shade/renderer/loader/SceneBundle.d.ts +7 -0
  325. package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
  326. package/src/shade/renderer/loader/SceneBundle.js +119 -111
  327. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  328. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts +4 -0
  329. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
  330. package/src/shade/renderer/material/standard/fragment_gbuffer.js +6 -5
  331. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +8 -7
  332. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
  333. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +9 -8
  334. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  335. package/src/shade/renderer/particles/GPUParticleSystem.js +4 -1
  336. package/src/shade/renderer/particles/graph_particles_avboit.d.ts +4 -3
  337. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
  338. package/src/shade/renderer/particles/graph_particles_avboit.js +28 -11
  339. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts +9 -13
  340. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts.map +1 -1
  341. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.js +25 -20
  342. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  343. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +22 -34
  344. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  345. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  346. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +9 -7
  347. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.d.ts.map +1 -1
  348. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.js +15 -7
  349. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -1
  350. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +6 -4
  351. package/src/shade/renderer/rasterize/native/oit/oit_resolve_fragment_body.js +3 -3
  352. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.d.ts.map +1 -1
  353. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +8 -5
  354. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  355. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +4 -3
  356. package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.d.ts.map +1 -1
  357. package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.js +62 -62
  358. package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts +6 -0
  359. package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts.map +1 -0
  360. package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.js +19 -0
  361. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.d.ts.map +1 -1
  362. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.js +16 -10
  363. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.d.ts.map +1 -1
  364. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.js +118 -117
  365. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1 -1
  366. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts +9 -0
  367. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts.map +1 -0
  368. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.js +17 -0
  369. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts +8 -0
  370. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts.map +1 -1
  371. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.js +28 -20
  372. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts +8 -0
  373. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts.map +1 -0
  374. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.js +15 -0
  375. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts +41 -7
  376. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts.map +1 -1
  377. package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.js +162 -58
  378. package/src/shade/renderer/view/chunk_view_mip_bias.d.ts +21 -0
  379. package/src/shade/renderer/view/chunk_view_mip_bias.d.ts.map +1 -0
  380. package/src/shade/renderer/view/chunk_view_mip_bias.js +44 -0
  381. package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.js +1 -1
  382. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +10 -12
  383. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  384. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +583 -606
  385. package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_sample.d.ts +24 -0
  386. package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_sample.d.ts.map +1 -0
  387. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.d.ts.map +1 -1
  388. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +1 -1
  389. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +640 -640
  390. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts +113 -0
  391. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts.map +1 -0
  392. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.js +484 -0
  393. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts +50 -0
  394. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts.map +1 -0
  395. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.js +60 -0
  396. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts +25 -0
  397. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts.map +1 -0
  398. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.js +47 -0
  399. package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts +74 -0
  400. package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts.map +1 -0
  401. package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.js +173 -0
  402. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts +26 -0
  403. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts.map +1 -0
  404. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +83 -0
  405. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts +31 -0
  406. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts.map +1 -0
  407. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.js +113 -0
  408. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts +121 -0
  409. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts.map +1 -0
  410. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.js +356 -0
  411. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts +16 -0
  412. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts.map +1 -0
  413. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.js +191 -0
  414. package/src/shade/renderer/volumetrics/shader_volumetrics_classify_froxels.d.ts +16 -0
  415. package/src/shade/renderer/volumetrics/shader_volumetrics_classify_froxels.d.ts.map +1 -0
  416. package/src/shade/renderer/volumetrics/shader_volumetrics_lighting_regimes.d.ts +23 -0
  417. package/src/shade/renderer/volumetrics/shader_volumetrics_lighting_regimes.d.ts.map +1 -0
  418. package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
  419. package/src/shade/renderer/wind/GPUSceneWind.js +1 -1
  420. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +1 -1
  421. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  422. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +105 -26
  423. package/src/engine/graphics/composit/CompositingStages.d.ts +0 -6
  424. package/src/engine/graphics/composit/CompositingStages.d.ts.map +0 -1
  425. package/src/engine/graphics/composit/CompositingStages.js +0 -8
  426. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +0 -7
  427. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +0 -1
  428. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +0 -24
  429. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts +0 -8
  430. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts.map +0 -1
  431. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.js +0 -17
  432. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +0 -8
  433. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +0 -1
  434. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +0 -60
  435. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +0 -7
  436. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +0 -1
  437. package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +0 -26
  438. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +0 -7
  439. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +0 -1
  440. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +0 -23
  441. package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts +0 -7
  442. package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts.map +0 -1
  443. package/src/engine/graphics/geometry/instancing/geometry_copy.js +0 -15
  444. package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts +0 -2
  445. package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts.map +0 -1
  446. package/src/engine/graphics/geometry/instancing/rewriteMaterial.js +0 -57
  447. package/src/engine/graphics/geometry/ribbon/Quad.d.ts +0 -96
  448. package/src/engine/graphics/geometry/ribbon/Quad.d.ts.map +0 -1
  449. package/src/engine/graphics/geometry/ribbon/Quad.js +0 -213
  450. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +0 -9
  451. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +0 -1
  452. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +0 -12
  453. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +0 -10
  454. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +0 -1
  455. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +0 -17
  456. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +0 -10
  457. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +0 -1
  458. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +0 -13
  459. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +0 -11
  460. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +0 -1
  461. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +0 -24
  462. package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts +0 -6
  463. package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts.map +0 -1
  464. package/src/engine/graphics/geometry/ribbon/rotateRibbon.js +0 -37
  465. package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts +0 -9
  466. package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts.map +0 -1
  467. package/src/engine/graphics/geometry/ribbon/updateTipPosition.js +0 -52
  468. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts +0 -8
  469. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts.map +0 -1
  470. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.js +0 -54
  471. package/src/engine/graphics/render/RenderPassType.d.ts +0 -6
  472. package/src/engine/graphics/render/RenderPassType.d.ts.map +0 -1
  473. package/src/engine/graphics/render/RenderPassType.js +0 -8
  474. package/src/engine/graphics/render/layers/RenderLayer.d.ts +0 -78
  475. package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +0 -1
  476. package/src/engine/graphics/render/layers/RenderLayer.js +0 -95
  477. package/src/engine/graphics/render/layers/RenderLayerManager.d.ts +0 -72
  478. package/src/engine/graphics/render/layers/RenderLayerManager.d.ts.map +0 -1
  479. package/src/engine/graphics/render/layers/RenderLayerManager.js +0 -160
  480. package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts +0 -18
  481. package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts.map +0 -1
  482. package/src/engine/graphics/render/layers/RenderLayerManagerState.js +0 -48
  483. package/src/engine/graphics/render/layers/RenderLayerState.d.ts +0 -18
  484. package/src/engine/graphics/render/layers/RenderLayerState.d.ts.map +0 -1
  485. package/src/engine/graphics/render/layers/RenderLayerState.js +0 -27
  486. package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts +0 -8
  487. package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts.map +0 -1
  488. package/src/engine/graphics/render/layers/RenderLayerUtils.js +0 -103
  489. package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts +0 -10
  490. package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts.map +0 -1
  491. package/src/engine/graphics/render/make_bvh_visibility_builder.js +0 -64
  492. package/src/engine/graphics/render/view/CameraViewFlags.d.ts +0 -7
  493. package/src/engine/graphics/render/view/CameraViewFlags.d.ts.map +0 -1
  494. package/src/engine/graphics/render/view/CameraViewFlags.js +0 -9
  495. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts +0 -143
  496. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts.map +0 -1
  497. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.js +0 -328
  498. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +0 -39
  499. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts.map +0 -1
  500. package/src/engine/graphics/render/visibility/VisibilityComputer.js +0 -80
  501. package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts +0 -29
  502. package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts.map +0 -1
  503. package/src/engine/graphics/render/visibility/VisibilityFilter.js +0 -37
  504. package/src/engine/graphics3/animation/write_graph_playback.d.ts +0 -24
  505. package/src/engine/graphics3/animation/write_graph_playback.d.ts.map +0 -1
  506. package/src/engine/graphics3/animation/write_graph_playback.js +0 -48
  507. package/src/engine/graphics3/decal/DecalAtlasFill.js +0 -32
  508. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_froxel_centre_ws.js +0 -49
  509. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.js +0 -50
  510. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.js +0 -105
  511. package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.js +0 -80
  512. package/src/shade/renderer/volumetrics/gi/shader_volumetrics_gi.js +0 -51
  513. package/src/shade/renderer/volumetrics/gi/volumetrics_gi_resources.js +0 -39
  514. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +0 -121
  515. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.js +0 -237
@@ -1,334 +1,369 @@
1
- import { assert } from "../../../core/assert.js";
2
- import { m4_multiply } from "../../../core/geom/3d/mat4/m4_multiply.js";
3
- import { ShadeAnimationChannel } from "../../../shade/renderer/animation/ShadeAnimationChannel.js";
4
- import { ShadeAnimationClip } from "../../../shade/renderer/animation/ShadeAnimationClip.js";
5
- import { Skin } from "../../../shade/renderer/animation/Skin.js";
6
- import { Transform64 } from "../../ecs/transform/Transform64.js";
7
- import { Prefab, PrefabPrimitive } from "./Prefab.js";
8
- import { prefab_normalize_skin_frames } from "./prefab_normalize_skin_frames.js";
9
- import { prefab_skin_clip_scale_conflicts } from "./prefab_skin_clip_scale_conflicts.js";
10
-
11
- /**
12
- * @typedef {import("../../../shade/renderer/loader/SceneBundle.js").SceneBundle} SceneBundle
13
- * @typedef {import("../../../shade/renderer/loader/SceneNode.js").SceneNode} SceneNode
14
- */
15
-
16
- /**
17
- * The root's world, and every node's until it is composed.
18
- *
19
- * @type {Float64Array}
20
- */
21
- const IDENTITY = new Float64Array([
22
- 1, 0, 0, 0,
23
- 0, 1, 0, 0,
24
- 0, 0, 1, 0,
25
- 0, 0, 0, 1,
26
- ]);
27
-
28
- /**
29
- * Whether a root can be folded into the prefab's root: it carries nothing an entity would be
30
- * spawned for. glTF gives every scene one of these, so folding it is one entity fewer per
31
- * placement; a root that is posed, named, drawn or animated is kept.
32
- *
33
- * @param {SceneNode} node
34
- * @param {number} index the node's index in the bundle
35
- * @param {Set<number>} referenced indices of the nodes a skin or a clip names
36
- * @returns {boolean}
37
- */
38
- function foldable(node, index, referenced) {
39
- return node.parent === -1
40
- && node.name === ""
41
- && node.geometry === null
42
- && node.local.isIdentity()
43
- && !referenced.has(index);
44
- }
45
-
46
- /**
47
- * Compile what a loader produced into a {@link Prefab}.
48
- *
49
- * The bundle is read and never written: it is the loader's, shared by every placement of the
50
- * model and by whatever else reads it. Geometry, materials, inverse-bind matrices and curves are
51
- * referenced, not copied.
52
- *
53
- * The bundle's nodes are in pre-order, so one forward pass indexes them with every parent below
54
- * its children and composes each world from its parent's. Skins and clips are re-addressed from
55
- * the bundle's indices to the prefab's; nothing about them changes otherwise. Then, once per model
56
- * rather than once per placement, each skin's meshes are put into the frame the skin deforms in
57
- * ({@link prefab_normalize_skin_frames}) and each clip that scales something is checked against
58
- * each skin ({@link prefab_skin_clip_scale_conflicts}), both reported the way the animation
59
- * manager used to report them on registration.
60
- *
61
- * @param {SceneBundle} bundle
62
- * @returns {Prefab}
63
- */
64
- export function prefab_compile(bundle) {
65
- assert.defined(bundle, 'bundle');
66
- assert.equal(bundle.isSceneBundle, true, 'bundle.isSceneBundle !== true');
67
-
68
- const nodes = bundle.nodes;
69
-
70
- const referenced = new Set();
71
-
72
- for (const skin of bundle.skins) {
73
- for (const joint of skin.joints) {
74
- referenced.add(joint);
75
- }
76
-
77
- for (const mesh of skin.meshes) {
78
- referenced.add(mesh);
79
- }
80
- }
81
-
82
- for (const clip of bundle.clips) {
83
- for (const channel of clip.channels) {
84
- referenced.add(channel.target);
85
- }
86
- }
87
-
88
- const prefab = new Prefab();
89
-
90
- /**
91
- * The prefab index of each bundle node; a folded root's is the prefab's root.
92
- *
93
- * @type {Int32Array}
94
- */
95
- const index_of = new Int32Array(nodes.length).fill(-1);
96
-
97
- const parents = [-1];
98
- const names = [""];
99
- const locals = [new Transform64()];
100
- const worlds = [new Float64Array(IDENTITY)];
101
-
102
- for (let i = 0; i < nodes.length; i++) {
103
- const node = nodes[i];
104
-
105
- assert.equal(node.parent < i, true, `bundle node ${i} names parent ${node.parent}: the bundle is not in pre-order`);
106
-
107
- if (foldable(node, i, referenced)) {
108
- index_of[i] = 0;
109
-
110
- continue;
111
- }
112
-
113
- const parent = node.parent === -1 ? 0 : index_of[node.parent];
114
- const index = parents.length;
115
-
116
- index_of[i] = index;
117
-
118
- parents.push(parent);
119
- names.push(node.name);
120
-
121
- const local = new Transform64();
122
-
123
- local.copy(node.local);
124
- local.updateMatrix();
125
-
126
- locals.push(local);
127
-
128
- const world = new Float64Array(16);
129
-
130
- m4_multiply(world, worlds[parent], local);
131
-
132
- worlds.push(world);
133
-
134
- if (node.geometry !== null) {
135
- const primitive = new PrefabPrimitive();
136
-
137
- primitive.node = index;
138
- primitive.geometry = node.geometry;
139
- primitive.material = node.material;
140
-
141
- prefab.primitives.push(primitive);
142
- }
143
- }
144
-
145
- prefab.node_count = parents.length;
146
- prefab.parent = Int32Array.from(parents);
147
- prefab.name = names;
148
- prefab.local = locals;
149
- prefab.world = worlds;
150
- prefab.animated = new Uint8Array(parents.length);
151
- prefab.index_names();
152
-
153
- /**
154
- * @param {number} node an index into the bundle's nodes
155
- * @param {string} what
156
- * @returns {number} the prefab's index for it
157
- */
158
- function resolve(node, what) {
159
- assert.isNonNegativeInteger(node, `${what}: a node is named by its index in the bundle`);
160
- assert.lessThan(node, nodes.length, `${what} names node ${node}, and the bundle has ${nodes.length}`);
161
-
162
- return index_of[node];
163
- }
164
-
165
- prefab.skins = bundle.skins.map((skin, s) => {
166
- const joints = skin.joints.map((joint, j) => resolve(joint, `skin ${s} joint ${j}`));
167
- const meshes = skin.meshes.map((mesh, m) => resolve(mesh, `skin ${s} mesh ${m}`));
168
-
169
- for (const joint of joints) {
170
- prefab.animated[joint] = 1;
171
- }
172
-
173
- for (const mesh of meshes) {
174
- const primitive = prefab.primitives.find(primitive => primitive.node === mesh);
175
-
176
- assert.defined(primitive, `skin ${s} deforms node ${mesh}, which carries no geometry`);
177
-
178
- primitive.skin = s;
179
- }
180
-
181
- return Skin.from({
182
- name: skin.name,
183
- joints,
184
- inverse_bind_matrices: skin.inverse_bind_matrices,
185
- meshes,
186
- });
187
- });
188
-
189
- prefab.clips = bundle.clips.map((clip, c) => ShadeAnimationClip.from({
190
- name: clip.name,
191
- channels: clip.channels.map((channel, ch) => {
192
- const target = resolve(channel.target, `clip ${c} channel ${ch}`);
193
-
194
- prefab.animated[target] = 1;
195
-
196
- return ShadeAnimationChannel.from({
197
- target,
198
- property: channel.property,
199
- curves: channel.curves,
200
- });
201
- }),
202
- }));
203
-
204
- /*
205
- A node under an animated one is animated too: once a clip takes the joint, the GPU composes
206
- the joint's world and every world below it, so the instance has to be able to say so on each
207
- of those entities without adding a component mid-game. Pre-order puts every parent before
208
- its children, so one pass carries the mark all the way down.
209
- */
210
- const animated = prefab.animated;
211
- const parent_of = prefab.parent;
212
-
213
- for (let i = 1; i < animated.length; i++) {
214
- if (animated[parent_of[i]] === 1) {
215
- animated[i] = 1;
216
- }
217
- }
218
-
219
- const reports = prefab_normalize_skin_frames(prefab);
220
-
221
- for (let s = 0; s < reports.length; s++) {
222
- report_frame(prefab, prefab.skins[s], reports[s]);
223
- }
224
-
225
- for (const clip of prefab.clips) {
226
- for (const skin of prefab.skins) {
227
- report_scale_conflicts(prefab, skin, clip);
228
- }
229
- }
230
-
231
- return prefab;
232
- }
233
-
234
- /**
235
- * The name a person would recognise a skin by: its own, or its first mesh's.
236
- *
237
- * @param {Prefab} prefab
238
- * @param {Skin} skin
239
- * @returns {string}
240
- */
241
- function skin_label(prefab, skin) {
242
- if (skin.name !== '') {
243
- return skin.name;
244
- }
245
-
246
- const mesh = skin.meshes[0];
247
-
248
- return mesh === undefined ? '<unnamed>' : (prefab.name[mesh] || '<unnamed>');
249
- }
250
-
251
- /**
252
- * Say what {@link prefab_normalize_skin_frames} found, on the console, the way registration
253
- * used to: an asset that renders wrong should say which asset and by how much, once, where it
254
- * was compiled, rather than reaching a person as a screenshot of soup.
255
- *
256
- * @param {Prefab} prefab
257
- * @param {Skin} skin
258
- * @param {object} report
259
- */
260
- function report_frame(prefab, skin, report) {
261
- const label = skin_label(prefab, skin);
262
-
263
- if (report.frame_defect > 0.001) {
264
- console.error(
265
- `skin '${label}': no frame can deform it — `
266
- + `inverse(frame) × joint.global × inverse_bind is ${report.frame_defect.toFixed(4)} `
267
- + `away from rigid at its own bind pose, and a dual quaternion carries a rotation and `
268
- + `a translation and nothing else. The rest pose has a non-uniform scale or a shear `
269
- + `in it. Rendering will be wrong; see SKINNING_FRAME_PLAN.md §4.`
270
- );
271
-
272
- return;
273
- }
274
-
275
- if (report.residual > 0.001) {
276
- console.error(
277
- `skin '${label}': its mesh frame did not land — ${report.residual.toFixed(6)} `
278
- + `left over. A correction carrying shear does not survive a Transform64's TRS `
279
- + `components. Rendering will be wrong; see SKINNING_FRAME_PLAN.md §3.`
280
- );
281
-
282
- return;
283
- }
284
-
285
- for (const mesh of report.obstructed) {
286
- console.warn(
287
- `skin '${label}': mesh node '${prefab.name[mesh]}' carries the skin's frame now, and `
288
- + `its child nodes inherit it. Sockets belong on bones.`
289
- );
290
- }
291
-
292
- if (report.corrected > 0) {
293
- // verbose rather than a warning: this is a legal asset shape, and a crowd of them would
294
- // otherwise be a crowd of log lines
295
- console.debug(
296
- `skin '${label}': ${report.corrected} mesh frame(s) moved onto the skin's bind `
297
- + `transform, absorbing ${report.absorbed.toFixed(4)} of non-rigidity the skinning `
298
- + `pass could not have carried.`
299
- );
300
- }
301
- }
302
-
303
- /**
304
- * Say so when a clip scales a skin's joints out from under the frame it is deformed in. Nothing
305
- * is refused: the clip is legal animation and the skin is a legal skin, and it is their
306
- * combination the skinning pass cannot carry.
307
- *
308
- * @param {Prefab} prefab
309
- * @param {Skin} skin
310
- * @param {ShadeAnimationClip} clip
311
- */
312
- function report_scale_conflicts(prefab, skin, clip) {
313
- const conflicts = prefab_skin_clip_scale_conflicts(prefab, skin, clip);
314
-
315
- if (conflicts.length === 0) {
316
- return;
317
- }
318
-
319
- const nodes = conflicts.map(conflict => prefab.name[conflict.node] || '<unnamed>').join(', ');
320
-
321
- const uniform = conflicts.every(conflict => conflict.uniform);
322
-
323
- console.error(
324
- `clip '${clip.name}' scales ${conflicts.length} node(s) of skin '${skin_label(prefab, skin)}' — `
325
- + `${nodes} — which reach its joints but not its mesh, so the scale enters the joint `
326
- + `matrices and not the frame they are folded against. A dual quaternion cannot carry `
327
- + `it and no choice of frame fixes it: the deformation will be wrong while this clip `
328
- + `plays. `
329
- + (uniform
330
- ? `The scale is uniform, which SKINNING_FRAME_PLAN.md §4 has a design for.`
331
- : `The scale is non-uniform, which no dual quaternion holds — §4's linear-blend `
332
- + `path or an import-time refusal.`)
333
- );
334
- }
1
+ import { assert } from "../../../core/assert.js";
2
+ import { m4_multiply } from "../../../core/geom/3d/mat4/m4_multiply.js";
3
+ import { FoliageWindJoint } from "../../../shade/renderer/animation/foliage/FoliageWindJoint.js";
4
+ import { FoliageWindRig } from "../../../shade/renderer/animation/foliage/FoliageWindRig.js";
5
+ import { ShadeAnimationChannel } from "../../../shade/renderer/animation/ShadeAnimationChannel.js";
6
+ import { ShadeAnimationClip } from "../../../shade/renderer/animation/ShadeAnimationClip.js";
7
+ import { Skin } from "../../../shade/renderer/animation/Skin.js";
8
+ import { Transform64 } from "../../ecs/transform/Transform64.js";
9
+ import { Prefab, PrefabPrimitive } from "./Prefab.js";
10
+ import { prefab_normalize_skin_frames } from "./prefab_normalize_skin_frames.js";
11
+ import { prefab_skin_clip_scale_conflicts } from "./prefab_skin_clip_scale_conflicts.js";
12
+
13
+ /**
14
+ * @typedef {import("../../../shade/renderer/loader/SceneBundle.js").SceneBundle} SceneBundle
15
+ * @typedef {import("../../../shade/renderer/loader/SceneNode.js").SceneNode} SceneNode
16
+ */
17
+
18
+ /**
19
+ * The root's world, and every node's until it is composed.
20
+ *
21
+ * @type {Float64Array}
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
+ * Whether a root can be folded into the prefab's root: it carries nothing an entity would be
32
+ * spawned for. glTF gives every scene one of these, so folding it is one entity fewer per
33
+ * placement; a root that is posed, named, drawn or animated is kept.
34
+ *
35
+ * @param {SceneNode} node
36
+ * @param {number} index the node's index in the bundle
37
+ * @param {Set<number>} referenced indices of the nodes a skin or a clip names
38
+ * @returns {boolean}
39
+ */
40
+ function foldable(node, index, referenced) {
41
+ return node.parent === -1
42
+ && node.name === ""
43
+ && node.geometry === null
44
+ && node.local.isIdentity()
45
+ && !referenced.has(index);
46
+ }
47
+
48
+ /**
49
+ * Compile what a loader produced into a {@link Prefab}.
50
+ *
51
+ * The bundle is read and never written: it is the loader's, shared by every placement of the
52
+ * model and by whatever else reads it. Geometry, materials, inverse-bind matrices and curves are
53
+ * referenced, not copied.
54
+ *
55
+ * The bundle's nodes are in pre-order, so one forward pass indexes them with every parent below
56
+ * its children and composes each world from its parent's. Skins and clips are re-addressed from
57
+ * the bundle's indices to the prefab's; nothing about them changes otherwise. Then, once per model
58
+ * rather than once per placement, each skin's meshes are put into the frame the skin deforms in
59
+ * ({@link prefab_normalize_skin_frames}) and each clip that scales something is checked against
60
+ * each skin ({@link prefab_skin_clip_scale_conflicts}), both reported the way the animation
61
+ * manager used to report them on registration.
62
+ *
63
+ * @param {SceneBundle} bundle
64
+ * @returns {Prefab}
65
+ */
66
+ export function prefab_compile(bundle) {
67
+ assert.defined(bundle, 'bundle');
68
+ assert.equal(bundle.isSceneBundle, true, 'bundle.isSceneBundle !== true');
69
+
70
+ const nodes = bundle.nodes;
71
+
72
+ const referenced = new Set();
73
+
74
+ for (const skin of bundle.skins) {
75
+ for (const joint of skin.joints) {
76
+ referenced.add(joint);
77
+ }
78
+
79
+ for (const mesh of skin.meshes) {
80
+ referenced.add(mesh);
81
+ }
82
+ }
83
+
84
+ for (const clip of bundle.clips) {
85
+ for (const channel of clip.channels) {
86
+ referenced.add(channel.target);
87
+ }
88
+ }
89
+
90
+ for (const rig of bundle.foliage_rigs) {
91
+ referenced.add(rig.root);
92
+ for (const joint of rig.joints) {
93
+ referenced.add(joint.target);
94
+ }
95
+ }
96
+
97
+ const prefab = new Prefab();
98
+
99
+ /**
100
+ * The prefab index of each bundle node; a folded root's is the prefab's root.
101
+ *
102
+ * @type {Int32Array}
103
+ */
104
+ const index_of = new Int32Array(nodes.length).fill(-1);
105
+
106
+ const parents = [-1];
107
+ const names = [""];
108
+ const locals = [new Transform64()];
109
+ const worlds = [new Float64Array(IDENTITY)];
110
+
111
+ for (let i = 0; i < nodes.length; i++) {
112
+ const node = nodes[i];
113
+
114
+ assert.equal(node.parent < i, true, `bundle node ${i} names parent ${node.parent}: the bundle is not in pre-order`);
115
+
116
+ if (foldable(node, i, referenced)) {
117
+ index_of[i] = 0;
118
+
119
+ continue;
120
+ }
121
+
122
+ const parent = node.parent === -1 ? 0 : index_of[node.parent];
123
+ const index = parents.length;
124
+
125
+ index_of[i] = index;
126
+
127
+ parents.push(parent);
128
+ names.push(node.name);
129
+
130
+ const local = new Transform64();
131
+
132
+ local.copy(node.local);
133
+ local.updateMatrix();
134
+
135
+ locals.push(local);
136
+
137
+ const world = new Float64Array(16);
138
+
139
+ m4_multiply(world, worlds[parent], local);
140
+
141
+ worlds.push(world);
142
+
143
+ if (node.geometry !== null) {
144
+ const primitive = new PrefabPrimitive();
145
+
146
+ primitive.node = index;
147
+ primitive.geometry = node.geometry;
148
+ primitive.material = node.material;
149
+
150
+ prefab.primitives.push(primitive);
151
+ }
152
+ }
153
+
154
+ prefab.node_count = parents.length;
155
+ prefab.parent = Int32Array.from(parents);
156
+ prefab.name = names;
157
+ prefab.local = locals;
158
+ prefab.world = worlds;
159
+ prefab.animated = new Uint8Array(parents.length);
160
+ prefab.index_names();
161
+
162
+ /**
163
+ * @param {number} node an index into the bundle's nodes
164
+ * @param {string} what
165
+ * @returns {number} the prefab's index for it
166
+ */
167
+ function resolve(node, what) {
168
+ assert.isNonNegativeInteger(node, `${what}: a node is named by its index in the bundle`);
169
+ assert.lessThan(node, nodes.length, `${what} names node ${node}, and the bundle has ${nodes.length}`);
170
+
171
+ return index_of[node];
172
+ }
173
+
174
+ prefab.skins = bundle.skins.map((skin, s) => {
175
+ const joints = skin.joints.map((joint, j) => resolve(joint, `skin ${s} joint ${j}`));
176
+ const meshes = skin.meshes.map((mesh, m) => resolve(mesh, `skin ${s} mesh ${m}`));
177
+
178
+ for (const joint of joints) {
179
+ prefab.animated[joint] = 1;
180
+ }
181
+
182
+ for (const mesh of meshes) {
183
+ const primitive = prefab.primitives.find(primitive => primitive.node === mesh);
184
+
185
+ assert.defined(primitive, `skin ${s} deforms node ${mesh}, which carries no geometry`);
186
+
187
+ primitive.skin = s;
188
+ }
189
+
190
+ return Skin.from({
191
+ name: skin.name,
192
+ joints,
193
+ inverse_bind_matrices: skin.inverse_bind_matrices,
194
+ meshes,
195
+ });
196
+ });
197
+
198
+ prefab.clips = bundle.clips.map((clip, c) => ShadeAnimationClip.from({
199
+ name: clip.name,
200
+ channels: clip.channels.map((channel, ch) => {
201
+ const target = resolve(channel.target, `clip ${c} channel ${ch}`);
202
+
203
+ prefab.animated[target] = 1;
204
+
205
+ return ShadeAnimationChannel.from({
206
+ target,
207
+ property: channel.property,
208
+ curves: channel.curves,
209
+ });
210
+ }),
211
+ }));
212
+
213
+ prefab.foliage_rigs = bundle.foliage_rigs.map((rig, r) => {
214
+ const root = resolve(rig.root, `foliage_rig ${r} root`);
215
+
216
+ return FoliageWindRig.from({
217
+ name: rig.name,
218
+ root,
219
+ weight: rig.weight,
220
+ joints: rig.joints.map((joint, j) => {
221
+ const target = resolve(joint.target, `foliage_rig ${r} joint ${j}`);
222
+
223
+ prefab.animated[target] = 1;
224
+
225
+ return FoliageWindJoint.from({
226
+ target,
227
+ branch_axis: joint.branch_axis,
228
+ compliance: joint.compliance,
229
+ natural_frequency: joint.natural_frequency,
230
+ damping_ratio: joint.damping_ratio,
231
+ max_angle: joint.max_angle,
232
+ turbulence: joint.turbulence,
233
+ phase_offset: joint.phase_offset,
234
+ });
235
+ }),
236
+ });
237
+ });
238
+
239
+ /*
240
+ A node under an animated one is animated too: once a clip takes the joint, the GPU composes
241
+ the joint's world and every world below it, so the instance has to be able to say so on each
242
+ of those entities without adding a component mid-game. Pre-order puts every parent before
243
+ its children, so one pass carries the mark all the way down.
244
+ */
245
+ const animated = prefab.animated;
246
+ const parent_of = prefab.parent;
247
+
248
+ for (let i = 1; i < animated.length; i++) {
249
+ if (animated[parent_of[i]] === 1) {
250
+ animated[i] = 1;
251
+ }
252
+ }
253
+
254
+ const reports = prefab_normalize_skin_frames(prefab);
255
+
256
+ for (let s = 0; s < reports.length; s++) {
257
+ report_frame(prefab, prefab.skins[s], reports[s]);
258
+ }
259
+
260
+ for (const clip of prefab.clips) {
261
+ for (const skin of prefab.skins) {
262
+ report_scale_conflicts(prefab, skin, clip);
263
+ }
264
+ }
265
+
266
+ return prefab;
267
+ }
268
+
269
+ /**
270
+ * The name a person would recognise a skin by: its own, or its first mesh's.
271
+ *
272
+ * @param {Prefab} prefab
273
+ * @param {Skin} skin
274
+ * @returns {string}
275
+ */
276
+ function skin_label(prefab, skin) {
277
+ if (skin.name !== '') {
278
+ return skin.name;
279
+ }
280
+
281
+ const mesh = skin.meshes[0];
282
+
283
+ return mesh === undefined ? '<unnamed>' : (prefab.name[mesh] || '<unnamed>');
284
+ }
285
+
286
+ /**
287
+ * Say what {@link prefab_normalize_skin_frames} found, on the console, the way registration
288
+ * used to: an asset that renders wrong should say which asset and by how much, once, where it
289
+ * was compiled, rather than reaching a person as a screenshot of soup.
290
+ *
291
+ * @param {Prefab} prefab
292
+ * @param {Skin} skin
293
+ * @param {object} report
294
+ */
295
+ function report_frame(prefab, skin, report) {
296
+ const label = skin_label(prefab, skin);
297
+
298
+ if (report.frame_defect > 0.001) {
299
+ console.error(
300
+ `skin '${label}': no frame can deform it — `
301
+ + `inverse(frame) × joint.global × inverse_bind is ${report.frame_defect.toFixed(4)} `
302
+ + `away from rigid at its own bind pose, and a dual quaternion carries a rotation and `
303
+ + `a translation and nothing else. The rest pose has a non-uniform scale or a shear `
304
+ + `in it. Rendering will be wrong; see SKINNING_FRAME_PLAN.md §4.`
305
+ );
306
+
307
+ return;
308
+ }
309
+
310
+ if (report.residual > 0.001) {
311
+ console.error(
312
+ `skin '${label}': its mesh frame did not land — ${report.residual.toFixed(6)} `
313
+ + `left over. A correction carrying shear does not survive a Transform64's TRS `
314
+ + `components. Rendering will be wrong; see SKINNING_FRAME_PLAN.md §3.`
315
+ );
316
+
317
+ return;
318
+ }
319
+
320
+ for (const mesh of report.obstructed) {
321
+ console.warn(
322
+ `skin '${label}': mesh node '${prefab.name[mesh]}' carries the skin's frame now, and `
323
+ + `its child nodes inherit it. Sockets belong on bones.`
324
+ );
325
+ }
326
+
327
+ if (report.corrected > 0) {
328
+ // verbose rather than a warning: this is a legal asset shape, and a crowd of them would
329
+ // otherwise be a crowd of log lines
330
+ console.debug(
331
+ `skin '${label}': ${report.corrected} mesh frame(s) moved onto the skin's bind `
332
+ + `transform, absorbing ${report.absorbed.toFixed(4)} of non-rigidity the skinning `
333
+ + `pass could not have carried.`
334
+ );
335
+ }
336
+ }
337
+
338
+ /**
339
+ * Say so when a clip scales a skin's joints out from under the frame it is deformed in. Nothing
340
+ * is refused: the clip is legal animation and the skin is a legal skin, and it is their
341
+ * combination the skinning pass cannot carry.
342
+ *
343
+ * @param {Prefab} prefab
344
+ * @param {Skin} skin
345
+ * @param {ShadeAnimationClip} clip
346
+ */
347
+ function report_scale_conflicts(prefab, skin, clip) {
348
+ const conflicts = prefab_skin_clip_scale_conflicts(prefab, skin, clip);
349
+
350
+ if (conflicts.length === 0) {
351
+ return;
352
+ }
353
+
354
+ const nodes = conflicts.map(conflict => prefab.name[conflict.node] || '<unnamed>').join(', ');
355
+
356
+ const uniform = conflicts.every(conflict => conflict.uniform);
357
+
358
+ console.error(
359
+ `clip '${clip.name}' scales ${conflicts.length} node(s) of skin '${skin_label(prefab, skin)}' — `
360
+ + `${nodes} — which reach its joints but not its mesh, so the scale enters the joint `
361
+ + `matrices and not the frame they are folded against. A dual quaternion cannot carry `
362
+ + `it and no choice of frame fixes it: the deformation will be wrong while this clip `
363
+ + `plays. `
364
+ + (uniform
365
+ ? `The scale is uniform, which SKINNING_FRAME_PLAN.md §4 has a design for.`
366
+ : `The scale is non-uniform, which no dual quaternion holds — §4's linear-blend `
367
+ + `path or an import-time refusal.`)
368
+ );
369
+ }