@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
|
@@ -32,45 +32,32 @@ const tmpV3 = new Vector3();
|
|
|
32
32
|
/** @internal */ _id;
|
|
33
33
|
/** @internal */ _joints;
|
|
34
34
|
/** @internal */ _inverseBindMatrices;
|
|
35
|
-
/** @internal */
|
|
35
|
+
/** @internal */ _bindPose;
|
|
36
36
|
/** @internal */ _jointMatrices;
|
|
37
|
-
/** @internal */ _jointTransforms;
|
|
38
37
|
/** @internal */ _jointOffsets;
|
|
39
38
|
/** @internal */ _jointMatrixArray;
|
|
40
39
|
/** @internal */ _jointTexture;
|
|
41
40
|
/** @internal */ _playing;
|
|
41
|
+
/** @internal */ _modifiers;
|
|
42
|
+
/** @internal */ _lastUpdateTime;
|
|
42
43
|
/**
|
|
43
44
|
* Create a skeleton instance.
|
|
44
45
|
*
|
|
45
46
|
* @param joints - Joint scene nodes (one per joint), ordered to match skin data.
|
|
46
47
|
* @param inverseBindMatrices - Inverse bind matrices for each joint.
|
|
47
48
|
* @param bindPoseMatrices - Bind pose matrices for each joint (model-space).
|
|
48
|
-
*/ constructor(joints, inverseBindMatrices,
|
|
49
|
+
*/ constructor(joints, inverseBindMatrices, bindPose){
|
|
49
50
|
super();
|
|
50
51
|
this._id = randomUUID();
|
|
51
52
|
this._joints = joints;
|
|
52
53
|
this._inverseBindMatrices = inverseBindMatrices;
|
|
53
|
-
this.
|
|
54
|
-
this._jointMatrixArray = null;
|
|
55
|
-
this._jointMatrices = null;
|
|
56
|
-
this._jointOffsets = null;
|
|
54
|
+
this._bindPose = bindPose;
|
|
57
55
|
this._jointTexture = new DRef();
|
|
58
56
|
this._playing = false;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
this._joints[i].rotation = jointTransforms[i].rotation;
|
|
64
|
-
this._joints[i].position = jointTransforms[i].position;
|
|
65
|
-
}
|
|
66
|
-
} else {
|
|
67
|
-
this._jointTransforms = this._joints.map((joint)=>({
|
|
68
|
-
scale: joint.scale.clone(),
|
|
69
|
-
rotation: joint.rotation.clone(),
|
|
70
|
-
position: joint.position.clone()
|
|
71
|
-
}));
|
|
72
|
-
}
|
|
73
|
-
this.updateJointMatrices();
|
|
57
|
+
this._modifiers = [];
|
|
58
|
+
this._lastUpdateTime = 0;
|
|
59
|
+
this.computeBindPose();
|
|
60
|
+
this.updateJointMatrices(0);
|
|
74
61
|
Skeleton._registry.set(this._id, new DWeakRef(this));
|
|
75
62
|
}
|
|
76
63
|
/**
|
|
@@ -90,14 +77,11 @@ const tmpV3 = new Vector3();
|
|
|
90
77
|
/** @internal */ get joints() {
|
|
91
78
|
return this._joints;
|
|
92
79
|
}
|
|
93
|
-
/** @internal */ get jointTransforms() {
|
|
94
|
-
return this._jointTransforms;
|
|
95
|
-
}
|
|
96
80
|
/** @internal */ get inverseBindMatrices() {
|
|
97
81
|
return this._inverseBindMatrices;
|
|
98
82
|
}
|
|
99
|
-
/** @internal */ get
|
|
100
|
-
return this.
|
|
83
|
+
/** @internal */ get bindPose() {
|
|
84
|
+
return this._bindPose;
|
|
101
85
|
}
|
|
102
86
|
/** @internal */ get playing() {
|
|
103
87
|
return this._playing;
|
|
@@ -127,6 +111,20 @@ const tmpV3 = new Vector3();
|
|
|
127
111
|
return this._jointTexture.get();
|
|
128
112
|
}
|
|
129
113
|
/**
|
|
114
|
+
* Get joint index by joint node
|
|
115
|
+
* @param joint - joint node
|
|
116
|
+
* @returns The index of the joint
|
|
117
|
+
*/ getJointIndex(joint) {
|
|
118
|
+
return this._joints.indexOf(joint);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get joint index by joint name
|
|
122
|
+
* @param jointName - joint name
|
|
123
|
+
* @returns The index of the joint
|
|
124
|
+
*/ getJointIndexByName(jointName) {
|
|
125
|
+
return this._joints.findIndex((joint)=>joint.name === jointName);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
130
128
|
* Update joint matrices from either provided transforms or the joints' world matrices.
|
|
131
129
|
*
|
|
132
130
|
* - Lazily creates the joint texture and its backing arrays on first call.
|
|
@@ -141,7 +139,8 @@ const tmpV3 = new Vector3();
|
|
|
141
139
|
* @param jointTransforms - Optional per-joint transforms to use instead of node world matrices.
|
|
142
140
|
* @param worldMatrix - Optional world-to-model transform applied before inverse bind.
|
|
143
141
|
* @internal
|
|
144
|
-
*/ updateJointMatrices(
|
|
142
|
+
*/ updateJointMatrices(deltaTime) {
|
|
143
|
+
this.applyModifiers(deltaTime);
|
|
145
144
|
if (!this._jointTexture.get()) {
|
|
146
145
|
this._createJointTexture();
|
|
147
146
|
}
|
|
@@ -153,53 +152,57 @@ const tmpV3 = new Vector3();
|
|
|
153
152
|
this._jointOffsets[0] = this._joints.length - this._jointOffsets[0] + 2;
|
|
154
153
|
}
|
|
155
154
|
for(let i = 0; i < this._joints.length; i++){
|
|
156
|
-
|
|
157
|
-
const jointTransform = jointTransforms ? jointTransforms[i] : this._joints[i].worldMatrix;
|
|
158
|
-
if (worldMatrix) {
|
|
159
|
-
Matrix4x4.multiplyAffine(worldMatrix, jointTransform, jointTransform);
|
|
160
|
-
}
|
|
161
|
-
Matrix4x4.multiply(jointTransform, this._inverseBindMatrices[i], mat);
|
|
155
|
+
Matrix4x4.multiply(this._joints[i].worldMatrix, this._inverseBindMatrices[i], this._jointMatrices[i + this._jointOffsets[0] - 1]);
|
|
162
156
|
}
|
|
163
157
|
}
|
|
164
158
|
/**
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
* - Fills the "current" ring buffer slot with bind pose transforms.
|
|
168
|
-
* - Uploads the entire matrix array to the GPU texture.
|
|
159
|
+
* Reset skeleton to bind pose
|
|
169
160
|
*
|
|
170
|
-
* @param model - The model node whose world matrix provides the reference space.
|
|
171
161
|
* @internal
|
|
172
|
-
*/ computeBindPose(
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
162
|
+
*/ computeBindPose() {
|
|
163
|
+
for(let i = 0; i < this._joints.length; i++){
|
|
164
|
+
const joint = this._joints[i];
|
|
165
|
+
const bindpose = this._bindPose[i];
|
|
166
|
+
joint.position.set(bindpose.position);
|
|
167
|
+
joint.rotation.set(bindpose.rotation);
|
|
168
|
+
joint.scale.set(bindpose.scale);
|
|
169
|
+
}
|
|
177
170
|
}
|
|
178
171
|
/**
|
|
179
172
|
* Compute current joint matrices from the nodes and upload them to the joint texture.
|
|
180
173
|
*
|
|
181
174
|
* @internal
|
|
182
|
-
*/
|
|
183
|
-
this.updateJointMatrices();
|
|
184
|
-
const tex = this.
|
|
175
|
+
*/ apply(deltaTime) {
|
|
176
|
+
this.updateJointMatrices(deltaTime);
|
|
177
|
+
const tex = this.jointTexture;
|
|
185
178
|
tex.update(this._jointMatrixArray, 0, 0, tex.width, tex.height);
|
|
186
179
|
}
|
|
187
180
|
/**
|
|
188
|
-
* Apply
|
|
189
|
-
* - Updates joint matrices and uploads to the texture.
|
|
190
|
-
* - Computes animated bounding boxes per mesh in model space.
|
|
191
|
-
* - Binds the joint texture to each mesh for GPU skinning.
|
|
181
|
+
* Apply all enabled modifiers.
|
|
192
182
|
*
|
|
183
|
+
* Modifiers are applied after the base animation/bind pose layer,
|
|
184
|
+
* allowing procedural modifications like IK, spring physics, or manual overrides.
|
|
185
|
+
*
|
|
186
|
+
* @param deltaTime - Time elapsed since last frame (in seconds)
|
|
193
187
|
* @internal
|
|
194
|
-
*/
|
|
195
|
-
this.
|
|
188
|
+
*/ applyModifiers(deltaTime) {
|
|
189
|
+
for (const modifier of this._modifiers){
|
|
190
|
+
modifier.apply(this, deltaTime);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get all modifiers attached to this skeleton.
|
|
195
|
+
*
|
|
196
|
+
* @public
|
|
197
|
+
*/ get modifiers() {
|
|
198
|
+
return this._modifiers;
|
|
196
199
|
}
|
|
197
200
|
/**
|
|
198
201
|
* Reset all meshes to an unskinned state and clear animated bounds.
|
|
199
202
|
*
|
|
200
203
|
* @internal
|
|
201
204
|
*/ reset() {
|
|
202
|
-
this.updateJointMatrices(this._bindPoseMatrices);
|
|
205
|
+
//this.updateJointMatrices(this._bindPoseMatrices);
|
|
203
206
|
this._playing = false;
|
|
204
207
|
}
|
|
205
208
|
/**
|
|
@@ -233,11 +236,6 @@ const tmpV3 = new Vector3();
|
|
|
233
236
|
*/ onDispose() {
|
|
234
237
|
super.onDispose();
|
|
235
238
|
this._jointTexture.dispose();
|
|
236
|
-
this._joints = null;
|
|
237
|
-
this._inverseBindMatrices = null;
|
|
238
|
-
this._bindPoseMatrices = null;
|
|
239
|
-
this._jointMatrices = null;
|
|
240
|
-
this._jointMatrixArray = null;
|
|
241
239
|
const m = Skeleton._registry.get(this._id);
|
|
242
240
|
if (m?.get() === this) {
|
|
243
241
|
Skeleton._registry.delete(this._id);
|
|
@@ -287,7 +285,6 @@ const tmpV3 = new Vector3();
|
|
|
287
285
|
*
|
|
288
286
|
* @param meshData - Raw submesh attributes (positions, blend indices, weights).
|
|
289
287
|
* @returns Skinned bounding box info used during per-frame updates.
|
|
290
|
-
* @internal
|
|
291
288
|
*/ getBoundingInfo(data) {
|
|
292
289
|
const indices = [
|
|
293
290
|
0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skeleton.js","sources":["../../src/animation/skeleton.ts"],"sourcesContent":["import { DRef, randomUUID, DWeakRef } from '@zephyr3d/base';\r\nimport type { Quaternion, TypedArray } from '@zephyr3d/base';\r\nimport { Disposable, Matrix4x4, Vector3, nextPowerOf2 } from '@zephyr3d/base';\r\nimport type { Texture2D } from '@zephyr3d/device';\r\nimport type { SceneNode } from '../scene/scene_node';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** @internal */\r\nexport interface SkinnedBoundingBox {\r\n /**\r\n * Representative vertices used to bound a skinned mesh (extreme points along axes).\r\n */\r\n boundingVertices: Vector3[];\r\n /**\r\n * Joint indices (up to 4 per vertex) for each representative vertex, flattened.\r\n * Layout: [i0_0, i0_1, i0_2, i0_3, i1_0, ...] for 6 vertices.\r\n */\r\n boundingVertexBlendIndices: Float32Array;\r\n /**\r\n * Corresponding joint weights (up to 4 per vertex) for each representative vertex, flattened.\r\n * Layout matches `boundingVertexBlendIndices`.\r\n */\r\n boundingVertexJointWeights: Float32Array;\r\n /**\r\n * Computed axis-aligned bounding box in model space for the current pose.\r\n */\r\n boundingBox: BoundingBox;\r\n}\r\n\r\nconst tmpV0 = new Vector3();\r\nconst tmpV1 = new Vector3();\r\nconst tmpV2 = new Vector3();\r\nconst tmpV3 = new Vector3();\r\n\r\n/**\r\n * Skeleton for skinned animation.\r\n *\r\n * Responsibilities:\r\n * - Maintains joint transforms: inverse bind, bind pose, and current skinning matrices.\r\n * - Provides a texture containing joint matrices for GPU skinning.\r\n * - Applies skinning state to associated meshes each frame.\r\n * - Computes animated axis-aligned bounding boxes using representative skinned vertices.\r\n *\r\n * Joint matrix texture layout:\r\n * - Texture format: `rgba32f`.\r\n * - Stored as a 2-layered ring buffer: current and previous joint transforms to support\r\n * temporal addressing if needed. Offsets are tracked in `_jointOffsets[0]` (current)\r\n * and `_jointOffsets[1]` (previous).\r\n *\r\n * Usage:\r\n * - Construct with joints, bind data, meshes and submesh bounding info.\r\n * - Call `apply()` each frame to update joint texture, bind to meshes, and update bounds.\r\n * - Call `reset()` to clear skinning on meshes.\r\n *\r\n * @public\r\n */\r\nexport class Skeleton extends Disposable {\r\n /** @internal Global weak registry keyed by persistentId for serialization/lookup. */\r\n private static readonly _registry: Map<string, DWeakRef<Skeleton>> = new Map();\r\n /** @internal */\r\n protected _id: string;\r\n /** @internal */\r\n protected _joints: SceneNode[];\r\n /** @internal */\r\n protected _inverseBindMatrices: Matrix4x4[];\r\n /** @internal */\r\n protected _bindPoseMatrices: Matrix4x4[];\r\n /** @internal */\r\n protected _jointMatrices: Matrix4x4[];\r\n /** @internal */\r\n protected _jointTransforms: { scale: Vector3; rotation: Quaternion; position: Vector3 }[];\r\n /** @internal */\r\n protected _jointOffsets: Float32Array<ArrayBuffer>;\r\n /** @internal */\r\n protected _jointMatrixArray: Float32Array<ArrayBuffer>;\r\n /** @internal */\r\n protected _jointTexture: DRef<Texture2D>;\r\n /** @internal */\r\n protected _playing: boolean;\r\n /**\r\n * Create a skeleton instance.\r\n *\r\n * @param joints - Joint scene nodes (one per joint), ordered to match skin data.\r\n * @param inverseBindMatrices - Inverse bind matrices for each joint.\r\n * @param bindPoseMatrices - Bind pose matrices for each joint (model-space).\r\n */\r\n constructor(\r\n joints: SceneNode[],\r\n inverseBindMatrices: Matrix4x4[],\r\n bindPoseMatrices: Matrix4x4[],\r\n jointTransforms?: { scale: Vector3; rotation: Quaternion; position: Vector3 }[]\r\n ) {\r\n super();\r\n this._id = randomUUID();\r\n this._joints = joints;\r\n this._inverseBindMatrices = inverseBindMatrices;\r\n this._bindPoseMatrices = bindPoseMatrices;\r\n this._jointMatrixArray = null;\r\n this._jointMatrices = null;\r\n this._jointOffsets = null;\r\n this._jointTexture = new DRef();\r\n this._playing = false;\r\n if (jointTransforms) {\r\n this._jointTransforms = jointTransforms;\r\n for (let i = 0; i < jointTransforms.length; i++) {\r\n this._joints[i].scale = jointTransforms[i].scale;\r\n this._joints[i].rotation = jointTransforms[i].rotation;\r\n this._joints[i].position = jointTransforms[i].position;\r\n }\r\n } else {\r\n this._jointTransforms = this._joints.map((joint) => ({\r\n scale: joint.scale.clone(),\r\n rotation: joint.rotation.clone(),\r\n position: joint.position.clone()\r\n }));\r\n }\r\n this.updateJointMatrices();\r\n Skeleton._registry.set(this._id, new DWeakRef(this));\r\n }\r\n /**\r\n * Lookup a skeleton from the global registry by persistent id.\r\n *\r\n * @param id - The persistent UUID to search for.\r\n * @returns The skeleton if alive, otherwise `null`.\r\n * @internal\r\n */\r\n static findSkeletonById(id: string) {\r\n const m = this._registry.get(id);\r\n if (m && !m.get()) {\r\n this._registry.delete(id);\r\n return null;\r\n }\r\n return m ? m.get() : null;\r\n }\r\n /** @internal */\r\n get joints() {\r\n return this._joints;\r\n }\r\n /** @internal */\r\n get jointTransforms() {\r\n return this._jointTransforms;\r\n }\r\n /** @internal */\r\n get inverseBindMatrices() {\r\n return this._inverseBindMatrices;\r\n }\r\n /** @internal */\r\n get bindPoseMatrices() {\r\n return this._bindPoseMatrices;\r\n }\r\n /** @internal */\r\n get playing() {\r\n return this._playing;\r\n }\r\n set playing(b: boolean) {\r\n this._playing = b;\r\n }\r\n /** @internal */\r\n get persistentId() {\r\n return this._id;\r\n }\r\n set persistentId(val) {\r\n if (val !== this._id) {\r\n const m = Skeleton._registry.get(this._id);\r\n if (!m || m.get() !== this) {\r\n throw new Error('Registry skeleton mismatch');\r\n }\r\n Skeleton._registry.delete(this._id);\r\n this._id = val;\r\n Skeleton._registry.set(this._id, m);\r\n }\r\n }\r\n /**\r\n * Texture containing joint matrices for GPU skinning.\r\n *\r\n * Each matrix is stored in 4 texels (one row per texel, RGBA = 4 floats).\r\n */\r\n get jointTexture(): Texture2D {\r\n return this._jointTexture.get();\r\n }\r\n /**\r\n * Update joint matrices from either provided transforms or the joints' world matrices.\r\n *\r\n * - Lazily creates the joint texture and its backing arrays on first call.\r\n * - Advances the ring buffer offset in `_jointOffsets` to write a new \"current\" set.\r\n * - For each joint:\r\n * - Optionally premultiplies by `worldMatrix` (to transform into model space).\r\n * - Computes skinning matrix: ( M_\\{skin\\} = M_\\{joint\\} \\\\times M_\\{inverseBind\\} ).\r\n *\r\n * Note: This method only writes into the CPU-side array; callers like `computeJoints()`\r\n * update the GPU texture.\r\n *\r\n * @param jointTransforms - Optional per-joint transforms to use instead of node world matrices.\r\n * @param worldMatrix - Optional world-to-model transform applied before inverse bind.\r\n * @internal\r\n */\r\n updateJointMatrices(jointTransforms?: Matrix4x4[], worldMatrix?: Matrix4x4) {\r\n if (!this._jointTexture.get()) {\r\n this._createJointTexture();\r\n }\r\n if (this._jointOffsets[0] === 0) {\r\n this._jointOffsets[0] = 1;\r\n this._jointOffsets[1] = 1;\r\n } else {\r\n this._jointOffsets[1] = this._jointOffsets[0];\r\n this._jointOffsets[0] = this._joints.length - this._jointOffsets[0] + 2;\r\n }\r\n for (let i = 0; i < this._joints.length; i++) {\r\n const mat = this._jointMatrices[i + this._jointOffsets[0] - 1];\r\n const jointTransform = jointTransforms ? jointTransforms[i] : this._joints[i].worldMatrix;\r\n if (worldMatrix) {\r\n Matrix4x4.multiplyAffine(worldMatrix, jointTransform, jointTransform);\r\n }\r\n Matrix4x4.multiply(jointTransform, this._inverseBindMatrices[i], mat);\r\n }\r\n }\r\n /**\r\n * Compute and upload the bind pose matrices to the joint texture for a given model.\r\n *\r\n * - Fills the \"current\" ring buffer slot with bind pose transforms.\r\n * - Uploads the entire matrix array to the GPU texture.\r\n *\r\n * @param model - The model node whose world matrix provides the reference space.\r\n * @internal\r\n */\r\n computeBindPose(model: SceneNode) {\r\n this.updateJointMatrices(this._bindPoseMatrices, model.worldMatrix);\r\n this._jointOffsets[1] = this._jointOffsets[0];\r\n const tex = this._jointTexture.get();\r\n tex.update(this._jointMatrixArray, 0, 0, tex.width, tex.height);\r\n }\r\n /**\r\n * Compute current joint matrices from the nodes and upload them to the joint texture.\r\n *\r\n * @internal\r\n */\r\n computeJoints() {\r\n this.updateJointMatrices();\r\n const tex = this._jointTexture.get();\r\n tex.update(this._jointMatrixArray, 0, 0, tex.width, tex.height);\r\n }\r\n /**\r\n * Apply current skeleton state to all meshes:\r\n * - Updates joint matrices and uploads to the texture.\r\n * - Computes animated bounding boxes per mesh in model space.\r\n * - Binds the joint texture to each mesh for GPU skinning.\r\n *\r\n * @internal\r\n */\r\n apply() {\r\n this.computeJoints();\r\n }\r\n /**\r\n * Reset all meshes to an unskinned state and clear animated bounds.\r\n *\r\n * @internal\r\n */\r\n reset() {\r\n this.updateJointMatrices(this._bindPoseMatrices);\r\n this._playing = false;\r\n }\r\n /**\r\n * Compute the animated bounding box for a single mesh using its representative vertices.\r\n *\r\n * For each representative vertex:\r\n * - Blends the vertex by up to 4 joint matrices using provided weights.\r\n * - Transforms to the mesh's local space using `invWorldMatrix`.\r\n * - Expands the bounding box.\r\n *\r\n * @param info - Precomputed bounding data (representative vertices, indices, weights).\r\n * @param invWorldMatrix - Mesh inverse world matrix to convert to model/local space.\r\n * @internal\r\n */\r\n computeBoundingBox(info: SkinnedBoundingBox, invWorldMatrix: Matrix4x4) {\r\n info.boundingBox.beginExtend();\r\n for (let i = 0; i < info.boundingVertices.length; i++) {\r\n this._jointMatrices[info.boundingVertexBlendIndices[i * 4 + 0] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(info.boundingVertices[i], tmpV0)\r\n .scaleBy(info.boundingVertexJointWeights[i * 4 + 0]);\r\n this._jointMatrices[info.boundingVertexBlendIndices[i * 4 + 1] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(info.boundingVertices[i], tmpV1)\r\n .scaleBy(info.boundingVertexJointWeights[i * 4 + 1]);\r\n this._jointMatrices[info.boundingVertexBlendIndices[i * 4 + 2] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(info.boundingVertices[i], tmpV2)\r\n .scaleBy(info.boundingVertexJointWeights[i * 4 + 2]);\r\n this._jointMatrices[info.boundingVertexBlendIndices[i * 4 + 3] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(info.boundingVertices[i], tmpV3)\r\n .scaleBy(info.boundingVertexJointWeights[i * 4 + 3]);\r\n tmpV0.addBy(tmpV1).addBy(tmpV2).addBy(tmpV3);\r\n invWorldMatrix.transformPointAffine(tmpV0, tmpV0);\r\n info.boundingBox.extend(tmpV0);\r\n }\r\n }\r\n /**\r\n * Dispose GPU resources and references held by the skeleton.\r\n *\r\n * - Disposes the joint texture.\r\n * - Clears matrix arrays and joint references.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._jointTexture.dispose();\r\n this._joints = null;\r\n this._inverseBindMatrices = null;\r\n this._bindPoseMatrices = null;\r\n this._jointMatrices = null;\r\n this._jointMatrixArray = null;\r\n const m = Skeleton._registry.get(this._id);\r\n if (m?.get() === this) {\r\n Skeleton._registry.delete(this._id);\r\n m.dispose();\r\n }\r\n }\r\n /**\r\n * Initialize joint texture and CPU-side matrix storage.\r\n *\r\n * Layout details:\r\n * - Texture size is the next power-of-two able to contain all matrices plus two offset texels.\r\n * - `_jointMatrixArray` holds:\r\n * - First 2 vec4s: ring buffer offsets `[current, previous, 0, 0]`.\r\n * - Followed by 2×N matrices (current and previous), each as 16 floats.\r\n * - `_jointMatrices` is a view into `_jointMatrixArray` providing Matrix4x4 objects per slot.\r\n *\r\n * @internal\r\n */\r\n private _createJointTexture() {\r\n const textureWidth = nextPowerOf2(Math.max(4, Math.ceil(Math.sqrt((this._joints.length * 2 + 1) * 4))));\r\n const device = getDevice();\r\n this._jointTexture.set(\r\n device.createTexture2D('rgba32f', textureWidth, textureWidth, {\r\n mipmapping: false,\r\n samplerOptions: {\r\n magFilter: 'nearest',\r\n minFilter: 'nearest'\r\n }\r\n })\r\n );\r\n this._jointMatrixArray = new Float32Array(textureWidth * textureWidth * 4);\r\n const buffer = this._jointMatrixArray.buffer;\r\n this._jointOffsets = new Float32Array(buffer);\r\n this._jointOffsets[0] = 0;\r\n this._jointOffsets[1] = 0;\r\n this._jointMatrices = Array.from({ length: this._joints.length * 2 }).map(\r\n (val, index) => new Matrix4x4(buffer, (index + 1) * 16 * Float32Array.BYTES_PER_ELEMENT)\r\n );\r\n }\r\n /**\r\n * Build representative skinned bounding data for a submesh.\r\n *\r\n * Strategy:\r\n * - For all vertices, compute their skinned position (using current ring buffer slot).\r\n * - Track the indices of the min/max extents along x, y, z (6 indices total).\r\n * - Store:\r\n * - The 6 representative positions in object space.\r\n * - Their 4 joint indices and weights (flattened).\r\n * - An empty BoundingBox to be filled during animation.\r\n *\r\n * @param meshData - Raw submesh attributes (positions, blend indices, weights).\r\n * @returns Skinned bounding box info used during per-frame updates.\r\n * @internal\r\n */\r\n getBoundingInfo(data: {\r\n positions: Float32Array;\r\n blendIndices: TypedArray;\r\n weights: TypedArray;\r\n }): SkinnedBoundingBox {\r\n const indices = [0, 0, 0, 0, 0, 0];\r\n let minx = Number.MAX_VALUE;\r\n let maxx = -Number.MAX_VALUE;\r\n let miny = Number.MAX_VALUE;\r\n let maxy = -Number.MAX_VALUE;\r\n let minz = Number.MAX_VALUE;\r\n let maxz = -Number.MAX_VALUE;\r\n const v = data.positions;\r\n const vert = new Vector3();\r\n const tmpV0 = new Vector3();\r\n const tmpV1 = new Vector3();\r\n const tmpV2 = new Vector3();\r\n const tmpV3 = new Vector3();\r\n const numVertices = Math.floor(v.length / 3);\r\n for (let i = 0; i < numVertices; i++) {\r\n vert.setXYZ(v[i * 3], v[i * 3 + 1], v[i * 3 + 2]);\r\n this._jointMatrices[data.blendIndices[i * 4 + 0] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(vert, tmpV0)\r\n .scaleBy(data.weights[i * 4 + 0]);\r\n this._jointMatrices[data.blendIndices[i * 4 + 1] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(vert, tmpV1)\r\n .scaleBy(data.weights[i * 4 + 1]);\r\n this._jointMatrices[data.blendIndices[i * 4 + 2] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(vert, tmpV2)\r\n .scaleBy(data.weights[i * 4 + 2]);\r\n this._jointMatrices[data.blendIndices[i * 4 + 3] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(vert, tmpV3)\r\n .scaleBy(data.weights[i * 4 + 3]);\r\n tmpV0.addBy(tmpV1).addBy(tmpV2).addBy(tmpV3);\r\n if (tmpV0.x < minx) {\r\n minx = tmpV0.x;\r\n indices[0] = i;\r\n }\r\n if (tmpV0.x > maxx) {\r\n maxx = tmpV0.x;\r\n indices[1] = i;\r\n }\r\n if (tmpV0.y < miny) {\r\n miny = tmpV0.y;\r\n indices[2] = i;\r\n }\r\n if (tmpV0.y > maxy) {\r\n maxy = tmpV0.y;\r\n indices[3] = i;\r\n }\r\n if (tmpV0.z < minz) {\r\n minz = tmpV0.z;\r\n indices[4] = i;\r\n }\r\n if (tmpV0.z > maxz) {\r\n maxz = tmpV0.z;\r\n indices[5] = i;\r\n }\r\n }\r\n const info: SkinnedBoundingBox = {\r\n boundingVertexBlendIndices: new Float32Array(\r\n Array.from({ length: 6 * 4 }).map(\r\n (val, index) => data.blendIndices[indices[index >> 2] * 4 + (index % 4)]\r\n )\r\n ),\r\n boundingVertexJointWeights: new Float32Array(\r\n Array.from({ length: 6 * 4 }).map((val, index) => data.weights[indices[index >> 2] * 4 + (index % 4)])\r\n ),\r\n boundingVertices: Array.from({ length: 6 }).map(\r\n (val, index) =>\r\n new Vector3(\r\n data.positions[indices[index] * 3],\r\n data.positions[indices[index] * 3 + 1],\r\n data.positions[indices[index] * 3 + 2]\r\n )\r\n ),\r\n boundingBox: new BoundingBox()\r\n };\r\n return info;\r\n }\r\n}\r\n"],"names":["tmpV0","Vector3","tmpV1","tmpV2","tmpV3","Skeleton","Disposable","_registry","Map","joints","inverseBindMatrices","bindPoseMatrices","jointTransforms","_id","randomUUID","_joints","_inverseBindMatrices","_bindPoseMatrices","_jointMatrixArray","_jointMatrices","_jointOffsets","_jointTexture","DRef","_playing","_jointTransforms","i","length","scale","rotation","position","map","joint","clone","updateJointMatrices","set","DWeakRef","findSkeletonById","id","m","get","delete","playing","b","persistentId","val","Error","jointTexture","worldMatrix","_createJointTexture","mat","jointTransform","Matrix4x4","multiplyAffine","multiply","computeBindPose","model","tex","update","width","height","computeJoints","apply","reset","computeBoundingBox","info","invWorldMatrix","boundingBox","beginExtend","boundingVertices","boundingVertexBlendIndices","transformPointAffine","scaleBy","boundingVertexJointWeights","addBy","extend","onDispose","dispose","textureWidth","nextPowerOf2","Math","max","ceil","sqrt","device","getDevice","createTexture2D","mipmapping","samplerOptions","magFilter","minFilter","Float32Array","buffer","Array","from","index","BYTES_PER_ELEMENT","getBoundingInfo","data","indices","minx","Number","MAX_VALUE","maxx","miny","maxy","minz","maxz","v","positions","vert","numVertices","floor","setXYZ","blendIndices","weights","x","y","z","BoundingBox"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"skeleton.js","sources":["../../src/animation/skeleton.ts"],"sourcesContent":["import { DRef, randomUUID, DWeakRef } from '@zephyr3d/base';\r\nimport type { Quaternion, TypedArray } from '@zephyr3d/base';\r\nimport { Disposable, Matrix4x4, Vector3, nextPowerOf2 } from '@zephyr3d/base';\r\nimport type { Texture2D } from '@zephyr3d/device';\r\nimport type { SceneNode } from '../scene/scene_node';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { getDevice } from '../app/api';\r\nimport type { SkeletonModifier } from './skeleton_modifier';\r\n\r\n/**\r\n * Skinned bounding box information for a submesh.\r\n *\r\n * Used to compute animated AABB for skinned meshes.\r\n *\r\n * @public\r\n */\r\nexport interface SkinnedBoundingBox {\r\n /**\r\n * Representative vertices used to bound a skinned mesh (extreme points along axes).\r\n */\r\n boundingVertices: Vector3[];\r\n /**\r\n * Joint indices (up to 4 per vertex) for each representative vertex, flattened.\r\n * Layout: [i0_0, i0_1, i0_2, i0_3, i1_0, ...] for 6 vertices.\r\n */\r\n boundingVertexBlendIndices: Float32Array;\r\n /**\r\n * Corresponding joint weights (up to 4 per vertex) for each representative vertex, flattened.\r\n * Layout matches `boundingVertexBlendIndices`.\r\n */\r\n boundingVertexJointWeights: Float32Array;\r\n /**\r\n * Computed axis-aligned bounding box in model space for the current pose.\r\n */\r\n boundingBox: BoundingBox;\r\n}\r\n\r\nconst tmpV0 = new Vector3();\r\nconst tmpV1 = new Vector3();\r\nconst tmpV2 = new Vector3();\r\nconst tmpV3 = new Vector3();\r\n\r\n/**\r\n * Skeleton for skinned animation.\r\n *\r\n * Responsibilities:\r\n * - Maintains joint transforms: inverse bind, bind pose, and current skinning matrices.\r\n * - Provides a texture containing joint matrices for GPU skinning.\r\n * - Applies skinning state to associated meshes each frame.\r\n * - Computes animated axis-aligned bounding boxes using representative skinned vertices.\r\n *\r\n * Joint matrix texture layout:\r\n * - Texture format: `rgba32f`.\r\n * - Stored as a 2-layered ring buffer: current and previous joint transforms to support\r\n * temporal addressing if needed. Offsets are tracked in `_jointOffsets[0]` (current)\r\n * and `_jointOffsets[1]` (previous).\r\n *\r\n * Usage:\r\n * - Construct with joints, bind data, meshes and submesh bounding info.\r\n * - Call `apply()` each frame to update joint texture, bind to meshes, and update bounds.\r\n * - Call `reset()` to clear skinning on meshes.\r\n *\r\n * @public\r\n */\r\nexport class Skeleton extends Disposable {\r\n /** @internal Global weak registry keyed by persistentId for serialization/lookup. */\r\n private static readonly _registry: Map<string, DWeakRef<Skeleton>> = new Map();\r\n /** @internal */\r\n protected _id: string;\r\n /** @internal */\r\n protected _joints: SceneNode[];\r\n /** @internal */\r\n protected _inverseBindMatrices: Matrix4x4[];\r\n /** @internal */\r\n protected _bindPose: { rotation: Quaternion; scale: Vector3; position: Vector3 }[];\r\n /** @internal */\r\n protected _jointMatrices!: Matrix4x4[];\r\n /** @internal */\r\n protected _jointOffsets!: Float32Array<ArrayBuffer>;\r\n /** @internal */\r\n protected _jointMatrixArray!: Float32Array<ArrayBuffer>;\r\n /** @internal */\r\n protected _jointTexture: DRef<Texture2D>;\r\n /** @internal */\r\n protected _playing: boolean;\r\n /** @internal */\r\n protected _modifiers: SkeletonModifier[];\r\n /** @internal */\r\n protected _lastUpdateTime: number;\r\n /**\r\n * Create a skeleton instance.\r\n *\r\n * @param joints - Joint scene nodes (one per joint), ordered to match skin data.\r\n * @param inverseBindMatrices - Inverse bind matrices for each joint.\r\n * @param bindPoseMatrices - Bind pose matrices for each joint (model-space).\r\n */\r\n constructor(\r\n joints: SceneNode[],\r\n inverseBindMatrices: Matrix4x4[],\r\n bindPose: { rotation: Quaternion; scale: Vector3; position: Vector3 }[]\r\n ) {\r\n super();\r\n this._id = randomUUID();\r\n this._joints = joints;\r\n this._inverseBindMatrices = inverseBindMatrices;\r\n this._bindPose = bindPose;\r\n this._jointTexture = new DRef();\r\n this._playing = false;\r\n this._modifiers = [];\r\n this._lastUpdateTime = 0;\r\n this.computeBindPose();\r\n this.updateJointMatrices(0);\r\n Skeleton._registry.set(this._id, new DWeakRef(this));\r\n }\r\n /**\r\n * Lookup a skeleton from the global registry by persistent id.\r\n *\r\n * @param id - The persistent UUID to search for.\r\n * @returns The skeleton if alive, otherwise `null`.\r\n * @internal\r\n */\r\n static findSkeletonById(id: string) {\r\n const m = this._registry.get(id);\r\n if (m && !m.get()) {\r\n this._registry.delete(id);\r\n return null;\r\n }\r\n return m ? m.get() : null;\r\n }\r\n /** @internal */\r\n get joints() {\r\n return this._joints;\r\n }\r\n /** @internal */\r\n get inverseBindMatrices() {\r\n return this._inverseBindMatrices;\r\n }\r\n /** @internal */\r\n get bindPose() {\r\n return this._bindPose;\r\n }\r\n /** @internal */\r\n get playing() {\r\n return this._playing;\r\n }\r\n set playing(b: boolean) {\r\n this._playing = b;\r\n }\r\n /** @internal */\r\n get persistentId() {\r\n return this._id;\r\n }\r\n set persistentId(val) {\r\n if (val !== this._id) {\r\n const m = Skeleton._registry.get(this._id);\r\n if (!m || m.get() !== this) {\r\n throw new Error('Registry skeleton mismatch');\r\n }\r\n Skeleton._registry.delete(this._id);\r\n this._id = val;\r\n Skeleton._registry.set(this._id, m);\r\n }\r\n }\r\n /**\r\n * Texture containing joint matrices for GPU skinning.\r\n *\r\n * Each matrix is stored in 4 texels (one row per texel, RGBA = 4 floats).\r\n */\r\n get jointTexture() {\r\n return this._jointTexture.get()!;\r\n }\r\n /**\r\n * Get joint index by joint node\r\n * @param joint - joint node\r\n * @returns The index of the joint\r\n */\r\n getJointIndex(joint: SceneNode) {\r\n return this._joints.indexOf(joint);\r\n }\r\n /**\r\n * Get joint index by joint name\r\n * @param jointName - joint name\r\n * @returns The index of the joint\r\n */\r\n getJointIndexByName(jointName: string) {\r\n return this._joints.findIndex((joint) => joint.name === jointName);\r\n }\r\n /**\r\n * Update joint matrices from either provided transforms or the joints' world matrices.\r\n *\r\n * - Lazily creates the joint texture and its backing arrays on first call.\r\n * - Advances the ring buffer offset in `_jointOffsets` to write a new \"current\" set.\r\n * - For each joint:\r\n * - Optionally premultiplies by `worldMatrix` (to transform into model space).\r\n * - Computes skinning matrix: ( M_\\{skin\\} = M_\\{joint\\} \\\\times M_\\{inverseBind\\} ).\r\n *\r\n * Note: This method only writes into the CPU-side array; callers like `computeJoints()`\r\n * update the GPU texture.\r\n *\r\n * @param jointTransforms - Optional per-joint transforms to use instead of node world matrices.\r\n * @param worldMatrix - Optional world-to-model transform applied before inverse bind.\r\n * @internal\r\n */\r\n updateJointMatrices(deltaTime: number) {\r\n this.applyModifiers(deltaTime);\r\n if (!this._jointTexture.get()) {\r\n this._createJointTexture();\r\n }\r\n if (this._jointOffsets[0] === 0) {\r\n this._jointOffsets[0] = 1;\r\n this._jointOffsets[1] = 1;\r\n } else {\r\n this._jointOffsets[1] = this._jointOffsets[0];\r\n this._jointOffsets[0] = this._joints.length - this._jointOffsets[0] + 2;\r\n }\r\n for (let i = 0; i < this._joints.length; i++) {\r\n Matrix4x4.multiply(\r\n this._joints[i].worldMatrix,\r\n this._inverseBindMatrices[i],\r\n this._jointMatrices[i + this._jointOffsets[0] - 1]\r\n );\r\n }\r\n }\r\n /**\r\n * Reset skeleton to bind pose\r\n *\r\n * @internal\r\n */\r\n computeBindPose() {\r\n for (let i = 0; i < this._joints.length; i++) {\r\n const joint = this._joints[i];\r\n const bindpose = this._bindPose[i];\r\n joint.position.set(bindpose.position);\r\n joint.rotation.set(bindpose.rotation);\r\n joint.scale.set(bindpose.scale);\r\n }\r\n }\r\n /**\r\n * Compute current joint matrices from the nodes and upload them to the joint texture.\r\n *\r\n * @internal\r\n */\r\n apply(deltaTime: number) {\r\n this.updateJointMatrices(deltaTime);\r\n const tex = this.jointTexture;\r\n tex.update(this._jointMatrixArray, 0, 0, tex.width, tex.height);\r\n }\r\n /**\r\n * Apply all enabled modifiers.\r\n *\r\n * Modifiers are applied after the base animation/bind pose layer,\r\n * allowing procedural modifications like IK, spring physics, or manual overrides.\r\n *\r\n * @param deltaTime - Time elapsed since last frame (in seconds)\r\n * @internal\r\n */\r\n protected applyModifiers(deltaTime: number): void {\r\n for (const modifier of this._modifiers) {\r\n modifier.apply(this, deltaTime);\r\n }\r\n }\r\n /**\r\n * Get all modifiers attached to this skeleton.\r\n *\r\n * @public\r\n */\r\n get modifiers(): SkeletonModifier[] {\r\n return this._modifiers;\r\n }\r\n /**\r\n * Reset all meshes to an unskinned state and clear animated bounds.\r\n *\r\n * @internal\r\n */\r\n reset() {\r\n //this.updateJointMatrices(this._bindPoseMatrices);\r\n this._playing = false;\r\n }\r\n /**\r\n * Compute the animated bounding box for a single mesh using its representative vertices.\r\n *\r\n * For each representative vertex:\r\n * - Blends the vertex by up to 4 joint matrices using provided weights.\r\n * - Transforms to the mesh's local space using `invWorldMatrix`.\r\n * - Expands the bounding box.\r\n *\r\n * @param info - Precomputed bounding data (representative vertices, indices, weights).\r\n * @param invWorldMatrix - Mesh inverse world matrix to convert to model/local space.\r\n * @internal\r\n */\r\n computeBoundingBox(info: SkinnedBoundingBox, invWorldMatrix: Matrix4x4) {\r\n info.boundingBox.beginExtend();\r\n for (let i = 0; i < info.boundingVertices.length; i++) {\r\n this._jointMatrices[info.boundingVertexBlendIndices[i * 4 + 0] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(info.boundingVertices[i], tmpV0)\r\n .scaleBy(info.boundingVertexJointWeights[i * 4 + 0]);\r\n this._jointMatrices[info.boundingVertexBlendIndices[i * 4 + 1] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(info.boundingVertices[i], tmpV1)\r\n .scaleBy(info.boundingVertexJointWeights[i * 4 + 1]);\r\n this._jointMatrices[info.boundingVertexBlendIndices[i * 4 + 2] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(info.boundingVertices[i], tmpV2)\r\n .scaleBy(info.boundingVertexJointWeights[i * 4 + 2]);\r\n this._jointMatrices[info.boundingVertexBlendIndices[i * 4 + 3] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(info.boundingVertices[i], tmpV3)\r\n .scaleBy(info.boundingVertexJointWeights[i * 4 + 3]);\r\n tmpV0.addBy(tmpV1).addBy(tmpV2).addBy(tmpV3);\r\n invWorldMatrix.transformPointAffine(tmpV0, tmpV0);\r\n info.boundingBox.extend(tmpV0);\r\n }\r\n }\r\n /**\r\n * Dispose GPU resources and references held by the skeleton.\r\n *\r\n * - Disposes the joint texture.\r\n * - Clears matrix arrays and joint references.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._jointTexture.dispose();\r\n const m = Skeleton._registry.get(this._id);\r\n if (m?.get() === this) {\r\n Skeleton._registry.delete(this._id);\r\n m.dispose();\r\n }\r\n }\r\n /**\r\n * Initialize joint texture and CPU-side matrix storage.\r\n *\r\n * Layout details:\r\n * - Texture size is the next power-of-two able to contain all matrices plus two offset texels.\r\n * - `_jointMatrixArray` holds:\r\n * - First 2 vec4s: ring buffer offsets `[current, previous, 0, 0]`.\r\n * - Followed by 2×N matrices (current and previous), each as 16 floats.\r\n * - `_jointMatrices` is a view into `_jointMatrixArray` providing Matrix4x4 objects per slot.\r\n *\r\n * @internal\r\n */\r\n private _createJointTexture() {\r\n const textureWidth = nextPowerOf2(Math.max(4, Math.ceil(Math.sqrt((this._joints.length * 2 + 1) * 4))));\r\n const device = getDevice();\r\n this._jointTexture.set(\r\n device.createTexture2D('rgba32f', textureWidth, textureWidth, {\r\n mipmapping: false,\r\n samplerOptions: {\r\n magFilter: 'nearest',\r\n minFilter: 'nearest'\r\n }\r\n })\r\n );\r\n this._jointMatrixArray = new Float32Array(textureWidth * textureWidth * 4);\r\n const buffer = this._jointMatrixArray.buffer;\r\n this._jointOffsets = new Float32Array(buffer);\r\n this._jointOffsets[0] = 0;\r\n this._jointOffsets[1] = 0;\r\n this._jointMatrices = Array.from({ length: this._joints.length * 2 }).map(\r\n (val, index) => new Matrix4x4(buffer, (index + 1) * 16 * Float32Array.BYTES_PER_ELEMENT)\r\n );\r\n }\r\n /**\r\n * Build representative skinned bounding data for a submesh.\r\n *\r\n * Strategy:\r\n * - For all vertices, compute their skinned position (using current ring buffer slot).\r\n * - Track the indices of the min/max extents along x, y, z (6 indices total).\r\n * - Store:\r\n * - The 6 representative positions in object space.\r\n * - Their 4 joint indices and weights (flattened).\r\n * - An empty BoundingBox to be filled during animation.\r\n *\r\n * @param meshData - Raw submesh attributes (positions, blend indices, weights).\r\n * @returns Skinned bounding box info used during per-frame updates.\r\n */\r\n getBoundingInfo(data: { positions: Float32Array; blendIndices: TypedArray; weights: TypedArray }) {\r\n const indices = [0, 0, 0, 0, 0, 0];\r\n let minx = Number.MAX_VALUE;\r\n let maxx = -Number.MAX_VALUE;\r\n let miny = Number.MAX_VALUE;\r\n let maxy = -Number.MAX_VALUE;\r\n let minz = Number.MAX_VALUE;\r\n let maxz = -Number.MAX_VALUE;\r\n const v = data.positions;\r\n const vert = new Vector3();\r\n const tmpV0 = new Vector3();\r\n const tmpV1 = new Vector3();\r\n const tmpV2 = new Vector3();\r\n const tmpV3 = new Vector3();\r\n const numVertices = Math.floor(v.length / 3);\r\n for (let i = 0; i < numVertices; i++) {\r\n vert.setXYZ(v[i * 3], v[i * 3 + 1], v[i * 3 + 2]);\r\n this._jointMatrices[data.blendIndices[i * 4 + 0] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(vert, tmpV0)\r\n .scaleBy(data.weights[i * 4 + 0]);\r\n this._jointMatrices[data.blendIndices[i * 4 + 1] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(vert, tmpV1)\r\n .scaleBy(data.weights[i * 4 + 1]);\r\n this._jointMatrices[data.blendIndices[i * 4 + 2] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(vert, tmpV2)\r\n .scaleBy(data.weights[i * 4 + 2]);\r\n this._jointMatrices[data.blendIndices[i * 4 + 3] + this._jointOffsets[0] - 1]\r\n .transformPointAffine(vert, tmpV3)\r\n .scaleBy(data.weights[i * 4 + 3]);\r\n tmpV0.addBy(tmpV1).addBy(tmpV2).addBy(tmpV3);\r\n if (tmpV0.x < minx) {\r\n minx = tmpV0.x;\r\n indices[0] = i;\r\n }\r\n if (tmpV0.x > maxx) {\r\n maxx = tmpV0.x;\r\n indices[1] = i;\r\n }\r\n if (tmpV0.y < miny) {\r\n miny = tmpV0.y;\r\n indices[2] = i;\r\n }\r\n if (tmpV0.y > maxy) {\r\n maxy = tmpV0.y;\r\n indices[3] = i;\r\n }\r\n if (tmpV0.z < minz) {\r\n minz = tmpV0.z;\r\n indices[4] = i;\r\n }\r\n if (tmpV0.z > maxz) {\r\n maxz = tmpV0.z;\r\n indices[5] = i;\r\n }\r\n }\r\n const info: SkinnedBoundingBox = {\r\n boundingVertexBlendIndices: new Float32Array(\r\n Array.from({ length: 6 * 4 }).map(\r\n (val, index) => data.blendIndices[indices[index >> 2] * 4 + (index % 4)]\r\n )\r\n ),\r\n boundingVertexJointWeights: new Float32Array(\r\n Array.from({ length: 6 * 4 }).map((val, index) => data.weights[indices[index >> 2] * 4 + (index % 4)])\r\n ),\r\n boundingVertices: Array.from({ length: 6 }).map(\r\n (val, index) =>\r\n new Vector3(\r\n data.positions[indices[index] * 3],\r\n data.positions[indices[index] * 3 + 1],\r\n data.positions[indices[index] * 3 + 2]\r\n )\r\n ),\r\n boundingBox: new BoundingBox()\r\n };\r\n return info;\r\n }\r\n}\r\n"],"names":["tmpV0","Vector3","tmpV1","tmpV2","tmpV3","Skeleton","Disposable","_registry","Map","joints","inverseBindMatrices","bindPose","_id","randomUUID","_joints","_inverseBindMatrices","_bindPose","_jointTexture","DRef","_playing","_modifiers","_lastUpdateTime","computeBindPose","updateJointMatrices","set","DWeakRef","findSkeletonById","id","m","get","delete","playing","b","persistentId","val","Error","jointTexture","getJointIndex","joint","indexOf","getJointIndexByName","jointName","findIndex","name","deltaTime","applyModifiers","_createJointTexture","_jointOffsets","length","i","Matrix4x4","multiply","worldMatrix","_jointMatrices","bindpose","position","rotation","scale","apply","tex","update","_jointMatrixArray","width","height","modifier","modifiers","reset","computeBoundingBox","info","invWorldMatrix","boundingBox","beginExtend","boundingVertices","boundingVertexBlendIndices","transformPointAffine","scaleBy","boundingVertexJointWeights","addBy","extend","onDispose","dispose","textureWidth","nextPowerOf2","Math","max","ceil","sqrt","device","getDevice","createTexture2D","mipmapping","samplerOptions","magFilter","minFilter","Float32Array","buffer","Array","from","map","index","BYTES_PER_ELEMENT","getBoundingInfo","data","indices","minx","Number","MAX_VALUE","maxx","miny","maxy","minz","maxz","v","positions","vert","numVertices","floor","setXYZ","blendIndices","weights","x","y","z","BoundingBox"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base class for skeleton post-processors.
|
|
3
|
+
*
|
|
4
|
+
* Post-processors are applied after the base animation/bind pose layer,
|
|
5
|
+
* allowing procedural modifications like IK, spring physics, or manual overrides.
|
|
6
|
+
*
|
|
7
|
+
* @public
|
|
8
|
+
*/ class SkeletonModifier {
|
|
9
|
+
/** Blend weight for this processor [0-1] */ _weight;
|
|
10
|
+
/** Whether this processor is enabled */ _enabled;
|
|
11
|
+
constructor(weight = 1.0){
|
|
12
|
+
this._weight = Math.max(0, Math.min(1, weight));
|
|
13
|
+
this._enabled = true;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get the blend weight [0-1]
|
|
17
|
+
*/ get weight() {
|
|
18
|
+
return this._weight;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Set the blend weight [0-1]
|
|
22
|
+
*/ set weight(value) {
|
|
23
|
+
this._weight = Math.max(0, Math.min(1, value));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get whether this processor is enabled
|
|
27
|
+
*/ get enabled() {
|
|
28
|
+
return this._enabled;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Set whether this processor is enabled
|
|
32
|
+
*/ set enabled(value) {
|
|
33
|
+
this._enabled = value;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { SkeletonModifier };
|
|
38
|
+
//# sourceMappingURL=skeleton_modifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skeleton_modifier.js","sources":["../../src/animation/skeleton_modifier.ts"],"sourcesContent":["import type { Skeleton } from './skeleton';\r\n\r\n/**\r\n * Abstract base class for skeleton post-processors.\r\n *\r\n * Post-processors are applied after the base animation/bind pose layer,\r\n * allowing procedural modifications like IK, spring physics, or manual overrides.\r\n *\r\n * @public\r\n */\r\nexport abstract class SkeletonModifier {\r\n /** Blend weight for this processor [0-1] */\r\n protected _weight: number;\r\n /** Whether this processor is enabled */\r\n protected _enabled: boolean;\r\n\r\n constructor(weight: number = 1.0) {\r\n this._weight = Math.max(0, Math.min(1, weight));\r\n this._enabled = true;\r\n }\r\n\r\n /**\r\n * Get the blend weight [0-1]\r\n */\r\n get weight(): number {\r\n return this._weight;\r\n }\r\n\r\n /**\r\n * Set the blend weight [0-1]\r\n */\r\n set weight(value: number) {\r\n this._weight = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n /**\r\n * Get whether this processor is enabled\r\n */\r\n get enabled(): boolean {\r\n return this._enabled;\r\n }\r\n\r\n /**\r\n * Set whether this processor is enabled\r\n */\r\n set enabled(value: boolean) {\r\n this._enabled = value;\r\n }\r\n\r\n /**\r\n * Apply post-processing to skeleton joints.\r\n *\r\n * This method is called after the base animation/bind pose has been applied.\r\n * Implementations should modify joint transforms and blend with the current state\r\n * using the processor's weight.\r\n *\r\n * @param skeleton - The skeleton to process\r\n * @param deltaTime - Time elapsed since last frame (in seconds)\r\n */\r\n abstract apply(skeleton: Skeleton, deltaTime: number): void;\r\n\r\n /**\r\n * Reset the processor to its initial state.\r\n *\r\n * Called when the skeleton or animation state changes significantly.\r\n */\r\n abstract reset(): void;\r\n}\r\n"],"names":["SkeletonModifier","weight","_weight","Math","max","min","_enabled","value","enabled"],"mappings":"AAEA;;;;;;;AAOC,IACM,MAAeA,gBAAAA,CAAAA;iDAEpB,OAA0B;6CAE1B,QAA4B;IAE5B,WAAYC,CAAAA,MAAAA,GAAiB,GAAG,CAAE;QAChC,IAAI,CAACC,OAAO,GAAGC,IAAKC,CAAAA,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,GAAG,CAAC,CAAGJ,EAAAA,MAAAA,CAAAA,CAAAA;QACvC,IAAI,CAACK,QAAQ,GAAG,IAAA;AAClB;AAEA;;AAEC,MACD,IAAIL,MAAiB,GAAA;QACnB,OAAO,IAAI,CAACC,OAAO;AACrB;AAEA;;MAGA,IAAID,MAAOM,CAAAA,KAAa,EAAE;QACxB,IAAI,CAACL,OAAO,GAAGC,IAAKC,CAAAA,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,GAAG,CAAC,CAAGE,EAAAA,KAAAA,CAAAA,CAAAA;AACzC;AAEA;;AAEC,MACD,IAAIC,OAAmB,GAAA;QACrB,OAAO,IAAI,CAACF,QAAQ;AACtB;AAEA;;MAGA,IAAIE,OAAQD,CAAAA,KAAc,EAAE;QAC1B,IAAI,CAACD,QAAQ,GAAGC,KAAAA;AAClB;AAoBF;;;;"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base class for skeleton post-processors.
|
|
3
|
+
*
|
|
4
|
+
* Post-processors are applied after the base animation/bind pose layer,
|
|
5
|
+
* allowing procedural modifications like IK, spring physics, or manual overrides.
|
|
6
|
+
*
|
|
7
|
+
* @public
|
|
8
|
+
*/ class SkeletonPostProcessor {
|
|
9
|
+
/** Blend weight for this processor [0-1] */ _weight;
|
|
10
|
+
/** Whether this processor is enabled */ _enabled;
|
|
11
|
+
/** Priority for ordering (higher = applied later) */ _priority;
|
|
12
|
+
constructor(weight = 1.0, priority = 0){
|
|
13
|
+
this._weight = Math.max(0, Math.min(1, weight));
|
|
14
|
+
this._enabled = true;
|
|
15
|
+
this._priority = priority;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get the blend weight [0-1]
|
|
19
|
+
*/ get weight() {
|
|
20
|
+
return this._weight;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Set the blend weight [0-1]
|
|
24
|
+
*/ set weight(value) {
|
|
25
|
+
this._weight = Math.max(0, Math.min(1, value));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get whether this processor is enabled
|
|
29
|
+
*/ get enabled() {
|
|
30
|
+
return this._enabled;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Set whether this processor is enabled
|
|
34
|
+
*/ set enabled(value) {
|
|
35
|
+
this._enabled = value;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get the priority (higher = applied later)
|
|
39
|
+
*/ get priority() {
|
|
40
|
+
return this._priority;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Set the priority (higher = applied later)
|
|
44
|
+
*/ set priority(value) {
|
|
45
|
+
this._priority = value;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export { SkeletonPostProcessor };
|
|
50
|
+
//# sourceMappingURL=skeleton_postprocessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skeleton_postprocessor.js","sources":["../../src/animation/skeleton_postprocessor.ts"],"sourcesContent":["import type { Skeleton } from './skeleton';\r\n\r\n/**\r\n * Abstract base class for skeleton post-processors.\r\n *\r\n * Post-processors are applied after the base animation/bind pose layer,\r\n * allowing procedural modifications like IK, spring physics, or manual overrides.\r\n *\r\n * @public\r\n */\r\nexport abstract class SkeletonPostProcessor {\r\n /** Blend weight for this processor [0-1] */\r\n protected _weight: number;\r\n /** Whether this processor is enabled */\r\n protected _enabled: boolean;\r\n /** Priority for ordering (higher = applied later) */\r\n protected _priority: number;\r\n\r\n constructor(weight: number = 1.0, priority: number = 0) {\r\n this._weight = Math.max(0, Math.min(1, weight));\r\n this._enabled = true;\r\n this._priority = priority;\r\n }\r\n\r\n /**\r\n * Get the blend weight [0-1]\r\n */\r\n get weight(): number {\r\n return this._weight;\r\n }\r\n\r\n /**\r\n * Set the blend weight [0-1]\r\n */\r\n set weight(value: number) {\r\n this._weight = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n /**\r\n * Get whether this processor is enabled\r\n */\r\n get enabled(): boolean {\r\n return this._enabled;\r\n }\r\n\r\n /**\r\n * Set whether this processor is enabled\r\n */\r\n set enabled(value: boolean) {\r\n this._enabled = value;\r\n }\r\n\r\n /**\r\n * Get the priority (higher = applied later)\r\n */\r\n get priority(): number {\r\n return this._priority;\r\n }\r\n\r\n /**\r\n * Set the priority (higher = applied later)\r\n */\r\n set priority(value: number) {\r\n this._priority = value;\r\n }\r\n\r\n /**\r\n * Apply post-processing to skeleton joints.\r\n *\r\n * This method is called after the base animation/bind pose has been applied.\r\n * Implementations should modify joint transforms and blend with the current state\r\n * using the processor's weight.\r\n *\r\n * @param skeleton - The skeleton to process\r\n * @param deltaTime - Time elapsed since last frame (in seconds)\r\n */\r\n abstract apply(skeleton: Skeleton, deltaTime: number): void;\r\n\r\n /**\r\n * Reset the processor to its initial state.\r\n *\r\n * Called when the skeleton or animation state changes significantly.\r\n */\r\n abstract reset(): void;\r\n}\r\n"],"names":["SkeletonPostProcessor","weight","priority","_weight","Math","max","min","_enabled","_priority","value","enabled"],"mappings":"AAEA;;;;;;;AAOC,IACM,MAAeA,qBAAAA,CAAAA;iDAEpB,OAA0B;6CAE1B,QAA4B;0DAE5B,SAA4B;AAE5B,IAAA,WAAA,CAAYC,MAAiB,GAAA,GAAG,EAAEC,QAAAA,GAAmB,CAAC,CAAE;QACtD,IAAI,CAACC,OAAO,GAAGC,IAAKC,CAAAA,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,GAAG,CAAC,CAAGL,EAAAA,MAAAA,CAAAA,CAAAA;QACvC,IAAI,CAACM,QAAQ,GAAG,IAAA;QAChB,IAAI,CAACC,SAAS,GAAGN,QAAAA;AACnB;AAEA;;AAEC,MACD,IAAID,MAAiB,GAAA;QACnB,OAAO,IAAI,CAACE,OAAO;AACrB;AAEA;;MAGA,IAAIF,MAAOQ,CAAAA,KAAa,EAAE;QACxB,IAAI,CAACN,OAAO,GAAGC,IAAKC,CAAAA,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,GAAG,CAAC,CAAGG,EAAAA,KAAAA,CAAAA,CAAAA;AACzC;AAEA;;AAEC,MACD,IAAIC,OAAmB,GAAA;QACrB,OAAO,IAAI,CAACH,QAAQ;AACtB;AAEA;;MAGA,IAAIG,OAAQD,CAAAA,KAAc,EAAE;QAC1B,IAAI,CAACF,QAAQ,GAAGE,KAAAA;AAClB;AAEA;;AAEC,MACD,IAAIP,QAAmB,GAAA;QACrB,OAAO,IAAI,CAACM,SAAS;AACvB;AAEA;;MAGA,IAAIN,QAASO,CAAAA,KAAa,EAAE;QAC1B,IAAI,CAACD,SAAS,GAAGC,KAAAA;AACnB;AAoBF;;;;"}
|