@zephyr3d/scene 0.7.0 → 0.7.1

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 (319) hide show
  1. package/dist/animation/animation.js +4 -15
  2. package/dist/animation/animation.js.map +1 -1
  3. package/dist/animation/animationset.js +22 -9
  4. package/dist/animation/animationset.js.map +1 -1
  5. package/dist/animation/animationtrack.js +1 -0
  6. package/dist/animation/animationtrack.js.map +1 -1
  7. package/dist/animation/eulerrotationtrack.js +0 -1
  8. package/dist/animation/eulerrotationtrack.js.map +1 -1
  9. package/dist/animation/morphtarget.js +7 -1
  10. package/dist/animation/morphtarget.js.map +1 -1
  11. package/dist/animation/morphtrack.js +3 -3
  12. package/dist/animation/morphtrack.js.map +1 -1
  13. package/dist/animation/proptrack.js +37 -41
  14. package/dist/animation/proptrack.js.map +1 -1
  15. package/dist/animation/rotationtrack.js +0 -1
  16. package/dist/animation/rotationtrack.js.map +1 -1
  17. package/dist/animation/scaletrack.js +0 -1
  18. package/dist/animation/scaletrack.js.map +1 -1
  19. package/dist/animation/skeleton.js +7 -14
  20. package/dist/animation/skeleton.js.map +1 -1
  21. package/dist/animation/translationtrack.js +0 -1
  22. package/dist/animation/translationtrack.js.map +1 -1
  23. package/dist/app/api.js +13 -4
  24. package/dist/app/api.js.map +1 -1
  25. package/dist/app/app.js +13 -1
  26. package/dist/app/app.js.map +1 -1
  27. package/dist/app/engine.js +33 -45
  28. package/dist/app/engine.js.map +1 -1
  29. package/dist/app/inputmgr.js.map +1 -1
  30. package/dist/app/runtimescript.js.map +1 -1
  31. package/dist/app/screen.js +318 -0
  32. package/dist/app/screen.js.map +1 -0
  33. package/dist/app/scriptingsystem.js +10 -6
  34. package/dist/app/scriptingsystem.js.map +1 -1
  35. package/dist/app/scriptregistry.js +11 -22
  36. package/dist/app/scriptregistry.js.map +1 -1
  37. package/dist/asset/assetmanager.js +79 -58
  38. package/dist/asset/assetmanager.js.map +1 -1
  39. package/dist/asset/builtin.js +5 -5
  40. package/dist/asset/builtin.js.map +1 -1
  41. package/dist/asset/loaders/dds/dds.js +6 -2
  42. package/dist/asset/loaders/dds/dds.js.map +1 -1
  43. package/dist/asset/loaders/dds/dds_loader.js +1 -1
  44. package/dist/asset/loaders/dds/dds_loader.js.map +1 -1
  45. package/dist/asset/loaders/gltf/gltf_loader.js +14 -6
  46. package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
  47. package/dist/asset/loaders/gltf/helpers.js +6 -2
  48. package/dist/asset/loaders/gltf/helpers.js.map +1 -1
  49. package/dist/asset/loaders/hdr/hdr.js +22 -15
  50. package/dist/asset/loaders/hdr/hdr.js.map +1 -1
  51. package/dist/asset/loaders/image/tga_Loader.js +2 -1
  52. package/dist/asset/loaders/image/tga_Loader.js.map +1 -1
  53. package/dist/asset/loaders/image/webimage_loader.js.map +1 -1
  54. package/dist/asset/loaders/loader.js +2 -2
  55. package/dist/asset/loaders/loader.js.map +1 -1
  56. package/dist/asset/model.js +2 -2
  57. package/dist/asset/model.js.map +1 -1
  58. package/dist/blitter/bilateralblur.js.map +1 -1
  59. package/dist/blitter/blitter.js +9 -11
  60. package/dist/blitter/blitter.js.map +1 -1
  61. package/dist/blitter/box.js +0 -1
  62. package/dist/blitter/box.js.map +1 -1
  63. package/dist/blitter/copy.js.map +1 -1
  64. package/dist/blitter/gaussianblur.js.map +1 -1
  65. package/dist/camera/base.js +1 -3
  66. package/dist/camera/base.js.map +1 -1
  67. package/dist/camera/camera.js +121 -37
  68. package/dist/camera/camera.js.map +1 -1
  69. package/dist/camera/fps.js +19 -17
  70. package/dist/camera/fps.js.map +1 -1
  71. package/dist/camera/orbit.js +45 -43
  72. package/dist/camera/orbit.js.map +1 -1
  73. package/dist/camera/orthocamera.js +27 -21
  74. package/dist/camera/orthocamera.js.map +1 -1
  75. package/dist/camera/perspectivecamera.js +26 -17
  76. package/dist/camera/perspectivecamera.js.map +1 -1
  77. package/dist/index.d.ts +14453 -15609
  78. package/dist/index.js +17 -11
  79. package/dist/index.js.map +1 -1
  80. package/dist/material/blinn.js.map +1 -1
  81. package/dist/material/grassmaterial.js.map +1 -1
  82. package/dist/material/lambert.js.map +1 -1
  83. package/dist/material/material.js +11 -5
  84. package/dist/material/material.js.map +1 -1
  85. package/dist/material/meshmaterial.js +10 -9
  86. package/dist/material/meshmaterial.js.map +1 -1
  87. package/dist/material/mixins/albedocolor.js.map +1 -1
  88. package/dist/material/mixins/foliage.js.map +1 -1
  89. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  90. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  91. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +7 -0
  92. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  93. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  94. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  95. package/dist/material/mixins/lit.js +3 -3
  96. package/dist/material/mixins/lit.js.map +1 -1
  97. package/dist/material/mixins/pbr/brdf.js.map +1 -1
  98. package/dist/material/mixins/pbr/common.js.map +1 -1
  99. package/dist/material/mixins/texture.js +3 -0
  100. package/dist/material/mixins/texture.js.map +1 -1
  101. package/dist/material/mixins/vertexcolor.js.map +1 -1
  102. package/dist/material/particle.js.map +1 -1
  103. package/dist/material/pbrblueprint.js +180 -22
  104. package/dist/material/pbrblueprint.js.map +1 -1
  105. package/dist/material/pbrmr.js.map +1 -1
  106. package/dist/material/pbrsg.js.map +1 -1
  107. package/dist/material/shader/helper.js +36 -53
  108. package/dist/material/shader/helper.js.map +1 -1
  109. package/dist/material/sprite.js +301 -0
  110. package/dist/material/sprite.js.map +1 -0
  111. package/dist/material/sprite3d.js +301 -0
  112. package/dist/material/sprite3d.js.map +1 -0
  113. package/dist/material/sprite3d_std.js +116 -0
  114. package/dist/material/sprite3d_std.js.map +1 -0
  115. package/dist/material/sprite3dblueprint.js +235 -0
  116. package/dist/material/sprite3dblueprint.js.map +1 -0
  117. package/dist/material/sprite_std.js +116 -0
  118. package/dist/material/sprite_std.js.map +1 -0
  119. package/dist/material/spriteblueprint.js +235 -0
  120. package/dist/material/spriteblueprint.js.map +1 -0
  121. package/dist/material/terrain-cm.js +0 -1
  122. package/dist/material/terrain-cm.js.map +1 -1
  123. package/dist/material/unlit.js.map +1 -1
  124. package/dist/material/water.js.map +1 -1
  125. package/dist/posteffect/bloom.js.map +1 -1
  126. package/dist/posteffect/compositor.js.map +1 -1
  127. package/dist/posteffect/fxaa.js.map +1 -1
  128. package/dist/posteffect/grayscale.js.map +1 -1
  129. package/dist/posteffect/motionblur.js.map +1 -1
  130. package/dist/posteffect/posteffect.js.map +1 -1
  131. package/dist/posteffect/sao.js.map +1 -1
  132. package/dist/posteffect/ssr.js +7 -5
  133. package/dist/posteffect/ssr.js.map +1 -1
  134. package/dist/posteffect/taa.js.map +1 -1
  135. package/dist/posteffect/tonemap.js.map +1 -1
  136. package/dist/render/abuffer_oit.js +8 -6
  137. package/dist/render/abuffer_oit.js.map +1 -1
  138. package/dist/render/clipmap.js +0 -10
  139. package/dist/render/clipmap.js.map +1 -1
  140. package/dist/render/cluster_light.js +4 -4
  141. package/dist/render/cluster_light.js.map +1 -1
  142. package/dist/render/cull_visitor.js +15 -17
  143. package/dist/render/cull_visitor.js.map +1 -1
  144. package/dist/render/depthpass.js +3 -4
  145. package/dist/render/depthpass.js.map +1 -1
  146. package/dist/render/drawable.js +15 -0
  147. package/dist/render/drawable.js.map +1 -0
  148. package/dist/render/drawable_mixin.js +8 -4
  149. package/dist/render/drawable_mixin.js.map +1 -1
  150. package/dist/render/envlight.js.map +1 -1
  151. package/dist/render/fbm_wavegenerator.js +3 -1
  152. package/dist/render/fbm_wavegenerator.js.map +1 -1
  153. package/dist/render/fft_wavegenerator.js +67 -64
  154. package/dist/render/fft_wavegenerator.js.map +1 -1
  155. package/dist/render/fullscreenquad.js.map +1 -1
  156. package/dist/render/gerstner_wavegenerator.js +3 -1
  157. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  158. package/dist/render/globalbindgroup_allocator.js +3 -1
  159. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  160. package/dist/render/hzb.js +1 -2
  161. package/dist/render/hzb.js.map +1 -1
  162. package/dist/render/lightpass.js +13 -13
  163. package/dist/render/lightpass.js.map +1 -1
  164. package/dist/render/objectcolorpass.js +4 -7
  165. package/dist/render/objectcolorpass.js.map +1 -1
  166. package/dist/render/primitive.js +4 -5
  167. package/dist/render/primitive.js.map +1 -1
  168. package/dist/render/render_queue.js +10 -5
  169. package/dist/render/render_queue.js.map +1 -1
  170. package/dist/render/renderer.js +16 -22
  171. package/dist/render/renderer.js.map +1 -1
  172. package/dist/render/renderpass.js +27 -52
  173. package/dist/render/renderpass.js.map +1 -1
  174. package/dist/render/rendertarget.js +5 -0
  175. package/dist/render/rendertarget.js.map +1 -0
  176. package/dist/render/screenrendertarget.js +56 -0
  177. package/dist/render/screenrendertarget.js.map +1 -0
  178. package/dist/render/shadowmap_pass.js +4 -5
  179. package/dist/render/shadowmap_pass.js.map +1 -1
  180. package/dist/render/sky.js +16 -14
  181. package/dist/render/sky.js.map +1 -1
  182. package/dist/render/weightedblended_oit.js.map +1 -1
  183. package/dist/scene/basesprite.js +296 -0
  184. package/dist/scene/basesprite.js.map +1 -0
  185. package/dist/scene/batchgroup.js +4 -2
  186. package/dist/scene/batchgroup.js.map +1 -1
  187. package/dist/scene/environment.js +9 -10
  188. package/dist/scene/environment.js.map +1 -1
  189. package/dist/scene/graph_node.js.map +1 -1
  190. package/dist/scene/light.js +22 -4
  191. package/dist/scene/light.js.map +1 -1
  192. package/dist/scene/mesh.js +93 -15
  193. package/dist/scene/mesh.js.map +1 -1
  194. package/dist/scene/octree.js.map +1 -1
  195. package/dist/scene/particlesys.js +25 -22
  196. package/dist/scene/particlesys.js.map +1 -1
  197. package/dist/scene/raycast_visitor.js +0 -16
  198. package/dist/scene/raycast_visitor.js.map +1 -1
  199. package/dist/scene/scene.js +7 -4
  200. package/dist/scene/scene.js.map +1 -1
  201. package/dist/scene/scene_node.js +20 -35
  202. package/dist/scene/scene_node.js.map +1 -1
  203. package/dist/scene/sprite.js +18 -0
  204. package/dist/scene/sprite.js.map +1 -0
  205. package/dist/scene/sprite3d.js +18 -0
  206. package/dist/scene/sprite3d.js.map +1 -0
  207. package/dist/scene/terrain-cm/grass.js +5 -4
  208. package/dist/scene/terrain-cm/grass.js.map +1 -1
  209. package/dist/scene/terrain-cm/grassmaterial.js +3 -1
  210. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  211. package/dist/scene/terrain-cm/terrain-cm.js +65 -48
  212. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  213. package/dist/scene/water.js +35 -30
  214. package/dist/scene/water.js.map +1 -1
  215. package/dist/shaders/atmosphere.js +17 -29
  216. package/dist/shaders/atmosphere.js.map +1 -1
  217. package/dist/shaders/fog.js.map +1 -1
  218. package/dist/shaders/misc.js.map +1 -1
  219. package/dist/shaders/noise.js.map +1 -1
  220. package/dist/shaders/pbr.js.map +1 -1
  221. package/dist/shaders/shadow.js.map +1 -1
  222. package/dist/shaders/ssr.js.map +1 -1
  223. package/dist/shaders/temporal.js.map +1 -1
  224. package/dist/shaders/water.js.map +1 -1
  225. package/dist/shadow/esm.js +1 -1
  226. package/dist/shadow/esm.js.map +1 -1
  227. package/dist/shadow/pcf_opt.js.map +1 -1
  228. package/dist/shadow/pcf_pd.js.map +1 -1
  229. package/dist/shadow/shader.js +3 -1
  230. package/dist/shadow/shader.js.map +1 -1
  231. package/dist/shadow/shadow_impl.js.map +1 -1
  232. package/dist/shadow/shadowmapper.js +6 -18
  233. package/dist/shadow/shadowmapper.js.map +1 -1
  234. package/dist/shadow/ssm.js.map +1 -1
  235. package/dist/shadow/vsm.js.map +1 -1
  236. package/dist/shapes/box.js +9 -3
  237. package/dist/shapes/box.js.map +1 -1
  238. package/dist/shapes/cylinder.js +2 -2
  239. package/dist/shapes/cylinder.js.map +1 -1
  240. package/dist/shapes/plane.js +2 -2
  241. package/dist/shapes/plane.js.map +1 -1
  242. package/dist/shapes/shape.js +2 -1
  243. package/dist/shapes/shape.js.map +1 -1
  244. package/dist/shapes/sphere.js +2 -2
  245. package/dist/shapes/sphere.js.map +1 -1
  246. package/dist/shapes/tetrahedron.js +5 -6
  247. package/dist/shapes/tetrahedron.js.map +1 -1
  248. package/dist/shapes/torus.js +2 -2
  249. package/dist/shapes/torus.js.map +1 -1
  250. package/dist/utility/aabbtree.js +1 -1
  251. package/dist/utility/aabbtree.js.map +1 -1
  252. package/dist/utility/blueprint/common/constants.js +578 -104
  253. package/dist/utility/blueprint/common/constants.js.map +1 -1
  254. package/dist/utility/blueprint/common/math.js +471 -9
  255. package/dist/utility/blueprint/common/math.js.map +1 -1
  256. package/dist/utility/blueprint/common.js +1 -1
  257. package/dist/utility/blueprint/common.js.map +1 -1
  258. package/dist/utility/blueprint/material/func.js +9 -5
  259. package/dist/utility/blueprint/material/func.js.map +1 -1
  260. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  261. package/dist/utility/blueprint/material/ir.js +288 -80
  262. package/dist/utility/blueprint/material/ir.js.map +1 -1
  263. package/dist/utility/blueprint/material/pbr.js +92 -4
  264. package/dist/utility/blueprint/material/pbr.js.map +1 -1
  265. package/dist/utility/blueprint/material/texture.js +62 -45
  266. package/dist/utility/blueprint/material/texture.js.map +1 -1
  267. package/dist/utility/blueprint/node.js +28 -1
  268. package/dist/utility/blueprint/node.js.map +1 -1
  269. package/dist/utility/bounding_volume.js.map +1 -1
  270. package/dist/utility/debug.js.map +1 -1
  271. package/dist/utility/draco/decoder.js.map +1 -1
  272. package/dist/utility/misc.js +1 -1
  273. package/dist/utility/misc.js.map +1 -1
  274. package/dist/utility/panorama.js.map +1 -1
  275. package/dist/utility/pmrem.js.map +1 -1
  276. package/dist/utility/rendermipmap.js.map +1 -1
  277. package/dist/utility/serialization/json.js +19 -15
  278. package/dist/utility/serialization/json.js.map +1 -1
  279. package/dist/utility/serialization/manager.js +89 -22
  280. package/dist/utility/serialization/manager.js.map +1 -1
  281. package/dist/utility/serialization/scene/animation.js +23 -21
  282. package/dist/utility/serialization/scene/animation.js.map +1 -1
  283. package/dist/utility/serialization/scene/batch.js +4 -3
  284. package/dist/utility/serialization/scene/batch.js.map +1 -1
  285. package/dist/utility/serialization/scene/camera.js +97 -9
  286. package/dist/utility/serialization/scene/camera.js.map +1 -1
  287. package/dist/utility/serialization/scene/common.js +102 -28
  288. package/dist/utility/serialization/scene/common.js.map +1 -1
  289. package/dist/utility/serialization/scene/light.js +14 -12
  290. package/dist/utility/serialization/scene/light.js.map +1 -1
  291. package/dist/utility/serialization/scene/material.js +154 -26
  292. package/dist/utility/serialization/scene/material.js.map +1 -1
  293. package/dist/utility/serialization/scene/mesh.js +71 -100
  294. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  295. package/dist/utility/serialization/scene/misc.js +3 -2
  296. package/dist/utility/serialization/scene/misc.js.map +1 -1
  297. package/dist/utility/serialization/scene/node.js +42 -9
  298. package/dist/utility/serialization/scene/node.js.map +1 -1
  299. package/dist/utility/serialization/scene/particle.js +7 -5
  300. package/dist/utility/serialization/scene/particle.js.map +1 -1
  301. package/dist/utility/serialization/scene/primitive.js +18 -15
  302. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  303. package/dist/utility/serialization/scene/scene.js +3 -2
  304. package/dist/utility/serialization/scene/scene.js.map +1 -1
  305. package/dist/utility/serialization/scene/sprite.js +164 -0
  306. package/dist/utility/serialization/scene/sprite.js.map +1 -0
  307. package/dist/utility/serialization/scene/terrain.js +8 -6
  308. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  309. package/dist/utility/serialization/scene/water.js +11 -9
  310. package/dist/utility/serialization/scene/water.js.map +1 -1
  311. package/dist/utility/serialization/types.js +6 -0
  312. package/dist/utility/serialization/types.js.map +1 -0
  313. package/dist/utility/shprojector.js.map +1 -1
  314. package/dist/utility/textures/ggxlut.js.map +1 -1
  315. package/dist/utility/textures/gradientnoise.js.map +1 -1
  316. package/dist/utility/textures/randomnoise.js.map +1 -1
  317. package/dist/values.js +14 -14
  318. package/dist/values.js.map +1 -1
  319. package/package.json +80 -80
