|
@@ -1562,6 +1562,24 @@ void PhysicalBone::apply_impulse(const Vector3 &p_pos, const Vector3 &p_impulse)
|
|
PhysicsServer::get_singleton()->body_apply_impulse(get_rid(), p_pos, p_impulse);
|
|
PhysicsServer::get_singleton()->body_apply_impulse(get_rid(), p_pos, p_impulse);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void PhysicalBone::reset_physics_simulation_state() {
|
|
|
|
+ if (simulate_physics) {
|
|
|
|
+ _start_physics_simulation();
|
|
|
|
+ } else {
|
|
|
|
+ _stop_physics_simulation();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void PhysicalBone::reset_to_rest_position() {
|
|
|
|
+ if (parent_skeleton) {
|
|
|
|
+ if (-1 == bone_id) {
|
|
|
|
+ set_global_transform(parent_skeleton->get_global_transform() * body_offset);
|
|
|
|
+ } else {
|
|
|
|
+ set_global_transform(parent_skeleton->get_global_transform() * parent_skeleton->get_bone_global_pose(bone_id) * body_offset);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
bool PhysicalBone::PinJointData::_set(const StringName &p_name, const Variant &p_value, RID j) {
|
|
bool PhysicalBone::PinJointData::_set(const StringName &p_name, const Variant &p_value, RID j) {
|
|
if (JointData::_set(p_name, p_value, j)) {
|
|
if (JointData::_set(p_name, p_value, j)) {
|
|
return true;
|
|
return true;
|
|
@@ -2167,7 +2185,7 @@ void PhysicalBone::_notification(int p_what) {
|
|
parent_skeleton = find_skeleton_parent(get_parent());
|
|
parent_skeleton = find_skeleton_parent(get_parent());
|
|
update_bone_id();
|
|
update_bone_id();
|
|
reset_to_rest_position();
|
|
reset_to_rest_position();
|
|
- _reset_physics_simulation_state();
|
|
|
|
|
|
+ reset_physics_simulation_state();
|
|
if (!joint.is_valid() && joint_data) {
|
|
if (!joint.is_valid() && joint_data) {
|
|
_reload_joint();
|
|
_reload_joint();
|
|
}
|
|
}
|
|
@@ -2238,8 +2256,6 @@ void PhysicalBone::_bind_methods() {
|
|
ClassDB::bind_method(D_METHOD("set_body_offset", "offset"), &PhysicalBone::set_body_offset);
|
|
ClassDB::bind_method(D_METHOD("set_body_offset", "offset"), &PhysicalBone::set_body_offset);
|
|
ClassDB::bind_method(D_METHOD("get_body_offset"), &PhysicalBone::get_body_offset);
|
|
ClassDB::bind_method(D_METHOD("get_body_offset"), &PhysicalBone::get_body_offset);
|
|
|
|
|
|
- ClassDB::bind_method(D_METHOD("is_static_body"), &PhysicalBone::is_static_body);
|
|
|
|
-
|
|
|
|
ClassDB::bind_method(D_METHOD("get_simulate_physics"), &PhysicalBone::get_simulate_physics);
|
|
ClassDB::bind_method(D_METHOD("get_simulate_physics"), &PhysicalBone::get_simulate_physics);
|
|
|
|
|
|
ClassDB::bind_method(D_METHOD("is_simulating_physics"), &PhysicalBone::is_simulating_physics);
|
|
ClassDB::bind_method(D_METHOD("is_simulating_physics"), &PhysicalBone::is_simulating_physics);
|
|
@@ -2508,26 +2524,13 @@ const Transform &PhysicalBone::get_joint_offset() const {
|
|
return joint_offset;
|
|
return joint_offset;
|
|
}
|
|
}
|
|
|
|
|
|
-void PhysicalBone::set_static_body(bool p_static) {
|
|
|
|
-
|
|
|
|
- static_body = p_static;
|
|
|
|
-
|
|
|
|
- set_as_toplevel(!static_body);
|
|
|
|
-
|
|
|
|
- _reset_physics_simulation_state();
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-bool PhysicalBone::is_static_body() {
|
|
|
|
- return static_body;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
void PhysicalBone::set_simulate_physics(bool p_simulate) {
|
|
void PhysicalBone::set_simulate_physics(bool p_simulate) {
|
|
if (simulate_physics == p_simulate) {
|
|
if (simulate_physics == p_simulate) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
simulate_physics = p_simulate;
|
|
simulate_physics = p_simulate;
|
|
- _reset_physics_simulation_state();
|
|
|
|
|
|
+ reset_physics_simulation_state();
|
|
}
|
|
}
|
|
|
|
|
|
bool PhysicalBone::get_simulate_physics() {
|
|
bool PhysicalBone::get_simulate_physics() {
|
|
@@ -2535,7 +2538,7 @@ bool PhysicalBone::get_simulate_physics() {
|
|
}
|
|
}
|
|
|
|
|
|
bool PhysicalBone::is_simulating_physics() {
|
|
bool PhysicalBone::is_simulating_physics() {
|
|
- return _internal_simulate_physics && !_internal_static_body;
|
|
|
|
|
|
+ return _internal_simulate_physics;
|
|
}
|
|
}
|
|
|
|
|
|
void PhysicalBone::set_bone_name(const String &p_name) {
|
|
void PhysicalBone::set_bone_name(const String &p_name) {
|
|
@@ -2618,8 +2621,6 @@ PhysicalBone::PhysicalBone() :
|
|
#endif
|
|
#endif
|
|
joint_data(NULL),
|
|
joint_data(NULL),
|
|
parent_skeleton(NULL),
|
|
parent_skeleton(NULL),
|
|
- static_body(false),
|
|
|
|
- _internal_static_body(false),
|
|
|
|
simulate_physics(false),
|
|
simulate_physics(false),
|
|
_internal_simulate_physics(false),
|
|
_internal_simulate_physics(false),
|
|
bone_id(-1),
|
|
bone_id(-1),
|
|
@@ -2629,8 +2630,7 @@ PhysicalBone::PhysicalBone() :
|
|
friction(1),
|
|
friction(1),
|
|
gravity_scale(1) {
|
|
gravity_scale(1) {
|
|
|
|
|
|
- set_static_body(static_body);
|
|
|
|
- _reset_physics_simulation_state();
|
|
|
|
|
|
+ reset_physics_simulation_state();
|
|
}
|
|
}
|
|
|
|
|
|
PhysicalBone::~PhysicalBone() {
|
|
PhysicalBone::~PhysicalBone() {
|
|
@@ -2657,8 +2657,7 @@ void PhysicalBone::update_bone_id() {
|
|
parent_skeleton->bind_physical_bone_to_bone(bone_id, this);
|
|
parent_skeleton->bind_physical_bone_to_bone(bone_id, this);
|
|
|
|
|
|
_fix_joint_offset();
|
|
_fix_joint_offset();
|
|
- _internal_static_body = !static_body; // Force staticness reset
|
|
|
|
- _reset_staticness_state();
|
|
|
|
|
|
+ reset_physics_simulation_state();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2680,49 +2679,6 @@ void PhysicalBone::update_offset() {
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
-void PhysicalBone::reset_to_rest_position() {
|
|
|
|
- if (parent_skeleton) {
|
|
|
|
- if (-1 == bone_id) {
|
|
|
|
- set_global_transform(parent_skeleton->get_global_transform() * body_offset);
|
|
|
|
- } else {
|
|
|
|
- set_global_transform(parent_skeleton->get_global_transform() * parent_skeleton->get_bone_global_pose(bone_id) * body_offset);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void PhysicalBone::_reset_physics_simulation_state() {
|
|
|
|
- if (simulate_physics && !static_body) {
|
|
|
|
- _start_physics_simulation();
|
|
|
|
- } else {
|
|
|
|
- _stop_physics_simulation();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- _reset_staticness_state();
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void PhysicalBone::_reset_staticness_state() {
|
|
|
|
-
|
|
|
|
- if (parent_skeleton && -1 != bone_id) {
|
|
|
|
- if (static_body && simulate_physics) { // With this check I'm sure the position of this body is updated only when it's necessary
|
|
|
|
-
|
|
|
|
- if (_internal_static_body) {
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- parent_skeleton->bind_child_node_to_bone(bone_id, this);
|
|
|
|
- _internal_static_body = true;
|
|
|
|
- } else {
|
|
|
|
-
|
|
|
|
- if (!_internal_static_body) {
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- parent_skeleton->unbind_child_node_from_bone(bone_id, this);
|
|
|
|
- _internal_static_body = false;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
void PhysicalBone::_start_physics_simulation() {
|
|
void PhysicalBone::_start_physics_simulation() {
|
|
if (_internal_simulate_physics || !parent_skeleton) {
|
|
if (_internal_simulate_physics || !parent_skeleton) {
|
|
return;
|
|
return;
|
|
@@ -2732,17 +2688,27 @@ void PhysicalBone::_start_physics_simulation() {
|
|
PhysicsServer::get_singleton()->body_set_collision_layer(get_rid(), get_collision_layer());
|
|
PhysicsServer::get_singleton()->body_set_collision_layer(get_rid(), get_collision_layer());
|
|
PhysicsServer::get_singleton()->body_set_collision_mask(get_rid(), get_collision_mask());
|
|
PhysicsServer::get_singleton()->body_set_collision_mask(get_rid(), get_collision_mask());
|
|
PhysicsServer::get_singleton()->body_set_force_integration_callback(get_rid(), this, "_direct_state_changed");
|
|
PhysicsServer::get_singleton()->body_set_force_integration_callback(get_rid(), this, "_direct_state_changed");
|
|
|
|
+ set_as_toplevel(true);
|
|
_internal_simulate_physics = true;
|
|
_internal_simulate_physics = true;
|
|
}
|
|
}
|
|
|
|
|
|
void PhysicalBone::_stop_physics_simulation() {
|
|
void PhysicalBone::_stop_physics_simulation() {
|
|
- if (!_internal_simulate_physics || !parent_skeleton) {
|
|
|
|
|
|
+ if (!parent_skeleton) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- PhysicsServer::get_singleton()->body_set_mode(get_rid(), PhysicsServer::BODY_MODE_STATIC);
|
|
|
|
- PhysicsServer::get_singleton()->body_set_collision_layer(get_rid(), 0);
|
|
|
|
- PhysicsServer::get_singleton()->body_set_collision_mask(get_rid(), 0);
|
|
|
|
- PhysicsServer::get_singleton()->body_set_force_integration_callback(get_rid(), NULL, "");
|
|
|
|
- parent_skeleton->set_bone_global_pose_override(bone_id, Transform(), 0.0, false);
|
|
|
|
- _internal_simulate_physics = false;
|
|
|
|
|
|
+ if (parent_skeleton->get_animate_physical_bones()) {
|
|
|
|
+ PhysicsServer::get_singleton()->body_set_mode(get_rid(), PhysicsServer::BODY_MODE_KINEMATIC);
|
|
|
|
+ PhysicsServer::get_singleton()->body_set_collision_layer(get_rid(), get_collision_layer());
|
|
|
|
+ PhysicsServer::get_singleton()->body_set_collision_mask(get_rid(), get_collision_mask());
|
|
|
|
+ } else {
|
|
|
|
+ PhysicsServer::get_singleton()->body_set_mode(get_rid(), PhysicsServer::BODY_MODE_STATIC);
|
|
|
|
+ PhysicsServer::get_singleton()->body_set_collision_layer(get_rid(), 0);
|
|
|
|
+ PhysicsServer::get_singleton()->body_set_collision_mask(get_rid(), 0);
|
|
|
|
+ }
|
|
|
|
+ if (_internal_simulate_physics) {
|
|
|
|
+ PhysicsServer::get_singleton()->body_set_force_integration_callback(get_rid(), NULL, "");
|
|
|
|
+ parent_skeleton->set_bone_global_pose_override(bone_id, Transform(), 0.0, false);
|
|
|
|
+ set_as_toplevel(false);
|
|
|
|
+ _internal_simulate_physics = false;
|
|
|
|
+ }
|
|
}
|
|
}
|