Skip to content

Commit

Permalink
Merge pull request #96270 from TokageItLab/physical-bone-update
Browse files Browse the repository at this point in the history
Fix physical bone update without simulating
  • Loading branch information
akien-mga committed Sep 3, 2024
2 parents 657dc36 + f2186ee commit 3c58b64
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 41 deletions.
49 changes: 9 additions & 40 deletions scene/3d/physical_bone_simulator_3d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -285,11 +285,11 @@ void _pb_start_simulation(const PhysicalBoneSimulator3D *p_simulator, Node *p_no
}

void PhysicalBoneSimulator3D::physical_bones_start_simulation_on(const TypedArray<StringName> &p_bones) {
_pose_updated();

simulating = true;
_reset_physical_bones_state();

_pose_updated();

Vector<int> sim_bones;
if (p_bones.size() > 0) {
sim_bones.resize(p_bones.size());
Expand Down Expand Up @@ -357,47 +357,16 @@ void PhysicalBoneSimulator3D::_process_modification() {
if (!skeleton) {
return;
}
if (!enabled) {
for (int i = 0; i < bones.size(); i++) {
if (bones[i].physical_bone) {
if (bones[i].physical_bone->is_simulating_physics() == false) {
bones[i].physical_bone->reset_to_rest_position();
}
}
ERR_FAIL_COND(skeleton->get_bone_count() != bones.size());
for (int i = 0; i < skeleton->get_bone_count(); i++) {
if (!bones[i].physical_bone) {
continue;
}
} else {
ERR_FAIL_COND(skeleton->get_bone_count() != bones.size());
for (int i = 0; i < skeleton->get_bone_count(); i++) {
if (!bones[i].physical_bone) {
continue;
}
if (bones[i].physical_bone->is_simulating_physics() == false) {
bones[i].physical_bone->reset_to_rest_position();
} else if (simulating) {
skeleton->set_bone_global_pose(i, bones[i].global_pose);
}

// TODO:
// The above method is performance heavy and needs to be improved.
// Ideally, the processing of set_bone_global_pose within Skeleton3D should be improved,
// but the workaround available now is to convert the global pose to a local pose on the SkeletonModifier side.
// However, the follow method needs recursive processing for deformations within PhysicalBoneSimulator3D to account for update order.
/*
ERR_FAIL_COND(skeleton->get_bone_count() != bones.size());
LocalVector<Transform3D> local_poses;
for (int i = 0; i < skeleton->get_bone_count(); i++) {
Transform3D pt;
if (skeleton->get_bone_parent(i) >= 0) {
pt = get_bone_global_pose(skeleton->get_bone_parent(i));
}
local_poses.push_back(pt.affine_inverse() * bones[i].global_pose);
}
for (int i = 0; i < skeleton->get_bone_count(); i++) {
if (!bones[i].physical_bone) {
continue;
}
skeleton->set_bone_pose_position(i, local_poses[i].origin);
skeleton->set_bone_pose_rotation(i, local_poses[i].basis.get_rotation_quaternion());
skeleton->set_bone_pose_scale(i, local_poses[i].basis.get_scale());
}
*/
}
}

Expand Down
1 change: 0 additions & 1 deletion scene/3d/physical_bone_simulator_3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ class PhysicalBoneSimulator3D : public SkeletonModifier3D {
GDCLASS(PhysicalBoneSimulator3D, SkeletonModifier3D);

bool simulating = false;
bool enabled = true;

struct SimulatedBone {
int parent;
Expand Down

0 comments on commit 3c58b64

Please sign in to comment.