| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466 | /*************************************************************************//*  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;	}}
 |