@@ -141,21 +141,21 @@ import { Disposable } from '@zephyr3d/base';
141
141
  * @returns This clip (for chaining).
142
142
  */ addTrack(target, track) {
143
143
  if (!track) {
144
- return;
144
+ return this;
145
145
  }
146
146
  if (track.animation) {
147
147
  if (track.animation === this) {
148
- return;
148
+ return this;
149
149
  } else {
150
150
  console.error('Track is already in another animation');
151
- return;
151
+ return this;
152
152
  }
153
153
  }
154
154
  const blendId = track.getBlendId();
155
155
  const tracks = this._tracks.get(target);
156
156
  if (tracks && tracks.findIndex((track)=>track.getBlendId() === blendId) >= 0) {
157
157
  console.error('Tracks with same BlendId could not be added to same animation');
158
- return;
158
+ return this;
159
159
  }
160
160
  track.animation = this;
161
161
  let trackInfo = this._tracks.get(target);
@@ -186,17 +186,6 @@ import { Disposable } from '@zephyr3d/base';
186
186
  callback(frame);
187
187
  }
188
188
  }
189
- /**
190
- * Dispose internal resources/references held by this clip.
191
- *
192
- * Notes:
193
- * - Clears track collections and disposes registered skeletons.
194
- * - The clip becomes unusable after disposing.
195
- */ onDispose() {
196
- super.onDispose();
197
- this._tracks = null;
198
- this._skeletons = null;
199
- }
200
189
  }
201
190
 
202
191
  export { AnimationClip };
