Skip to content

Commit cc7e39d

Browse files
Add damped skeleton modifier
This could be used as a placeholder for blending
1 parent dc56770 commit cc7e39d

File tree

5 files changed

+92
-0
lines changed

5 files changed

+92
-0
lines changed

SConstruct

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ sources = Glob("src/*.cpp")
2828
sources += Glob("src/editor/*.cpp")
2929
sources += Glob("src/features/*.cpp")
3030
sources += Glob("src/math/*.cpp")
31+
sources += Glob("src/modifiers/*.cpp")
3132
sources += Glob("src/synchronizers/*.cpp")
3233

3334
if env["platform"] == "macos":

demo/scenes/rin.tscn

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,8 @@ bones/294/scale = Vector3(1, 1, 1)
539539
bones/296/position = Vector3(0.0011635, 0.0935117, 5.08575e-11)
540540
bones/296/rotation = Quaternion(0, 1, 6.23271e-17, 7.54979e-08)
541541

542+
[node name="DampedSkeletonModifier" type="DampedSkeletonModifier" parent="rin/Armature/Skeleton3D" index="25"]
543+
542544
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
543545
root_node = NodePath("../rin")
544546
root_motion_track = NodePath("Armature/Skeleton3D:root")
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#include "modifiers/damped_skeleton_modifier.h"
2+
3+
#include "damped_skeleton_modifier.h"
4+
#include "math/spring.hpp"
5+
6+
void DampedSkeletonModifier::_ready() {
7+
8+
Skeleton3D* skeleton = get_skeleton();
9+
10+
if (skeleton) {
11+
_skeleton_state = SkeletonState(skeleton);
12+
for (int b = 0; b < skeleton->get_bone_count(); ++b) {
13+
BoneState& bone = _skeleton_state[b];
14+
bone.pos = skeleton->get_bone_pose_position(b);
15+
bone.rot = skeleton->get_bone_pose_rotation(b);
16+
bone.scl = skeleton->get_bone_pose_scale(b);
17+
}
18+
}
19+
}
20+
21+
void DampedSkeletonModifier::_process_modification() {
22+
if (!is_active()) {
23+
return;
24+
}
25+
26+
Skeleton3D* skeleton = get_skeleton();
27+
const float delta =
28+
skeleton->get_modifier_callback_mode_process() == Skeleton3D::ModifierCallbackModeProcess::MODIFIER_CALLBACK_MODE_PROCESS_IDLE ? get_process_delta_time() : get_physics_process_delta_time();
29+
30+
for (auto bone_id = 0; bone_id < skeleton->get_bone_count(); ++bone_id) {
31+
32+
if (skeleton->get_bone_parent(bone_id) == -1) {
33+
// Skip root bone
34+
continue;
35+
}
36+
37+
const Vector3 desired_pos = skeleton->get_bone_pose_position(bone_id);
38+
const Quaternion desired_rot = skeleton->get_bone_pose_rotation(bone_id);
39+
40+
Spring::_simple_spring_damper_exact(
41+
_skeleton_state[bone_id].pos,
42+
_skeleton_state[bone_id].vel,
43+
desired_pos,
44+
halflife,
45+
delta);
46+
47+
Spring::_simple_spring_damper_exact(
48+
_skeleton_state[bone_id].rot,
49+
_skeleton_state[bone_id].ang_vel,
50+
desired_rot,
51+
halflife,
52+
delta);
53+
54+
skeleton->set_bone_pose_position(bone_id, _skeleton_state[bone_id].pos);
55+
skeleton->set_bone_pose_rotation(bone_id, _skeleton_state[bone_id].rot);
56+
}
57+
}
58+
59+
void DampedSkeletonModifier::_bind_methods() {
60+
BINDER_PROPERTY_PARAMS(DampedSkeletonModifier, Variant::FLOAT, halflife);
61+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#pragma once
2+
3+
#include "common.h"
4+
#include "mm_bone_state.h"
5+
6+
#include <godot_cpp/classes/skeleton_modifier3d.hpp>
7+
8+
using namespace godot;
9+
10+
class DampedSkeletonModifier : public SkeletonModifier3D {
11+
GDCLASS(DampedSkeletonModifier, SkeletonModifier3D)
12+
13+
public:
14+
virtual void _ready() override;
15+
virtual void _process_modification() override;
16+
17+
GETSET(float, halflife, 0.1);
18+
19+
protected:
20+
static void _bind_methods();
21+
22+
private:
23+
SkeletonState _skeleton_state;
24+
};

src/register_types.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#include "features/mm_feature.h"
1818
#include "features/mm_trajectory_feature.h"
1919

20+
#include "modifiers/damped_skeleton_modifier.h"
21+
2022
#include "synchronizers/mm_clamp_synchronizer.h"
2123
#include "synchronizers/mm_rootmotion_synchronizer.h"
2224
#include "synchronizers/mm_synchronizer.h"
@@ -44,6 +46,8 @@ void initialize_example_module(ModuleInitializationLevel p_level) {
4446

4547
ClassDB::register_class<MMCharacter>();
4648

49+
ClassDB::register_class<DampedSkeletonModifier>();
50+
4751
ClassDB::register_abstract_class<MMSynchronizer>();
4852
ClassDB::register_class<MMClampSynchronizer>();
4953
ClassDB::register_class<MMRootMotionSynchronizer>();

0 commit comments

Comments
 (0)