panda3d/panda/src/bullet/bulletGenericConstraint.cxx

168 lines
5.5 KiB
C++

// Filename: bulletGenericConstraint.cxx
// Created by: enn0x (02Mar10)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) Carnegie Mellon University. All rights reserved.
//
// All use of this software is subject to the terms of the revised BSD
// license. You should have received a copy of this license along
// with this source code in a file named "LICENSE."
//
////////////////////////////////////////////////////////////////////
#include "bulletGenericConstraint.h"
#include "bulletRigidBodyNode.h"
TypeHandle BulletGenericConstraint::_type_handle;
////////////////////////////////////////////////////////////////////
// Function: BulletGenericConstraint::Constructor
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
BulletGenericConstraint::
BulletGenericConstraint(const BulletRigidBodyNode *node_a,
CPT(TransformState) frame_a,
bool use_frame_a) {
btRigidBody *ptr_a = btRigidBody::upcast(node_a->get_object());
btTransform trans_a = TransformState_to_btTrans(frame_a);
_constraint = new btGeneric6DofConstraint(*ptr_a, trans_a, use_frame_a);
}
////////////////////////////////////////////////////////////////////
// Function: BulletGenericConstraint::Constructor
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
BulletGenericConstraint::
BulletGenericConstraint(const BulletRigidBodyNode *node_a,
const BulletRigidBodyNode *node_b,
CPT(TransformState) frame_a,
CPT(TransformState) frame_b,
bool use_frame_a) {
btRigidBody *ptr_a = btRigidBody::upcast(node_a->get_object());
btTransform trans_a = TransformState_to_btTrans(frame_a);
btRigidBody *ptr_b = btRigidBody::upcast(node_b->get_object());
btTransform trans_b = TransformState_to_btTrans(frame_b);
_constraint = new btGeneric6DofConstraint(*ptr_a, *ptr_b, trans_a, trans_b, use_frame_a);
}
////////////////////////////////////////////////////////////////////
// Function: BulletGenericConstraint::ptr
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
btTypedConstraint *BulletGenericConstraint::
ptr() const {
return _constraint;
}
////////////////////////////////////////////////////////////////////
// Function: BulletGenericConstraint::get_axis
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
LVector3 BulletGenericConstraint::
get_axis(int axis) const {
nassertr(axis >= 0, LVector3::zero());
nassertr(axis <= 3, LVector3::zero());
_constraint->buildJacobian();
return btVector3_to_LVector3(_constraint->getAxis(axis));
}
////////////////////////////////////////////////////////////////////
// Function: BulletGenericConstraint::get_pivot
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
PN_stdfloat BulletGenericConstraint::
get_pivot(int axis) const {
nassertr(axis >= 0, 0.0f);
nassertr(axis <= 3, 0.0f);
_constraint->buildJacobian();
return _constraint->getRelativePivotPosition(axis);
}
////////////////////////////////////////////////////////////////////
// Function: BulletGenericConstraint::get_angle
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
PN_stdfloat BulletGenericConstraint::
get_angle(int axis) const {
nassertr(axis >= 0, 0.0f);
nassertr(axis <= 3, 0.0f);
_constraint->buildJacobian();
return _constraint->getAngle(axis);
}
////////////////////////////////////////////////////////////////////
// Function: BulletGenericConstraint::set_linear_limit
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void BulletGenericConstraint::
set_linear_limit(int axis, PN_stdfloat low, PN_stdfloat high) {
nassertv(axis >= 0);
nassertv(axis <= 3);
_constraint->buildJacobian();
_constraint->setLimit(axis, low, high);
}
////////////////////////////////////////////////////////////////////
// Function: BulletGenericConstraint::set_angular_limit
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void BulletGenericConstraint::
set_angular_limit(int axis, PN_stdfloat low, PN_stdfloat high) {
nassertv(axis >= 0);
nassertv(axis <= 3);
low = deg_2_rad(low);
high = deg_2_rad(high);
_constraint->buildJacobian();
_constraint->setLimit(axis + 3, low, high);
}
////////////////////////////////////////////////////////////////////
// Function: BulletGenericConstraint::get_rotational_limit_motor
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
BulletRotationalLimitMotor BulletGenericConstraint::
get_rotational_limit_motor(int axis) {
return BulletRotationalLimitMotor(*_constraint->getRotationalLimitMotor(axis));
}
////////////////////////////////////////////////////////////////////
// Function: BulletGenericConstraint::get_translational_limit_motor
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
BulletTranslationalLimitMotor BulletGenericConstraint::
get_translational_limit_motor() {
return BulletTranslationalLimitMotor(*_constraint->getTranslationalLimitMotor());
}