@zephyr3d/scene 0.9.25 → 0.9.27

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 (299) hide show
  1. package/dist/animation/animationset.js +92 -30
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
  4. package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
  5. package/dist/animation/joint_dynamics/controller.js +7 -5
  6. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  7. package/dist/animation/joint_dynamics/convex_collider.js +320 -0
  8. package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
  9. package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
  10. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  11. package/dist/animation/morphtrack.js +3 -4
  12. package/dist/animation/morphtrack.js.map +1 -1
  13. package/dist/animation/skeleton.js +79 -25
  14. package/dist/animation/skeleton.js.map +1 -1
  15. package/dist/animation/spring/multi_chain_spring_system.js +577 -179
  16. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  17. package/dist/animation/spring/spring_collider.js +4 -3
  18. package/dist/animation/spring/spring_collider.js.map +1 -1
  19. package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
  20. package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
  21. package/dist/animation/spring/spring_particle.js +2 -0
  22. package/dist/animation/spring/spring_particle.js.map +1 -1
  23. package/dist/animation/spring/spring_system.js +11 -3
  24. package/dist/animation/spring/spring_system.js.map +1 -1
  25. package/dist/animation/spring_modifier.js +10 -0
  26. package/dist/animation/spring_modifier.js.map +1 -1
  27. package/dist/app/engine.js +53 -43
  28. package/dist/app/engine.js.map +1 -1
  29. package/dist/app/scriptingsystem.js +119 -6
  30. package/dist/app/scriptingsystem.js.map +1 -1
  31. package/dist/app/scriptregistry.js +3 -2
  32. package/dist/app/scriptregistry.js.map +1 -1
  33. package/dist/asset/assetmanager.js +284 -67
  34. package/dist/asset/assetmanager.js.map +1 -1
  35. package/dist/asset/loaders/zhair/zhair_format.js +288 -0
  36. package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
  37. package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
  38. package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
  39. package/dist/asset/model.js +184 -69
  40. package/dist/asset/model.js.map +1 -1
  41. package/dist/camera/camera.js +268 -44
  42. package/dist/camera/camera.js.map +1 -1
  43. package/dist/camera/perspectivecamera.js +3 -1
  44. package/dist/camera/perspectivecamera.js.map +1 -1
  45. package/dist/index.d.ts +9044 -5139
  46. package/dist/index.js +17 -6
  47. package/dist/index.js.map +1 -1
  48. package/dist/material/eye.js +932 -0
  49. package/dist/material/eye.js.map +1 -0
  50. package/dist/material/hair.js +917 -0
  51. package/dist/material/hair.js.map +1 -0
  52. package/dist/material/hairstrand.js +842 -0
  53. package/dist/material/hairstrand.js.map +1 -0
  54. package/dist/material/hairstrand_data.js +162 -0
  55. package/dist/material/hairstrand_data.js.map +1 -0
  56. package/dist/material/lambert.js +5 -2
  57. package/dist/material/lambert.js.map +1 -1
  58. package/dist/material/material.js +48 -10
  59. package/dist/material/material.js.map +1 -1
  60. package/dist/material/meshmaterial.js +120 -19
  61. package/dist/material/meshmaterial.js.map +1 -1
  62. package/dist/material/mixins/albedocolor.js +1 -1
  63. package/dist/material/mixins/albedocolor.js.map +1 -1
  64. package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
  65. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  66. package/dist/material/mixins/lightmodel/lambert.js +5 -4
  67. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  68. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
  69. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  70. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
  71. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  72. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
  73. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  74. package/dist/material/mixins/lit.js +106 -19
  75. package/dist/material/mixins/lit.js.map +1 -1
  76. package/dist/material/mixins/pbr/common.js +4 -4
  77. package/dist/material/mixins/pbr/common.js.map +1 -1
  78. package/dist/material/mixins/texture.js +48 -11
  79. package/dist/material/mixins/texture.js.map +1 -1
  80. package/dist/material/mtoon.js +6 -5
  81. package/dist/material/mtoon.js.map +1 -1
  82. package/dist/material/pbrblueprint.js +146 -28
  83. package/dist/material/pbrblueprint.js.map +1 -1
  84. package/dist/material/pbrblueprint_instance.js +501 -0
  85. package/dist/material/pbrblueprint_instance.js.map +1 -0
  86. package/dist/material/pbrmr.js +15 -16
  87. package/dist/material/pbrmr.js.map +1 -1
  88. package/dist/material/shader/helper.js +734 -23
  89. package/dist/material/shader/helper.js.map +1 -1
  90. package/dist/material/shader/terrain_blend.js +55 -0
  91. package/dist/material/shader/terrain_blend.js.map +1 -0
  92. package/dist/material/skin.js +192 -32
  93. package/dist/material/skin.js.map +1 -1
  94. package/dist/material/spriteblueprint.js +16 -1
  95. package/dist/material/spriteblueprint.js.map +1 -1
  96. package/dist/material/subsurfaceprofile.js +86 -23
  97. package/dist/material/subsurfaceprofile.js.map +1 -1
  98. package/dist/material/water.js +2059 -72
  99. package/dist/material/water.js.map +1 -1
  100. package/dist/posteffect/bloom.js +167 -7
  101. package/dist/posteffect/bloom.js.map +1 -1
  102. package/dist/posteffect/coloradjust.js +2 -1
  103. package/dist/posteffect/coloradjust.js.map +1 -1
  104. package/dist/posteffect/compositor.js.map +1 -1
  105. package/dist/posteffect/fxaa.js +2 -1
  106. package/dist/posteffect/fxaa.js.map +1 -1
  107. package/dist/posteffect/grayscale.js +3 -1
  108. package/dist/posteffect/grayscale.js.map +1 -1
  109. package/dist/posteffect/motionblur.js +664 -56
  110. package/dist/posteffect/motionblur.js.map +1 -1
  111. package/dist/posteffect/posteffect.js +12 -1
  112. package/dist/posteffect/posteffect.js.map +1 -1
  113. package/dist/posteffect/sao.js +46 -44
  114. package/dist/posteffect/sao.js.map +1 -1
  115. package/dist/posteffect/skinsss.js +368 -69
  116. package/dist/posteffect/skinsss.js.map +1 -1
  117. package/dist/posteffect/ssgi.js +16 -9
  118. package/dist/posteffect/ssgi.js.map +1 -1
  119. package/dist/posteffect/ssr.js +3 -0
  120. package/dist/posteffect/ssr.js.map +1 -1
  121. package/dist/posteffect/sss.js +121 -36
  122. package/dist/posteffect/sss.js.map +1 -1
  123. package/dist/posteffect/taa.js.map +1 -1
  124. package/dist/posteffect/tonemap.js +44 -1
  125. package/dist/posteffect/tonemap.js.map +1 -1
  126. package/dist/render/abuffer_oit.js +8 -2
  127. package/dist/render/abuffer_oit.js.map +1 -1
  128. package/dist/render/clipmap.js +156 -5
  129. package/dist/render/clipmap.js.map +1 -1
  130. package/dist/render/cull_visitor.js +20 -0
  131. package/dist/render/cull_visitor.js.map +1 -1
  132. package/dist/render/depthpass.js +36 -2
  133. package/dist/render/depthpass.js.map +1 -1
  134. package/dist/render/drawable_mixin.js +26 -1
  135. package/dist/render/drawable_mixin.js.map +1 -1
  136. package/dist/render/dualdepthpeeling_oit.js +3 -2
  137. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  138. package/dist/render/envlight.js +1 -1
  139. package/dist/render/envlight.js.map +1 -1
  140. package/dist/render/fbm_wavegenerator.js +6 -3
  141. package/dist/render/fbm_wavegenerator.js.map +1 -1
  142. package/dist/render/fft_wavegenerator.js +57 -15
  143. package/dist/render/fft_wavegenerator.js.map +1 -1
  144. package/dist/render/gerstner_wavegenerator.js +130 -20
  145. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  146. package/dist/render/globalbindgroup_allocator.js +3 -0
  147. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  148. package/dist/render/hzb.js +80 -22
  149. package/dist/render/hzb.js.map +1 -1
  150. package/dist/render/lightpass.js +6 -3
  151. package/dist/render/lightpass.js.map +1 -1
  152. package/dist/render/oit.js +29 -0
  153. package/dist/render/oit.js.map +1 -0
  154. package/dist/render/render_queue.js +39 -0
  155. package/dist/render/render_queue.js.map +1 -1
  156. package/dist/render/renderer.js +4 -0
  157. package/dist/render/renderer.js.map +1 -1
  158. package/dist/render/rendergraph/blackboard.js +1 -0
  159. package/dist/render/rendergraph/blackboard.js.map +1 -1
  160. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  161. package/dist/render/rendergraph/executor.js +2 -0
  162. package/dist/render/rendergraph/executor.js.map +1 -1
  163. package/dist/render/rendergraph/forward_plus_builder.js +379 -10
  164. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  165. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  166. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  167. package/dist/render/rendergraph/history_resources.js +8 -1
  168. package/dist/render/rendergraph/history_resources.js.map +1 -1
  169. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  170. package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
  171. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
  172. package/dist/render/rendergraph/types.js.map +1 -1
  173. package/dist/render/shadow_mask_pass.js +73 -8
  174. package/dist/render/shadow_mask_pass.js.map +1 -1
  175. package/dist/render/sky.js +166 -126
  176. package/dist/render/sky.js.map +1 -1
  177. package/dist/render/underwater.js +624 -0
  178. package/dist/render/underwater.js.map +1 -0
  179. package/dist/render/water_caustics.js +1380 -0
  180. package/dist/render/water_caustics.js.map +1 -0
  181. package/dist/render/weightedblended_oit.js +3 -2
  182. package/dist/render/weightedblended_oit.js.map +1 -1
  183. package/dist/scene/basesprite.js +8 -0
  184. package/dist/scene/basesprite.js.map +1 -1
  185. package/dist/scene/batchgroup.js +3 -0
  186. package/dist/scene/batchgroup.js.map +1 -1
  187. package/dist/scene/environment.js +4 -1
  188. package/dist/scene/environment.js.map +1 -1
  189. package/dist/scene/hair.js +963 -0
  190. package/dist/scene/hair.js.map +1 -0
  191. package/dist/scene/light.js +5 -1
  192. package/dist/scene/light.js.map +1 -1
  193. package/dist/scene/mesh.js +481 -47
  194. package/dist/scene/mesh.js.map +1 -1
  195. package/dist/scene/meshdrawable.js +6 -0
  196. package/dist/scene/meshdrawable.js.map +1 -1
  197. package/dist/scene/msdftext.js +3 -0
  198. package/dist/scene/msdftext.js.map +1 -1
  199. package/dist/scene/msdftextsprite.js +3 -0
  200. package/dist/scene/msdftextsprite.js.map +1 -1
  201. package/dist/scene/particlesys.js +6 -0
  202. package/dist/scene/particlesys.js.map +1 -1
  203. package/dist/scene/scene.js +3 -0
  204. package/dist/scene/scene.js.map +1 -1
  205. package/dist/scene/scene_node.js +6 -1
  206. package/dist/scene/scene_node.js.map +1 -1
  207. package/dist/scene/terrain-cm/grass.js +3 -0
  208. package/dist/scene/terrain-cm/grass.js.map +1 -1
  209. package/dist/scene/terrain-cm/grassmaterial.js +3 -0
  210. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  211. package/dist/scene/terrain-cm/terrain-cm.js +6 -0
  212. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  213. package/dist/scene/terrain-cm/texture_cache.js +309 -0
  214. package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
  215. package/dist/scene/water.js +546 -4
  216. package/dist/scene/water.js.map +1 -1
  217. package/dist/shaders/atmosphere.js.map +1 -1
  218. package/dist/shaders/diffusion.js +54 -0
  219. package/dist/shaders/diffusion.js.map +1 -0
  220. package/dist/shaders/shadow.js +33 -21
  221. package/dist/shaders/shadow.js.map +1 -1
  222. package/dist/shaders/temporal.js +71 -33
  223. package/dist/shaders/temporal.js.map +1 -1
  224. package/dist/shaders/water.js +22 -19
  225. package/dist/shaders/water.js.map +1 -1
  226. package/dist/shaders/water_medium.js +56 -0
  227. package/dist/shaders/water_medium.js.map +1 -0
  228. package/dist/shadow/dom.js +546 -0
  229. package/dist/shadow/dom.js.map +1 -0
  230. package/dist/shadow/pcf_opt.js +3 -5
  231. package/dist/shadow/pcf_opt.js.map +1 -1
  232. package/dist/shadow/pcf_pd.js +1 -1
  233. package/dist/shadow/pcf_pd.js.map +1 -1
  234. package/dist/shadow/receiver_bias.js +41 -0
  235. package/dist/shadow/receiver_bias.js.map +1 -0
  236. package/dist/shadow/shader.js +20 -60
  237. package/dist/shadow/shader.js.map +1 -1
  238. package/dist/shadow/shadow_impl.js +89 -0
  239. package/dist/shadow/shadow_impl.js.map +1 -1
  240. package/dist/shadow/shadow_region.js +1 -1
  241. package/dist/shadow/shadow_region.js.map +1 -1
  242. package/dist/shadow/shadowmapper.js +150 -37
  243. package/dist/shadow/shadowmapper.js.map +1 -1
  244. package/dist/shapes/shape.js +11 -2
  245. package/dist/shapes/shape.js.map +1 -1
  246. package/dist/shapes/sphere.js +50 -9
  247. package/dist/shapes/sphere.js.map +1 -1
  248. package/dist/utility/blueprint/common/constants.js +112 -2
  249. package/dist/utility/blueprint/common/constants.js.map +1 -1
  250. package/dist/utility/blueprint/material/func.js +142 -49
  251. package/dist/utility/blueprint/material/func.js.map +1 -1
  252. package/dist/utility/blueprint/material/ir.js +490 -25
  253. package/dist/utility/blueprint/material/ir.js.map +1 -1
  254. package/dist/utility/blueprint/material/texture.js +898 -4
  255. package/dist/utility/blueprint/material/texture.js.map +1 -1
  256. package/dist/utility/serialization/manager.js +434 -101
  257. package/dist/utility/serialization/manager.js.map +1 -1
  258. package/dist/utility/serialization/scene/animation.js +401 -5
  259. package/dist/utility/serialization/scene/animation.js.map +1 -1
  260. package/dist/utility/serialization/scene/batch.js +4 -0
  261. package/dist/utility/serialization/scene/batch.js.map +1 -1
  262. package/dist/utility/serialization/scene/camera.js +186 -26
  263. package/dist/utility/serialization/scene/camera.js.map +1 -1
  264. package/dist/utility/serialization/scene/common.js +26 -5
  265. package/dist/utility/serialization/scene/common.js.map +1 -1
  266. package/dist/utility/serialization/scene/hair.js +1141 -0
  267. package/dist/utility/serialization/scene/hair.js.map +1 -0
  268. package/dist/utility/serialization/scene/light.js +84 -4
  269. package/dist/utility/serialization/scene/light.js.map +1 -1
  270. package/dist/utility/serialization/scene/material.js +1867 -166
  271. package/dist/utility/serialization/scene/material.js.map +1 -1
  272. package/dist/utility/serialization/scene/mesh.js +231 -14
  273. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  274. package/dist/utility/serialization/scene/node.js +141 -7
  275. package/dist/utility/serialization/scene/node.js.map +1 -1
  276. package/dist/utility/serialization/scene/particle.js +4 -0
  277. package/dist/utility/serialization/scene/particle.js.map +1 -1
  278. package/dist/utility/serialization/scene/primitive.js +18 -0
  279. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  280. package/dist/utility/serialization/scene/sprite.js +4 -0
  281. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  282. package/dist/utility/serialization/scene/terrain.js +4 -0
  283. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  284. package/dist/utility/serialization/scene/text.js +4 -0
  285. package/dist/utility/serialization/scene/text.js.map +1 -1
  286. package/dist/utility/serialization/scene/water.js +1105 -21
  287. package/dist/utility/serialization/scene/water.js.map +1 -1
  288. package/dist/utility/serialization/types.js.map +1 -1
  289. package/dist/utility/shprojector.js +9 -8
  290. package/dist/utility/shprojector.js.map +1 -1
  291. package/dist/values.js +49 -2
  292. package/dist/values.js.map +1 -1
  293. package/package.json +3 -3
  294. package/dist/render/rendergraph/frame_graph_context.js +0 -41
  295. package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
  296. package/dist/shaders/ssgi.js +0 -63
  297. package/dist/shaders/ssgi.js.map +0 -1
  298. package/dist/shaders/ssgi_reprojection.js +0 -118
  299. package/dist/shaders/ssgi_reprojection.js.map +0 -1
