Fusion360-Addons/usr/Src/Core/pJoint/pJoint.cpp
2021-10-31 19:39:29 +01:00

287 lines
5.5 KiB
C++

#include <StdAfx.h>
#include "vtPhysXAll.h"
using namespace vtAgeia;
VxVector pJoint::getGlobalAxis(){
if (!getJoint())
return VxVector(-1,-1,-1);
return getFrom(getJoint()->getGlobalAxis());
}
void pJoint::setGlobalAxis(VxVector axis)
{
if (getJoint())
getJoint()->setGlobalAxis(getFrom(axis));
}
VxVector pJoint::getGlobalAnchor(){
if (!getJoint())
return VxVector(-1,-1,-1);
return getFrom(getJoint()->getGlobalAnchor());
}
void pJoint::setGlobalAnchor(VxVector anchor)
{
if (getJoint())
getJoint()->setGlobalAnchor(getFrom(anchor));
}
int pJoint::getNbLimitPlanes()
{
if (!getJoint())
return -1;
NxJoint *j = getJoint();
j->resetLimitPlaneIterator();
int numLimitPlanes = 0;
NxVec3 limitPoint;
if ( j->hasMoreLimitPlanes() )
{
NxVec3 planeNormal;
NxReal planeD;
NxReal restitution;
bool ok = true;
while ( ok )
{
j->getNextLimitPlane( planeNormal, planeD, &restitution );
++numLimitPlanes;
ok = j->hasMoreLimitPlanes();
}
}
return numLimitPlanes;
}
//////////////////////////////////////////////////////////////////////////
pJointFixed::pJointFixed(pRigidBody* _a,pRigidBody* _b) : pJoint(_a,_b,JT_Fixed)
{
}
pJoint::pJoint(pRigidBody* _a,pRigidBody* _b,int _type ) : m_SolidA(_a) , m_SolidB(_b) ,m_type((JType)_type)
{
m_vtObjectA = _a ? _a->GetVT3DObject() : NULL;
m_vtObjectB = _b ? _b->GetVT3DObject() : NULL;
mAID = _a ? _a->GetVT3DObject()->GetID() : -1 ;
mBID = _b ? _b->GetVT3DObject()->GetID() : -1 ;
mJoint = NULL;
m_pWorld = NULL;
}
pJointD6*pJoint::castD6Joint()
{
if (getJoint())
{
if (getJoint()->isD6Joint())
{
return static_cast<pJointD6*>(this);
}
}
return NULL;
}
pJointPulley* pJoint::castPulley()
{
if (getJoint())
{
if (getJoint()->isPulleyJoint())
{
return static_cast<pJointPulley*>(this);
}
}
return NULL;
}
pJointDistance* pJoint::castDistanceJoint()
{
if (getJoint())
{
if (getJoint()->isDistanceJoint())
{
return static_cast<pJointDistance*>(this);
}
}
return NULL;
}
pJointBall* pJoint::castBall()
{
if (getJoint())
{
if (getJoint()->isSphericalJoint())
{
return static_cast<pJointBall*>(this);
}
}
return NULL;
}
pJointRevolute* pJoint::castRevolute()
{
if (getJoint())
{
if (getJoint()->isRevoluteJoint())
{
return static_cast<pJointRevolute*>(this);
}
}
return NULL;
}
pJointPrismatic* pJoint::castPrismatic()
{
if (getJoint())
{
if (getJoint()->isPrismaticJoint())
{
return static_cast<pJointPrismatic*>(this);
}
}
return NULL;
}
pJointCylindrical* pJoint::castCylindrical()
{
if (getJoint())
{
if (getJoint()->isCylindricalJoint())
{
return static_cast<pJointCylindrical*>(this);
}
}
return NULL;
}
pJointPointInPlane* pJoint::castPointInPlane()
{
if (getJoint())
{
if (getJoint()->isPointInPlaneJoint())
{
return static_cast<pJointPointInPlane*>(this);
}
}
return NULL;
}
pJointPointOnLine* pJoint::castPointOnLine()
{
if (getJoint())
{
if (getJoint()->isPointOnLineJoint())
{
return static_cast<pJointPointOnLine*>(this);
}
}
return NULL;
}
/************************************************************************/
/* */
/************************************************************************/
int pJoint::addLimitPlane(const VxVector normal, VxVector pointInPlane, float restitution/* =0.0f */)
{
int res = -1;
if (getJoint()){
res = getJoint()->addLimitPlane(pMath::getFrom(normal),pMath::getFrom(pointInPlane),restitution);
}
return res;
}
void pJoint::setLimitPoint( VxVector point,bool pointIsOnActor2/*=true*/ )
{
if (getJoint()){
return getJoint()->setLimitPoint(getFrom(point),pointIsOnActor2);
}
}
void pJoint::purgeLimitPlanes(){ if (getJoint()) getJoint()->purgeLimitPlanes();}
void pJoint::resetLimitPlaneIterator(){ if (getJoint()) getJoint()->resetLimitPlaneIterator();}
int pJoint::hasMoreLimitPlanes(){ if (getJoint()) return getJoint()->hasMoreLimitPlanes(); return false;}
int pJoint::getNextLimitPlane (VxVector &planeNormal, float &planeD,float *restitution)
{
if (getJoint())
{
NxVec3 n;
int k =getJoint()->getNextLimitPlane(n,planeD,restitution);
planeNormal = pMath::getFrom(n);
return k;
}
return 0;
}
void pJoint::getBreakForces( float& maxForce,float& maxTorque )
{
if (getJoint())
getJoint()->getBreakable(maxForce,maxTorque);
}
void pJoint::setBreakForces( float maxForce,float maxTorque )
{
if (!getJoint())
return;
if ( maxTorque !=0.0f && maxForce != 0.0f)
getJoint()->setBreakable(maxForce,maxTorque);
//if ( maxTorque =0.0f && maxForce = 0.0f)
// getJoint()->setBreakable(,maxTorque);
}
void pJoint::setLocalAnchor0(VxVector anchor0)
{
if (getJoint())
{
if(getJoint()->isRevoluteJoint())
{
NxRevoluteJointDesc descr;
NxRevoluteJoint *joint = static_cast<NxRevoluteJoint*>(getJoint());
if (!joint)return;
joint->saveToDesc(descr);
descr.localAnchor[0] = getFrom(anchor0);
joint->loadFromDesc(descr);
}
}
}
/************************************************************************/
/* */
/************************************************************************/