mirror of
https://github.com/godotengine/godot.git
synced 2024-12-15 10:12:40 +08:00
467 lines
16 KiB
C++
467 lines
16 KiB
C++
/*************************************************************************/
|
|
/* slider_joint_bullet.cpp */
|
|
/*************************************************************************/
|
|
/* This file is part of: */
|
|
/* GODOT ENGINE */
|
|
/* https://godotengine.org */
|
|
/*************************************************************************/
|
|
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
|
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
|
/* */
|
|
/* Permission is hereby granted, free of charge, to any person obtaining */
|
|
/* a copy of this software and associated documentation files (the */
|
|
/* "Software"), to deal in the Software without restriction, including */
|
|
/* without limitation the rights to use, copy, modify, merge, publish, */
|
|
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
|
/* permit persons to whom the Software is furnished to do so, subject to */
|
|
/* the following conditions: */
|
|
/* */
|
|
/* The above copyright notice and this permission notice shall be */
|
|
/* included in all copies or substantial portions of the Software. */
|
|
/* */
|
|
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
|
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
|
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
|
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
|
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
|
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
|
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
|
/*************************************************************************/
|
|
|
|
#include "slider_joint_bullet.h"
|
|
|
|
#include "bullet_types_converter.h"
|
|
#include "bullet_utilities.h"
|
|
#include "rigid_body_bullet.h"
|
|
|
|
#include <BulletDynamics/ConstraintSolver/btSliderConstraint.h>
|
|
|
|
/**
|
|
@author AndreaCatania
|
|
*/
|
|
|
|
SliderJointBullet::SliderJointBullet(RigidBodyBullet *rbA, RigidBodyBullet *rbB, const Transform3D &frameInA, const Transform3D &frameInB) :
|
|
JointBullet() {
|
|
Transform3D scaled_AFrame(frameInA.scaled(rbA->get_body_scale()));
|
|
scaled_AFrame.basis.rotref_posscale_decomposition(scaled_AFrame.basis);
|
|
|
|
btTransform btFrameA;
|
|
G_TO_B(scaled_AFrame, btFrameA);
|
|
|
|
if (rbB) {
|
|
Transform3D scaled_BFrame(frameInB.scaled(rbB->get_body_scale()));
|
|
scaled_BFrame.basis.rotref_posscale_decomposition(scaled_BFrame.basis);
|
|
|
|
btTransform btFrameB;
|
|
G_TO_B(scaled_BFrame, btFrameB);
|
|
sliderConstraint = bulletnew(btSliderConstraint(*rbA->get_bt_rigid_body(), *rbB->get_bt_rigid_body(), btFrameA, btFrameB, true));
|
|
|
|
} else {
|
|
sliderConstraint = bulletnew(btSliderConstraint(*rbA->get_bt_rigid_body(), btFrameA, true));
|
|
}
|
|
setup(sliderConstraint);
|
|
}
|
|
|
|
const RigidBodyBullet *SliderJointBullet::getRigidBodyA() const {
|
|
return static_cast<RigidBodyBullet *>(sliderConstraint->getRigidBodyA().getUserPointer());
|
|
}
|
|
|
|
const RigidBodyBullet *SliderJointBullet::getRigidBodyB() const {
|
|
return static_cast<RigidBodyBullet *>(sliderConstraint->getRigidBodyB().getUserPointer());
|
|
}
|
|
|
|
const Transform3D SliderJointBullet::getCalculatedTransformA() const {
|
|
btTransform btTransform = sliderConstraint->getCalculatedTransformA();
|
|
Transform3D gTrans;
|
|
B_TO_G(btTransform, gTrans);
|
|
return gTrans;
|
|
}
|
|
|
|
const Transform3D SliderJointBullet::getCalculatedTransformB() const {
|
|
btTransform btTransform = sliderConstraint->getCalculatedTransformB();
|
|
Transform3D gTrans;
|
|
B_TO_G(btTransform, gTrans);
|
|
return gTrans;
|
|
}
|
|
|
|
const Transform3D SliderJointBullet::getFrameOffsetA() const {
|
|
btTransform btTransform = sliderConstraint->getFrameOffsetA();
|
|
Transform3D gTrans;
|
|
B_TO_G(btTransform, gTrans);
|
|
return gTrans;
|
|
}
|
|
|
|
const Transform3D SliderJointBullet::getFrameOffsetB() const {
|
|
btTransform btTransform = sliderConstraint->getFrameOffsetB();
|
|
Transform3D gTrans;
|
|
B_TO_G(btTransform, gTrans);
|
|
return gTrans;
|
|
}
|
|
|
|
Transform3D SliderJointBullet::getFrameOffsetA() {
|
|
btTransform btTransform = sliderConstraint->getFrameOffsetA();
|
|
Transform3D gTrans;
|
|
B_TO_G(btTransform, gTrans);
|
|
return gTrans;
|
|
}
|
|
|
|
Transform3D SliderJointBullet::getFrameOffsetB() {
|
|
btTransform btTransform = sliderConstraint->getFrameOffsetB();
|
|
Transform3D gTrans;
|
|
B_TO_G(btTransform, gTrans);
|
|
return gTrans;
|
|
}
|
|
|
|
real_t SliderJointBullet::getLowerLinLimit() const {
|
|
return sliderConstraint->getLowerLinLimit();
|
|
}
|
|
|
|
void SliderJointBullet::setLowerLinLimit(real_t lowerLimit) {
|
|
sliderConstraint->setLowerLinLimit(lowerLimit);
|
|
}
|
|
|
|
real_t SliderJointBullet::getUpperLinLimit() const {
|
|
return sliderConstraint->getUpperLinLimit();
|
|
}
|
|
|
|
void SliderJointBullet::setUpperLinLimit(real_t upperLimit) {
|
|
sliderConstraint->setUpperLinLimit(upperLimit);
|
|
}
|
|
|
|
real_t SliderJointBullet::getLowerAngLimit() const {
|
|
return sliderConstraint->getLowerAngLimit();
|
|
}
|
|
|
|
void SliderJointBullet::setLowerAngLimit(real_t lowerLimit) {
|
|
sliderConstraint->setLowerAngLimit(lowerLimit);
|
|
}
|
|
|
|
real_t SliderJointBullet::getUpperAngLimit() const {
|
|
return sliderConstraint->getUpperAngLimit();
|
|
}
|
|
|
|
void SliderJointBullet::setUpperAngLimit(real_t upperLimit) {
|
|
sliderConstraint->setUpperAngLimit(upperLimit);
|
|
}
|
|
|
|
real_t SliderJointBullet::getSoftnessDirLin() const {
|
|
return sliderConstraint->getSoftnessDirLin();
|
|
}
|
|
|
|
real_t SliderJointBullet::getRestitutionDirLin() const {
|
|
return sliderConstraint->getRestitutionDirLin();
|
|
}
|
|
|
|
real_t SliderJointBullet::getDampingDirLin() const {
|
|
return sliderConstraint->getDampingDirLin();
|
|
}
|
|
|
|
real_t SliderJointBullet::getSoftnessDirAng() const {
|
|
return sliderConstraint->getSoftnessDirAng();
|
|
}
|
|
|
|
real_t SliderJointBullet::getRestitutionDirAng() const {
|
|
return sliderConstraint->getRestitutionDirAng();
|
|
}
|
|
|
|
real_t SliderJointBullet::getDampingDirAng() const {
|
|
return sliderConstraint->getDampingDirAng();
|
|
}
|
|
|
|
real_t SliderJointBullet::getSoftnessLimLin() const {
|
|
return sliderConstraint->getSoftnessLimLin();
|
|
}
|
|
|
|
real_t SliderJointBullet::getRestitutionLimLin() const {
|
|
return sliderConstraint->getRestitutionLimLin();
|
|
}
|
|
|
|
real_t SliderJointBullet::getDampingLimLin() const {
|
|
return sliderConstraint->getDampingLimLin();
|
|
}
|
|
|
|
real_t SliderJointBullet::getSoftnessLimAng() const {
|
|
return sliderConstraint->getSoftnessLimAng();
|
|
}
|
|
|
|
real_t SliderJointBullet::getRestitutionLimAng() const {
|
|
return sliderConstraint->getRestitutionLimAng();
|
|
}
|
|
|
|
real_t SliderJointBullet::getDampingLimAng() const {
|
|
return sliderConstraint->getDampingLimAng();
|
|
}
|
|
|
|
real_t SliderJointBullet::getSoftnessOrthoLin() const {
|
|
return sliderConstraint->getSoftnessOrthoLin();
|
|
}
|
|
|
|
real_t SliderJointBullet::getRestitutionOrthoLin() const {
|
|
return sliderConstraint->getRestitutionOrthoLin();
|
|
}
|
|
|
|
real_t SliderJointBullet::getDampingOrthoLin() const {
|
|
return sliderConstraint->getDampingOrthoLin();
|
|
}
|
|
|
|
real_t SliderJointBullet::getSoftnessOrthoAng() const {
|
|
return sliderConstraint->getSoftnessOrthoAng();
|
|
}
|
|
|
|
real_t SliderJointBullet::getRestitutionOrthoAng() const {
|
|
return sliderConstraint->getRestitutionOrthoAng();
|
|
}
|
|
|
|
real_t SliderJointBullet::getDampingOrthoAng() const {
|
|
return sliderConstraint->getDampingOrthoAng();
|
|
}
|
|
|
|
void SliderJointBullet::setSoftnessDirLin(real_t softnessDirLin) {
|
|
sliderConstraint->setSoftnessDirLin(softnessDirLin);
|
|
}
|
|
|
|
void SliderJointBullet::setRestitutionDirLin(real_t restitutionDirLin) {
|
|
sliderConstraint->setRestitutionDirLin(restitutionDirLin);
|
|
}
|
|
|
|
void SliderJointBullet::setDampingDirLin(real_t dampingDirLin) {
|
|
sliderConstraint->setDampingDirLin(dampingDirLin);
|
|
}
|
|
|
|
void SliderJointBullet::setSoftnessDirAng(real_t softnessDirAng) {
|
|
sliderConstraint->setSoftnessDirAng(softnessDirAng);
|
|
}
|
|
|
|
void SliderJointBullet::setRestitutionDirAng(real_t restitutionDirAng) {
|
|
sliderConstraint->setRestitutionDirAng(restitutionDirAng);
|
|
}
|
|
|
|
void SliderJointBullet::setDampingDirAng(real_t dampingDirAng) {
|
|
sliderConstraint->setDampingDirAng(dampingDirAng);
|
|
}
|
|
|
|
void SliderJointBullet::setSoftnessLimLin(real_t softnessLimLin) {
|
|
sliderConstraint->setSoftnessLimLin(softnessLimLin);
|
|
}
|
|
|
|
void SliderJointBullet::setRestitutionLimLin(real_t restitutionLimLin) {
|
|
sliderConstraint->setRestitutionLimLin(restitutionLimLin);
|
|
}
|
|
|
|
void SliderJointBullet::setDampingLimLin(real_t dampingLimLin) {
|
|
sliderConstraint->setDampingLimLin(dampingLimLin);
|
|
}
|
|
|
|
void SliderJointBullet::setSoftnessLimAng(real_t softnessLimAng) {
|
|
sliderConstraint->setSoftnessLimAng(softnessLimAng);
|
|
}
|
|
|
|
void SliderJointBullet::setRestitutionLimAng(real_t restitutionLimAng) {
|
|
sliderConstraint->setRestitutionLimAng(restitutionLimAng);
|
|
}
|
|
|
|
void SliderJointBullet::setDampingLimAng(real_t dampingLimAng) {
|
|
sliderConstraint->setDampingLimAng(dampingLimAng);
|
|
}
|
|
|
|
void SliderJointBullet::setSoftnessOrthoLin(real_t softnessOrthoLin) {
|
|
sliderConstraint->setSoftnessOrthoLin(softnessOrthoLin);
|
|
}
|
|
|
|
void SliderJointBullet::setRestitutionOrthoLin(real_t restitutionOrthoLin) {
|
|
sliderConstraint->setRestitutionOrthoLin(restitutionOrthoLin);
|
|
}
|
|
|
|
void SliderJointBullet::setDampingOrthoLin(real_t dampingOrthoLin) {
|
|
sliderConstraint->setDampingOrthoLin(dampingOrthoLin);
|
|
}
|
|
|
|
void SliderJointBullet::setSoftnessOrthoAng(real_t softnessOrthoAng) {
|
|
sliderConstraint->setSoftnessOrthoAng(softnessOrthoAng);
|
|
}
|
|
|
|
void SliderJointBullet::setRestitutionOrthoAng(real_t restitutionOrthoAng) {
|
|
sliderConstraint->setRestitutionOrthoAng(restitutionOrthoAng);
|
|
}
|
|
|
|
void SliderJointBullet::setDampingOrthoAng(real_t dampingOrthoAng) {
|
|
sliderConstraint->setDampingOrthoAng(dampingOrthoAng);
|
|
}
|
|
|
|
void SliderJointBullet::setPoweredLinMotor(bool onOff) {
|
|
sliderConstraint->setPoweredLinMotor(onOff);
|
|
}
|
|
|
|
bool SliderJointBullet::getPoweredLinMotor() {
|
|
return sliderConstraint->getPoweredLinMotor();
|
|
}
|
|
|
|
void SliderJointBullet::setTargetLinMotorVelocity(real_t targetLinMotorVelocity) {
|
|
sliderConstraint->setTargetLinMotorVelocity(targetLinMotorVelocity);
|
|
}
|
|
|
|
real_t SliderJointBullet::getTargetLinMotorVelocity() {
|
|
return sliderConstraint->getTargetLinMotorVelocity();
|
|
}
|
|
|
|
void SliderJointBullet::setMaxLinMotorForce(real_t maxLinMotorForce) {
|
|
sliderConstraint->setMaxLinMotorForce(maxLinMotorForce);
|
|
}
|
|
|
|
real_t SliderJointBullet::getMaxLinMotorForce() {
|
|
return sliderConstraint->getMaxLinMotorForce();
|
|
}
|
|
|
|
void SliderJointBullet::setPoweredAngMotor(bool onOff) {
|
|
sliderConstraint->setPoweredAngMotor(onOff);
|
|
}
|
|
|
|
bool SliderJointBullet::getPoweredAngMotor() {
|
|
return sliderConstraint->getPoweredAngMotor();
|
|
}
|
|
|
|
void SliderJointBullet::setTargetAngMotorVelocity(real_t targetAngMotorVelocity) {
|
|
sliderConstraint->setTargetAngMotorVelocity(targetAngMotorVelocity);
|
|
}
|
|
|
|
real_t SliderJointBullet::getTargetAngMotorVelocity() {
|
|
return sliderConstraint->getTargetAngMotorVelocity();
|
|
}
|
|
|
|
void SliderJointBullet::setMaxAngMotorForce(real_t maxAngMotorForce) {
|
|
sliderConstraint->setMaxAngMotorForce(maxAngMotorForce);
|
|
}
|
|
|
|
real_t SliderJointBullet::getMaxAngMotorForce() {
|
|
return sliderConstraint->getMaxAngMotorForce();
|
|
}
|
|
|
|
real_t SliderJointBullet::getLinearPos() {
|
|
return sliderConstraint->getLinearPos();
|
|
;
|
|
}
|
|
|
|
void SliderJointBullet::set_param(PhysicsServer3D::SliderJointParam p_param, real_t p_value) {
|
|
switch (p_param) {
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_UPPER:
|
|
setUpperLinLimit(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_LOWER:
|
|
setLowerLinLimit(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_SOFTNESS:
|
|
setSoftnessLimLin(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_RESTITUTION:
|
|
setRestitutionLimLin(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_DAMPING:
|
|
setDampingLimLin(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_MOTION_SOFTNESS:
|
|
setSoftnessDirLin(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_MOTION_RESTITUTION:
|
|
setRestitutionDirLin(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_MOTION_DAMPING:
|
|
setDampingDirLin(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_ORTHOGONAL_SOFTNESS:
|
|
setSoftnessOrthoLin(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_ORTHOGONAL_RESTITUTION:
|
|
setRestitutionOrthoLin(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_ORTHOGONAL_DAMPING:
|
|
setDampingOrthoLin(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_LIMIT_UPPER:
|
|
setUpperAngLimit(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_LIMIT_LOWER:
|
|
setLowerAngLimit(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_LIMIT_SOFTNESS:
|
|
setSoftnessLimAng(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_LIMIT_RESTITUTION:
|
|
setRestitutionLimAng(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_LIMIT_DAMPING:
|
|
setDampingLimAng(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_MOTION_SOFTNESS:
|
|
setSoftnessDirAng(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_MOTION_RESTITUTION:
|
|
setRestitutionDirAng(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_MOTION_DAMPING:
|
|
setDampingDirAng(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_ORTHOGONAL_SOFTNESS:
|
|
setSoftnessOrthoAng(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_ORTHOGONAL_RESTITUTION:
|
|
setRestitutionOrthoAng(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_ORTHOGONAL_DAMPING:
|
|
setDampingOrthoAng(p_value);
|
|
break;
|
|
case PhysicsServer3D::SLIDER_JOINT_MAX:
|
|
break; // Can't happen, but silences warning
|
|
}
|
|
}
|
|
|
|
real_t SliderJointBullet::get_param(PhysicsServer3D::SliderJointParam p_param) const {
|
|
switch (p_param) {
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_UPPER:
|
|
return getUpperLinLimit();
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_LOWER:
|
|
return getLowerLinLimit();
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_SOFTNESS:
|
|
return getSoftnessLimLin();
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_RESTITUTION:
|
|
return getRestitutionLimLin();
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_DAMPING:
|
|
return getDampingLimLin();
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_MOTION_SOFTNESS:
|
|
return getSoftnessDirLin();
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_MOTION_RESTITUTION:
|
|
return getRestitutionDirLin();
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_MOTION_DAMPING:
|
|
return getDampingDirLin();
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_ORTHOGONAL_SOFTNESS:
|
|
return getSoftnessOrthoLin();
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_ORTHOGONAL_RESTITUTION:
|
|
return getRestitutionOrthoLin();
|
|
case PhysicsServer3D::SLIDER_JOINT_LINEAR_ORTHOGONAL_DAMPING:
|
|
return getDampingOrthoLin();
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_LIMIT_UPPER:
|
|
return getUpperAngLimit();
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_LIMIT_LOWER:
|
|
return getLowerAngLimit();
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_LIMIT_SOFTNESS:
|
|
return getSoftnessLimAng();
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_LIMIT_RESTITUTION:
|
|
return getRestitutionLimAng();
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_LIMIT_DAMPING:
|
|
return getDampingLimAng();
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_MOTION_SOFTNESS:
|
|
return getSoftnessDirAng();
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_MOTION_RESTITUTION:
|
|
return getRestitutionDirAng();
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_MOTION_DAMPING:
|
|
return getDampingDirAng();
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_ORTHOGONAL_SOFTNESS:
|
|
return getSoftnessOrthoAng();
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_ORTHOGONAL_RESTITUTION:
|
|
return getRestitutionOrthoAng();
|
|
case PhysicsServer3D::SLIDER_JOINT_ANGULAR_ORTHOGONAL_DAMPING:
|
|
return getDampingOrthoAng();
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|