@@ -13,6 +13,13 @@ import { FixedGeometryCacheTrack } from '../../../animation/fixed_geometry_cache
13
13
  import { BoundingBox } from '../../bounding_volume.js';
14
14
  import { PCAGeometryCacheTrack } from '../../../animation/pca_geometry_cache_track.js';
15
15
  import { Skeleton, SkeletonRig, SkinBinding } from '../../../animation/skeleton.js';
16
+ import { SpringModifier } from '../../../animation/spring_modifier.js';
17
+ import { createSpringParticle } from '../../../animation/spring/spring_particle.js';
18
+ import { createSpringConstraint } from '../../../animation/spring/spring_constraint.js';
19
+ import { SpringChain } from '../../../animation/spring/spring_chain.js';
20
+ import { SpringSystem } from '../../../animation/spring/spring_system.js';
21
+ import { MultiChainSpringSystem } from '../../../animation/spring/multi_chain_spring_system.js';
22
+ import { createPlaneCollider, createCapsuleCollider, createSphereCollider } from '../../../animation/spring/spring_collider.js';
16
23
  import '@zephyr3d/device';
17
24
  import '../../../animation/joint_dynamics/collision.js';
18
25
  import '../../../animation/joint_dynamics/solver.js';
@@ -30,7 +37,10 @@ import '../../../material/unlit.js';
30
37
  import '../../../material/particle.js';
