summaryrefslogtreecommitdiffstats
path: root/scene/3d
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-09-03 11:43:39 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-09-03 11:43:39 +0200
commit3c58b64b07579f014fc9c723ed6a8c31a9a2b985 (patch)
tree2c8c2a80c77032b23a13af33125e9376e4e763f5 /scene/3d
parent657dc363ef962fee1bc7806eb0574c560725a0a1 (diff)
parentf2186eeac013ff10d5c277d59ea85f6c21f50b50 (diff)
downloadredot-engine-3c58b64b07579f014fc9c723ed6a8c31a9a2b985.tar.gz
Merge pull request #96270 from TokageItLab/physical-bone-update
Fix physical bone update without simulating
Diffstat (limited to 'scene/3d')
-rw-r--r--scene/3d/physical_bone_simulator_3d.cpp49
-rw-r--r--scene/3d/physical_bone_simulator_3d.h1
2 files changed, 9 insertions, 41 deletions
diff --git a/scene/3d/physical_bone_simulator_3d.cpp b/scene/3d/physical_bone_simulator_3d.cpp
index ffe79e0892..510d887c83 100644
--- a/scene/3d/physical_bone_simulator_3d.cpp
+++ b/scene/3d/physical_bone_simulator_3d.cpp
@@ -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());
@@ -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());
- }
- */
}
}
diff --git a/scene/3d/physical_bone_simulator_3d.h b/scene/3d/physical_bone_simulator_3d.h
index ee900e0e77..ddc9cd569a 100644
--- a/scene/3d/physical_bone_simulator_3d.h
+++ b/scene/3d/physical_bone_simulator_3d.h
@@ -41,7 +41,6 @@ class PhysicalBoneSimulator3D : public SkeletonModifier3D {
GDCLASS(PhysicalBoneSimulator3D, SkeletonModifier3D);
bool simulating = false;
- bool enabled = true;
struct SimulatedBone {
int parent;