Merge pull request #21433 from AndreaCatania/megafix
Multiple fixes on Physics things
This commit is contained in:
commit
98cc2ce1dd
8 changed files with 58 additions and 25 deletions
|
@ -1722,8 +1722,16 @@ void PhysicalBoneSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
|
|||
return;
|
||||
|
||||
Skeleton *sk(physical_bone->find_skeleton_parent());
|
||||
if (!sk)
|
||||
return;
|
||||
|
||||
PhysicalBone *pb(sk->get_physical_bone(physical_bone->get_bone_id()));
|
||||
if (!pb)
|
||||
return;
|
||||
|
||||
PhysicalBone *pbp(sk->get_physical_bone_parent(physical_bone->get_bone_id()));
|
||||
if (!pbp)
|
||||
return;
|
||||
|
||||
Vector<Vector3> points;
|
||||
|
||||
|
|
|
@ -82,8 +82,11 @@ void ConeTwistJointBullet::set_param(PhysicsServer::ConeTwistJointParam p_param,
|
|||
case PhysicsServer::CONE_TWIST_JOINT_RELAXATION:
|
||||
coneConstraint->setLimit(coneConstraint->getSwingSpan1(), coneConstraint->getSwingSpan2(), coneConstraint->getTwistSpan(), coneConstraint->getLimitSoftness(), coneConstraint->getBiasFactor(), p_value);
|
||||
break;
|
||||
#ifndef DISABLE_DEPRECATED
|
||||
default:
|
||||
WARN_PRINT("This parameter is not supported by Bullet engine");
|
||||
ERR_EXPLAIN("This parameter " + itos(p_param) + " is deprecated");
|
||||
WARN_DEPRECATED
|
||||
#endif // DISABLE_DEPRECATED
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -99,8 +102,11 @@ real_t ConeTwistJointBullet::get_param(PhysicsServer::ConeTwistJointParam p_para
|
|||
return coneConstraint->getLimitSoftness();
|
||||
case PhysicsServer::CONE_TWIST_JOINT_RELAXATION:
|
||||
return coneConstraint->getRelaxationFactor();
|
||||
#ifndef DISABLE_DEPRECATED
|
||||
default:
|
||||
WARN_PRINT("This parameter is not supported by Bullet engine");
|
||||
ERR_EXPLAIN("This parameter " + itos(p_param) + " is deprecated");
|
||||
WARN_DEPRECATED;
|
||||
return 0;
|
||||
#endif // DISABLE_DEPRECATED
|
||||
}
|
||||
}
|
||||
|
|
|
@ -152,8 +152,11 @@ void Generic6DOFJointBullet::set_param(Vector3::Axis p_axis, PhysicsServer::G6DO
|
|||
case PhysicsServer::G6DOF_JOINT_ANGULAR_MOTOR_FORCE_LIMIT:
|
||||
sixDOFConstraint->getRotationalLimitMotor(p_axis)->m_maxMotorForce = p_value;
|
||||
break;
|
||||
#ifndef DISABLE_DEPRECATED
|
||||
default:
|
||||
WARN_PRINT("This parameter is not supported");
|
||||
ERR_EXPLAIN("This parameter " + itos(p_param) + " is deprecated");
|
||||
WARN_DEPRECATED
|
||||
#endif // DISABLE_DEPRECATED
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -180,9 +183,12 @@ real_t Generic6DOFJointBullet::get_param(Vector3::Axis p_axis, PhysicsServer::G6
|
|||
return sixDOFConstraint->getRotationalLimitMotor(p_axis)->m_targetVelocity;
|
||||
case PhysicsServer::G6DOF_JOINT_ANGULAR_MOTOR_FORCE_LIMIT:
|
||||
return sixDOFConstraint->getRotationalLimitMotor(p_axis)->m_maxMotorForce;
|
||||
#ifndef DISABLE_DEPRECATED
|
||||
default:
|
||||
WARN_PRINT("This parameter is not supported");
|
||||
return 0.;
|
||||
ERR_EXPLAIN("This parameter " + itos(p_param) + " is deprecated");
|
||||
WARN_DEPRECATED;
|
||||
return 0;
|
||||
#endif // DISABLE_DEPRECATED
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -212,9 +218,11 @@ void Generic6DOFJointBullet::set_flag(Vector3::Axis p_axis, PhysicsServer::G6DOF
|
|||
case PhysicsServer::G6DOF_JOINT_FLAG_ENABLE_LINEAR_MOTOR:
|
||||
sixDOFConstraint->getTranslationalLimitMotor()->m_enableMotor[p_axis] = flags[p_axis][p_flag];
|
||||
break;
|
||||
#ifndef DISABLE_DEPRECATED
|
||||
default:
|
||||
WARN_PRINT("This flag is not supported by Bullet engine");
|
||||
return;
|
||||
ERR_EXPLAIN("This flag " + itos(p_flag) + " is deprecated");
|
||||
WARN_DEPRECATED
|
||||
#endif // DISABLE_DEPRECATED
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -95,11 +95,6 @@ real_t HingeJointBullet::get_hinge_angle() {
|
|||
|
||||
void HingeJointBullet::set_param(PhysicsServer::HingeJointParam p_param, real_t p_value) {
|
||||
switch (p_param) {
|
||||
case PhysicsServer::HINGE_JOINT_BIAS:
|
||||
if (0 < p_value) {
|
||||
WARN_PRINTS("HingeJoint doesn't support bias in the Bullet backend, so it's always 0.");
|
||||
}
|
||||
break;
|
||||
case PhysicsServer::HINGE_JOINT_LIMIT_UPPER:
|
||||
hingeConstraint->setLimit(hingeConstraint->getLowerLimit(), p_value, hingeConstraint->getLimitSoftness(), hingeConstraint->getLimitBiasFactor(), hingeConstraint->getLimitRelaxationFactor());
|
||||
break;
|
||||
|
@ -121,8 +116,11 @@ void HingeJointBullet::set_param(PhysicsServer::HingeJointParam p_param, real_t
|
|||
case PhysicsServer::HINGE_JOINT_MOTOR_MAX_IMPULSE:
|
||||
hingeConstraint->setMaxMotorImpulse(p_value);
|
||||
break;
|
||||
#ifndef DISABLE_DEPRECATED
|
||||
default:
|
||||
WARN_PRINTS("HingeJoint doesn't support this parameter in the Bullet backend: " + itos(p_param) + ", value: " + itos(p_value));
|
||||
ERR_EXPLAIN("This parameter " + itos(p_param) + " is deprecated");
|
||||
WARN_DEPRECATED
|
||||
#endif // DISABLE_DEPRECATED
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -145,9 +143,12 @@ real_t HingeJointBullet::get_param(PhysicsServer::HingeJointParam p_param) const
|
|||
return hingeConstraint->getMotorTargetVelocity();
|
||||
case PhysicsServer::HINGE_JOINT_MOTOR_MAX_IMPULSE:
|
||||
return hingeConstraint->getMaxMotorImpulse();
|
||||
#ifndef DISABLE_DEPRECATED
|
||||
default:
|
||||
WARN_PRINTS("HingeJoint doesn't support this parameter in the Bullet backend: " + itos(p_param));
|
||||
ERR_EXPLAIN("This parameter " + itos(p_param) + " is deprecated");
|
||||
WARN_DEPRECATED;
|
||||
return 0;
|
||||
#endif // DISABLE_DEPRECATED
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -84,9 +84,11 @@ real_t PinJointBullet::get_param(PhysicsServer::PinJointParam p_param) const {
|
|||
return p2pConstraint->m_setting.m_damping;
|
||||
case PhysicsServer::PIN_JOINT_IMPULSE_CLAMP:
|
||||
return p2pConstraint->m_setting.m_impulseClamp;
|
||||
#ifndef DISABLE_DEPRECATED
|
||||
default:
|
||||
WARN_PRINTS("This get parameter is not supported");
|
||||
return 0;
|
||||
ERR_EXPLAIN("This parameter " + itos(p_param) + " is deprecated");
|
||||
WARN_DEPRECATED
|
||||
#endif // DISABLE_DEPRECATED
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -178,7 +178,9 @@ bool BulletPhysicsDirectSpaceState::cast_motion(const RID &p_shape, const Transf
|
|||
space->dynamicsWorld->convexSweepTest(bt_convex_shape, bt_xform_from, bt_xform_to, btResult, 0.002);
|
||||
|
||||
if (btResult.hasHit()) {
|
||||
p_closest_safe = p_closest_unsafe = btResult.m_closestHitFraction;
|
||||
const btScalar l = bt_motion.length();
|
||||
p_closest_unsafe = btResult.m_closestHitFraction;
|
||||
p_closest_safe = MAX(p_closest_unsafe - (1 - ((l - 0.01) / l)), 0);
|
||||
if (r_info) {
|
||||
if (btCollisionObject::CO_RIGID_BODY == btResult.m_hitCollisionObject->getInternalType()) {
|
||||
B_TO_G(static_cast<const btRigidBody *>(btResult.m_hitCollisionObject)->getVelocityInLocalPoint(btResult.m_hitPointWorld), r_info->linear_velocity);
|
||||
|
|
|
@ -54,9 +54,9 @@ FabrikInverseKinematic::ChainItem *FabrikInverseKinematic::ChainItem::add_child(
|
|||
}
|
||||
|
||||
/// Build a chain that starts from the root to tip
|
||||
void FabrikInverseKinematic::build_chain(Task *p_task, bool p_force_simple_chain) {
|
||||
bool FabrikInverseKinematic::build_chain(Task *p_task, bool p_force_simple_chain) {
|
||||
|
||||
ERR_FAIL_COND(-1 == p_task->root_bone);
|
||||
ERR_FAIL_COND_V(-1 == p_task->root_bone, false);
|
||||
|
||||
Chain &chain(p_task->chain);
|
||||
|
||||
|
@ -77,8 +77,8 @@ void FabrikInverseKinematic::build_chain(Task *p_task, bool p_force_simple_chain
|
|||
for (int x = p_task->end_effectors.size() - 1; 0 <= x; --x) {
|
||||
|
||||
const EndEffector *ee(&p_task->end_effectors[x]);
|
||||
ERR_FAIL_COND(p_task->root_bone >= ee->tip_bone);
|
||||
ERR_FAIL_INDEX(ee->tip_bone, p_task->skeleton->get_bone_count());
|
||||
ERR_FAIL_COND_V(p_task->root_bone >= ee->tip_bone, false);
|
||||
ERR_FAIL_INDEX_V(ee->tip_bone, p_task->skeleton->get_bone_count(), false);
|
||||
|
||||
sub_chain_size = 0;
|
||||
// Picks all IDs that composing a single chain in reverse order (except the root)
|
||||
|
@ -133,6 +133,7 @@ void FabrikInverseKinematic::build_chain(Task *p_task, bool p_force_simple_chain
|
|||
break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void FabrikInverseKinematic::update_chain(const Skeleton *p_sk, ChainItem *p_chain_item) {
|
||||
|
@ -247,7 +248,10 @@ FabrikInverseKinematic::Task *FabrikInverseKinematic::create_simple_task(Skeleto
|
|||
task->end_effectors.push_back(ee);
|
||||
task->goal_global_transform = goal_transform;
|
||||
|
||||
build_chain(task);
|
||||
if (!build_chain(task)) {
|
||||
free_task(task);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return task;
|
||||
}
|
||||
|
@ -535,8 +539,10 @@ void SkeletonIK::reload_chain() {
|
|||
return;
|
||||
|
||||
task = FabrikInverseKinematic::create_simple_task(skeleton, skeleton->find_bone(root_bone), skeleton->find_bone(tip_bone), _get_target_transform());
|
||||
task->max_iterations = max_iterations;
|
||||
task->min_distance = min_distance;
|
||||
if (task) {
|
||||
task->max_iterations = max_iterations;
|
||||
task->min_distance = min_distance;
|
||||
}
|
||||
}
|
||||
|
||||
void SkeletonIK::reload_goal() {
|
||||
|
|
|
@ -123,7 +123,7 @@ public:
|
|||
|
||||
private:
|
||||
/// Init a chain that starts from the root to tip
|
||||
static void build_chain(Task *p_task, bool p_force_simple_chain = true);
|
||||
static bool build_chain(Task *p_task, bool p_force_simple_chain = true);
|
||||
|
||||
static void update_chain(const Skeleton *p_sk, ChainItem *p_chain_item);
|
||||
|
||||
|
|
Loading…
Reference in a new issue