31
38
  import '../../../material/subsurfaceprofile.js';
32
39
  import '../../../material/skin.js';
40
+ import '../../../material/eye.js';
33
41
  import '../../../material/meshmaterial.js';
42
+ import '../../../material/hair.js';
43
+ import '../../../material/hairstrand.js';
34
44
  import '../../../material/grassmaterial.js';
35
45
  import '../../../material/terrain-cm.js';
36
46
  import '../../../material/pbrmr.js';
@@ -55,6 +65,7 @@ import '../../../scene/meshdrawable.js';
55
65
  import '../../../scene/basesprite.js';
56
66
  import '../../../material/msdf_text.js';
57
67
  import '../../../scene/water.js';
68
+ import '../../../scene/hair.js';
58
69
  import '../../../scene/particlesys.js';
59
70
  import '../../../scene/batchgroup.js';
60
71
  import '../../../scene/terrain-cm/terrain-cm.js';
@@ -62,6 +73,7 @@ import '../../../scene/terrain-cm/grass.js';
62
73
  import '../../../scene/raycast_visitor.js';
63
74
 
64
75
  const jointDynamicsModifierSkeletons = new WeakMap();
76
+ const springModifierSkeletons = new WeakMap();
65
77
  function encodeSkeletonBindPose(bindPose) {
66
78
  return uint8ArrayToBase64(new Uint8Array(new Float32Array([
67
79
  ...bindPose.position,
@@ -77,6 +89,29 @@ function decodeSkeletonBindPose(encoded) {
77
89
  scale: new Vector3(data[7], data[8], data[9])
78
90
  };
79
91
  }
92
+ function encodeSkeletonPose(pose) {
93
+ const values = pose.flatMap((transform)=>[
94
+ ...transform.position,
95
+ ...transform.rotation,
96
+ ...transform.scale
97
+ ]);
98
+ return uint8ArrayToBase64(new Uint8Array(new Float32Array(values).buffer));
99
+ }
100
+ function decodeSkeletonPose(encoded, jointCount) {
101
+ const data = new Float32Array(base64ToUint8Array(encoded).buffer);
102
+ if (data.length !== jointCount * 10) {
103
+ throw new Error('Invalid serialized skeleton pose');
104
+ }
105
+ const pose = [];
106
+ for(let i = 0; i < jointCount; i++){
107
+ pose.push({
108
+ position: new Vector3(data[i * 10 + 0], data[i * 10 + 1], data[i * 10 + 2]),
109
+ rotation: new Quaternion(data[i * 10 + 3], data[i * 10 + 4], data[i * 10 + 5], data[i * 10 + 6]),
110
+ scale: new Vector3(data[i * 10 + 7], data[i * 10 + 8], data[i * 10 + 9])
111
+ });
112
+ }
113
+ return pose;
114
+ }
80
115
  function vectorToArray(value) {
81
116
  return [
82
117
  value.x,
@@ -87,6 +122,216 @@ function vectorToArray(value) {
87
122
  function vectorFromArray(value, defaultValue = Vector3.zero()) {
88
123
  return Array.isArray(value) ? new Vector3(value[0] ?? 0, value[1] ?? 0, value[2] ?? 0) : defaultValue.clone();
89
124
  }
125
+ function quaternionToArray(value) {
126
+ return [
127
+ value.x,
128
+ value.y,
129
+ value.z,
130
+ value.w
131
+ ];
132
+ }
133
+ function quaternionFromArray(value) {
134
+ return Array.isArray(value) ? new Quaternion(value[0] ?? 0, value[1] ?? 0, value[2] ?? 0, value[3] ?? 1) : undefined;
135
+ }
136
+ function serializeSpringChain(chain) {
137
+ return {
138
+ particles: chain.particles.map((particle)=>({
139
+ ...particle.node ? {
140
+ node: particle.node.persistentId
141
+ } : {},
142
+ ...particle.anchorNode ? {
143
+ anchorNode: particle.anchorNode.persistentId
144
+ } : {},
145
+ ...particle.anchorOffset ? {
146
+ anchorOffset: vectorToArray(particle.anchorOffset)
147
+ } : {},
148
+ originalPosition: vectorToArray(particle.originalPosition),
149
+ ...particle.originalRotation ? {
150
+ originalRotation: quaternionToArray(particle.originalRotation)
151
+ } : {},
152
+ mass: particle.mass,
153
+ damping: particle.damping,
154
+ fixed: particle.fixed
155
+ })),
156
+ constraints: chain.constraints.map((constraint)=>({
157
+ particleA: constraint.particleA,
158
+ particleB: constraint.particleB,
159
+ restLength: constraint.restLength,
160
+ stiffness: constraint.stiffness,
161
+ compliance: constraint.compliance
162
+ }))
163
+ };
164
+ }
165
+ function deserializeSpringChain(ctx, data) {
166
+ const chain = new SpringChain();
167
+ for (const item of data.particles ?? []){
168
+ const node = findSerializedNode(ctx, item.node);
169
+ const anchorNode = findSerializedNode(ctx, item.anchorNode);
170
+ if (item.node && !node || item.anchorNode && !anchorNode) {
171
+ return null;
172
+ }
173
+ const position = node ? new Vector3(node.worldMatrix.m03, node.worldMatrix.m13, node.worldMatrix.m23) : vectorFromArray(item.originalPosition);
174
+ let originalRotation = quaternionFromArray(item.originalRotation);
175
+ if (node) {
176
+ originalRotation = new Quaternion();
177
+ node.worldMatrix.decompose(null, originalRotation, null);
178
+ }
179
+ chain.addParticle(createSpringParticle(position, {
180
+ mass: item.mass,
181
+ damping: item.damping,
182
+ fixed: item.fixed,
183
+ node: node ?? undefined,
184
+ anchorNode: anchorNode ?? undefined,
185
+ anchorOffset: item.anchorOffset ? vectorFromArray(item.anchorOffset) : undefined,
186
+ originalRotation
187
+ }));
188
+ }
189
+ for (const item of data.constraints ?? []){
190
+ if (item.particleA < 0 || item.particleB < 0 || item.particleA >= chain.particles.length || item.particleB >= chain.particles.length) {
191
+ return null;
192
+ }
193
+ chain.addConstraint(createSpringConstraint(item.particleA, item.particleB, item.restLength, item.stiffness, item.compliance));
194
+ }
195
+ return chain.particles.length > 0 ? chain : null;
196
+ }
197
+ function serializeSpringCollider(collider) {
198
+ switch(collider.type){
199
+ case 'sphere':
200
+ {
201
+ const sphere = collider;
202
+ return {
203
+ type: 'sphere',
204
+ ...sphere.node ? {
205
+ node: sphere.node.persistentId
206
+ } : {},
207
+ enabled: sphere.enabled,
208
+ center: vectorToArray(sphere.center),
209
+ radius: sphere.radius,
210
+ ...sphere.localRadius !== undefined ? {
211
+ localRadius: sphere.localRadius
212
+ } : {},
213
+ ...sphere.localRadiusScaleRef !== undefined ? {
214
+ localRadiusScaleRef: sphere.localRadiusScaleRef
215
+ } : {},
216
+ ...sphere.localOffset ? {
217
+ localOffset: vectorToArray(sphere.localOffset)
218
+ } : {}
219
+ };
220
+ }
221
+ case 'capsule':
222
+ {
223
+ const capsule = collider;
224
+ return {
225
+ type: 'capsule',
226
+ ...capsule.node ? {
227
+ node: capsule.node.persistentId
228
+ } : {},
229
+ enabled: capsule.enabled,
230
+ start: vectorToArray(capsule.start),
231
+ end: vectorToArray(capsule.end),
232
+ radius: capsule.radius,
233
+ ...capsule.localRadius !== undefined ? {
234
+ localRadius: capsule.localRadius
235
+ } : {},
236
+ ...capsule.localRadiusScaleRef !== undefined ? {
237
+ localRadiusScaleRef: capsule.localRadiusScaleRef
238
+ } : {},
239
+ ...capsule.localStartOffset ? {
240
+ localStartOffset: vectorToArray(capsule.localStartOffset)
241
+ } : {},
242
+ ...capsule.localEndOffset ? {
243
+ localEndOffset: vectorToArray(capsule.localEndOffset)
244
+ } : {}
245
+ };
246
+ }
247
+ case 'plane':
248
+ {
249
+ const plane = collider;
250
+ return {
251
+ type: 'plane',
252
+ ...plane.node ? {
253
+ node: plane.node.persistentId
254
+ } : {},
255
+ enabled: plane.enabled,
256
+ point: vectorToArray(plane.point),
257
+ normal: vectorToArray(plane.normal),
258
+ ...plane.localPointOffset ? {
259
+ localPointOffset: vectorToArray(plane.localPointOffset)
260
+ } : {},
261
+ ...plane.localNormal ? {
262
+ localNormal: vectorToArray(plane.localNormal)
263
+ } : {}
264
+ };
265
+ }
266
+ }
267
+ }
268
+ function restoreSpringColliderRadiusScale(collider, data) {
269
+ const createdScaleRef = collider.localRadiusScaleRef;
270
+ if (data.localRadiusScaleRef !== undefined) {
271
+ collider.localRadiusScaleRef = data.localRadiusScaleRef;
272
+ } else if (data.localRadius !== undefined && createdScaleRef !== undefined && Number.isFinite(data.localRadius) && Number.isFinite(data.radius) && Math.abs(data.radius) > 1e-6) {
273
+ // Older serialized modifiers omitted the authored scale reference. Recover it
274
+ // from the stored world radius and the node scale captured by the constructor.
275
+ const inferredScaleRef = data.localRadius * createdScaleRef / data.radius;
276
+ if (Number.isFinite(inferredScaleRef) && Math.abs(inferredScaleRef) > 1e-6) {
277
+ collider.localRadiusScaleRef = Math.abs(inferredScaleRef);
278
+ }
279
+ }
280
+ collider.radius = data.radius;
281
+ }
282
+ function deserializeSpringCollider(ctx, data) {
283
+ const node = findSerializedNode(ctx, data.node);
284
+ if (data.node && !node) {
285
+ return null;
286
+ }
287
+ let collider;
288
+ switch(data.type){
289
+ case 'sphere':
290
+ {
291
+ const sphere = createSphereCollider(node && data.localOffset ? vectorFromArray(data.localOffset) : vectorFromArray(data.center), node ? data.localRadius ?? data.radius : data.radius, node ?? undefined);
292
+ restoreSpringColliderRadiusScale(sphere, data);
293
+ collider = sphere;
294
+ break;
295
+ }
296
+ case 'capsule':
297
+ {
298
+ const capsule = createCapsuleCollider(node && data.localStartOffset ? vectorFromArray(data.localStartOffset) : vectorFromArray(data.start), node && data.localEndOffset ? vectorFromArray(data.localEndOffset) : vectorFromArray(data.end), node ? data.localRadius ?? data.radius : data.radius, node ?? undefined);
299
+ restoreSpringColliderRadiusScale(capsule, data);
300
+ collider = capsule;
301
+ break;
302
+ }
303
+ case 'plane':
304
+ collider = createPlaneCollider(node && data.localPointOffset ? vectorFromArray(data.localPointOffset) : vectorFromArray(data.point), node && data.localNormal ? vectorFromArray(data.localNormal) : vectorFromArray(data.normal), node ?? undefined);
305
+ break;
306
+ }
307
+ collider.enabled = data.enabled;
308
+ return collider;
309
+ }
310
+ function getSpringSystemOptions(system) {
311
+ return {
312
+ iterations: system.iterations,
313
+ gravity: vectorToArray(system.gravity),
314
+ wind: vectorToArray(system.wind),
315
+ enableInertialForces: system.enableInertialForces,
316
+ centrifugalScale: system.centrifugalScale,
317
+ coriolisScale: system.coriolisScale,
318
+ solver: system.solver,
319
+ poseFollow: system.poseFollow,
320
+ poseFollowRoot: system.poseFollowRoot,
321
+ poseFollowTip: system.poseFollowTip,
322
+ poseFollowExponent: system.poseFollowExponent,
323
+ maxPoseOffset: system.maxPoseOffset,
324
+ maxPoseOffsetRoot: system.maxPoseOffsetRoot,
325
+ maxPoseOffsetTip: system.maxPoseOffsetTip
326
+ };
327
+ }
328
+ function deserializeSpringSystemOptions(options) {
329
+ return {
330
+ ...options,
331
+ gravity: vectorFromArray(options.gravity, new Vector3(0, -9.8, 0)),
332
+ wind: vectorFromArray(options.wind)
333
+ };
334
+ }
90
335
  function serializeScalarCurve(value) {
91
336
  return {
92
337
  mode: value.mode,
@@ -197,6 +442,12 @@ function setJointDynamicsModifierSkeleton(modifier, skeleton) {
197
442
  function getJointDynamicsModifierSkeleton(modifier) {
198
443
  return jointDynamicsModifierSkeletons.get(modifier) ?? null;
199
444
  }
445
+ /** @internal */ function setSpringModifierSkeleton(modifier, skeleton) {
446
+ springModifierSkeletons.set(modifier, skeleton);
447
+ }
448
+ /** @internal */ function getSpringModifierSkeleton(modifier) {
449
+ return springModifierSkeletons.get(modifier) ?? null;
450
+ }
200
451
  const jointDynamicsPropOptions = {
201
452
  group: 'Joint Dynamics'
202
453
  };
@@ -394,6 +645,135 @@ function createJointDynamicsCurveProp(name, key, label, description) {
394
645
  }
395
646
  };
396
647
  */ }
648
+ /** @internal */ function getSpringModifierClass() {
649
+ return {
650
+ ctor: SpringModifier,
651
+ name: 'SpringModifier',
652
+ createFunc (ctx, init) {
653
+ const skeleton = ctx.findSkeletonRigById(init.skeleton) ?? ctx.findSkeletonById(init.skeleton)?.rig ?? null;
654
+ if (!skeleton || !Array.isArray(init.chains) || init.chains.length === 0) {
655
+ return {
656
+ obj: null,
657
+ loadProps: false
658
+ };
659
+ }
660
+ const chains = init.chains.map((chain)=>deserializeSpringChain(ctx, chain));
661
+ if (chains.some((chain)=>!chain)) {
662
+ return {
663
+ obj: null,
664
+ loadProps: false
665
+ };
666
+ }
667
+ const options = deserializeSpringSystemOptions(init.options);
668
+ let system;
669
+ if (init.systemType === 'single') {
670
+ system = new SpringSystem(chains[0], options);
671
+ } else {
672
+ const multiChainSystem = new MultiChainSpringSystem(options);
673
+ for (const chain of chains){
674
+ multiChainSystem.addChain(chain);
675
+ }
676
+ for (const constraint of init.interChainConstraints ?? []){
677
+ if (constraint.chainAIndex < 0 || constraint.chainBIndex < 0 || constraint.chainAIndex >= chains.length || constraint.chainBIndex >= chains.length) {
678
+ continue;
679
+ }
680
+ multiChainSystem.addInterChainConstraint({
681
+ ...constraint,
682
+ lambda: 0
683
+ });
684
+ }
685
+ system = multiChainSystem;
686
+ }
687
+ for (const colliderData of init.colliders ?? []){
688
+ const collider = deserializeSpringCollider(ctx, colliderData);
689
+ if (collider) {
690
+ system.addCollider(collider);
691
+ }
692
+ }
693
+ const modifier = new SpringModifier(system, init.weight ?? 1);
694
+ modifier.sourceId = init.sourceId ?? '';
695
+ modifier.enabled = init.enabled ?? true;
696
+ setSpringModifierSkeleton(modifier, skeleton);
697
+ return {
698
+ obj: modifier,
699
+ loadProps: false
700
+ };
701
+ },
702
+ getInitParams (obj) {
703
+ const skeleton = getSpringModifierSkeleton(obj);
704
+ const system = obj.springSystem;
705
+ const isMultiChain = system instanceof MultiChainSpringSystem;
706
+ if (!isMultiChain && !(system instanceof SpringSystem)) {
707
+ throw new Error('Serialize SpringModifier failed: Unsupported spring system type');
708
+ }
709
+ const chains = isMultiChain ? system.chains : [
710
+ system.chain
711
+ ];
712
+ const init = {
713
+ skeleton: skeleton?.persistentId ?? '',
714
+ sourceId: obj.sourceId,
715
+ systemType: isMultiChain ? 'multi' : 'single',
716
+ options: getSpringSystemOptions(system),
717
+ chains: chains.map(serializeSpringChain),
718
+ ...isMultiChain ? {
719
+ interChainConstraints: system.interChainConstraints.map(({ lambda: _lambda, ...constraint })=>constraint)
720
+ } : {},
721
+ colliders: system.colliders.map(serializeSpringCollider),
722
+ enabled: obj.enabled,
723
+ weight: obj.weight
724
+ };
725
+ return init;
726
+ },
727
+ getProps () {
728
+ return defineProps([
729
+ {
730
+ name: 'Commands',
731
+ description: 'Reset spring modifier state',
732
+ type: 'command',
733
+ command () {
734
+ this.reset();
735
+ return false;
736
+ },
737
+ get (value) {
738
+ value.str[0] = 'Reset';
739
+ }
740
+ },
741
+ {
742
+ name: 'Enabled',
743
+ description: 'Whether this spring modifier is active',
744
+ type: 'bool',
745
+ isPersistent () {
746
+ return false;
747
+ },
748
+ get (value) {
749
+ value.bool[0] = this.enabled;
750
+ },
751
+ set (value) {
752
+ this.enabled = value.bool[0];
753
+ }
754
+ },
755
+ {
756
+ name: 'Weight',
757
+ description: 'Physics blend weight. 0 uses animation only, 1 uses full spring physics',
758
+ type: 'float',
759
+ options: {
760
+ minValue: 0,
761
+ maxValue: 1
762
+ },
763
+ isPersistent () {
764
+ return false;
765
+ },
766
+ get (value) {
767
+ value.num[0] = this.weight;
768
+ },
769
+ set (value) {
770
+ this.weight = value.num[0];
771
+ }
772
+ }
773
+ ]);
774
+ }
775
+ };
776
+ }
397
777
  /** @internal */ function getJointDynamicsModifierClass() {
398
778
  return {
399
779
  ctor: JointDynamicsModifier,
@@ -410,9 +790,15 @@ function createJointDynamicsCurveProp(name, key, label, description) {
410
790
  const chains = (init.chains ?? []).map((chain)=>{
411
791
  const start = findSerializedNode(ctx, chain.start);
412
792
  const end = findSerializedNode(ctx, chain.end);
793
+ const startAnchor = findSerializedNode(ctx, chain.startAnchor);
794
+ const endAnchor = findSerializedNode(ctx, chain.endAnchor);
413
795
  return start && end ? {
414
796
  start,
415
- end
797
+ end,
798
+ startAnchor: startAnchor ?? undefined,
799
+ endAnchor: endAnchor ?? undefined,
800
+ startAnchorOffset: chain.startAnchorOffset ? vectorFromArray(chain.startAnchorOffset) : undefined,
801
+ endAnchorOffset: chain.endAnchorOffset ? vectorFromArray(chain.endAnchorOffset) : undefined
416
802
  } : null;
417
803
  }).filter((chain)=>{
418
804
  return !!chain && chain.start.isParentOf(chain.end);
@@ -488,7 +874,11 @@ function createJointDynamicsCurveProp(name, key, label, description) {
488
874
  systemRoot: chainConfig.systemRoot.persistentId,
489
875
  chains: chainConfig.chains.map((chain)=>({
490
876
  start: chain.start.persistentId,
491
- end: chain.end.persistentId
877
+ end: chain.end.persistentId,
878
+ startAnchor: chain.startAnchor?.persistentId,
879
+ endAnchor: chain.endAnchor?.persistentId,
880
+ startAnchorOffset: chain.startAnchorOffset ? vectorToArray(chain.startAnchorOffset) : undefined,
881
+ endAnchorOffset: chain.endAnchorOffset ? vectorToArray(chain.endAnchorOffset) : undefined
492
882
  })),
493
883
  controllerConfig: serializeControllerConfig(controllerConfig),
494
884
  colliders: obj.jointDynamicsSystem.getColliderSnapshots().map((item)=>({
@@ -1457,6 +1847,7 @@ function getPCAGeometryCacheTrackClass() {
1457
1847
  const inverseBindMatricesArray = new Float32Array(base64ToUint8Array(init.inverseBindMatrices).buffer);
1458
1848
  const bindPoseArray = new Float32Array(base64ToUint8Array(init.bindPose ?? init.bindPoseMatrices).buffer);
1459
1849
  const rootBindPose = init.rootBindPose ? decodeSkeletonBindPose(init.rootBindPose) : undefined;
1850
+ const retargetPose = init.retargetPose ? decodeSkeletonPose(init.retargetPose, joints.length) : undefined;
1460
1851
  const inverseBindMatrices = [];
1461
1852
  const bindPose = [];
1462
1853
  for(let i = 0; i < joints.length; i++){
@@ -1482,7 +1873,8 @@ function getPCAGeometryCacheTrackClass() {
1482
1873
  if (!rig) {
1483
1874
  rig = new SkeletonRig(joints, bindPose, {
1484
1875
  rootJoint,
1485
- rootBindPose
1876
+ rootBindPose,
1877
+ retargetPose
1486
1878
  });
1487
1879
  ctx.animationSet.rigs.push(new DRef(rig));
1488
1880
  }
@@ -1514,6 +1906,7 @@ function getPCAGeometryCacheTrackClass() {
1514
1906
  rootBindPose: encodeSkeletonBindPose(obj.rig.rootBindPose),
1515
1907
  inverseBindMatrices: uint8ArrayToBase64(new Uint8Array(new Float32Array(inverseBindMatrices).buffer)),
1516
1908
  bindPose: uint8ArrayToBase64(new Uint8Array(new Float32Array(bindPose).buffer)),
1909
+ retargetPose: obj.rig.hasRetargetPose ? encodeSkeletonPose(obj.rig.retargetPose) : undefined,
1517
1910
  id: obj.persistentId
1518
1911
  };
1519
1912
  },
@@ -1556,9 +1949,11 @@ function getPCAGeometryCacheTrackClass() {
1556
1949
  });
1557
1950
  }
1558
1951
  }
1952
+ const retargetPose = init.retargetPose ? decodeSkeletonPose(init.retargetPose, joints.length) : undefined;
1559
1953
  const rig = new SkeletonRig(joints, bindPose, {
1560
1954
  rootJoint,
1561
- rootBindPose
1955
+ rootBindPose,
1956
+ retargetPose
1562
1957
  });
1563
1958
  rig.persistentId = init.id;
1564
1959
  return {
@@ -1580,6 +1975,7 @@ function getPCAGeometryCacheTrackClass() {
1580
1975
  rootJoint: obj.rootJoint?.persistentId ?? '',
1581
1976
  rootBindPose: encodeSkeletonBindPose(obj.rootBindPose),
1582
1977
  bindPose: uint8ArrayToBase64(new Uint8Array(new Float32Array(bindPose).buffer)),
1978
+ retargetPose: obj.hasRetargetPose ? encodeSkeletonPose(obj.retargetPose) : undefined,
1583
1979
  id: obj.persistentId
1584
1980
  };
1585
1981
  },
@@ -1792,5 +2188,5 @@ function getPCAGeometryCacheTrackClass() {
1792
2188
  };
1793
2189
  }
1794
2190
 
1795
- export { getAnimationClass, getFixedGeometryCacheTrackClass, getInterpolatorClass, getInterpolatorScalarClass, getJointDynamicsModifierClass, getJointDynamicsModifierSkeleton, getMorphTargetGroupTrackClass, getMorphTrackClass, getNodeEulerRotationTrackClass, getNodeRotationTrackClass, getNodeScaleTrackClass, getNodeTranslationTrackClass, getPCAGeometryCacheTrackClass, getPropTrackClass, getSkeletonClass, getSkeletonRigClass, getSkinBindingClass, setJointDynamicsModifierSkeleton };
2191
+ export { getAnimationClass, getFixedGeometryCacheTrackClass, getInterpolatorClass, getInterpolatorScalarClass, getJointDynamicsModifierClass, getJointDynamicsModifierSkeleton, getMorphTargetGroupTrackClass, getMorphTrackClass, getNodeEulerRotationTrackClass, getNodeRotationTrackClass, getNodeScaleTrackClass, getNodeTranslationTrackClass, getPCAGeometryCacheTrackClass, getPropTrackClass, getSkeletonClass, getSkeletonRigClass, getSkinBindingClass, getSpringModifierClass, getSpringModifierSkeleton, setJointDynamicsModifierSkeleton, setSpringModifierSkeleton };
1796
2192
  //# sourceMappingURL=animation.js.map