@zephyr3d/scene 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation/animation.js +4 -33
- package/dist/animation/animation.js.map +1 -1
- package/dist/animation/animationset.js +24 -11
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/animationtrack.js +1 -0
- package/dist/animation/animationtrack.js.map +1 -1
- package/dist/animation/eulerrotationtrack.js +0 -1
- package/dist/animation/eulerrotationtrack.js.map +1 -1
- package/dist/animation/ik/ccd_solver.js +372 -0
- package/dist/animation/ik/ccd_solver.js.map +1 -0
- package/dist/animation/ik/fabrik_solver.js +399 -0
- package/dist/animation/ik/fabrik_solver.js.map +1 -0
- package/dist/animation/ik/ik_angle_constraint.js +181 -0
- package/dist/animation/ik/ik_angle_constraint.js.map +1 -0
- package/dist/animation/ik/ik_chain.js +163 -0
- package/dist/animation/ik/ik_chain.js.map +1 -0
- package/dist/animation/ik/ik_chain_builder.js +68 -0
- package/dist/animation/ik/ik_chain_builder.js.map +1 -0
- package/dist/animation/ik/ik_constraint.js +25 -0
- package/dist/animation/ik/ik_constraint.js.map +1 -0
- package/dist/animation/ik/ik_pole_constraint.js +123 -0
- package/dist/animation/ik/ik_pole_constraint.js.map +1 -0
- package/dist/animation/ik/ik_solver.js +48 -0
- package/dist/animation/ik/ik_solver.js.map +1 -0
- package/dist/animation/ik/ik_track.js +96 -0
- package/dist/animation/ik/ik_track.js.map +1 -0
- package/dist/animation/ik/ik_utils.js +270 -0
- package/dist/animation/ik/ik_utils.js.map +1 -0
- package/dist/animation/ik/two_bone_ik_solver.js +332 -0
- package/dist/animation/ik/two_bone_ik_solver.js.map +1 -0
- package/dist/animation/ik_modifier.js +61 -0
- package/dist/animation/ik_modifier.js.map +1 -0
- package/dist/animation/ik_postprocessor.js +71 -0
- package/dist/animation/ik_postprocessor.js.map +1 -0
- package/dist/animation/manual_transform_processor.js +156 -0
- package/dist/animation/manual_transform_processor.js.map +1 -0
- package/dist/animation/morphtarget.js +7 -1
- package/dist/animation/morphtarget.js.map +1 -1
- package/dist/animation/morphtrack.js +3 -3
- package/dist/animation/morphtrack.js.map +1 -1
- package/dist/animation/proptrack.js +37 -41
- package/dist/animation/proptrack.js.map +1 -1
- package/dist/animation/rotationtrack.js +0 -1
- package/dist/animation/rotationtrack.js.map +1 -1
- package/dist/animation/scaletrack.js +0 -1
- package/dist/animation/scaletrack.js.map +1 -1
- package/dist/animation/skeleton.js +57 -60
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skeleton_modifier.js +38 -0
- package/dist/animation/skeleton_modifier.js.map +1 -0
- package/dist/animation/skeleton_postprocessor.js +50 -0
- package/dist/animation/skeleton_postprocessor.js.map +1 -0
- package/dist/animation/spring/multi_chain_spring_system.js +503 -0
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -0
- package/dist/animation/spring/spring_chain.js +103 -0
- package/dist/animation/spring/spring_chain.js.map +1 -0
- package/dist/animation/spring/spring_collider.js +247 -0
- package/dist/animation/spring/spring_collider.js.map +1 -0
- package/dist/animation/spring/spring_constraint.js +21 -0
- package/dist/animation/spring/spring_constraint.js.map +1 -0
- package/dist/animation/spring/spring_particle.js +20 -0
- package/dist/animation/spring/spring_particle.js.map +1 -0
- package/dist/animation/spring/spring_system.js +526 -0
- package/dist/animation/spring/spring_system.js.map +1 -0
- package/dist/animation/spring_modifier.js +45 -0
- package/dist/animation/spring_modifier.js.map +1 -0
- package/dist/animation/spring_postprocessor.js +54 -0
- package/dist/animation/spring_postprocessor.js.map +1 -0
- package/dist/animation/translationtrack.js +0 -1
- package/dist/animation/translationtrack.js.map +1 -1
- package/dist/app/api.js +13 -4
- package/dist/app/api.js.map +1 -1
- package/dist/app/app.js +13 -1
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +33 -45
- package/dist/app/engine.js.map +1 -1
- package/dist/app/inputmgr.js.map +1 -1
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/screen.js +318 -0
- package/dist/app/screen.js.map +1 -0
- package/dist/app/scriptingsystem.js +10 -6
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +11 -22
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +79 -58
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/builtin.js +5 -5
- package/dist/asset/builtin.js.map +1 -1
- package/dist/asset/loaders/dds/dds.js +6 -2
- package/dist/asset/loaders/dds/dds.js.map +1 -1
- package/dist/asset/loaders/dds/dds_loader.js +1 -1
- package/dist/asset/loaders/dds/dds_loader.js.map +1 -1
- package/dist/asset/loaders/gltf/gltf_loader.js +14 -6
- package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
- package/dist/asset/loaders/gltf/helpers.js +6 -2
- package/dist/asset/loaders/gltf/helpers.js.map +1 -1
- package/dist/asset/loaders/hdr/hdr.js +22 -15
- package/dist/asset/loaders/hdr/hdr.js.map +1 -1
- package/dist/asset/loaders/image/tga_Loader.js +2 -1
- package/dist/asset/loaders/image/tga_Loader.js.map +1 -1
- package/dist/asset/loaders/image/webimage_loader.js.map +1 -1
- package/dist/asset/loaders/loader.js +2 -2
- package/dist/asset/loaders/loader.js.map +1 -1
- package/dist/asset/model.js +9 -5
- package/dist/asset/model.js.map +1 -1
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/blitter.js +9 -11
- package/dist/blitter/blitter.js.map +1 -1
- package/dist/blitter/box.js +0 -1
- package/dist/blitter/box.js.map +1 -1
- package/dist/blitter/copy.js.map +1 -1
- package/dist/blitter/gaussianblur.js.map +1 -1
- package/dist/camera/base.js +1 -3
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +121 -37
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/fps.js +19 -17
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +45 -43
- package/dist/camera/orbit.js.map +1 -1
- package/dist/camera/orthocamera.js +27 -21
- package/dist/camera/orthocamera.js.map +1 -1
- package/dist/camera/perspectivecamera.js +28 -19
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +15802 -15577
- package/dist/index.js +33 -11
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/grassmaterial.js.map +1 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +11 -5
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +10 -9
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/albedocolor.js.map +1 -1
- package/dist/material/mixins/foliage.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +66 -4
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +7 -0
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +3 -3
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/brdf.js.map +1 -1
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mixins/texture.js +3 -0
- package/dist/material/mixins/texture.js.map +1 -1
- package/dist/material/mixins/vertexcolor.js.map +1 -1
- package/dist/material/particle.js.map +1 -1
- package/dist/material/pbrblueprint.js +180 -22
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/shader/helper.js +41 -56
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/sprite.js +301 -0
- package/dist/material/sprite.js.map +1 -0
- package/dist/material/sprite3d.js +301 -0
- package/dist/material/sprite3d.js.map +1 -0
- package/dist/material/sprite3d_std.js +116 -0
- package/dist/material/sprite3d_std.js.map +1 -0
- package/dist/material/sprite3dblueprint.js +235 -0
- package/dist/material/sprite3dblueprint.js.map +1 -0
- package/dist/material/sprite_std.js +116 -0
- package/dist/material/sprite_std.js.map +1 -0
- package/dist/material/spriteblueprint.js +235 -0
- package/dist/material/spriteblueprint.js.map +1 -0
- package/dist/material/terrain-cm.js +0 -1
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/unlit.js.map +1 -1
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/fxaa.js.map +1 -1
- package/dist/posteffect/grayscale.js.map +1 -1
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/ssr.js +7 -5
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +8 -6
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +0 -10
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cluster_light.js +4 -4
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +15 -17
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/depthpass.js +3 -4
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable.js +15 -0
- package/dist/render/drawable.js.map +1 -0
- package/dist/render/drawable_mixin.js +8 -4
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +3 -1
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +67 -64
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/fullscreenquad.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +3 -1
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +3 -1
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/hzb.js +1 -2
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +13 -13
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/objectcolorpass.js +4 -7
- package/dist/render/objectcolorpass.js.map +1 -1
- package/dist/render/primitive.js +4 -5
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/render_queue.js +10 -5
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +16 -22
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/renderpass.js +27 -52
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/rendertarget.js +5 -0
- package/dist/render/rendertarget.js.map +1 -0
- package/dist/render/screenrendertarget.js +56 -0
- package/dist/render/screenrendertarget.js.map +1 -0
- package/dist/render/shadowmap_pass.js +4 -5
- package/dist/render/shadowmap_pass.js.map +1 -1
- package/dist/render/sky.js +16 -14
- package/dist/render/sky.js.map +1 -1
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +296 -0
- package/dist/scene/basesprite.js.map +1 -0
- package/dist/scene/batchgroup.js +4 -2
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +9 -10
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/graph_node.js.map +1 -1
- package/dist/scene/light.js +22 -4
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +96 -26
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/octree.js.map +1 -1
- package/dist/scene/particlesys.js +25 -22
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/raycast_visitor.js +0 -16
- package/dist/scene/raycast_visitor.js.map +1 -1
- package/dist/scene/scene.js +7 -4
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +20 -35
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/sprite.js +18 -0
- package/dist/scene/sprite.js.map +1 -0
- package/dist/scene/sprite3d.js +18 -0
- package/dist/scene/sprite3d.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +5 -4
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +3 -1
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +65 -48
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +35 -30
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/atmosphere.js +17 -29
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/pbr.js.map +1 -1
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js.map +1 -1
- package/dist/shadow/esm.js +1 -1
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/shader.js +3 -1
- package/dist/shadow/shader.js.map +1 -1
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadowmapper.js +6 -18
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/box.js +9 -3
- package/dist/shapes/box.js.map +1 -1
- package/dist/shapes/cylinder.js +2 -2
- package/dist/shapes/cylinder.js.map +1 -1
- package/dist/shapes/plane.js +2 -2
- package/dist/shapes/plane.js.map +1 -1
- package/dist/shapes/shape.js +2 -1
- package/dist/shapes/shape.js.map +1 -1
- package/dist/shapes/sphere.js +2 -2
- package/dist/shapes/sphere.js.map +1 -1
- package/dist/shapes/tetrahedron.js +5 -6
- package/dist/shapes/tetrahedron.js.map +1 -1
- package/dist/shapes/torus.js +2 -2
- package/dist/shapes/torus.js.map +1 -1
- package/dist/utility/aabbtree.js +1 -1
- package/dist/utility/aabbtree.js.map +1 -1
- package/dist/utility/blueprint/common/constants.js +578 -104
- package/dist/utility/blueprint/common/constants.js.map +1 -1
- package/dist/utility/blueprint/common/math.js +471 -9
- package/dist/utility/blueprint/common/math.js.map +1 -1
- package/dist/utility/blueprint/common.js +1 -1
- package/dist/utility/blueprint/common.js.map +1 -1
- package/dist/utility/blueprint/material/func.js +9 -5
- package/dist/utility/blueprint/material/func.js.map +1 -1
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +288 -80
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/pbr.js +92 -4
- package/dist/utility/blueprint/material/pbr.js.map +1 -1
- package/dist/utility/blueprint/material/texture.js +62 -45
- package/dist/utility/blueprint/material/texture.js.map +1 -1
- package/dist/utility/blueprint/node.js +28 -1
- package/dist/utility/blueprint/node.js.map +1 -1
- package/dist/utility/bounding_volume.js.map +1 -1
- package/dist/utility/debug.js.map +1 -1
- package/dist/utility/draco/decoder.js.map +1 -1
- package/dist/utility/misc.js +1 -1
- package/dist/utility/misc.js.map +1 -1
- package/dist/utility/panorama.js.map +1 -1
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/rendermipmap.js.map +1 -1
- package/dist/utility/serialization/json.js +19 -15
- package/dist/utility/serialization/json.js.map +1 -1
- package/dist/utility/serialization/manager.js +89 -22
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +44 -41
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +4 -3
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +97 -9
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/common.js +102 -28
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +14 -12
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +216 -26
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +71 -100
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/misc.js +3 -2
- package/dist/utility/serialization/scene/misc.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +42 -9
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +7 -5
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +18 -15
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +3 -2
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +164 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -0
- package/dist/utility/serialization/scene/terrain.js +8 -6
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +11 -9
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js +6 -0
- package/dist/utility/serialization/types.js.map +1 -0
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/utility/textures/ggxlut.js.map +1 -1
- package/dist/utility/textures/gradientnoise.js.map +1 -1
- package/dist/utility/textures/randomnoise.js.map +1 -1
- package/dist/values.js +14 -14
- package/dist/values.js.map +1 -1
- package/package.json +80 -80
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { Vector3, Quaternion } from '@zephyr3d/base';
|
|
2
|
+
import { SkeletonPostProcessor } from './skeleton_postprocessor.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Post-processor for manual joint transform control.
|
|
6
|
+
*
|
|
7
|
+
* Allows setting custom transforms for specific joints that blend with
|
|
8
|
+
* the base animation/bind pose layer.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const processor = new ManualTransformProcessor();
|
|
13
|
+
* processor.setJointPosition(5, new Vector3(1, 2, 3));
|
|
14
|
+
* processor.setJointRotation(5, Quaternion.fromEuler(0, Math.PI / 2, 0));
|
|
15
|
+
* skeleton.addPostProcessor(processor);
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* @public
|
|
19
|
+
*/ class ManualTransformProcessor extends SkeletonPostProcessor {
|
|
20
|
+
/** Map of joint index to transform overrides */ _overrides;
|
|
21
|
+
constructor(weight = 1.0, priority = 100){
|
|
22
|
+
super(weight, priority);
|
|
23
|
+
this._overrides = new Map();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Set position override for a joint.
|
|
27
|
+
*
|
|
28
|
+
* @param jointIndex - Index of the joint in the skeleton
|
|
29
|
+
* @param position - New local position (will be cloned)
|
|
30
|
+
*/ setJointPosition(jointIndex, position) {
|
|
31
|
+
let override = this._overrides.get(jointIndex);
|
|
32
|
+
if (!override) {
|
|
33
|
+
override = {};
|
|
34
|
+
this._overrides.set(jointIndex, override);
|
|
35
|
+
}
|
|
36
|
+
override.position = position.clone();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Set rotation override for a joint.
|
|
40
|
+
*
|
|
41
|
+
* @param jointIndex - Index of the joint in the skeleton
|
|
42
|
+
* @param rotation - New local rotation (will be cloned)
|
|
43
|
+
*/ setJointRotation(jointIndex, rotation) {
|
|
44
|
+
let override = this._overrides.get(jointIndex);
|
|
45
|
+
if (!override) {
|
|
46
|
+
override = {};
|
|
47
|
+
this._overrides.set(jointIndex, override);
|
|
48
|
+
}
|
|
49
|
+
override.rotation = rotation.clone();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Set scale override for a joint.
|
|
53
|
+
*
|
|
54
|
+
* @param jointIndex - Index of the joint in the skeleton
|
|
55
|
+
* @param scale - New local scale (will be cloned)
|
|
56
|
+
*/ setJointScale(jointIndex, scale) {
|
|
57
|
+
let override = this._overrides.get(jointIndex);
|
|
58
|
+
if (!override) {
|
|
59
|
+
override = {};
|
|
60
|
+
this._overrides.set(jointIndex, override);
|
|
61
|
+
}
|
|
62
|
+
override.scale = scale.clone();
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Set full transform override for a joint.
|
|
66
|
+
*
|
|
67
|
+
* @param jointIndex - Index of the joint in the skeleton
|
|
68
|
+
* @param position - New local position (optional)
|
|
69
|
+
* @param rotation - New local rotation (optional)
|
|
70
|
+
* @param scale - New local scale (optional)
|
|
71
|
+
*/ setJointTransform(jointIndex, position, rotation, scale) {
|
|
72
|
+
const override = {};
|
|
73
|
+
if (position) {
|
|
74
|
+
override.position = position.clone();
|
|
75
|
+
}
|
|
76
|
+
if (rotation) {
|
|
77
|
+
override.rotation = rotation.clone();
|
|
78
|
+
}
|
|
79
|
+
if (scale) {
|
|
80
|
+
override.scale = scale.clone();
|
|
81
|
+
}
|
|
82
|
+
this._overrides.set(jointIndex, override);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Clear override for a specific joint.
|
|
86
|
+
*
|
|
87
|
+
* @param jointIndex - Index of the joint to clear
|
|
88
|
+
*/ clearJoint(jointIndex) {
|
|
89
|
+
this._overrides.delete(jointIndex);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Clear all joint overrides.
|
|
93
|
+
*/ clearAll() {
|
|
94
|
+
this._overrides.clear();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Check if a joint has any overrides.
|
|
98
|
+
*
|
|
99
|
+
* @param jointIndex - Index of the joint to check
|
|
100
|
+
* @returns True if the joint has overrides
|
|
101
|
+
*/ hasOverride(jointIndex) {
|
|
102
|
+
return this._overrides.has(jointIndex);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get the number of joints with overrides.
|
|
106
|
+
*/ get overrideCount() {
|
|
107
|
+
return this._overrides.size;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Apply manual transform overrides to skeleton joints.
|
|
111
|
+
*/ apply(skeleton, _deltaTime) {
|
|
112
|
+
if (!this._enabled || this._overrides.size === 0 || this._weight <= 0) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const joints = skeleton.joints;
|
|
116
|
+
const weight = this._weight;
|
|
117
|
+
this._overrides.forEach((override, jointIndex)=>{
|
|
118
|
+
if (jointIndex < 0 || jointIndex >= joints.length) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const joint = joints[jointIndex];
|
|
122
|
+
// Blend position
|
|
123
|
+
if (override.position) {
|
|
124
|
+
if (weight >= 1) {
|
|
125
|
+
joint.position = override.position;
|
|
126
|
+
} else {
|
|
127
|
+
joint.position = Vector3.combine(joint.position, override.position, weight, 1 - weight);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Blend rotation
|
|
131
|
+
if (override.rotation) {
|
|
132
|
+
if (weight >= 1) {
|
|
133
|
+
joint.rotation = override.rotation;
|
|
134
|
+
} else {
|
|
135
|
+
joint.rotation = Quaternion.slerp(joint.rotation, override.rotation, weight);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Blend scale
|
|
139
|
+
if (override.scale) {
|
|
140
|
+
if (weight >= 1) {
|
|
141
|
+
joint.scale = override.scale;
|
|
142
|
+
} else {
|
|
143
|
+
joint.scale = Vector3.combine(joint.scale, override.scale, weight, 1 - weight);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Reset the processor (clears all overrides).
|
|
150
|
+
*/ reset() {
|
|
151
|
+
this._overrides.clear();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export { ManualTransformProcessor };
|
|
156
|
+
//# sourceMappingURL=manual_transform_processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manual_transform_processor.js","sources":["../../src/animation/manual_transform_processor.ts"],"sourcesContent":["import { Vector3, Quaternion } from '@zephyr3d/base';\r\nimport { SkeletonPostProcessor } from './skeleton_postprocessor';\r\nimport type { Skeleton } from './skeleton';\r\n\r\n/**\r\n * Manual transform override for specific joints.\r\n *\r\n * Stores position, rotation, and scale overrides for joints and blends them\r\n * with the base animation layer.\r\n */\r\ninterface JointOverride {\r\n position?: Vector3;\r\n rotation?: Quaternion;\r\n scale?: Vector3;\r\n}\r\n\r\n/**\r\n * Post-processor for manual joint transform control.\r\n *\r\n * Allows setting custom transforms for specific joints that blend with\r\n * the base animation/bind pose layer.\r\n *\r\n * @example\r\n * ```typescript\r\n * const processor = new ManualTransformProcessor();\r\n * processor.setJointPosition(5, new Vector3(1, 2, 3));\r\n * processor.setJointRotation(5, Quaternion.fromEuler(0, Math.PI / 2, 0));\r\n * skeleton.addPostProcessor(processor);\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport class ManualTransformProcessor extends SkeletonPostProcessor {\r\n /** Map of joint index to transform overrides */\r\n private _overrides: Map<number, JointOverride>;\r\n\r\n constructor(weight: number = 1.0, priority: number = 100) {\r\n super(weight, priority);\r\n this._overrides = new Map();\r\n }\r\n\r\n /**\r\n * Set position override for a joint.\r\n *\r\n * @param jointIndex - Index of the joint in the skeleton\r\n * @param position - New local position (will be cloned)\r\n */\r\n setJointPosition(jointIndex: number, position: Vector3): void {\r\n let override = this._overrides.get(jointIndex);\r\n if (!override) {\r\n override = {};\r\n this._overrides.set(jointIndex, override);\r\n }\r\n override.position = position.clone();\r\n }\r\n\r\n /**\r\n * Set rotation override for a joint.\r\n *\r\n * @param jointIndex - Index of the joint in the skeleton\r\n * @param rotation - New local rotation (will be cloned)\r\n */\r\n setJointRotation(jointIndex: number, rotation: Quaternion): void {\r\n let override = this._overrides.get(jointIndex);\r\n if (!override) {\r\n override = {};\r\n this._overrides.set(jointIndex, override);\r\n }\r\n override.rotation = rotation.clone();\r\n }\r\n\r\n /**\r\n * Set scale override for a joint.\r\n *\r\n * @param jointIndex - Index of the joint in the skeleton\r\n * @param scale - New local scale (will be cloned)\r\n */\r\n setJointScale(jointIndex: number, scale: Vector3): void {\r\n let override = this._overrides.get(jointIndex);\r\n if (!override) {\r\n override = {};\r\n this._overrides.set(jointIndex, override);\r\n }\r\n override.scale = scale.clone();\r\n }\r\n\r\n /**\r\n * Set full transform override for a joint.\r\n *\r\n * @param jointIndex - Index of the joint in the skeleton\r\n * @param position - New local position (optional)\r\n * @param rotation - New local rotation (optional)\r\n * @param scale - New local scale (optional)\r\n */\r\n setJointTransform(jointIndex: number, position?: Vector3, rotation?: Quaternion, scale?: Vector3): void {\r\n const override: JointOverride = {};\r\n if (position) {\r\n override.position = position.clone();\r\n }\r\n if (rotation) {\r\n override.rotation = rotation.clone();\r\n }\r\n if (scale) {\r\n override.scale = scale.clone();\r\n }\r\n this._overrides.set(jointIndex, override);\r\n }\r\n\r\n /**\r\n * Clear override for a specific joint.\r\n *\r\n * @param jointIndex - Index of the joint to clear\r\n */\r\n clearJoint(jointIndex: number): void {\r\n this._overrides.delete(jointIndex);\r\n }\r\n\r\n /**\r\n * Clear all joint overrides.\r\n */\r\n clearAll(): void {\r\n this._overrides.clear();\r\n }\r\n\r\n /**\r\n * Check if a joint has any overrides.\r\n *\r\n * @param jointIndex - Index of the joint to check\r\n * @returns True if the joint has overrides\r\n */\r\n hasOverride(jointIndex: number): boolean {\r\n return this._overrides.has(jointIndex);\r\n }\r\n\r\n /**\r\n * Get the number of joints with overrides.\r\n */\r\n get overrideCount(): number {\r\n return this._overrides.size;\r\n }\r\n\r\n /**\r\n * Apply manual transform overrides to skeleton joints.\r\n */\r\n apply(skeleton: Skeleton, _deltaTime: number): void {\r\n if (!this._enabled || this._overrides.size === 0 || this._weight <= 0) {\r\n return;\r\n }\r\n\r\n const joints = skeleton.joints;\r\n const weight = this._weight;\r\n\r\n this._overrides.forEach((override, jointIndex) => {\r\n if (jointIndex < 0 || jointIndex >= joints.length) {\r\n return;\r\n }\r\n\r\n const joint = joints[jointIndex];\r\n\r\n // Blend position\r\n if (override.position) {\r\n if (weight >= 1) {\r\n joint.position = override.position;\r\n } else {\r\n joint.position = Vector3.combine(joint.position, override.position, weight, 1 - weight);\r\n }\r\n }\r\n\r\n // Blend rotation\r\n if (override.rotation) {\r\n if (weight >= 1) {\r\n joint.rotation = override.rotation;\r\n } else {\r\n joint.rotation = Quaternion.slerp(joint.rotation, override.rotation, weight);\r\n }\r\n }\r\n\r\n // Blend scale\r\n if (override.scale) {\r\n if (weight >= 1) {\r\n joint.scale = override.scale;\r\n } else {\r\n joint.scale = Vector3.combine(joint.scale, override.scale, weight, 1 - weight);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Reset the processor (clears all overrides).\r\n */\r\n reset(): void {\r\n this._overrides.clear();\r\n }\r\n}\r\n"],"names":["ManualTransformProcessor","SkeletonPostProcessor","weight","priority","_overrides","Map","setJointPosition","jointIndex","position","override","get","set","clone","setJointRotation","rotation","setJointScale","scale","setJointTransform","clearJoint","delete","clearAll","clear","hasOverride","has","overrideCount","size","apply","skeleton","_deltaTime","_enabled","_weight","joints","forEach","length","joint","Vector3","combine","Quaternion","slerp","reset"],"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()
|
|
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
|
|
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
|
|
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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"}
|
|
@@ -40,19 +40,19 @@ import { Interpolator } from '@zephyr3d/base';
|
|
|
40
40
|
*/ constructor(prop, value, embedded){
|
|
41
41
|
super(embedded);
|
|
42
42
|
this._prop = prop;
|
|
43
|
-
this._state =
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
43
|
+
this._state = [
|
|
44
|
+
0,
|
|
45
|
+
0,
|
|
46
|
+
0,
|
|
47
|
+
0
|
|
48
|
+
];
|
|
49
|
+
this._stateAlpha = [
|
|
50
|
+
0
|
|
51
|
+
];
|
|
52
52
|
this._interpolator = null;
|
|
53
53
|
this._interpolatorAlpha = null;
|
|
54
54
|
if (value) {
|
|
55
|
-
this._state
|
|
55
|
+
this._state = value.slice();
|
|
56
56
|
}
|
|
57
57
|
switch(this._prop.type){
|
|
58
58
|
case 'float':
|
|
@@ -61,8 +61,8 @@ import { Interpolator } from '@zephyr3d/base';
|
|
|
61
61
|
0,
|
|
62
62
|
1
|
|
63
63
|
]), new Float32Array([
|
|
64
|
-
this._state
|
|
65
|
-
this._state
|
|
64
|
+
this._state[0],
|
|
65
|
+
this._state[0]
|
|
66
66
|
]));
|
|
67
67
|
break;
|
|
68
68
|
case 'vec2':
|
|
@@ -71,8 +71,8 @@ import { Interpolator } from '@zephyr3d/base';
|
|
|
71
71
|
0,
|
|
72
72
|
1
|
|
73
73
|
]), new Float32Array([
|
|
74
|
-
...this._state.
|
|
75
|
-
...this._state.
|
|
74
|
+
...this._state.slice(0, 2),
|
|
75
|
+
...this._state.slice(0, 2)
|
|
76
76
|
]));
|
|
77
77
|
break;
|
|
78
78
|
case 'rgb':
|
|
@@ -82,8 +82,8 @@ import { Interpolator } from '@zephyr3d/base';
|
|
|
82
82
|
0,
|
|
83
83
|
1
|
|
84
84
|
]), new Float32Array([
|
|
85
|
-
...this._state.
|
|
86
|
-
...this._state.
|
|
85
|
+
...this._state.slice(0, 3),
|
|
86
|
+
...this._state.slice(0, 3)
|
|
87
87
|
]));
|
|
88
88
|
break;
|
|
89
89
|
case 'vec4':
|
|
@@ -92,8 +92,8 @@ import { Interpolator } from '@zephyr3d/base';
|
|
|
92
92
|
0,
|
|
93
93
|
1
|
|
94
94
|
]), new Float32Array([
|
|
95
|
-
...this._state.
|
|
96
|
-
...this._state.
|
|
95
|
+
...this._state.slice(0, 4),
|
|
96
|
+
...this._state.slice(0, 4)
|
|
97
97
|
]));
|
|
98
98
|
break;
|
|
99
99
|
case 'rgba':
|
|
@@ -102,21 +102,19 @@ import { Interpolator } from '@zephyr3d/base';
|
|
|
102
102
|
0,
|
|
103
103
|
1
|
|
104
104
|
]), new Float32Array([
|
|
105
|
-
...this._state.
|
|
106
|
-
...this._state.
|
|
105
|
+
...this._state.slice(0, 3),
|
|
106
|
+
...this._state.slice(0, 3)
|
|
107
107
|
]));
|
|
108
108
|
this._interpolatorAlpha = new Interpolator('linear', 'number', new Float32Array([
|
|
109
109
|
0,
|
|
110
110
|
1
|
|
111
111
|
]), new Float32Array([
|
|
112
|
-
this._state
|
|
113
|
-
this._state
|
|
112
|
+
this._state[3],
|
|
113
|
+
this._state[3]
|
|
114
114
|
]));
|
|
115
|
-
this._stateAlpha =
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
]
|
|
119
|
-
};
|
|
115
|
+
this._stateAlpha = [
|
|
116
|
+
this._state[3]
|
|
117
|
+
];
|
|
120
118
|
break;
|
|
121
119
|
default:
|
|
122
120
|
throw new Error(`Property '${this._prop.name}' cannot be animated`);
|
|
@@ -144,38 +142,36 @@ import { Interpolator } from '@zephyr3d/base';
|
|
|
144
142
|
set interpolatorAlpha(interpolator) {
|
|
145
143
|
this._interpolatorAlpha = interpolator ?? null;
|
|
146
144
|
if (!this._stateAlpha && this._interpolatorAlpha) {
|
|
147
|
-
this._stateAlpha =
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
]
|
|
151
|
-
};
|
|
145
|
+
this._stateAlpha = [
|
|
146
|
+
0
|
|
147
|
+
];
|
|
152
148
|
}
|
|
153
149
|
}
|
|
154
150
|
/** {@inheritDoc AnimationTrack.calculateState} */ calculateState(target, currentTime) {
|
|
155
|
-
this._interpolator.interpolate(currentTime, this._state
|
|
151
|
+
this._interpolator.interpolate(currentTime, this._state);
|
|
156
152
|
if (this._interpolatorAlpha) {
|
|
157
|
-
this._interpolatorAlpha.interpolate(currentTime, this._stateAlpha
|
|
158
|
-
this._state
|
|
153
|
+
this._interpolatorAlpha.interpolate(currentTime, this._stateAlpha);
|
|
154
|
+
this._state[3] = this._stateAlpha[0];
|
|
159
155
|
}
|
|
160
156
|
return this._state;
|
|
161
157
|
}
|
|
162
158
|
/** {@inheritDoc AnimationTrack.applyState} */ applyState(target, state) {
|
|
163
|
-
this._prop.set.call(target,
|
|
159
|
+
this._prop.set.call(target, {
|
|
160
|
+
num: state
|
|
161
|
+
});
|
|
164
162
|
}
|
|
165
163
|
/** {@inheritDoc AnimationTrack.mixState} */ mixState(a, b, t) {
|
|
166
164
|
const v = [];
|
|
167
165
|
for(let i = 0; i < this._count; i++){
|
|
168
|
-
v[i] = a
|
|
166
|
+
v[i] = a[i] + t * (b[i] - a[i]);
|
|
169
167
|
}
|
|
170
|
-
return
|
|
171
|
-
num: v
|
|
172
|
-
};
|
|
168
|
+
return v;
|
|
173
169
|
}
|
|
174
170
|
/** {@inheritDoc AnimationTrack.getBlendId} */ getBlendId() {
|
|
175
171
|
return this._prop;
|
|
176
172
|
}
|
|
177
173
|
/** {@inheritDoc AnimationTrack.getDuration} */ getDuration() {
|
|
178
|
-
return this._interpolator
|
|
174
|
+
return this._interpolator?.maxTime ?? 0;
|
|
179
175
|
}
|
|
180
176
|
/**
|
|
181
177
|
* Access the underlying property accessor.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proptrack.js","sources":["../../src/animation/proptrack.ts"],"sourcesContent":["import { AnimationTrack } from './animationtrack';\r\nimport type { PropertyAccessor, PropertyValue } from '../utility';\r\nimport { Interpolator } from '@zephyr3d/base';\r\n\r\n/**\r\n * Property animation track\r\n *\r\n * Animates a single property (scalar, vector, or color) on a target object using\r\n * time-based interpolation. Supports:\r\n * - float, vec2, vec3/rgb, vec4, rgba property types\r\n * - Separate interpolation for RGB and Alpha in RGBA mode\r\n * - Linear and cubic spline (natural) interpolation presets\r\n *\r\n * The track reads a `PropertyAccessor` which encapsulates how to get/set the property\r\n * on the target object. Internally, the current state is represented as a numeric array.\r\n *\r\n * Notes:\r\n * - `calculateState` samples interpolators into an internal reusable state instance\r\n * for performance; consumers should treat returned states as ephemeral.\r\n * - `mixState` performs component-wise linear interpolation for blending.\r\n *\r\n * @public\r\n */\r\nexport class PropertyTrack extends AnimationTrack<PropertyValue> {\r\n private readonly _state: PropertyValue;\r\n private _stateAlpha: PropertyValue;\r\n private readonly _prop: PropertyAccessor;\r\n private readonly _count: number;\r\n private _interpolator: Interpolator;\r\n private _interpolatorAlpha: Interpolator;\r\n /**\r\n * Construct a PropertyTrack for a specific property.\r\n *\r\n * Initializes interpolators and internal state based on the property type.\r\n * If an initial `value` is provided, it seeds the starting state and default key values.\r\n *\r\n * @param prop - The property accessor describing what and how to animate.\r\n * @param value - Optional initial numeric values (length must match the property type).\r\n * @param embedded - Whether this track is embedded/owned inline. Default false.\r\n *\r\n * @throws Error if the property type is unsupported for animation.\r\n */\r\n constructor(prop: PropertyAccessor, value?: number[], embedded?: boolean) {\r\n super(embedded);\r\n this._prop = prop;\r\n this._state = { num: [0, 0, 0, 0] };\r\n this._stateAlpha = null;\r\n this._interpolator = null;\r\n this._interpolatorAlpha = null;\r\n if (value) {\r\n this._state.num = value.slice();\r\n }\r\n switch (this._prop.type) {\r\n case 'float':\r\n this._count = 1;\r\n this._interpolator = new Interpolator(\r\n 'cubicspline-natural',\r\n 'number',\r\n new Float32Array([0, 1]),\r\n new Float32Array([this._state.num[0], this._state.num[0]])\r\n );\r\n break;\r\n case 'vec2':\r\n this._count = 2;\r\n this._interpolator = new Interpolator(\r\n 'cubicspline-natural',\r\n 'vec2',\r\n new Float32Array([0, 1]),\r\n new Float32Array([...this._state.num.slice(0, 2), ...this._state.num.slice(0, 2)])\r\n );\r\n break;\r\n case 'rgb':\r\n case 'vec3':\r\n this._count = 3;\r\n this._interpolator = new Interpolator(\r\n 'cubicspline-natural',\r\n 'vec3',\r\n new Float32Array([0, 1]),\r\n new Float32Array([...this._state.num.slice(0, 3), ...this._state.num.slice(0, 3)])\r\n );\r\n break;\r\n case 'vec4':\r\n this._count = 4;\r\n this._interpolator = new Interpolator(\r\n 'cubicspline-natural',\r\n 'vec4',\r\n new Float32Array([0, 1]),\r\n new Float32Array([...this._state.num.slice(0, 4), ...this._state.num.slice(0, 4)])\r\n );\r\n break;\r\n case 'rgba':\r\n this._count = 4;\r\n this._interpolator = new Interpolator(\r\n 'linear',\r\n 'vec3',\r\n new Float32Array([0, 1]),\r\n new Float32Array([...this._state.num.slice(0, 3), ...this._state.num.slice(0, 3)])\r\n );\r\n this._interpolatorAlpha = new Interpolator(\r\n 'linear',\r\n 'number',\r\n new Float32Array([0, 1]),\r\n new Float32Array([this._state.num[3], this._state.num[3]])\r\n );\r\n this._stateAlpha = { num: [this._state.num[3]] };\r\n break;\r\n default:\r\n throw new Error(`Property '${this._prop.name}' cannot be animated`);\r\n }\r\n }\r\n /**\r\n * The primary interpolator for the property components.\r\n *\r\n * - For float/vec2/vec3/vec4/rgb: handles all channels.\r\n * - For rgba: handles RGB channels only; alpha is handled by `interpolatorAlpha`.\r\n */\r\n get interpolator() {\r\n return this._interpolator;\r\n }\r\n set interpolator(interpolator: Interpolator) {\r\n this._interpolator = interpolator;\r\n }\r\n /**\r\n * The alpha-channel interpolator for RGBA properties.\r\n *\r\n * - Only used when the property type is `rgba`.\r\n * - Setting a non-null interpolator ensures alpha state storage is allocated.\r\n */\r\n get interpolatorAlpha() {\r\n return this._interpolatorAlpha;\r\n }\r\n set interpolatorAlpha(interpolator: Interpolator) {\r\n this._interpolatorAlpha = interpolator ?? null;\r\n if (!this._stateAlpha && this._interpolatorAlpha) {\r\n this._stateAlpha = { num: [0] };\r\n }\r\n }\r\n /** {@inheritDoc AnimationTrack.calculateState} */\r\n calculateState(target: unknown, currentTime: number): PropertyValue {\r\n this._interpolator.interpolate(currentTime, this._state.num);\r\n if (this._interpolatorAlpha) {\r\n this._interpolatorAlpha.interpolate(currentTime, this._stateAlpha.num);\r\n this._state.num[3] = this._stateAlpha.num[0];\r\n }\r\n return this._state;\r\n }\r\n /** {@inheritDoc AnimationTrack.applyState} */\r\n applyState(target: object, state: PropertyValue) {\r\n this._prop.set.call(target, state);\r\n }\r\n /** {@inheritDoc AnimationTrack.mixState} */\r\n mixState(a: PropertyValue, b: PropertyValue, t: number): PropertyValue {\r\n const v: number[] = [];\r\n for (let i = 0; i < this._count; i++) {\r\n v[i] = a.num[i] + t * (b.num[i] - a.num[i]);\r\n }\r\n return { num: v };\r\n }\r\n /** {@inheritDoc AnimationTrack.getBlendId} */\r\n getBlendId(): unknown {\r\n return this._prop;\r\n }\r\n /** {@inheritDoc AnimationTrack.getDuration} */\r\n getDuration(): number {\r\n return this._interpolator.maxTime;\r\n }\r\n /**\r\n * Access the underlying property accessor.\r\n *\r\n * @returns The `PropertyAccessor` used by this track.\r\n */\r\n getProp(): PropertyAccessor {\r\n return this._prop;\r\n }\r\n}\r\n"],"names":["PropertyTrack","AnimationTrack","_state","_stateAlpha","_prop","_count","_interpolator","_interpolatorAlpha","prop","value","embedded","num","slice","type","Interpolator","Float32Array","Error","name","interpolator","interpolatorAlpha","calculateState","target","currentTime","interpolate","applyState","state","set","call","mixState","a","b","t","v","i","getBlendId","getDuration","maxTime","getProp"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"proptrack.js","sources":["../../src/animation/proptrack.ts"],"sourcesContent":["import { AnimationTrack } from './animationtrack';\r\nimport type { PropertyAccessor } from '../utility';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Interpolator } from '@zephyr3d/base';\r\n\r\n/**\r\n * Property animation track\r\n *\r\n * Animates a single property (scalar, vector, or color) on a target object using\r\n * time-based interpolation. Supports:\r\n * - float, vec2, vec3/rgb, vec4, rgba property types\r\n * - Separate interpolation for RGB and Alpha in RGBA mode\r\n * - Linear and cubic spline (natural) interpolation presets\r\n *\r\n * The track reads a `PropertyAccessor` which encapsulates how to get/set the property\r\n * on the target object. Internally, the current state is represented as a numeric array.\r\n *\r\n * Notes:\r\n * - `calculateState` samples interpolators into an internal reusable state instance\r\n * for performance; consumers should treat returned states as ephemeral.\r\n * - `mixState` performs component-wise linear interpolation for blending.\r\n *\r\n * @public\r\n */\r\nexport class PropertyTrack extends AnimationTrack<number[]> {\r\n private readonly _state: number[];\r\n private _stateAlpha: number[];\r\n private readonly _prop: PropertyAccessor;\r\n private readonly _count: number;\r\n private _interpolator: Nullable<Interpolator>;\r\n private _interpolatorAlpha: Nullable<Interpolator>;\r\n /**\r\n * Construct a PropertyTrack for a specific property.\r\n *\r\n * Initializes interpolators and internal state based on the property type.\r\n * If an initial `value` is provided, it seeds the starting state and default key values.\r\n *\r\n * @param prop - The property accessor describing what and how to animate.\r\n * @param value - Optional initial numeric values (length must match the property type).\r\n * @param embedded - Whether this track is embedded/owned inline. Default false.\r\n *\r\n * @throws Error if the property type is unsupported for animation.\r\n */\r\n constructor(prop: PropertyAccessor, value?: number[], embedded?: boolean) {\r\n super(embedded);\r\n this._prop = prop;\r\n this._state = [0, 0, 0, 0];\r\n this._stateAlpha = [0];\r\n this._interpolator = null;\r\n this._interpolatorAlpha = null;\r\n if (value) {\r\n this._state = value.slice();\r\n }\r\n switch (this._prop.type) {\r\n case 'float':\r\n this._count = 1;\r\n this._interpolator = new Interpolator(\r\n 'cubicspline-natural',\r\n 'number',\r\n new Float32Array([0, 1]),\r\n new Float32Array([this._state[0], this._state[0]])\r\n );\r\n break;\r\n case 'vec2':\r\n this._count = 2;\r\n this._interpolator = new Interpolator(\r\n 'cubicspline-natural',\r\n 'vec2',\r\n new Float32Array([0, 1]),\r\n new Float32Array([...this._state.slice(0, 2), ...this._state.slice(0, 2)])\r\n );\r\n break;\r\n case 'rgb':\r\n case 'vec3':\r\n this._count = 3;\r\n this._interpolator = new Interpolator(\r\n 'cubicspline-natural',\r\n 'vec3',\r\n new Float32Array([0, 1]),\r\n new Float32Array([...this._state.slice(0, 3), ...this._state.slice(0, 3)])\r\n );\r\n break;\r\n case 'vec4':\r\n this._count = 4;\r\n this._interpolator = new Interpolator(\r\n 'cubicspline-natural',\r\n 'vec4',\r\n new Float32Array([0, 1]),\r\n new Float32Array([...this._state.slice(0, 4), ...this._state.slice(0, 4)])\r\n );\r\n break;\r\n case 'rgba':\r\n this._count = 4;\r\n this._interpolator = new Interpolator(\r\n 'linear',\r\n 'vec3',\r\n new Float32Array([0, 1]),\r\n new Float32Array([...this._state.slice(0, 3), ...this._state.slice(0, 3)])\r\n );\r\n this._interpolatorAlpha = new Interpolator(\r\n 'linear',\r\n 'number',\r\n new Float32Array([0, 1]),\r\n new Float32Array([this._state[3], this._state[3]])\r\n );\r\n this._stateAlpha = [this._state[3]];\r\n break;\r\n default:\r\n throw new Error(`Property '${this._prop.name}' cannot be animated`);\r\n }\r\n }\r\n /**\r\n * The primary interpolator for the property components.\r\n *\r\n * - For float/vec2/vec3/vec4/rgb: handles all channels.\r\n * - For rgba: handles RGB channels only; alpha is handled by `interpolatorAlpha`.\r\n */\r\n get interpolator() {\r\n return this._interpolator;\r\n }\r\n set interpolator(interpolator: Nullable<Interpolator>) {\r\n this._interpolator = interpolator;\r\n }\r\n /**\r\n * The alpha-channel interpolator for RGBA properties.\r\n *\r\n * - Only used when the property type is `rgba`.\r\n * - Setting a non-null interpolator ensures alpha state storage is allocated.\r\n */\r\n get interpolatorAlpha() {\r\n return this._interpolatorAlpha;\r\n }\r\n set interpolatorAlpha(interpolator: Nullable<Interpolator>) {\r\n this._interpolatorAlpha = interpolator ?? null;\r\n if (!this._stateAlpha && this._interpolatorAlpha) {\r\n this._stateAlpha = [0];\r\n }\r\n }\r\n /** {@inheritDoc AnimationTrack.calculateState} */\r\n calculateState(target: unknown, currentTime: number) {\r\n this._interpolator!.interpolate(currentTime, this._state);\r\n if (this._interpolatorAlpha) {\r\n this._interpolatorAlpha.interpolate(currentTime, this._stateAlpha);\r\n this._state[3] = this._stateAlpha[0];\r\n }\r\n return this._state;\r\n }\r\n /** {@inheritDoc AnimationTrack.applyState} */\r\n applyState(target: object, state: number[]) {\r\n this._prop.set!.call(target, { num: state } as any);\r\n }\r\n /** {@inheritDoc AnimationTrack.mixState} */\r\n mixState(a: number[], b: number[], t: number) {\r\n const v: number[] = [];\r\n for (let i = 0; i < this._count; i++) {\r\n v[i] = a[i] + t * (b[i] - a[i]);\r\n }\r\n return v;\r\n }\r\n /** {@inheritDoc AnimationTrack.getBlendId} */\r\n getBlendId() {\r\n return this._prop;\r\n }\r\n /** {@inheritDoc AnimationTrack.getDuration} */\r\n getDuration() {\r\n return this._interpolator?.maxTime ?? 0;\r\n }\r\n /**\r\n * Access the underlying property accessor.\r\n *\r\n * @returns The `PropertyAccessor` used by this track.\r\n */\r\n getProp() {\r\n return this._prop;\r\n }\r\n}\r\n"],"names":["PropertyTrack","AnimationTrack","_state","_stateAlpha","_prop","_count","_interpolator","_interpolatorAlpha","prop","value","embedded","slice","type","Interpolator","Float32Array","Error","name","interpolator","interpolatorAlpha","calculateState","target","currentTime","interpolate","applyState","state","set","call","num","mixState","a","b","t","v","i","getBlendId","getDuration","maxTime","getProp"],"mappings":"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"}
|
|
@@ -10,7 +10,6 @@ import { AnimationTrack } from './animationtrack.js';
|
|
|
10
10
|
constructor(modeOrInterpolator, keyFramesOrEmbedded, embedded){
|
|
11
11
|
if (modeOrInterpolator === undefined) {
|
|
12
12
|
super(false);
|
|
13
|
-
this._interpolator = null;
|
|
14
13
|
} else if (modeOrInterpolator instanceof Interpolator) {
|
|
15
14
|
if (modeOrInterpolator.target !== 'quat') {
|
|
16
15
|
throw new Error(`RotationTrack(): interpolator target must be 'quat'`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rotationtrack.js","sources":["../../src/animation/rotationtrack.ts"],"sourcesContent":["import type { InterpolationMode } from '@zephyr3d/base';\r\nimport { Interpolator, Quaternion } from '@zephyr3d/base';\r\nimport { AnimationTrack } from './animationtrack';\r\nimport type { SceneNode } from '../scene';\r\n\r\n/**\r\n * Rotation animation track\r\n * @public\r\n */\r\nexport class NodeRotationTrack extends AnimationTrack<Quaternion> {\r\n private readonly _state: Quaternion;\r\n private _interpolator
|
|
1
|
+
{"version":3,"file":"rotationtrack.js","sources":["../../src/animation/rotationtrack.ts"],"sourcesContent":["import type { InterpolationMode } from '@zephyr3d/base';\r\nimport { Interpolator, Quaternion } from '@zephyr3d/base';\r\nimport { AnimationTrack } from './animationtrack';\r\nimport type { SceneNode } from '../scene';\r\n\r\n/**\r\n * Rotation animation track\r\n * @public\r\n */\r\nexport class NodeRotationTrack extends AnimationTrack<Quaternion> {\r\n private readonly _state: Quaternion;\r\n private _interpolator!: Interpolator;\r\n /**\r\n * Create an instance of RotationTrack\r\n */\r\n constructor();\r\n /**\r\n * Create an instance of RotationTrack from keyframe values\r\n * @param interpolator - Interpolator object that contains 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 RotationTrack 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: Quaternion }[], embedded?: boolean);\r\n constructor(\r\n modeOrInterpolator?: Interpolator | InterpolationMode,\r\n keyFramesOrEmbedded?: { time: number; value: Quaternion }[] | 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 !== 'quat') {\r\n throw new Error(`RotationTrack(): interpolator target must be 'quat'`);\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: Quaternion }[];\r\n const inputs = new Float32Array(keyFrames.map((val) => val.time));\r\n const outputs = new Float32Array(keyFrames.length * 4);\r\n for (let i = 0; i < keyFrames.length; i++) {\r\n outputs[i * 4 + 0] = keyFrames[i].value.x;\r\n outputs[i * 4 + 1] = keyFrames[i].value.y;\r\n outputs[i * 4 + 2] = keyFrames[i].value.z;\r\n outputs[i * 4 + 3] = keyFrames[i].value.w;\r\n }\r\n super(embedded ?? false);\r\n this._interpolator = new Interpolator(modeOrInterpolator, 'quat', 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 !== 'quat') {\r\n throw new Error(`RotationTrack(): interpolator target must be 'quat'`);\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, this._state);\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":["NodeRotationTrack","AnimationTrack","_state","_interpolator","modeOrInterpolator","keyFramesOrEmbedded","embedded","undefined","Interpolator","target","Error","keyFrames","inputs","Float32Array","map","val","time","outputs","length","i","value","x","y","z","w","Quaternion","interpolator","interp","calculateState","currentTime","interpolate","applyState","node","state","rotation","set","mixState","a","b","t","slerp","getBlendId","getDuration","maxTime"],"mappings":"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"}
|
|
@@ -10,7 +10,6 @@ import { AnimationTrack } from './animationtrack.js';
|
|
|
10
10
|
constructor(modeOrInterpolator, keyFramesOrEmbedded, embedded){
|
|
11
11
|
if (modeOrInterpolator === undefined) {
|
|
12
12
|
super(false);
|
|
13
|
-
this._interpolator = null;
|
|
14
13
|
} else if (modeOrInterpolator instanceof Interpolator) {
|
|
15
14
|
if (modeOrInterpolator.target !== 'vec3') {
|
|
16
15
|
throw new Error(`ScaleTrack(): interpolator target must be 'vec3'`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaletrack.js","sources":["../../src/animation/scaletrack.ts"],"sourcesContent":["import type { InterpolationMode } from '@zephyr3d/base';\r\nimport { Interpolator, Vector3 } from '@zephyr3d/base';\r\nimport { AnimationTrack } from './animationtrack';\r\nimport type { SceneNode } from '../scene';\r\n\r\n/**\r\n * Scale animation track\r\n * @public\r\n */\r\nexport class NodeScaleTrack extends AnimationTrack<Vector3> {\r\n private readonly _state: Vector3;\r\n private _interpolator
|
|
1
|
+
{"version":3,"file":"scaletrack.js","sources":["../../src/animation/scaletrack.ts"],"sourcesContent":["import type { InterpolationMode } from '@zephyr3d/base';\r\nimport { Interpolator, Vector3 } from '@zephyr3d/base';\r\nimport { AnimationTrack } from './animationtrack';\r\nimport type { SceneNode } from '../scene';\r\n\r\n/**\r\n * Scale animation track\r\n * @public\r\n */\r\nexport class NodeScaleTrack extends AnimationTrack<Vector3> {\r\n private readonly _state: Vector3;\r\n private _interpolator!: Interpolator;\r\n /**\r\n * Create an instance of ScaleTrack\r\n */\r\n constructor();\r\n /**\r\n * Create an instance of ScaleTrack from keyframe values\r\n * @param interpolator - Interpolator object that contains 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 ScaleTrack 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(`ScaleTrack(): 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 Vector3();\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(`ScaleTrack(): 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, this._state);\r\n return this._state;\r\n }\r\n /** {@inheritDoc AnimationTrack.applyState} */\r\n applyState(node: SceneNode, state: Vector3) {\r\n node.scale.set(state);\r\n }\r\n /** {@inheritDoc AnimationTrack.mixState} */\r\n mixState(a: Vector3, b: Vector3, t: number) {\r\n return new Vector3(a.x + t * (b.x - a.x), a.y + t * (b.y - a.y), a.z + t * (b.z - a.z));\r\n }\r\n /** {@inheritDoc AnimationTrack.getBlendId} */\r\n getBlendId() {\r\n return 'node-scale';\r\n }\r\n /** {@inheritDoc AnimationTrack.getDuration} */\r\n getDuration() {\r\n return this._interpolator.maxTime;\r\n }\r\n}\r\n"],"names":["NodeScaleTrack","AnimationTrack","_state","_interpolator","modeOrInterpolator","keyFramesOrEmbedded","embedded","undefined","Interpolator","target","Error","keyFrames","inputs","Float32Array","map","val","time","outputs","length","i","value","x","y","z","Vector3","interpolator","interp","calculateState","currentTime","interpolate","applyState","node","state","scale","set","mixState","a","b","t","getBlendId","getDuration","maxTime"],"mappings":"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"}
|