@@ -1 +1 @@
1
- {"version":3,"file":"animation.js","sources":["../../src/animation/animation.ts"],"sourcesContent":["import { Disposable } from '@zephyr3d/base';\r\nimport type { AnimationSet } from './animationset';\r\nimport type { AnimationTrack } from './animationtrack';\r\n\r\n/**\r\n * Animation clip\r\n *\r\n * Represents a named animation composed of multiple tracks targeting various objects/properties,\r\n * with an overall duration, weight, and optional auto-play behavior. Tracks may target different\r\n * objects and are grouped by a per-target array. Skeletons used by this clip are tracked for\r\n * lifecycle and application during playback.\r\n *\r\n * Typical workflow:\r\n * - Create a clip via `AnimationSet.createAnimation(name)`.\r\n * - Add one or more `AnimationTrack`s via `addTrack(target, track)`.\r\n * - Optionally register skeletons via `addSkeleton(...)`.\r\n * - Start playback through the owning `AnimationSet.playAnimation(name, options)`.\r\n *\r\n * @public\r\n */\r\nexport class AnimationClip extends Disposable {\r\n /** @internal */\r\n protected _name: string;\r\n /** @internal */\r\n protected _animationSet: AnimationSet;\r\n /** @internal */\r\n protected _embedded: boolean;\r\n /** @internal */\r\n protected _duration: number;\r\n /** @internal */\r\n protected _autoPlay: boolean;\r\n /** @internal */\r\n protected _tracks: Map<object, AnimationTrack[]>;\r\n protected _weight: number;\r\n /** @internal */\r\n protected _skeletons: Set<string>;\r\n /**\r\n * Creates an animation instance\r\n * @param name - Name of the animation\r\n * @param model - Parent node if this is a skeleton animation\r\n */\r\n constructor(name: string, animationSet: AnimationSet, embedded = false) {\r\n super();\r\n this._name = name;\r\n this._animationSet = animationSet;\r\n this._embedded = embedded;\r\n this._tracks = new Map();\r\n this._duration = 0;\r\n this._weight = 1;\r\n this._autoPlay = false;\r\n this._skeletons = new Set();\r\n }\r\n /**\r\n * Whether this clip is embedded (owned inline by its container/resource).\r\n */\r\n get embedded(): boolean {\r\n return this._embedded;\r\n }\r\n /**\r\n * The `AnimationSet` that owns this clip.\r\n */\r\n get animationSet() {\r\n return this._animationSet;\r\n }\r\n /**\r\n * Global blend weight for the clip.\r\n *\r\n * Used by the animation system when combining multiple active clips.\r\n */\r\n get weight() {\r\n return this._weight;\r\n }\r\n set weight(val: number) {\r\n this._weight = val;\r\n }\r\n /**\r\n * Whether this clip should start playing automatically when loaded/instantiated.\r\n */\r\n get autoPlay() {\r\n return this._autoPlay;\r\n }\r\n set autoPlay(val: boolean) {\r\n this._autoPlay = val;\r\n }\r\n /**\r\n * The unique name of this clip.\r\n */\r\n get name(): string {\r\n return this._name;\r\n }\r\n /**\r\n * All animation tracks grouped by target object.\r\n *\r\n * Key: target object; Value: list of `AnimationTrack`s affecting that target.\r\n */\r\n get tracks() {\r\n return this._tracks;\r\n }\r\n /**\r\n * All skeletons referenced by this clip.\r\n */\r\n get skeletons() {\r\n return this._skeletons;\r\n }\r\n set skeletons(val: Set<string>) {\r\n this._skeletons = val;\r\n }\r\n /**\r\n * Total time span of the clip in seconds.\r\n *\r\n * Automatically extended when adding tracks with longer duration.\r\n */\r\n get timeDuration(): number {\r\n return this._duration;\r\n }\r\n set timeDuration(val: number) {\r\n this._duration = val;\r\n }\r\n /**\r\n * Add a skeleton used by this clip.\r\n *\r\n * @param skeletonId - Persistent ID of Skeleton to register for this clip.\r\n */\r\n addSkeleton(skeletonId: string) {\r\n this._skeletons.add(skeletonId);\r\n }\r\n /**\r\n * Remove a specific track from this clip.\r\n *\r\n * Errors if the track does not belong to this clip. Does nothing if not found.\r\n *\r\n * @param track - The track instance to remove.\r\n * @returns This clip (for chaining).\r\n */\r\n deleteTrack(track: AnimationTrack): this {\r\n if (track?.animation !== this) {\r\n console.error('Cannot delete animation track which is not belongs to THIS animation');\r\n }\r\n for (const k of this._tracks.keys()) {\r\n const tracks = this._tracks.get(k);\r\n const index = tracks.indexOf(track);\r\n if (index >= 0) {\r\n tracks.splice(index, 1);\r\n }\r\n }\r\n return this;\r\n }\r\n /**\r\n * Add a track to this clip for a specific target object.\r\n *\r\n * Constraints:\r\n * - The track must not already belong to another clip.\r\n * - Only one track with the same blendId may exist per target in a single clip.\r\n *\r\n * Side effects:\r\n * - Assigns this clip to `track.animation`.\r\n * - Extends `timeDuration` to cover the track duration if longer.\r\n * - Calls `track.reset(target)` to initialize the target state if needed.\r\n *\r\n * @param target - Target object controlled by the track.\r\n * @param track - Track to add.\r\n * @returns This clip (for chaining).\r\n */\r\n addTrack(target: object, track: AnimationTrack): this {\r\n if (!track) {\r\n return;\r\n }\r\n if (track.animation) {\r\n if (track.animation === this) {\r\n return;\r\n } else {\r\n console.error('Track is already in another animation');\r\n return;\r\n }\r\n }\r\n const blendId = track.getBlendId();\r\n const tracks = this._tracks.get(target);\r\n if (tracks && tracks.findIndex((track) => track.getBlendId() === blendId) >= 0) {\r\n console.error('Tracks with same BlendId could not be added to same animation');\r\n return;\r\n }\r\n track.animation = this;\r\n let trackInfo = this._tracks.get(target);\r\n if (!trackInfo) {\r\n trackInfo = [];\r\n this._tracks.set(target, trackInfo);\r\n }\r\n trackInfo.push(track);\r\n this._duration = Math.max(this._duration, track.getDuration() ?? 0);\r\n track.reset(target);\r\n return this;\r\n }\r\n /** @internal */\r\n resample(frames: number, callback: (frame: number) => void) {\r\n for (let frame = 0; frame <= frames; frame++) {\r\n const t = frame / this.timeDuration;\r\n for (const [k, v] of this.tracks) {\r\n for (const track of v) {\r\n const state = track.calculateState(k, t);\r\n track.applyState(k, state);\r\n }\r\n }\r\n for (const sk of this.skeletons) {\r\n const skeleton = this._animationSet.model.findSkeletonById(sk);\r\n if (skeleton) {\r\n skeleton.computeJoints();\r\n }\r\n }\r\n callback(frame);\r\n }\r\n }\r\n /**\r\n * Dispose internal resources/references held by this clip.\r\n *\r\n * Notes:\r\n * - Clears track collections and disposes registered skeletons.\r\n * - The clip becomes unusable after disposing.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._tracks = null;\r\n this._skeletons = null;\r\n }\r\n}\r\n"],"names":["AnimationClip","Disposable","_weight","name","animationSet","embedded","_name","_animationSet","_embedded","_tracks","Map","_duration","_autoPlay","_skeletons","Set","weight","val","autoPlay","tracks","skeletons","timeDuration","addSkeleton","skeletonId","add","deleteTrack","track","animation","console","error","k","keys","get","index","indexOf","splice","addTrack","target","blendId","getBlendId","findIndex","trackInfo","set","push","Math","max","getDuration","reset","resample","frames","callback","frame","t","v","state","calculateState","applyState","sk","skeleton","model","findSkeletonById","computeJoints","onDispose"],"mappings":"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"}
1
+ {"version":3,"file":"animation.js","sources":["../../src/animation/animation.ts"],"sourcesContent":["import { Disposable } from '@zephyr3d/base';\r\nimport type { AnimationSet } from './animationset';\r\nimport type { AnimationTrack } from './animationtrack';\r\n\r\n/**\r\n * Animation clip\r\n *\r\n * Represents a named animation composed of multiple tracks targeting various objects/properties,\r\n * with an overall duration, weight, and optional auto-play behavior. Tracks may target different\r\n * objects and are grouped by a per-target array. Skeletons used by this clip are tracked for\r\n * lifecycle and application during playback.\r\n *\r\n * Typical workflow:\r\n * - Create a clip via `AnimationSet.createAnimation(name)`.\r\n * - Add one or more `AnimationTrack`s via `addTrack(target, track)`.\r\n * - Optionally register skeletons via `addSkeleton(...)`.\r\n * - Start playback through the owning `AnimationSet.playAnimation(name, options)`.\r\n *\r\n * @public\r\n */\r\nexport class AnimationClip extends Disposable {\r\n /** @internal */\r\n protected _name: string;\r\n /** @internal */\r\n protected _animationSet: AnimationSet;\r\n /** @internal */\r\n protected _embedded: boolean;\r\n /** @internal */\r\n protected _duration: number;\r\n /** @internal */\r\n protected _autoPlay: boolean;\r\n /** @internal */\r\n protected _tracks: Map<object, AnimationTrack[]>;\r\n protected _weight: number;\r\n /** @internal */\r\n protected _skeletons: Set<string>;\r\n /**\r\n * Creates an animation instance\r\n * @param name - Name of the animation\r\n * @param model - Parent node if this is a skeleton animation\r\n */\r\n constructor(name: string, animationSet: AnimationSet, embedded = false) {\r\n super();\r\n this._name = name;\r\n this._animationSet = animationSet;\r\n this._embedded = embedded;\r\n this._tracks = new Map();\r\n this._duration = 0;\r\n this._weight = 1;\r\n this._autoPlay = false;\r\n this._skeletons = new Set();\r\n }\r\n /**\r\n * Whether this clip is embedded (owned inline by its container/resource).\r\n */\r\n get embedded() {\r\n return this._embedded;\r\n }\r\n /**\r\n * The `AnimationSet` that owns this clip.\r\n */\r\n get animationSet() {\r\n return this._animationSet;\r\n }\r\n /**\r\n * Global blend weight for the clip.\r\n *\r\n * Used by the animation system when combining multiple active clips.\r\n */\r\n get weight() {\r\n return this._weight;\r\n }\r\n set weight(val: number) {\r\n this._weight = val;\r\n }\r\n /**\r\n * Whether this clip should start playing automatically when loaded/instantiated.\r\n */\r\n get autoPlay() {\r\n return this._autoPlay;\r\n }\r\n set autoPlay(val: boolean) {\r\n this._autoPlay = val;\r\n }\r\n /**\r\n * The unique name of this clip.\r\n */\r\n get name() {\r\n return this._name;\r\n }\r\n /**\r\n * All animation tracks grouped by target object.\r\n *\r\n * Key: target object; Value: list of `AnimationTrack`s affecting that target.\r\n */\r\n get tracks() {\r\n return this._tracks;\r\n }\r\n /**\r\n * All skeletons referenced by this clip.\r\n */\r\n get skeletons() {\r\n return this._skeletons;\r\n }\r\n set skeletons(val: Set<string>) {\r\n this._skeletons = val;\r\n }\r\n /**\r\n * Total time span of the clip in seconds.\r\n *\r\n * Automatically extended when adding tracks with longer duration.\r\n */\r\n get timeDuration() {\r\n return this._duration;\r\n }\r\n set timeDuration(val) {\r\n this._duration = val;\r\n }\r\n /**\r\n * Add a skeleton used by this clip.\r\n *\r\n * @param skeletonId - Persistent ID of Skeleton to register for this clip.\r\n */\r\n addSkeleton(skeletonId: string) {\r\n this._skeletons.add(skeletonId);\r\n }\r\n /**\r\n * Remove a specific track from this clip.\r\n *\r\n * Errors if the track does not belong to this clip. Does nothing if not found.\r\n *\r\n * @param track - The track instance to remove.\r\n * @returns This clip (for chaining).\r\n */\r\n deleteTrack(track: AnimationTrack) {\r\n if (track?.animation !== this) {\r\n console.error('Cannot delete animation track which is not belongs to THIS animation');\r\n }\r\n for (const k of this._tracks.keys()) {\r\n const tracks = this._tracks.get(k)!;\r\n const index = tracks.indexOf(track);\r\n if (index >= 0) {\r\n tracks.splice(index, 1);\r\n }\r\n }\r\n return this;\r\n }\r\n /**\r\n * Add a track to this clip for a specific target object.\r\n *\r\n * Constraints:\r\n * - The track must not already belong to another clip.\r\n * - Only one track with the same blendId may exist per target in a single clip.\r\n *\r\n * Side effects:\r\n * - Assigns this clip to `track.animation`.\r\n * - Extends `timeDuration` to cover the track duration if longer.\r\n * - Calls `track.reset(target)` to initialize the target state if needed.\r\n *\r\n * @param target - Target object controlled by the track.\r\n * @param track - Track to add.\r\n * @returns This clip (for chaining).\r\n */\r\n addTrack(target: object, track: AnimationTrack) {\r\n if (!track) {\r\n return this;\r\n }\r\n if (track.animation) {\r\n if (track.animation === this) {\r\n return this;\r\n } else {\r\n console.error('Track is already in another animation');\r\n return this;\r\n }\r\n }\r\n const blendId = track.getBlendId();\r\n const tracks = this._tracks.get(target);\r\n if (tracks && tracks.findIndex((track) => track.getBlendId() === blendId) >= 0) {\r\n console.error('Tracks with same BlendId could not be added to same animation');\r\n return this;\r\n }\r\n track.animation = this;\r\n let trackInfo = this._tracks.get(target);\r\n if (!trackInfo) {\r\n trackInfo = [];\r\n this._tracks.set(target, trackInfo);\r\n }\r\n trackInfo.push(track);\r\n this._duration = Math.max(this._duration, track.getDuration() ?? 0);\r\n track.reset(target);\r\n return this;\r\n }\r\n /** @internal */\r\n resample(frames: number, callback: (frame: number) => void) {\r\n for (let frame = 0; frame <= frames; frame++) {\r\n const t = frame / this.timeDuration;\r\n for (const [k, v] of this.tracks) {\r\n for (const track of v) {\r\n const state = track.calculateState(k, t);\r\n track.applyState(k, state);\r\n }\r\n }\r\n for (const sk of this.skeletons) {\r\n const skeleton = this._animationSet.model.findSkeletonById(sk);\r\n if (skeleton) {\r\n skeleton.computeJoints();\r\n }\r\n }\r\n callback(frame);\r\n }\r\n }\r\n}\r\n"],"names":["AnimationClip","Disposable","_weight","name","animationSet","embedded","_name","_animationSet","_embedded","_tracks","Map","_duration","_autoPlay","_skeletons","Set","weight","val","autoPlay","tracks","skeletons","timeDuration","addSkeleton","skeletonId","add","deleteTrack","track","animation","console","error","k","keys","get","index","indexOf","splice","addTrack","target","blendId","getBlendId","findIndex","trackInfo","set","push","Math","max","getDuration","reset","resample","frames","callback","frame","t","v","state","calculateState","applyState","sk","skeleton","model","findSkeletonById","computeJoints"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Disposable, DWeakRef, weightedAverage } from '@zephyr3d/base';
1
+ import { Disposable, weightedAverage } from '@zephyr3d/base';
2
2
  import { AnimationClip } from './animation.js';
3
3
 
4
4
  /**
@@ -33,7 +33,7 @@ import { AnimationClip } from './animation.js';
33
33
  * @param model - The SceneNode (model root) controlled by this animation set.
34
34
  */ constructor(model){
35
35
  super();
36
- this._model = new DWeakRef(model);
36
+ this._model = model;
37
37
  this._animations = {};
38
38
  this._activeTracks = new Map();
39
39
  this._activeSkeletons = new Map();
@@ -43,14 +43,16 @@ import { AnimationClip } from './animation.js';
43
43
  /**
44
44
  * The model (SceneNode) controlled by this animation set.
45
45
  */ get model() {
46
- return this._model.get();
46
+ return this._model;
47
47
  }
48
48
  /**
49
49
  * Number of animation clips registered in this set.
50
50
  */ get numAnimations() {
51
51
  return Object.getOwnPropertyNames(this._animations).length;
52
52
  }
53
- /** @internal */ get skeletons() {
53
+ /**
54
+ * The skeletons used by animations in this set.
55
+ */ get skeletons() {
54
56
  return this._skeletons;
55
57
  }
56
58
  /**
@@ -74,7 +76,7 @@ import { AnimationClip } from './animation.js';
74
76
  } else {
75
77
  const animation = new AnimationClip(name, this, embedded);
76
78
  this._animations[name] = animation;
77
- this._model.get().scene.queueUpdateNode(this._model.get());
79
+ this._model.scene?.queueUpdateNode(this._model);
78
80
  return animation;
79
81
  }
80
82
  }
@@ -155,7 +157,8 @@ import { AnimationClip } from './animation.js';
155
157
  return weight * fadeIn * fadeOut;
156
158
  });
157
159
  const states = tracks.map((track)=>{
158
- const t = this._activeAnimations.get(track.animation).currentTime / track.animation.timeDuration * track.getDuration();
160
+ const info = this._activeAnimations.get(track.animation);
161
+ const t = info.currentTime / track.animation.timeDuration * track.getDuration();
159
162
  return track.calculateState(k, t);
160
163
  });
161
164
  const state = weightedAverage(weights, states, (a, b, t)=>{
@@ -176,7 +179,11 @@ import { AnimationClip } from './animation.js';
176
179
  * @param name - Optional animation name. If omitted, returns true if any animation is playing.
177
180
  * @returns True if playing; otherwise false.
178
181
  */ isPlayingAnimation(name) {
179
- return name ? this._activeAnimations.has(this._animations[name]) : this._activeAnimations.size > 0;
182
+ if (name) {
183
+ const animation = this._animations[name];
184
+ return !!animation && this._activeAnimations.has(animation);
185
+ }
186
+ return this._activeAnimations.size > 0;
180
187
  }
181
188
  /**
182
189
  * Get an animation clip by name.
@@ -197,6 +204,10 @@ import { AnimationClip } from './animation.js';
197
204
  * @param weight - New weight value used during blending.
198
205
  */ setAnimationWeight(name, weight) {
199
206
  const ani = this._animations[name];
207
+ if (!ani) {
208
+ console.error(`Animation ${name} not exists`);
209
+ return;
210
+ }
200
211
  const info = this._activeAnimations.get(ani);
201
212
  if (info) {
202
213
  info.weight = weight;
@@ -283,6 +294,10 @@ import { AnimationClip } from './animation.js';
283
294
  * @param options - Optional fade-out configuration.
284
295
  */ stopAnimation(name, options) {
285
296
  const ani = this._animations[name];
297
+ if (!ani) {
298
+ console.error(`Animation ${name} not exists`);
299
+ return;
300
+ }
286
301
  const info = this._activeAnimations.get(ani);
287
302
  if (info) {
288
303
  const fadeOut = Math.max(options?.fadeOut ?? 0, 0);
@@ -319,8 +334,6 @@ import { AnimationClip } from './animation.js';
319
334
  * - Clears active animations, tracks, and skeleton references.
320
335
  */ onDispose() {
321
336
  super.onDispose();
322
- this._model?.dispose();
323
- this._model = null;
324
337
  for(const k in this._animations){
325
338
  this._animations[k].dispose();
326
339
  }
@@ -1 +1 @@
1
- {"version":3,"file":"animationset.js","sources":["../../src/animation/animationset.ts"],"sourcesContent":["import { weightedAverage, DWeakRef, Disposable } from '@zephyr3d/base';\r\nimport type { DRef, IDisposable } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../scene';\r\nimport { AnimationClip } from './animation';\r\nimport type { AnimationTrack } from './animationtrack';\r\nimport type { Skeleton } from './skeleton';\r\n\r\n/**\r\n * Options for playing an animation.\r\n *\r\n * Controls looping, playback speed (including reverse), and fade-in blending.\r\n * @public\r\n **/\r\nexport type PlayAnimationOptions = {\r\n /**\r\n * Number of loops to play.\r\n *\r\n * - 0: infinite looping (default).\r\n * - n \\> 0: play exactly n loops (each loop is one full duration of the clip).\r\n */\r\n repeat?: number;\r\n /**\r\n * Playback speed multiplier.\r\n *\r\n * - 1: normal speed (default).\r\n * - \\>1: faster; \\<1: slower.\r\n * - Negative values play the clip in reverse. The initial `currentTime` will be set to the end.\r\n */\r\n speedRatio?: number;\r\n /**\r\n * Fade-in duration in seconds.\r\n *\r\n * Interpolates the animation weight from 0 to the clip's configured weight over this time.\r\n * Use together with `stopAnimation(..., { fadeOut })` for smooth cross-fading.\r\n * Default is 0 (no fade-in).\r\n */\r\n fadeIn?: number;\r\n /**\r\n * Weight of the animation clip.\r\n *\r\n * Used during blending when multiple animations affect the same property.\r\n * Default is the clip's configured weight.\r\n */\r\n weight?: number;\r\n};\r\n\r\n/**\r\n * Options for stopping an animation.\r\n *\r\n * Allows a graceful fade-out instead of abrupt stop.\r\n * @public\r\n */\r\nexport type StopAnimationOptions = {\r\n /**\r\n * Fade-out duration in seconds.\r\n *\r\n * Interpolates the current animation weight down to 0 over this time.\r\n * Default is 0 (immediate stop).\r\n */\r\n fadeOut?: number;\r\n};\r\n\r\n/**\r\n * Animation set\r\n *\r\n * Manages a collection of named animation clips for a model and orchestrates:\r\n * - Playback state (time, loops, speed, weights, fade-in/out).\r\n * - Blending across multiple tracks targeting the same property via weighted averages.\r\n * - Skeleton usage and application for clips that drive skeletal animation.\r\n * - Active track registration and cleanup as clips start/stop.\r\n *\r\n * Usage:\r\n * - Create or retrieve `AnimationClip`s by name.\r\n * - Start playback with `playAnimation(name, options)`.\r\n * - Advance animation with `update(deltaSeconds)`.\r\n * - Optionally adjust weight while playing with `setAnimationWeight(name, weight)`.\r\n *\r\n * Lifetime:\r\n * - Disposing the set releases references to the model, clips, and clears active state.\r\n *\r\n * @public\r\n */\r\nexport class AnimationSet extends Disposable implements IDisposable {\r\n /** @internal */\r\n private _model: DWeakRef<SceneNode>;\r\n /** @internal */\r\n private _animations: Record<string, AnimationClip>;\r\n /** @internal */\r\n private _skeletons: DRef<Skeleton>[];\r\n /** @internal */\r\n private readonly _activeTracks: Map<object, Map<unknown, AnimationTrack[]>>;\r\n /** @internal */\r\n private readonly _activeSkeletons: Map<Skeleton, number>;\r\n /** @internal */\r\n private readonly _activeAnimations: Map<\r\n AnimationClip,\r\n {\r\n currentTime: number;\r\n repeat: number;\r\n repeatCounter: number;\r\n weight: number;\r\n speedRatio: number;\r\n firstFrame: boolean;\r\n fadeIn: number;\r\n fadeOut: number;\r\n fadeOutStart: number;\r\n animateTime: number;\r\n }\r\n >;\r\n /**\r\n * Create an AnimationSet controlling the provided model.\r\n *\r\n * @param model - The SceneNode (model root) controlled by this animation set.\r\n */\r\n constructor(model: SceneNode) {\r\n super();\r\n this._model = new DWeakRef<SceneNode>(model);\r\n this._animations = {};\r\n this._activeTracks = new Map();\r\n this._activeSkeletons = new Map();\r\n this._activeAnimations = new Map();\r\n this._skeletons = [];\r\n }\r\n /**\r\n * The model (SceneNode) controlled by this animation set.\r\n */\r\n get model(): SceneNode {\r\n return this._model.get();\r\n }\r\n /**\r\n * Number of animation clips registered in this set.\r\n */\r\n get numAnimations(): number {\r\n return Object.getOwnPropertyNames(this._animations).length;\r\n }\r\n /** @internal */\r\n get skeletons() {\r\n return this._skeletons;\r\n }\r\n /**\r\n * Retrieve an animation clip by name.\r\n *\r\n * @param name - Name of the animation.\r\n * @returns The clip if present; otherwise null.\r\n */\r\n get(name: string): AnimationClip {\r\n return this._animations[name] ?? null;\r\n }\r\n /**\r\n * Create and register a new animation clip.\r\n *\r\n * @param name - Unique name for the animation clip.\r\n * @param embedded - Whether the clip is embedded/owned (implementation-specific). Default false.\r\n * @returns The created clip, or null if the name is empty or not unique.\r\n */\r\n createAnimation(name: string, embedded = false): AnimationClip {\r\n if (!name || this._animations[name]) {\r\n console.error('Animation must have unique name');\r\n return null;\r\n } else {\r\n const animation = new AnimationClip(name, this, embedded);\r\n this._animations[name] = animation;\r\n this._model.get().scene.queueUpdateNode(this._model.get());\r\n return animation;\r\n }\r\n }\r\n /**\r\n * Delete and dispose an animation clip by name.\r\n *\r\n * - If the animation is currently playing, it is first stopped (immediately).\r\n *\r\n * @param name - Name of the animation to remove.\r\n */\r\n deleteAnimation(name: string) {\r\n const animation = this._animations[name];\r\n if (animation) {\r\n this.stopAnimation(name);\r\n delete this._animations[name];\r\n animation.dispose();\r\n }\r\n }\r\n /**\r\n * Get the list of all registered animation names.\r\n *\r\n * @returns An array of clip names.\r\n */\r\n getAnimationNames(): string[] {\r\n return Object.keys(this._animations);\r\n }\r\n /**\r\n * Advance and apply active animations.\r\n *\r\n * Responsibilities per call:\r\n * - Update time cursor for each active clip (respecting speedRatio and looping).\r\n * - Enforce repeat limits and apply fade-out termination if configured.\r\n * - For each animated target, blend active tracks (weighted by clip weight × fade-in × fade-out)\r\n * and apply the resulting state to the target.\r\n * - Apply all active skeletons to update skinning transforms.\r\n *\r\n * @param deltaInSeconds - Time step in seconds since last update.\r\n */\r\n update(deltaInSeconds: number): void {\r\n this._activeAnimations.forEach((v, k) => {\r\n if (v.fadeOut > 0 && v.fadeOutStart < 0) {\r\n v.fadeOutStart = v.animateTime;\r\n }\r\n // Update animation time\r\n if (v.firstFrame) {\r\n v.firstFrame = false;\r\n } else {\r\n const timeAdvance = deltaInSeconds * v.speedRatio;\r\n v.currentTime += timeAdvance;\r\n v.animateTime += timeAdvance;\r\n if (v.currentTime > k.timeDuration) {\r\n v.repeatCounter++;\r\n v.currentTime = 0;\r\n } else if (v.currentTime < 0) {\r\n v.repeatCounter++;\r\n v.currentTime = k.timeDuration;\r\n }\r\n if (v.repeat !== 0 && v.repeatCounter >= v.repeat) {\r\n this.stopAnimation(k.name);\r\n } else if (v.fadeOut > 0) {\r\n if (v.animateTime - v.fadeOutStart >= v.fadeOut) {\r\n this.stopAnimation(k.name);\r\n }\r\n }\r\n }\r\n });\r\n // Update tracks\r\n this._activeTracks.forEach((v, k) => {\r\n v.forEach((alltracks) => {\r\n // Only deal with tracks which have not been removed\r\n const tracks = alltracks.filter(\r\n (track) => track.animation && this.isPlayingAnimation(track.animation.name)\r\n );\r\n if (tracks.length > 0) {\r\n const weights = tracks.map((track) => {\r\n const info = this._activeAnimations.get(track.animation);\r\n const weight = info.weight;\r\n const fadeIn = info.fadeIn === 0 ? 1 : Math.min(1, info.animateTime / info.fadeIn);\r\n let fadeOut = 1;\r\n if (info.fadeOut !== 0) {\r\n fadeOut = 1 - (info.animateTime - info.fadeOutStart) / info.fadeOut;\r\n }\r\n return weight * fadeIn * fadeOut;\r\n });\r\n const states = tracks.map((track) => {\r\n const t =\r\n (this._activeAnimations.get(track.animation).currentTime / track.animation.timeDuration) *\r\n track.getDuration();\r\n return track.calculateState(k, t);\r\n });\r\n const state = weightedAverage(weights, states, (a, b, t) => {\r\n return tracks[0].mixState(a, b, t);\r\n });\r\n tracks[0].applyState(k, state);\r\n }\r\n });\r\n });\r\n // Update skeletons\r\n this._activeSkeletons.forEach((v, k) => {\r\n k.apply();\r\n });\r\n }\r\n /**\r\n * Check whether an animation is currently playing.\r\n *\r\n * @param name - Optional animation name. If omitted, returns true if any animation is playing.\r\n * @returns True if playing; otherwise false.\r\n */\r\n isPlayingAnimation(name?: string): boolean {\r\n return name ? this._activeAnimations.has(this._animations[name]) : this._activeAnimations.size > 0;\r\n }\r\n /**\r\n * Get an animation clip by name.\r\n *\r\n * Alias of `get(name)` returning a nullable type.\r\n *\r\n * @param name - Name of the animation.\r\n * @returns The clip if present; otherwise null.\r\n */\r\n getAnimationClip(name: string): AnimationClip | null {\r\n return this._animations[name] ?? null;\r\n }\r\n /**\r\n * Set the runtime blend weight for a currently playing animation.\r\n *\r\n * Has no effect if the clip is not active.\r\n *\r\n * @param name - Name of the playing animation.\r\n * @param weight - New weight value used during blending.\r\n */\r\n setAnimationWeight(name: string, weight: number): void {\r\n const ani = this._animations[name];\r\n const info = this._activeAnimations.get(ani);\r\n if (info) {\r\n info.weight = weight;\r\n }\r\n }\r\n /**\r\n * Start (or update) playback of an animation clip.\r\n *\r\n * Behavior:\r\n * - If the clip is already playing, updates its fade-in (resets fade-out).\r\n * - Otherwise initializes playback state (repeat counter, speed, weight, initial time).\r\n * - Registers clip tracks and skeletons into the active sets for blending and application.\r\n *\r\n * @param name - Name of the animation to play.\r\n * @param options - Playback options (repeat, speedRatio, fadeIn).\r\n */\r\n playAnimation(name: string, options?: PlayAnimationOptions): void {\r\n const ani = this._animations[name];\r\n if (!ani) {\r\n console.error(`Animation ${name} not exists`);\r\n return;\r\n }\r\n const fadeIn = Math.max(options?.fadeIn ?? 0, 0);\r\n const info = this._activeAnimations.get(ani);\r\n if (info) {\r\n info.fadeOut = 0;\r\n info.fadeIn = fadeIn;\r\n } else {\r\n const repeat = options?.repeat ?? 0;\r\n const speedRatio = options?.speedRatio ?? 1;\r\n const weight = options?.weight ?? ani.weight ?? 1;\r\n this._activeAnimations.set(ani, {\r\n repeat,\r\n weight,\r\n speedRatio,\r\n fadeIn,\r\n fadeOut: 0,\r\n repeatCounter: 0,\r\n currentTime: speedRatio < 0 ? ani.timeDuration : 0,\r\n animateTime: 0,\r\n fadeOutStart: 0,\r\n firstFrame: true\r\n });\r\n ani.tracks?.forEach((v, k) => {\r\n let nodeTracks = this._activeTracks.get(k);\r\n if (!nodeTracks) {\r\n nodeTracks = new Map();\r\n this._activeTracks.set(k, nodeTracks);\r\n }\r\n for (const track of v) {\r\n const blendId = track.getBlendId();\r\n let blendedTracks = nodeTracks.get(blendId);\r\n if (!blendedTracks) {\r\n blendedTracks = [];\r\n nodeTracks.set(blendId, blendedTracks);\r\n }\r\n blendedTracks.push(track);\r\n }\r\n });\r\n ani.skeletons?.forEach((v, k) => {\r\n const skeleton = this.model.findSkeletonById(k);\r\n if (skeleton) {\r\n const refcount = this._activeSkeletons.get(skeleton);\r\n if (refcount) {\r\n this._activeSkeletons.set(skeleton, refcount + 1);\r\n } else {\r\n this._activeSkeletons.set(skeleton, 1);\r\n }\r\n skeleton.playing = true;\r\n }\r\n });\r\n }\r\n }\r\n /**\r\n * Stop playback of an animation clip.\r\n *\r\n * Behavior:\r\n * - If `options.fadeOut > 0`, marks the clip for fade-out; actual removal occurs after fade completes.\r\n * - If `fadeOut` is 0 or omitted, immediately:\r\n * - Removes the clip from active animations.\r\n * - Unregisters its tracks from active track maps.\r\n * - Decrements skeleton reference counts; resets and removes skeletons when refcount reaches 0.\r\n *\r\n * @param name - Name of the animation to stop.\r\n * @param options - Optional fade-out configuration.\r\n */\r\n stopAnimation(name: string, options?: StopAnimationOptions): void {\r\n const ani = this._animations[name];\r\n const info = this._activeAnimations.get(ani);\r\n if (info) {\r\n const fadeOut = Math.max(options?.fadeOut ?? 0, 0);\r\n if (fadeOut !== 0) {\r\n info.fadeOut = fadeOut;\r\n info.fadeOutStart = -1;\r\n } else {\r\n this._activeAnimations.delete(ani);\r\n this._activeTracks.forEach((v) => {\r\n v.forEach((tracks, id) => {\r\n v.set(\r\n id,\r\n tracks.filter((track) => track.animation !== ani)\r\n );\r\n });\r\n });\r\n ani.skeletons?.forEach((v, k) => {\r\n const skeleton = this.model.findSkeletonById(k);\r\n if (skeleton) {\r\n const refcount = this._activeSkeletons.get(skeleton);\r\n if (refcount === 1) {\r\n skeleton.reset();\r\n this._activeSkeletons.delete(skeleton);\r\n } else {\r\n this._activeSkeletons.set(skeleton, refcount - 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n }\r\n /**\r\n * Dispose the animation set and release owned resources.\r\n *\r\n * - Disposes the weak reference to the model.\r\n * - Disposes all registered animation clips.\r\n * - Clears active animations, tracks, and skeleton references.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._model?.dispose();\r\n this._model = null;\r\n for (const k in this._animations) {\r\n this._animations[k].dispose();\r\n }\r\n this._animations = {};\r\n this._activeAnimations.clear();\r\n this._activeSkeletons.clear();\r\n this._activeTracks.clear();\r\n }\r\n}\r\n"],"names":["AnimationSet","Disposable","model","_model","DWeakRef","_animations","_activeTracks","Map","_activeSkeletons","_activeAnimations","_skeletons","get","numAnimations","Object","getOwnPropertyNames","length","skeletons","name","createAnimation","embedded","console","error","animation","AnimationClip","scene","queueUpdateNode","deleteAnimation","stopAnimation","dispose","getAnimationNames","keys","update","deltaInSeconds","forEach","v","k","fadeOut","fadeOutStart","animateTime","firstFrame","timeAdvance","speedRatio","currentTime","timeDuration","repeatCounter","repeat","alltracks","tracks","filter","track","isPlayingAnimation","weights","map","info","weight","fadeIn","Math","min","states","t","getDuration","calculateState","state","weightedAverage","a","b","mixState","applyState","apply","has","size","getAnimationClip","setAnimationWeight","ani","playAnimation","options","max","set","nodeTracks","blendId","getBlendId","blendedTracks","push","skeleton","findSkeletonById","refcount","playing","delete","id","reset","onDispose","clear"],"mappings":"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"}
1
+ {"version":3,"file":"animationset.js","sources":["../../src/animation/animationset.ts"],"sourcesContent":["import { weightedAverage, Disposable } from '@zephyr3d/base';\r\nimport type { DRef, IDisposable } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../scene';\r\nimport { AnimationClip } from './animation';\r\nimport type { AnimationTrack } from './animationtrack';\r\nimport type { Skeleton } from './skeleton';\r\n\r\n/**\r\n * Options for playing an animation.\r\n *\r\n * Controls looping, playback speed (including reverse), and fade-in blending.\r\n * @public\r\n **/\r\nexport type PlayAnimationOptions = {\r\n /**\r\n * Number of loops to play.\r\n *\r\n * - 0: infinite looping (default).\r\n * - n \\> 0: play exactly n loops (each loop is one full duration of the clip).\r\n */\r\n repeat?: number;\r\n /**\r\n * Playback speed multiplier.\r\n *\r\n * - 1: normal speed (default).\r\n * - \\>1: faster; \\<1: slower.\r\n * - Negative values play the clip in reverse. The initial `currentTime` will be set to the end.\r\n */\r\n speedRatio?: number;\r\n /**\r\n * Fade-in duration in seconds.\r\n *\r\n * Interpolates the animation weight from 0 to the clip's configured weight over this time.\r\n * Use together with `stopAnimation(..., { fadeOut })` for smooth cross-fading.\r\n * Default is 0 (no fade-in).\r\n */\r\n fadeIn?: number;\r\n /**\r\n * Weight of the animation clip.\r\n *\r\n * Used during blending when multiple animations affect the same property.\r\n * Default is the clip's configured weight.\r\n */\r\n weight?: number;\r\n};\r\n\r\n/**\r\n * Options for stopping an animation.\r\n *\r\n * Allows a graceful fade-out instead of abrupt stop.\r\n * @public\r\n */\r\nexport type StopAnimationOptions = {\r\n /**\r\n * Fade-out duration in seconds.\r\n *\r\n * Interpolates the current animation weight down to 0 over this time.\r\n * Default is 0 (immediate stop).\r\n */\r\n fadeOut?: number;\r\n};\r\n\r\n/**\r\n * Animation set\r\n *\r\n * Manages a collection of named animation clips for a model and orchestrates:\r\n * - Playback state (time, loops, speed, weights, fade-in/out).\r\n * - Blending across multiple tracks targeting the same property via weighted averages.\r\n * - Skeleton usage and application for clips that drive skeletal animation.\r\n * - Active track registration and cleanup as clips start/stop.\r\n *\r\n * Usage:\r\n * - Create or retrieve `AnimationClip`s by name.\r\n * - Start playback with `playAnimation(name, options)`.\r\n * - Advance animation with `update(deltaSeconds)`.\r\n * - Optionally adjust weight while playing with `setAnimationWeight(name, weight)`.\r\n *\r\n * Lifetime:\r\n * - Disposing the set releases references to the model, clips, and clears active state.\r\n *\r\n * @public\r\n */\r\nexport class AnimationSet extends Disposable implements IDisposable {\r\n /** @internal */\r\n private _model: SceneNode;\r\n /** @internal */\r\n private _animations: Partial<Record<string, AnimationClip>>;\r\n /** @internal */\r\n private _skeletons: DRef<Skeleton>[];\r\n /** @internal */\r\n private readonly _activeTracks: Map<object, Map<unknown, AnimationTrack[]>>;\r\n /** @internal */\r\n private readonly _activeSkeletons: Map<Skeleton, number>;\r\n /** @internal */\r\n private readonly _activeAnimations: Map<\r\n AnimationClip,\r\n {\r\n currentTime: number;\r\n repeat: number;\r\n repeatCounter: number;\r\n weight: number;\r\n speedRatio: number;\r\n firstFrame: boolean;\r\n fadeIn: number;\r\n fadeOut: number;\r\n fadeOutStart: number;\r\n animateTime: number;\r\n }\r\n >;\r\n /**\r\n * Create an AnimationSet controlling the provided model.\r\n *\r\n * @param model - The SceneNode (model root) controlled by this animation set.\r\n */\r\n constructor(model: SceneNode) {\r\n super();\r\n this._model = model;\r\n this._animations = {};\r\n this._activeTracks = new Map();\r\n this._activeSkeletons = new Map();\r\n this._activeAnimations = new Map();\r\n this._skeletons = [];\r\n }\r\n /**\r\n * The model (SceneNode) controlled by this animation set.\r\n */\r\n get model() {\r\n return this._model;\r\n }\r\n /**\r\n * Number of animation clips registered in this set.\r\n */\r\n get numAnimations() {\r\n return Object.getOwnPropertyNames(this._animations).length;\r\n }\r\n /**\r\n * The skeletons used by animations in this set.\r\n */\r\n get skeletons() {\r\n return this._skeletons;\r\n }\r\n /**\r\n * Retrieve an animation clip by name.\r\n *\r\n * @param name - Name of the animation.\r\n * @returns The clip if present; otherwise null.\r\n */\r\n get(name: string) {\r\n return this._animations[name] ?? null;\r\n }\r\n /**\r\n * Create and register a new animation clip.\r\n *\r\n * @param name - Unique name for the animation clip.\r\n * @param embedded - Whether the clip is embedded/owned (implementation-specific). Default false.\r\n * @returns The created clip, or null if the name is empty or not unique.\r\n */\r\n createAnimation(name: string, embedded = false) {\r\n if (!name || this._animations[name]) {\r\n console.error('Animation must have unique name');\r\n return null;\r\n } else {\r\n const animation = new AnimationClip(name, this, embedded);\r\n this._animations[name] = animation;\r\n this._model.scene?.queueUpdateNode(this._model);\r\n return animation;\r\n }\r\n }\r\n /**\r\n * Delete and dispose an animation clip by name.\r\n *\r\n * - If the animation is currently playing, it is first stopped (immediately).\r\n *\r\n * @param name - Name of the animation to remove.\r\n */\r\n deleteAnimation(name: string) {\r\n const animation = this._animations[name];\r\n if (animation) {\r\n this.stopAnimation(name);\r\n delete this._animations[name];\r\n animation.dispose();\r\n }\r\n }\r\n /**\r\n * Get the list of all registered animation names.\r\n *\r\n * @returns An array of clip names.\r\n */\r\n getAnimationNames() {\r\n return Object.keys(this._animations);\r\n }\r\n /**\r\n * Advance and apply active animations.\r\n *\r\n * Responsibilities per call:\r\n * - Update time cursor for each active clip (respecting speedRatio and looping).\r\n * - Enforce repeat limits and apply fade-out termination if configured.\r\n * - For each animated target, blend active tracks (weighted by clip weight × fade-in × fade-out)\r\n * and apply the resulting state to the target.\r\n * - Apply all active skeletons to update skinning transforms.\r\n *\r\n * @param deltaInSeconds - Time step in seconds since last update.\r\n */\r\n update(deltaInSeconds: number) {\r\n this._activeAnimations.forEach((v, k) => {\r\n if (v.fadeOut > 0 && v.fadeOutStart < 0) {\r\n v.fadeOutStart = v.animateTime;\r\n }\r\n // Update animation time\r\n if (v.firstFrame) {\r\n v.firstFrame = false;\r\n } else {\r\n const timeAdvance = deltaInSeconds * v.speedRatio;\r\n v.currentTime += timeAdvance;\r\n v.animateTime += timeAdvance;\r\n if (v.currentTime > k.timeDuration) {\r\n v.repeatCounter++;\r\n v.currentTime = 0;\r\n } else if (v.currentTime < 0) {\r\n v.repeatCounter++;\r\n v.currentTime = k.timeDuration;\r\n }\r\n if (v.repeat !== 0 && v.repeatCounter >= v.repeat) {\r\n this.stopAnimation(k.name);\r\n } else if (v.fadeOut > 0) {\r\n if (v.animateTime - v.fadeOutStart >= v.fadeOut) {\r\n this.stopAnimation(k.name);\r\n }\r\n }\r\n }\r\n });\r\n // Update tracks\r\n this._activeTracks.forEach((v, k) => {\r\n v.forEach((alltracks) => {\r\n // Only deal with tracks which have not been removed\r\n const tracks = alltracks.filter(\r\n (track) => track.animation && this.isPlayingAnimation(track.animation.name)\r\n );\r\n if (tracks.length > 0) {\r\n const weights = tracks.map((track) => {\r\n const info = this._activeAnimations.get(track.animation!)!;\r\n const weight = info.weight;\r\n const fadeIn = info.fadeIn === 0 ? 1 : Math.min(1, info.animateTime / info.fadeIn);\r\n let fadeOut = 1;\r\n if (info.fadeOut !== 0) {\r\n fadeOut = 1 - (info.animateTime - info.fadeOutStart) / info.fadeOut;\r\n }\r\n return weight * fadeIn * fadeOut;\r\n });\r\n const states = tracks.map((track) => {\r\n const info = this._activeAnimations.get(track.animation!)!;\r\n const t = (info.currentTime / track.animation!.timeDuration) * track.getDuration();\r\n return track.calculateState(k, t);\r\n });\r\n const state = weightedAverage(weights, states, (a, b, t) => {\r\n return tracks[0].mixState(a, b, t);\r\n });\r\n tracks[0].applyState(k, state);\r\n }\r\n });\r\n });\r\n // Update skeletons\r\n this._activeSkeletons.forEach((v, k) => {\r\n k.apply();\r\n });\r\n }\r\n /**\r\n * Check whether an animation is currently playing.\r\n *\r\n * @param name - Optional animation name. If omitted, returns true if any animation is playing.\r\n * @returns True if playing; otherwise false.\r\n */\r\n isPlayingAnimation(name?: string) {\r\n if (name) {\r\n const animation = this._animations[name];\r\n return !!animation && this._activeAnimations.has(animation);\r\n }\r\n return this._activeAnimations.size > 0;\r\n }\r\n /**\r\n * Get an animation clip by name.\r\n *\r\n * Alias of `get(name)` returning a nullable type.\r\n *\r\n * @param name - Name of the animation.\r\n * @returns The clip if present; otherwise null.\r\n */\r\n getAnimationClip(name: string) {\r\n return this._animations[name] ?? null;\r\n }\r\n /**\r\n * Set the runtime blend weight for a currently playing animation.\r\n *\r\n * Has no effect if the clip is not active.\r\n *\r\n * @param name - Name of the playing animation.\r\n * @param weight - New weight value used during blending.\r\n */\r\n setAnimationWeight(name: string, weight: number) {\r\n const ani = this._animations[name];\r\n if (!ani) {\r\n console.error(`Animation ${name} not exists`);\r\n return;\r\n }\r\n const info = this._activeAnimations.get(ani);\r\n if (info) {\r\n info.weight = weight;\r\n }\r\n }\r\n /**\r\n * Start (or update) playback of an animation clip.\r\n *\r\n * Behavior:\r\n * - If the clip is already playing, updates its fade-in (resets fade-out).\r\n * - Otherwise initializes playback state (repeat counter, speed, weight, initial time).\r\n * - Registers clip tracks and skeletons into the active sets for blending and application.\r\n *\r\n * @param name - Name of the animation to play.\r\n * @param options - Playback options (repeat, speedRatio, fadeIn).\r\n */\r\n playAnimation(name: string, options?: PlayAnimationOptions) {\r\n const ani = this._animations[name];\r\n if (!ani) {\r\n console.error(`Animation ${name} not exists`);\r\n return;\r\n }\r\n const fadeIn = Math.max(options?.fadeIn ?? 0, 0);\r\n const info = this._activeAnimations.get(ani);\r\n if (info) {\r\n info.fadeOut = 0;\r\n info.fadeIn = fadeIn;\r\n } else {\r\n const repeat = options?.repeat ?? 0;\r\n const speedRatio = options?.speedRatio ?? 1;\r\n const weight = options?.weight ?? ani.weight ?? 1;\r\n this._activeAnimations.set(ani, {\r\n repeat,\r\n weight,\r\n speedRatio,\r\n fadeIn,\r\n fadeOut: 0,\r\n repeatCounter: 0,\r\n currentTime: speedRatio < 0 ? ani.timeDuration : 0,\r\n animateTime: 0,\r\n fadeOutStart: 0,\r\n firstFrame: true\r\n });\r\n ani.tracks?.forEach((v, k) => {\r\n let nodeTracks = this._activeTracks.get(k);\r\n if (!nodeTracks) {\r\n nodeTracks = new Map();\r\n this._activeTracks.set(k, nodeTracks);\r\n }\r\n for (const track of v) {\r\n const blendId = track.getBlendId();\r\n let blendedTracks = nodeTracks.get(blendId);\r\n if (!blendedTracks) {\r\n blendedTracks = [];\r\n nodeTracks.set(blendId, blendedTracks);\r\n }\r\n blendedTracks.push(track);\r\n }\r\n });\r\n ani.skeletons?.forEach((v, k) => {\r\n const skeleton = this.model.findSkeletonById(k);\r\n if (skeleton) {\r\n const refcount = this._activeSkeletons.get(skeleton);\r\n if (refcount) {\r\n this._activeSkeletons.set(skeleton, refcount + 1);\r\n } else {\r\n this._activeSkeletons.set(skeleton, 1);\r\n }\r\n skeleton.playing = true;\r\n }\r\n });\r\n }\r\n }\r\n /**\r\n * Stop playback of an animation clip.\r\n *\r\n * Behavior:\r\n * - If `options.fadeOut > 0`, marks the clip for fade-out; actual removal occurs after fade completes.\r\n * - If `fadeOut` is 0 or omitted, immediately:\r\n * - Removes the clip from active animations.\r\n * - Unregisters its tracks from active track maps.\r\n * - Decrements skeleton reference counts; resets and removes skeletons when refcount reaches 0.\r\n *\r\n * @param name - Name of the animation to stop.\r\n * @param options - Optional fade-out configuration.\r\n */\r\n stopAnimation(name: string, options?: StopAnimationOptions) {\r\n const ani = this._animations[name];\r\n if (!ani) {\r\n console.error(`Animation ${name} not exists`);\r\n return;\r\n }\r\n const info = this._activeAnimations.get(ani);\r\n if (info) {\r\n const fadeOut = Math.max(options?.fadeOut ?? 0, 0);\r\n if (fadeOut !== 0) {\r\n info.fadeOut = fadeOut;\r\n info.fadeOutStart = -1;\r\n } else {\r\n this._activeAnimations.delete(ani);\r\n this._activeTracks.forEach((v) => {\r\n v.forEach((tracks, id) => {\r\n v.set(\r\n id,\r\n tracks.filter((track) => track.animation !== ani)\r\n );\r\n });\r\n });\r\n ani.skeletons?.forEach((v, k) => {\r\n const skeleton = this.model.findSkeletonById(k);\r\n if (skeleton) {\r\n const refcount = this._activeSkeletons.get(skeleton)!;\r\n if (refcount === 1) {\r\n skeleton.reset();\r\n this._activeSkeletons.delete(skeleton);\r\n } else {\r\n this._activeSkeletons.set(skeleton, refcount - 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n }\r\n /**\r\n * Dispose the animation set and release owned resources.\r\n *\r\n * - Disposes the weak reference to the model.\r\n * - Disposes all registered animation clips.\r\n * - Clears active animations, tracks, and skeleton references.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n for (const k in this._animations) {\r\n this._animations[k]!.dispose();\r\n }\r\n this._animations = {};\r\n this._activeAnimations.clear();\r\n this._activeSkeletons.clear();\r\n this._activeTracks.clear();\r\n }\r\n}\r\n"],"names":["AnimationSet","Disposable","model","_model","_animations","_activeTracks","Map","_activeSkeletons","_activeAnimations","_skeletons","numAnimations","Object","getOwnPropertyNames","length","skeletons","get","name","createAnimation","embedded","console","error","animation","AnimationClip","scene","queueUpdateNode","deleteAnimation","stopAnimation","dispose","getAnimationNames","keys","update","deltaInSeconds","forEach","v","k","fadeOut","fadeOutStart","animateTime","firstFrame","timeAdvance","speedRatio","currentTime","timeDuration","repeatCounter","repeat","alltracks","tracks","filter","track","isPlayingAnimation","weights","map","info","weight","fadeIn","Math","min","states","t","getDuration","calculateState","state","weightedAverage","a","b","mixState","applyState","apply","has","size","getAnimationClip","setAnimationWeight","ani","playAnimation","options","max","set","nodeTracks","blendId","getBlendId","blendedTracks","push","skeleton","findSkeletonById","refcount","playing","delete","id","reset","onDispose","clear"],"mappings":"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"}
@@ -24,6 +24,7 @@
24
24
  * @param embedded - Whether this track is embedded/owned inline by its container. Default false.
25
25
  */ constructor(embedded){
26
26
  this._name = 'noname';
27
+ this._animation = null;
27
28
  this._embedded = !!embedded;
28
29
  this._target = '';
29
30
  this._jointIndex = -1;
@@ -1 +1 @@
1
- {"version":3,"file":"animationtrack.js","sources":["../../src/animation/animationtrack.ts"],"sourcesContent":["import type { AnimationClip } from './animation';\r\n\r\n/**\r\n * Base class for animation tracks.\r\n *\r\n * A track produces time-varying state for a specific target and defines how to:\r\n * - Compute state at a given time (`calculateState`)\r\n * - Apply that state to a target (`applyState`)\r\n * - Blend between two states (`mixState`)\r\n * - Report its blend compatibility (`getBlendId`)\r\n * - Report its intrinsic duration (`getDuration`)\r\n *\r\n * Generic:\r\n * - `StateType` is the shape of the computed/applied state (e.g., number, vector, pose).\r\n *\r\n * @public\r\n */\r\nexport abstract class AnimationTrack<StateType = unknown> {\r\n /** @internal */\r\n protected _name: string;\r\n /** @internal */\r\n protected _embedded: boolean;\r\n /** @internal */\r\n protected _animation: AnimationClip;\r\n /** @internal */\r\n protected _target: string;\r\n /** @internal */\r\n protected _jointIndex: number;\r\n /**\r\n * Construct a new animation track.\r\n *\r\n * @param embedded - Whether this track is embedded/owned inline by its container. Default false.\r\n */\r\n constructor(embedded?: boolean) {\r\n this._name = 'noname';\r\n this._embedded = !!embedded;\r\n this._target = '';\r\n this._jointIndex = -1;\r\n }\r\n /**\r\n * Human-readable name of the track.\r\n */\r\n get name() {\r\n return this._name;\r\n }\r\n set name(val: string) {\r\n this._name = val;\r\n }\r\n /**\r\n * Whether this track is embedded (owned inline by a resource/container).\r\n */\r\n get embedded(): boolean {\r\n return this._embedded;\r\n }\r\n /**\r\n * The `AnimationClip` that owns this track.\r\n */\r\n get animation(): AnimationClip {\r\n return this._animation;\r\n }\r\n set animation(ani: AnimationClip) {\r\n this._animation = ani;\r\n }\r\n /**\r\n * Logical target identifier for this track (optional metadata).\r\n *\r\n * This does not affect application; it can be used by tooling or higher-level\r\n * systems to label/group tracks.\r\n */\r\n get target() {\r\n return this._target;\r\n }\r\n set target(val: string) {\r\n this._target = val;\r\n }\r\n /**\r\n * Joint index if this track controls a joint, otherwise -1\r\n */\r\n get jointIndex() {\r\n return this._jointIndex;\r\n }\r\n set jointIndex(index: number) {\r\n this._jointIndex = index;\r\n }\r\n /**\r\n * Reset the track to its initial state for the given target.\r\n *\r\n * Intended to stop playback and rewind the target to the first frame or default state.\r\n *\r\n * @param _target - The animated object to reset.\r\n */\r\n reset(_target: object) {}\r\n /**\r\n * Compute the animation state at the specified time.\r\n *\r\n * Implementations should be pure with respect to inputs: given the same `target` and\r\n * `currentTime`, return the same `StateType`.\r\n *\r\n * @param target - The animated object (used to resolve current baseline if needed).\r\n * @param currentTime - Time cursor in seconds within the track's timeline.\r\n * @returns The computed state at `currentTime`.\r\n */\r\n abstract calculateState(target: object, currentTime: number): StateType;\r\n /**\r\n * Apply a previously computed animation state to the target.\r\n *\r\n * @param target - The animated object to modify.\r\n * @param state - The state to apply.\r\n */\r\n abstract applyState(target: object, state: StateType);\r\n /**\r\n * Blend two states into a new state using a weight.\r\n *\r\n * @param a - First state.\r\n * @param b - Second state.\r\n * @param t - Blend weight in \\[0, 1\\], where 0 yields `a` and 1 yields `b`.\r\n * @returns The blended state.\r\n */\r\n abstract mixState(a: StateType, b: StateType, t: number): StateType;\r\n /**\r\n * Get the blend identifier for this track.\r\n *\r\n * Tracks with the same blend ID are considered compatible for blending on the\r\n * same target channel/property.\r\n *\r\n * @returns An identifier used to group compatible tracks for blending.\r\n */\r\n abstract getBlendId(): unknown;\r\n /**\r\n * Get the intrinsic duration of this track in seconds.\r\n *\r\n * Used by clips to determine overall clip duration and looping behavior.\r\n *\r\n * @returns Track duration (seconds).\r\n */\r\n abstract getDuration(): number;\r\n}\r\n"],"names":["AnimationTrack","embedded","_name","_embedded","_target","_jointIndex","name","val","animation","_animation","ani","target","jointIndex","index","reset"],"mappings":"AAEA;;;;;;;;;;;;;;AAcC,IACM,MAAeA,cAAAA,CAAAA;qBAEpB,KAAwB;qBAExB,SAA6B;qBAE7B,UAAoC;qBAEpC,OAA0B;qBAE1B,WAA8B;AAC9B;;;;MAKA,WAAA,CAAYC,QAAkB,CAAE;QAC9B,IAAI,CAACC,KAAK,GAAG,QAAA;AACb,QAAA,IAAI,CAACC,SAAS,GAAG,CAAC,CAACF,QAAAA;QACnB,IAAI,CAACG,OAAO,GAAG,EAAA;QACf,IAAI,CAACC,WAAW,GAAG,EAAC;AACtB;AACA;;AAEC,MACD,IAAIC,IAAO,GAAA;QACT,OAAO,IAAI,CAACJ,KAAK;AACnB;IACA,IAAII,IAAAA,CAAKC,GAAW,EAAE;QACpB,IAAI,CAACL,KAAK,GAAGK,GAAAA;AACf;AACA;;AAEC,MACD,IAAIN,QAAoB,GAAA;QACtB,OAAO,IAAI,CAACE,SAAS;AACvB;AACA;;AAEC,MACD,IAAIK,SAA2B,GAAA;QAC7B,OAAO,IAAI,CAACC,UAAU;AACxB;IACA,IAAID,SAAAA,CAAUE,GAAkB,EAAE;QAChC,IAAI,CAACD,UAAU,GAAGC,GAAAA;AACpB;AACA;;;;;AAKC,MACD,IAAIC,MAAS,GAAA;QACX,OAAO,IAAI,CAACP,OAAO;AACrB;IACA,IAAIO,MAAAA,CAAOJ,GAAW,EAAE;QACtB,IAAI,CAACH,OAAO,GAAGG,GAAAA;AACjB;AACA;;AAEC,MACD,IAAIK,UAAa,GAAA;QACf,OAAO,IAAI,CAACP,WAAW;AACzB;IACA,IAAIO,UAAAA,CAAWC,KAAa,EAAE;QAC5B,IAAI,CAACR,WAAW,GAAGQ,KAAAA;AACrB;AACA;;;;;;MAOAC,KAAAA,CAAMV,OAAe,EAAE;AA6CzB;;;;"}
1
+ {"version":3,"file":"animationtrack.js","sources":["../../src/animation/animationtrack.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport type { AnimationClip } from './animation';\r\n\r\n/**\r\n * Base class for animation tracks.\r\n *\r\n * A track produces time-varying state for a specific target and defines how to:\r\n * - Compute state at a given time (`calculateState`)\r\n * - Apply that state to a target (`applyState`)\r\n * - Blend between two states (`mixState`)\r\n * - Report its blend compatibility (`getBlendId`)\r\n * - Report its intrinsic duration (`getDuration`)\r\n *\r\n * Generic:\r\n * - `StateType` is the shape of the computed/applied state (e.g., number, vector, pose).\r\n *\r\n * @public\r\n */\r\nexport abstract class AnimationTrack<StateType = unknown> {\r\n /** @internal */\r\n protected _name: string;\r\n /** @internal */\r\n protected _embedded: boolean;\r\n /** @internal */\r\n protected _animation: Nullable<AnimationClip>;\r\n /** @internal */\r\n protected _target: string;\r\n /** @internal */\r\n protected _jointIndex: number;\r\n /**\r\n * Construct a new animation track.\r\n *\r\n * @param embedded - Whether this track is embedded/owned inline by its container. Default false.\r\n */\r\n constructor(embedded?: boolean) {\r\n this._name = 'noname';\r\n this._animation = null;\r\n this._embedded = !!embedded;\r\n this._target = '';\r\n this._jointIndex = -1;\r\n }\r\n /**\r\n * Human-readable name of the track.\r\n */\r\n get name() {\r\n return this._name;\r\n }\r\n set name(val: string) {\r\n this._name = val;\r\n }\r\n /**\r\n * Whether this track is embedded (owned inline by a resource/container).\r\n */\r\n get embedded() {\r\n return this._embedded;\r\n }\r\n /**\r\n * The `AnimationClip` that owns this track.\r\n */\r\n get animation() {\r\n return this._animation;\r\n }\r\n set animation(ani) {\r\n this._animation = ani;\r\n }\r\n /**\r\n * Logical target identifier for this track (optional metadata).\r\n *\r\n * This does not affect application; it can be used by tooling or higher-level\r\n * systems to label/group tracks.\r\n */\r\n get target() {\r\n return this._target;\r\n }\r\n set target(val: string) {\r\n this._target = val;\r\n }\r\n /**\r\n * Joint index if this track controls a joint, otherwise -1\r\n */\r\n get jointIndex() {\r\n return this._jointIndex;\r\n }\r\n set jointIndex(index: number) {\r\n this._jointIndex = index;\r\n }\r\n /**\r\n * Reset the track to its initial state for the given target.\r\n *\r\n * Intended to stop playback and rewind the target to the first frame or default state.\r\n *\r\n * @param _target - The animated object to reset.\r\n */\r\n reset(_target: object) {}\r\n /**\r\n * Compute the animation state at the specified time.\r\n *\r\n * Implementations should be pure with respect to inputs: given the same `target` and\r\n * `currentTime`, return the same `StateType`.\r\n *\r\n * @param target - The animated object (used to resolve current baseline if needed).\r\n * @param currentTime - Time cursor in seconds within the track's timeline.\r\n * @returns The computed state at `currentTime`.\r\n */\r\n abstract calculateState(target: object, currentTime: number): StateType;\r\n /**\r\n * Apply a previously computed animation state to the target.\r\n *\r\n * @param target - The animated object to modify.\r\n * @param state - The state to apply.\r\n */\r\n abstract applyState(target: object, state: StateType): unknown;\r\n /**\r\n * Blend two states into a new state using a weight.\r\n *\r\n * @param a - First state.\r\n * @param b - Second state.\r\n * @param t - Blend weight in \\[0, 1\\], where 0 yields `a` and 1 yields `b`.\r\n * @returns The blended state.\r\n */\r\n abstract mixState(a: StateType, b: StateType, t: number): StateType;\r\n /**\r\n * Get the blend identifier for this track.\r\n *\r\n * Tracks with the same blend ID are considered compatible for blending on the\r\n * same target channel/property.\r\n *\r\n * @returns An identifier used to group compatible tracks for blending.\r\n */\r\n abstract getBlendId(): unknown;\r\n /**\r\n * Get the intrinsic duration of this track in seconds.\r\n *\r\n * Used by clips to determine overall clip duration and looping behavior.\r\n *\r\n * @returns Track duration (seconds).\r\n */\r\n abstract getDuration(): number;\r\n}\r\n"],"names":["AnimationTrack","embedded","_name","_animation","_embedded","_target","_jointIndex","name","val","animation","ani","target","jointIndex","index","reset"],"mappings":"AAGA;;;;;;;;;;;;;;AAcC,IACM,MAAeA,cAAAA,CAAAA;qBAEpB,KAAwB;qBAExB,SAA6B;qBAE7B,UAA8C;qBAE9C,OAA0B;qBAE1B,WAA8B;AAC9B;;;;MAKA,WAAA,CAAYC,QAAkB,CAAE;QAC9B,IAAI,CAACC,KAAK,GAAG,QAAA;QACb,IAAI,CAACC,UAAU,GAAG,IAAA;AAClB,QAAA,IAAI,CAACC,SAAS,GAAG,CAAC,CAACH,QAAAA;QACnB,IAAI,CAACI,OAAO,GAAG,EAAA;QACf,IAAI,CAACC,WAAW,GAAG,EAAC;AACtB;AACA;;AAEC,MACD,IAAIC,IAAO,GAAA;QACT,OAAO,IAAI,CAACL,KAAK;AACnB;IACA,IAAIK,IAAAA,CAAKC,GAAW,EAAE;QACpB,IAAI,CAACN,KAAK,GAAGM,GAAAA;AACf;AACA;;AAEC,MACD,IAAIP,QAAW,GAAA;QACb,OAAO,IAAI,CAACG,SAAS;AACvB;AACA;;AAEC,MACD,IAAIK,SAAY,GAAA;QACd,OAAO,IAAI,CAACN,UAAU;AACxB;IACA,IAAIM,SAAAA,CAAUC,GAAG,EAAE;QACjB,IAAI,CAACP,UAAU,GAAGO,GAAAA;AACpB;AACA;;;;;AAKC,MACD,IAAIC,MAAS,GAAA;QACX,OAAO,IAAI,CAACN,OAAO;AACrB;IACA,IAAIM,MAAAA,CAAOH,GAAW,EAAE;QACtB,IAAI,CAACH,OAAO,GAAGG,GAAAA;AACjB;AACA;;AAEC,MACD,IAAII,UAAa,GAAA;QACf,OAAO,IAAI,CAACN,WAAW;AACzB;IACA,IAAIM,UAAAA,CAAWC,KAAa,EAAE;QAC5B,IAAI,CAACP,WAAW,GAAGO,KAAAA;AACrB;AACA;;;;;;MAOAC,KAAAA,CAAMT,OAAe,EAAE;AA6CzB;;;;"}
@@ -11,7 +11,6 @@ const tmpVec3 = new Vector3();
11
11
  constructor(modeOrInterpolator, keyFramesOrEmbedded, embedded){
12
12
  if (modeOrInterpolator === undefined) {
13
13
  super(false);
14
- this._interpolator = null;
15
14
  } else if (modeOrInterpolator instanceof Interpolator) {
16
15
  if (modeOrInterpolator.target !== 'vec3') {
17
16
  throw new Error(`EulerRotationTrack(): interpolator target must be 'vec3'`);
@@ -1 +1 @@
1
- {"version":3,"file":"eulerrotationtrack.js","sources":["../../src/animation/eulerrotationtrack.ts"],"sourcesContent":["import type { InterpolationMode } from '@zephyr3d/base';\r\nimport { Interpolator, Quaternion, Vector3 } from '@zephyr3d/base';\r\nimport { AnimationTrack } from './animationtrack';\r\nimport type { SceneNode } from '../scene';\r\n\r\nconst tmpVec3 = new Vector3();\r\n\r\n/**\r\n * Euler angle rotation animation track\r\n * @public\r\n */\r\nexport class NodeEulerRotationTrack extends AnimationTrack<Quaternion> {\r\n private readonly _state: Quaternion;\r\n private _interpolator: Interpolator;\r\n /**\r\n * Create an instance of EulerRotationTrack\r\n */\r\n constructor();\r\n /**\r\n * Create an instance of EulerRotationTrack from keyframe values\r\n * @param interpolator - Interpolator object that contains the keyframe values\r\n * @param embedded - Whether this track be an embedded track\r\n */\r\n constructor(interpolator: Interpolator, embedded?: boolean);\r\n /**\r\n * Create an instance of EulerRotationTrack from keyframe values\r\n * @param mode - The interpolation mode of keyframes\r\n * @param keyFrames - Keyframe values\r\n * @param embedded - Whether this track be an embedded track\r\n */\r\n constructor(mode: InterpolationMode, keyFrames: { time: number; value: Vector3 }[], embedded?: boolean);\r\n constructor(\r\n modeOrInterpolator?: Interpolator | InterpolationMode,\r\n keyFramesOrEmbedded?: { time: number; value: Vector3 }[] | boolean,\r\n embedded?: boolean\r\n ) {\r\n if (modeOrInterpolator === undefined) {\r\n super(false);\r\n this._interpolator = null;\r\n } else if (modeOrInterpolator instanceof Interpolator) {\r\n if (modeOrInterpolator.target !== 'vec3') {\r\n throw new Error(`EulerRotationTrack(): interpolator target must be 'vec3'`);\r\n }\r\n super((keyFramesOrEmbedded as boolean) ?? false);\r\n this._interpolator = modeOrInterpolator;\r\n } else {\r\n const keyFrames = keyFramesOrEmbedded as { time: number; value: Vector3 }[];\r\n const inputs = new Float32Array(keyFrames.map((val) => val.time));\r\n const outputs = new Float32Array(keyFrames.length * 3);\r\n for (let i = 0; i < keyFrames.length; i++) {\r\n outputs[i * 3 + 0] = keyFrames[i].value.x;\r\n outputs[i * 3 + 1] = keyFrames[i].value.y;\r\n outputs[i * 3 + 2] = keyFrames[i].value.z;\r\n }\r\n super(embedded ?? false);\r\n this._interpolator = new Interpolator(modeOrInterpolator, 'vec3', inputs, outputs);\r\n }\r\n this._state = new Quaternion();\r\n }\r\n get interpolator() {\r\n return this._interpolator;\r\n }\r\n set interpolator(interp: Interpolator) {\r\n if (interp && interp.target !== 'vec3') {\r\n throw new Error(`EulerRotationTrack(): interpolator target must be 'vec3'`);\r\n }\r\n this._interpolator = interp ?? null;\r\n }\r\n /** {@inheritDoc AnimationTrack.calculateState} */\r\n calculateState(target: object, currentTime: number): Quaternion {\r\n this._interpolator.interpolate(currentTime, tmpVec3);\r\n this._state.fromEulerAngle(tmpVec3.x, tmpVec3.y, tmpVec3.z);\r\n return this._state;\r\n }\r\n /** {@inheritDoc AnimationTrack.applyState} */\r\n applyState(node: SceneNode, state: Quaternion) {\r\n node.rotation.set(state);\r\n }\r\n /** {@inheritDoc AnimationTrack.mixState} */\r\n mixState(a: Quaternion, b: Quaternion, t: number): Quaternion {\r\n return Quaternion.slerp(a, b, t);\r\n }\r\n /** {@inheritDoc AnimationTrack.getBlendId} */\r\n getBlendId(): unknown {\r\n return 'node-rotation';\r\n }\r\n /** {@inheritDoc AnimationTrack.getDuration} */\r\n getDuration(): number {\r\n return this._interpolator.maxTime;\r\n }\r\n}\r\n"],"names":["tmpVec3","Vector3","NodeEulerRotationTrack","AnimationTrack","_state","_interpolator","modeOrInterpolator","keyFramesOrEmbedded","embedded","undefined","Interpolator","target","Error","keyFrames","inputs","Float32Array","map","val","time","outputs","length","i","value","x","y","z","Quaternion","interpolator","interp","calculateState","currentTime","interpolate","fromEulerAngle","applyState","node","state","rotation","set","mixState","a","b","t","slerp","getBlendId","getDuration","maxTime"],"mappings":"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"}
1
+ {"version":3,"file":"eulerrotationtrack.js","sources":["../../src/animation/eulerrotationtrack.ts"],"sourcesContent":["import type { InterpolationMode } from '@zephyr3d/base';\r\nimport { Interpolator, Quaternion, Vector3 } from '@zephyr3d/base';\r\nimport { AnimationTrack } from './animationtrack';\r\nimport type { SceneNode } from '../scene';\r\n\r\nconst tmpVec3 = new Vector3();\r\n\r\n/**\r\n * Euler angle rotation animation track\r\n * @public\r\n */\r\nexport class NodeEulerRotationTrack extends AnimationTrack<Quaternion> {\r\n private readonly _state: Quaternion;\r\n private _interpolator!: Interpolator;\r\n /**\r\n * Create an instance of EulerRotationTrack\r\n */\r\n constructor();\r\n /**\r\n * Create an instance of EulerRotationTrack from keyframe values\r\n * @param interpolator - Interpolator object that contains the keyframe values\r\n * @param embedded - Whether this track be an embedded track\r\n */\r\n constructor(interpolator: Interpolator, embedded?: boolean);\r\n /**\r\n * Create an instance of EulerRotationTrack from keyframe values\r\n * @param mode - The interpolation mode of keyframes\r\n * @param keyFrames - Keyframe values\r\n * @param embedded - Whether this track be an embedded track\r\n */\r\n constructor(mode: InterpolationMode, keyFrames: { time: number; value: Vector3 }[], embedded?: boolean);\r\n constructor(\r\n modeOrInterpolator?: Interpolator | InterpolationMode,\r\n keyFramesOrEmbedded?: { time: number; value: Vector3 }[] | boolean,\r\n embedded?: boolean\r\n ) {\r\n if (modeOrInterpolator === undefined) {\r\n super(false);\r\n } else if (modeOrInterpolator instanceof Interpolator) {\r\n if (modeOrInterpolator.target !== 'vec3') {\r\n throw new Error(`EulerRotationTrack(): interpolator target must be 'vec3'`);\r\n }\r\n super((keyFramesOrEmbedded as boolean) ?? false);\r\n this._interpolator = modeOrInterpolator;\r\n } else {\r\n const keyFrames = keyFramesOrEmbedded as { time: number; value: Vector3 }[];\r\n const inputs = new Float32Array(keyFrames.map((val) => val.time));\r\n const outputs = new Float32Array(keyFrames.length * 3);\r\n for (let i = 0; i < keyFrames.length; i++) {\r\n outputs[i * 3 + 0] = keyFrames[i].value.x;\r\n outputs[i * 3 + 1] = keyFrames[i].value.y;\r\n outputs[i * 3 + 2] = keyFrames[i].value.z;\r\n }\r\n super(embedded ?? false);\r\n this._interpolator = new Interpolator(modeOrInterpolator, 'vec3', inputs, outputs);\r\n }\r\n this._state = new Quaternion();\r\n }\r\n get interpolator() {\r\n return this._interpolator;\r\n }\r\n set interpolator(interp: Interpolator) {\r\n if (interp && interp.target !== 'vec3') {\r\n throw new Error(`EulerRotationTrack(): interpolator target must be 'vec3'`);\r\n }\r\n this._interpolator = interp ?? null;\r\n }\r\n /** {@inheritDoc AnimationTrack.calculateState} */\r\n calculateState(target: object, currentTime: number) {\r\n this._interpolator.interpolate(currentTime, tmpVec3);\r\n this._state.fromEulerAngle(tmpVec3.x, tmpVec3.y, tmpVec3.z);\r\n return this._state;\r\n }\r\n /** {@inheritDoc AnimationTrack.applyState} */\r\n applyState(node: SceneNode, state: Quaternion) {\r\n node.rotation.set(state);\r\n }\r\n /** {@inheritDoc AnimationTrack.mixState} */\r\n mixState(a: Quaternion, b: Quaternion, t: number) {\r\n return Quaternion.slerp(a, b, t);\r\n }\r\n /** {@inheritDoc AnimationTrack.getBlendId} */\r\n getBlendId() {\r\n return 'node-rotation';\r\n }\r\n /** {@inheritDoc AnimationTrack.getDuration} */\r\n getDuration() {\r\n return this._interpolator.maxTime;\r\n }\r\n}\r\n"],"names":["tmpVec3","Vector3","NodeEulerRotationTrack","AnimationTrack","_state","_interpolator","modeOrInterpolator","keyFramesOrEmbedded","embedded","undefined","Interpolator","target","Error","keyFrames","inputs","Float32Array","map","val","time","outputs","length","i","value","x","y","z","Quaternion","interpolator","interp","calculateState","currentTime","interpolate","fromEulerAngle","applyState","node","state","rotation","set","mixState","a","b","t","slerp","getBlendId","getDuration","maxTime"],"mappings":"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"}
@@ -51,13 +51,19 @@ import { getDevice } from '../app/api.js';
51
51
  const meshAABB = subMesh.mesh.getBoundingVolume().toAABB();
52
52
  morphBoundingBox.minPoint.addBy(meshAABB.minPoint);
53
53
  morphBoundingBox.maxPoint.addBy(meshAABB.maxPoint);
54
+ const names = {};
55
+ for(let i = 0; i < numTargets; i++){
56
+ const name = `Target${i}`;
57
+ names[name] = i;
58
+ }
54
59
  subMesh.mesh.setMorphData({
55
60
  width: textureSize,
56
61
  height: textureSize,
57
62
  data: textureData
58
63
  });
59
64
  subMesh.mesh.setMorphInfo({
60
- data: weightsAndOffsets
65
+ data: weightsAndOffsets,
66
+ names
61
67
  });
62
68
  subMesh.mesh.setAnimatedBoundingBox(morphBoundingBox);
63
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"morphtarget.js","sources":["../../src/animation/morphtarget.ts"],"sourcesContent":["import type { AssetSubMeshData } from '../asset';\r\nimport { MAX_MORPH_ATTRIBUTES, MAX_MORPH_TARGETS } from '../values';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** @internal */\r\nexport function processMorphData(subMesh: AssetSubMeshData, morphWeights: number[]) {\r\n const device = getDevice();\r\n const numTargets = subMesh.numTargets;\r\n if (numTargets === 0) {\r\n return;\r\n }\r\n const attributes = Object.getOwnPropertyNames(subMesh.targets);\r\n const numVertices = subMesh.primitive.get().getNumVertices();\r\n const weightsAndOffsets = new Float32Array(4 + MAX_MORPH_TARGETS + MAX_MORPH_ATTRIBUTES);\r\n for (let i = 0; i < numTargets; i++) {\r\n weightsAndOffsets[4 + i] = morphWeights?.[i] ?? 0;\r\n }\r\n const textureSize = Math.ceil(Math.sqrt(numVertices * attributes.length * numTargets));\r\n if (textureSize > device.getDeviceCaps().textureCaps.maxTextureSize) {\r\n // TODO: reduce morph attributes\r\n throw new Error(`Morph target data too large`);\r\n }\r\n weightsAndOffsets[0] = textureSize;\r\n weightsAndOffsets[1] = textureSize;\r\n weightsAndOffsets[2] = numVertices;\r\n weightsAndOffsets[3] = numTargets;\r\n let offset = 0;\r\n const textureData = new Float32Array(textureSize * textureSize * 4);\r\n for (let attrib = 0; attrib < MAX_MORPH_ATTRIBUTES; attrib++) {\r\n const index = attributes.indexOf(String(attrib));\r\n if (index < 0) {\r\n weightsAndOffsets[4 + MAX_MORPH_TARGETS + attrib] = -1;\r\n continue;\r\n }\r\n weightsAndOffsets[4 + MAX_MORPH_TARGETS + attrib] = offset >> 2;\r\n const info = subMesh.targets[attrib];\r\n if (info.data.length !== numTargets) {\r\n console.error(`Invalid morph target data`);\r\n return;\r\n }\r\n for (let t = 0; t < numTargets; t++) {\r\n const data = info.data[t];\r\n for (let i = 0; i < numVertices; i++) {\r\n for (let j = 0; j < 4; j++) {\r\n textureData[offset++] = j < info.numComponents ? data[i * info.numComponents + j] : 1;\r\n }\r\n }\r\n }\r\n }\r\n const morphBoundingBox = new BoundingBox();\r\n calculateMorphBoundingBox(\r\n morphBoundingBox,\r\n subMesh.targetBox,\r\n weightsAndOffsets.subarray(4, 4 + MAX_MORPH_TARGETS),\r\n numTargets\r\n );\r\n const meshAABB = subMesh.mesh.getBoundingVolume().toAABB();\r\n morphBoundingBox.minPoint.addBy(meshAABB.minPoint);\r\n morphBoundingBox.maxPoint.addBy(meshAABB.maxPoint);\r\n\r\n subMesh.mesh.setMorphData({ width: textureSize, height: textureSize, data: textureData });\r\n subMesh.mesh.setMorphInfo({ data: weightsAndOffsets });\r\n subMesh.mesh.setAnimatedBoundingBox(morphBoundingBox);\r\n}\r\n\r\n/** @internal */\r\nexport function calculateMorphBoundingBox(\r\n morphBoundingBox: BoundingBox,\r\n keyframeBoundingBox: BoundingBox[],\r\n weights: Float32Array,\r\n numTargets: number\r\n) {\r\n morphBoundingBox.minPoint.setXYZ(0, 0, 0);\r\n morphBoundingBox.maxPoint.setXYZ(0, 0, 0);\r\n for (let i = 0; i < numTargets; i++) {\r\n const weight = weights[i];\r\n const keyframeBox = keyframeBoundingBox[i];\r\n morphBoundingBox.minPoint.x += keyframeBox.minPoint.x * weight;\r\n morphBoundingBox.minPoint.y += keyframeBox.minPoint.y * weight;\r\n morphBoundingBox.minPoint.y += keyframeBox.minPoint.z * weight;\r\n morphBoundingBox.maxPoint.x += keyframeBox.maxPoint.x * weight;\r\n morphBoundingBox.maxPoint.y += keyframeBox.maxPoint.y * weight;\r\n morphBoundingBox.maxPoint.y += keyframeBox.maxPoint.z * weight;\r\n }\r\n}\r\n"],"names":["processMorphData","subMesh","morphWeights","device","getDevice","numTargets","attributes","Object","getOwnPropertyNames","targets","numVertices","primitive","get","getNumVertices","weightsAndOffsets","Float32Array","MAX_MORPH_TARGETS","MAX_MORPH_ATTRIBUTES","i","textureSize","Math","ceil","sqrt","length","getDeviceCaps","textureCaps","maxTextureSize","Error","offset","textureData","attrib","index","indexOf","String","info","data","console","error","t","j","numComponents","morphBoundingBox","BoundingBox","calculateMorphBoundingBox","targetBox","subarray","meshAABB","mesh","getBoundingVolume","toAABB","minPoint","addBy","maxPoint","setMorphData","width","height","setMorphInfo","setAnimatedBoundingBox","keyframeBoundingBox","weights","setXYZ","weight","keyframeBox","x","y","z"],"mappings":"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"}
1
+ {"version":3,"file":"morphtarget.js","sources":["../../src/animation/morphtarget.ts"],"sourcesContent":["import type { AssetSubMeshData } from '../asset';\r\nimport { MAX_MORPH_ATTRIBUTES, MAX_MORPH_TARGETS } from '../values';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** @internal */\r\nexport function processMorphData(subMesh: AssetSubMeshData, morphWeights: number[]) {\r\n const device = getDevice();\r\n const numTargets = subMesh.numTargets;\r\n if (numTargets === 0) {\r\n return;\r\n }\r\n const attributes = Object.getOwnPropertyNames(subMesh.targets);\r\n const numVertices = subMesh.primitive.get()!.getNumVertices();\r\n const weightsAndOffsets = new Float32Array(4 + MAX_MORPH_TARGETS + MAX_MORPH_ATTRIBUTES);\r\n for (let i = 0; i < numTargets; i++) {\r\n weightsAndOffsets[4 + i] = morphWeights?.[i] ?? 0;\r\n }\r\n const textureSize = Math.ceil(Math.sqrt(numVertices * attributes.length * numTargets));\r\n if (textureSize > device.getDeviceCaps().textureCaps.maxTextureSize) {\r\n // TODO: reduce morph attributes\r\n throw new Error(`Morph target data too large`);\r\n }\r\n weightsAndOffsets[0] = textureSize;\r\n weightsAndOffsets[1] = textureSize;\r\n weightsAndOffsets[2] = numVertices;\r\n weightsAndOffsets[3] = numTargets;\r\n let offset = 0;\r\n const textureData = new Float32Array(textureSize * textureSize * 4);\r\n for (let attrib = 0; attrib < MAX_MORPH_ATTRIBUTES; attrib++) {\r\n const index = attributes.indexOf(String(attrib));\r\n if (index < 0) {\r\n weightsAndOffsets[4 + MAX_MORPH_TARGETS + attrib] = -1;\r\n continue;\r\n }\r\n weightsAndOffsets[4 + MAX_MORPH_TARGETS + attrib] = offset >> 2;\r\n const info = subMesh.targets![attrib]!;\r\n if (info.data.length !== numTargets) {\r\n console.error(`Invalid morph target data`);\r\n return;\r\n }\r\n for (let t = 0; t < numTargets; t++) {\r\n const data = info.data[t];\r\n for (let i = 0; i < numVertices; i++) {\r\n for (let j = 0; j < 4; j++) {\r\n textureData[offset++] = j < info.numComponents ? data[i * info.numComponents + j] : 1;\r\n }\r\n }\r\n }\r\n }\r\n const morphBoundingBox = new BoundingBox();\r\n calculateMorphBoundingBox(\r\n morphBoundingBox,\r\n subMesh.targetBox!,\r\n weightsAndOffsets.subarray(4, 4 + MAX_MORPH_TARGETS),\r\n numTargets\r\n );\r\n const meshAABB = subMesh.mesh!.getBoundingVolume()!.toAABB();\r\n morphBoundingBox.minPoint.addBy(meshAABB.minPoint);\r\n morphBoundingBox.maxPoint.addBy(meshAABB.maxPoint);\r\n\r\n const names: Record<string, number> = {};\r\n for (let i = 0; i < numTargets; i++) {\r\n const name = `Target${i}`;\r\n names[name] = i;\r\n }\r\n\r\n subMesh.mesh!.setMorphData({ width: textureSize, height: textureSize, data: textureData });\r\n subMesh.mesh!.setMorphInfo({ data: weightsAndOffsets, names });\r\n subMesh.mesh!.setAnimatedBoundingBox(morphBoundingBox);\r\n}\r\n\r\n/** @internal */\r\nexport function calculateMorphBoundingBox(\r\n morphBoundingBox: BoundingBox,\r\n keyframeBoundingBox: BoundingBox[],\r\n weights: Float32Array,\r\n numTargets: number\r\n) {\r\n morphBoundingBox.minPoint.setXYZ(0, 0, 0);\r\n morphBoundingBox.maxPoint.setXYZ(0, 0, 0);\r\n for (let i = 0; i < numTargets; i++) {\r\n const weight = weights[i];\r\n const keyframeBox = keyframeBoundingBox[i];\r\n morphBoundingBox.minPoint.x += keyframeBox.minPoint.x * weight;\r\n morphBoundingBox.minPoint.y += keyframeBox.minPoint.y * weight;\r\n morphBoundingBox.minPoint.y += keyframeBox.minPoint.z * weight;\r\n morphBoundingBox.maxPoint.x += keyframeBox.maxPoint.x * weight;\r\n morphBoundingBox.maxPoint.y += keyframeBox.maxPoint.y * weight;\r\n morphBoundingBox.maxPoint.y += keyframeBox.maxPoint.z * weight;\r\n }\r\n}\r\n"],"names":["processMorphData","subMesh","morphWeights","device","getDevice","numTargets","attributes","Object","getOwnPropertyNames","targets","numVertices","primitive","get","getNumVertices","weightsAndOffsets","Float32Array","MAX_MORPH_TARGETS","MAX_MORPH_ATTRIBUTES","i","textureSize","Math","ceil","sqrt","length","getDeviceCaps","textureCaps","maxTextureSize","Error","offset","textureData","attrib","index","indexOf","String","info","data","console","error","t","j","numComponents","morphBoundingBox","BoundingBox","calculateMorphBoundingBox","targetBox","subarray","meshAABB","mesh","getBoundingVolume","toAABB","minPoint","addBy","maxPoint","names","name","setMorphData","width","height","setMorphInfo","setAnimatedBoundingBox","keyframeBoundingBox","weights","setXYZ","weight","keyframeBox","x","y","z"],"mappings":"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"}
@@ -30,8 +30,8 @@ import { Vector3 } from '@zephyr3d/base';
30
30
  boundingBox: new BoundingBox(),
31
31
  weights: new Float32Array(MAX_MORPH_TARGETS)
32
32
  };
33
- this._boundingBox = targetBox;
34
- this._originBox = originBox;
33
+ this._boundingBox = targetBox ?? null;
34
+ this._originBox = originBox ?? null;
35
35
  this._defaultWeights = defaultMorphWeights ?? Array.from({
36
36
  length: this._state.numTargets
37
37
  }).map(()=>0);
@@ -94,7 +94,7 @@ import { Vector3 } from '@zephyr3d/base';
94
94
  return 'node-morph';
95
95
  }
96
96
  /** {@inheritDoc AnimationTrack.getDuration} */ getDuration() {
97
- return this._interpolator.maxTime;
97
+ return this._interpolator?.maxTime ?? 0;
98
98
  }
99
99
  /** {@inheritDoc AnimationTrack.reset} */ reset(node) {
100
100
  // apply default weights
@@ -1 +1 @@
1
- {"version":3,"file":"morphtrack.js","sources":["../../src/animation/morphtrack.ts"],"sourcesContent":["import { AnimationTrack } from './animationtrack';\r\nimport type { Mesh, SceneNode } from '../scene';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { MAX_MORPH_TARGETS } from '../values';\r\nimport { calculateMorphBoundingBox } from './morphtarget';\r\nimport type { AABB, Interpolator } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Morph animation state\r\n *\r\n * @public\r\n **/\r\nexport type MorphState = {\r\n numTargets: number;\r\n weights: Float32Array<ArrayBuffer>;\r\n boundingBox: BoundingBox;\r\n};\r\n\r\n/**\r\n * Morph target track\r\n * @public\r\n */\r\nexport class MorphTargetTrack extends AnimationTrack<MorphState> {\r\n private _state: MorphState;\r\n private _originBox: AABB;\r\n private _boundingBox: BoundingBox[];\r\n private _defaultWeights: number[];\r\n private _interpolator: Interpolator;\r\n /**\r\n * Create an instance of MorphTargetTrack\r\n */\r\n constructor();\r\n /**\r\n * Create an instance of MorphTargetTrack from morph parameters\r\n */\r\n constructor(\r\n interpolator?: Interpolator,\r\n defaultMorphWeights?: number[],\r\n targetBox?: BoundingBox[],\r\n originBox?: AABB,\r\n embedded?: boolean\r\n );\r\n /**\r\n * Create an instance of MorphTargetTrack\r\n */\r\n constructor(\r\n interpolator?: Interpolator,\r\n defaultMorphWeights?: number[],\r\n targetBox?: BoundingBox[],\r\n originBox?: AABB,\r\n embedded?: boolean\r\n ) {\r\n super(embedded);\r\n if (interpolator === undefined) {\r\n this._interpolator = null;\r\n this._state = null;\r\n this._boundingBox = null;\r\n this._originBox = null;\r\n this._defaultWeights = null;\r\n } else {\r\n this._interpolator = interpolator;\r\n this._state = {\r\n numTargets: interpolator.stride,\r\n boundingBox: new BoundingBox(),\r\n weights: new Float32Array(MAX_MORPH_TARGETS)\r\n };\r\n this._boundingBox = targetBox;\r\n this._originBox = originBox;\r\n this._defaultWeights =\r\n defaultMorphWeights ?? Array.from({ length: this._state.numTargets }).map(() => 0);\r\n }\r\n }\r\n get interpolator() {\r\n return this._interpolator;\r\n }\r\n set interpolator(interp: Interpolator) {\r\n this._interpolator = interp ?? null;\r\n this._state = this._interpolator\r\n ? {\r\n numTargets: this._interpolator.stride,\r\n boundingBox: new BoundingBox(),\r\n weights: new Float32Array(MAX_MORPH_TARGETS)\r\n }\r\n : null;\r\n }\r\n get boundingBox() {\r\n return this._boundingBox;\r\n }\r\n set boundingBox(box: BoundingBox[]) {\r\n this._boundingBox = box;\r\n }\r\n get defaultWeights() {\r\n return this._defaultWeights;\r\n }\r\n set defaultWeights(value: number[]) {\r\n this._defaultWeights = value;\r\n }\r\n get originBoundingBox() {\r\n return this._originBox;\r\n }\r\n set originBoundingBox(box: AABB) {\r\n this._originBox = box;\r\n }\r\n /** {@inheritDoc AnimationTrack.calculateState} */\r\n\r\n calculateState(target: object, currentTime: number): MorphState {\r\n this._interpolator.interpolate(currentTime, this._state.weights);\r\n calculateMorphBoundingBox(\r\n this._state.boundingBox,\r\n this._boundingBox,\r\n this._state.weights,\r\n this._state.numTargets\r\n );\r\n return this._state;\r\n }\r\n /** {@inheritDoc AnimationTrack.applyState} */\r\n applyState(node: SceneNode, state: MorphState) {\r\n (node as Mesh)\r\n .getMorphInfo()\r\n .buffer.get()\r\n .bufferSubData(4 * 4, state.weights);\r\n state.boundingBox.minPoint.addBy(this._originBox.minPoint);\r\n state.boundingBox.maxPoint.addBy(this._originBox.maxPoint);\r\n (node as Mesh).setAnimatedBoundingBox(state.boundingBox);\r\n }\r\n /** {@inheritDoc AnimationTrack.mixState} */\r\n mixState(a: MorphState, b: MorphState, t: number): MorphState {\r\n const state: MorphState = {\r\n weights: new Float32Array(a.numTargets),\r\n boundingBox: new BoundingBox(),\r\n numTargets: a.numTargets\r\n };\r\n for (let i = 0; i < a.numTargets; i++) {\r\n state.weights[i] = a.weights[i] + (b.weights[i] - a.weights[i]) * t;\r\n state.boundingBox.minPoint = Vector3.min(a.boundingBox.minPoint, b.boundingBox.minPoint);\r\n state.boundingBox.maxPoint = Vector3.max(a.boundingBox.maxPoint, b.boundingBox.maxPoint);\r\n }\r\n return state;\r\n }\r\n /** {@inheritDoc AnimationTrack.getBlendId} */\r\n getBlendId(): unknown {\r\n return 'node-morph';\r\n }\r\n /** {@inheritDoc AnimationTrack.getDuration} */\r\n getDuration(): number {\r\n return this._interpolator.maxTime;\r\n }\r\n /** {@inheritDoc AnimationTrack.reset} */\r\n reset(node: SceneNode) {\r\n // apply default weights\r\n this._state.weights.set(this._defaultWeights);\r\n this.applyState(node, this._state);\r\n }\r\n}\r\n"],"names":["MorphTargetTrack","AnimationTrack","_state","_originBox","_boundingBox","_defaultWeights","_interpolator","interpolator","defaultMorphWeights","targetBox","originBox","embedded","undefined","numTargets","stride","boundingBox","BoundingBox","weights","Float32Array","MAX_MORPH_TARGETS","Array","from","length","map","interp","box","defaultWeights","value","originBoundingBox","calculateState","target","currentTime","interpolate","calculateMorphBoundingBox","applyState","node","state","getMorphInfo","buffer","get","bufferSubData","minPoint","addBy","maxPoint","setAnimatedBoundingBox","mixState","a","b","t","i","Vector3","min","max","getBlendId","getDuration","maxTime","reset","set"],"mappings":"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"}
1
+ {"version":3,"file":"morphtrack.js","sources":["../../src/animation/morphtrack.ts"],"sourcesContent":["import { AnimationTrack } from './animationtrack';\r\nimport type { Mesh, SceneNode } from '../scene';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { MAX_MORPH_TARGETS } from '../values';\r\nimport { calculateMorphBoundingBox } from './morphtarget';\r\nimport type { AABB, Interpolator, Nullable } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Morph animation state\r\n *\r\n * @public\r\n **/\r\nexport type MorphState = {\r\n numTargets: number;\r\n weights: Float32Array<ArrayBuffer>;\r\n boundingBox: BoundingBox;\r\n};\r\n\r\n/**\r\n * Morph target track\r\n * @public\r\n */\r\nexport class MorphTargetTrack extends AnimationTrack<MorphState> {\r\n private _state: Nullable<MorphState>;\r\n private _originBox: Nullable<AABB>;\r\n private _boundingBox: Nullable<BoundingBox[]>;\r\n private _defaultWeights: Nullable<number[]>;\r\n private _interpolator: Nullable<Interpolator>;\r\n /**\r\n * Create an instance of MorphTargetTrack\r\n */\r\n constructor();\r\n /**\r\n * Create an instance of MorphTargetTrack from morph parameters\r\n */\r\n constructor(\r\n interpolator?: Interpolator,\r\n defaultMorphWeights?: number[],\r\n targetBox?: BoundingBox[],\r\n originBox?: AABB,\r\n embedded?: boolean\r\n );\r\n /**\r\n * Create an instance of MorphTargetTrack\r\n */\r\n constructor(\r\n interpolator?: Interpolator,\r\n defaultMorphWeights?: number[],\r\n targetBox?: BoundingBox[],\r\n originBox?: AABB,\r\n embedded?: boolean\r\n ) {\r\n super(embedded);\r\n if (interpolator === undefined) {\r\n this._interpolator = null;\r\n this._state = null;\r\n this._boundingBox = null;\r\n this._originBox = null;\r\n this._defaultWeights = null;\r\n } else {\r\n this._interpolator = interpolator;\r\n this._state = {\r\n numTargets: interpolator.stride,\r\n boundingBox: new BoundingBox(),\r\n weights: new Float32Array(MAX_MORPH_TARGETS)\r\n };\r\n this._boundingBox = targetBox ?? null;\r\n this._originBox = originBox ?? null;\r\n this._defaultWeights =\r\n defaultMorphWeights ?? Array.from({ length: this._state.numTargets }).map(() => 0);\r\n }\r\n }\r\n get interpolator() {\r\n return this._interpolator;\r\n }\r\n set interpolator(interp: Nullable<Interpolator>) {\r\n this._interpolator = interp ?? null;\r\n this._state = this._interpolator\r\n ? {\r\n numTargets: this._interpolator.stride,\r\n boundingBox: new BoundingBox(),\r\n weights: new Float32Array(MAX_MORPH_TARGETS)\r\n }\r\n : null;\r\n }\r\n get boundingBox() {\r\n return this._boundingBox;\r\n }\r\n set boundingBox(box: Nullable<BoundingBox[]>) {\r\n this._boundingBox = box;\r\n }\r\n get defaultWeights() {\r\n return this._defaultWeights;\r\n }\r\n set defaultWeights(value: Nullable<number[]>) {\r\n this._defaultWeights = value;\r\n }\r\n get originBoundingBox() {\r\n return this._originBox;\r\n }\r\n set originBoundingBox(box: Nullable<AABB>) {\r\n this._originBox = box;\r\n }\r\n /** {@inheritDoc AnimationTrack.calculateState} */\r\n\r\n calculateState(target: object, currentTime: number) {\r\n this._interpolator!.interpolate(currentTime, this._state!.weights);\r\n calculateMorphBoundingBox(\r\n this._state!.boundingBox,\r\n this._boundingBox!,\r\n this._state!.weights,\r\n this._state!.numTargets\r\n );\r\n return this._state!;\r\n }\r\n /** {@inheritDoc AnimationTrack.applyState} */\r\n applyState(node: SceneNode, state: MorphState) {\r\n (node as Mesh)\r\n .getMorphInfo()!\r\n .buffer!.get()!\r\n .bufferSubData(4 * 4, state.weights);\r\n state.boundingBox.minPoint.addBy(this._originBox!.minPoint);\r\n state.boundingBox.maxPoint.addBy(this._originBox!.maxPoint);\r\n (node as Mesh).setAnimatedBoundingBox(state.boundingBox);\r\n }\r\n /** {@inheritDoc AnimationTrack.mixState} */\r\n mixState(a: MorphState, b: MorphState, t: number) {\r\n const state: MorphState = {\r\n weights: new Float32Array(a.numTargets),\r\n boundingBox: new BoundingBox(),\r\n numTargets: a.numTargets\r\n };\r\n for (let i = 0; i < a.numTargets; i++) {\r\n state.weights[i] = a.weights[i] + (b.weights[i] - a.weights[i]) * t;\r\n state.boundingBox.minPoint = Vector3.min(a.boundingBox.minPoint, b.boundingBox.minPoint);\r\n state.boundingBox.maxPoint = Vector3.max(a.boundingBox.maxPoint, b.boundingBox.maxPoint);\r\n }\r\n return state;\r\n }\r\n /** {@inheritDoc AnimationTrack.getBlendId} */\r\n getBlendId() {\r\n return 'node-morph';\r\n }\r\n /** {@inheritDoc AnimationTrack.getDuration} */\r\n getDuration() {\r\n return this._interpolator?.maxTime ?? 0;\r\n }\r\n /** {@inheritDoc AnimationTrack.reset} */\r\n reset(node: SceneNode) {\r\n // apply default weights\r\n this._state!.weights.set(this._defaultWeights!);\r\n this.applyState(node, this._state!);\r\n }\r\n}\r\n"],"names":["MorphTargetTrack","AnimationTrack","_state","_originBox","_boundingBox","_defaultWeights","_interpolator","interpolator","defaultMorphWeights","targetBox","originBox","embedded","undefined","numTargets","stride","boundingBox","BoundingBox","weights","Float32Array","MAX_MORPH_TARGETS","Array","from","length","map","interp","box","defaultWeights","value","originBoundingBox","calculateState","target","currentTime","interpolate","calculateMorphBoundingBox","applyState","node","state","getMorphInfo","buffer","get","bufferSubData","minPoint","addBy","maxPoint","setAnimatedBoundingBox","mixState","a","b","t","i","Vector3","min","max","getBlendId","getDuration","maxTime","reset","set"],"mappings":"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"}