示例#1
0
pSpring pJointBall::getJointSpring()
{
	NxSphericalJointDesc descr;	
	NxSphericalJoint *joint  = static_cast<NxSphericalJoint*>(getJoint());
	if (!joint)return pSpring();
	joint->saveToDesc(descr);
	return pSpring (descr.jointSpring.damper,descr.jointSpring.spring,descr.jointSpring.targetValue);
}
示例#2
0
pJointLimit pJointBall::getSwingLimit()
{
	NxSphericalJointDesc descr;	
	NxSphericalJoint *joint  = static_cast<NxSphericalJoint*>(getJoint());
	if (!joint)return pJointLimit();
	joint->saveToDesc(descr);
	return pJointLimit (descr.swingLimit.hardness,descr.swingLimit.restitution,descr.swingLimit.value);
}
示例#3
0
bool pJointBall::setJointSpring( pSpring spring )
{
	NxSphericalJointDesc descr;	
	NxSphericalJoint *joint  = static_cast<NxSphericalJoint*>(getJoint());
	if (!joint)return false ;
	joint->saveToDesc(descr);

	NxSpringDesc sLimit;	sLimit.damper = spring.damper;sLimit.spring=spring.spring;sLimit.targetValue=spring.targetValue;
	if (!sLimit.isValid())return false;
	descr.jointSpring= sLimit;
	joint->loadFromDesc(descr);
	return 1;
}
示例#4
0
void pJointBall::enableFlag(int flag,bool enable)
{

	NxSphericalJointDesc descr;	
	NxSphericalJoint *joint  = static_cast<NxSphericalJoint*>(getJoint());
	if (!joint)return;
	joint->saveToDesc(descr);

	if (enable)
		descr.flags |=flag;
	else
		descr.flags &=~flag;

	joint->loadFromDesc(descr);
	return ;

}
示例#5
0
bool pJointBall::setSwingLimit( pJointLimit limit )
{
	NxSphericalJointDesc descr;	
	NxSphericalJoint *joint  = static_cast<NxSphericalJoint*>(getJoint());
	if (!joint)return false ;
	joint->saveToDesc(descr);

	if ( limit.hardness != 0.0f || limit.restitution != 0.0f || limit.value !=0.0f )
	{
		enableFlag(NX_SJF_SWING_LIMIT_ENABLED,1);
		NxJointLimitDesc sLimit;	sLimit.value  = limit.value;sLimit.restitution = limit.restitution;sLimit.hardness = limit.hardness;
		if (!sLimit.isValid())return false;
		descr.swingLimit= sLimit;
		joint->loadFromDesc(descr);
		return true;
	}else
	{
		enableFlag(NX_SJF_SWING_LIMIT_ENABLED,0);
	}
	return false;
}
示例#6
0
void pJointBall::setProjectionMode(ProjectionMode mode)
{
	NxSphericalJointDesc descr;		NxSphericalJoint *joint  = static_cast<NxSphericalJoint*>(getJoint());	if (!joint)return ;	joint->saveToDesc(descr);
	descr.projectionMode = (NxJointProjectionMode)mode;
	joint->loadFromDesc(descr);
}
示例#7
0
void pJointBall::enableCollision( bool collision )
{

	NxSphericalJointDesc descr;		
	NxSphericalJoint *joint  = static_cast<NxSphericalJoint*>(getJoint());	if (!joint)return ;	joint->saveToDesc(descr);
	if (collision)
	{
		descr.jointFlags  |= NX_JF_COLLISION_ENABLED;
	}else
		descr.jointFlags  &= ~NX_JF_COLLISION_ENABLED;
	joint->loadFromDesc(descr);
}
示例#8
0
void pJointBall::setSwingLimitAxis( const VxVector& swingLimitAxis )
{
	NxSphericalJointDesc descr;		
	NxSphericalJoint *joint  = static_cast<NxSphericalJoint*>(getJoint());	if (!joint)return ;	joint->saveToDesc(descr);
	descr.swingAxis = pMath::getFrom(swingLimitAxis);
	joint->loadFromDesc(descr);

}
示例#9
0
void pJointBall::setAnchor( const VxVector& anchor )
{
	NxSphericalJointDesc descr;		
	NxSphericalJoint *joint  = static_cast<NxSphericalJoint*>(getJoint());	if (!joint)return ;	joint->saveToDesc(descr);
	joint->setGlobalAnchor(pMath::getFrom(anchor));
}
示例#10
0
void pJointBall::setProjectionDistance(float distance)
{
	NxSphericalJointDesc descr;		NxSphericalJoint *joint  = static_cast<NxSphericalJoint*>(getJoint());	if (!joint)return ;	joint->saveToDesc(descr);
	descr.projectionDistance= distance;
	joint->loadFromDesc(descr);
}
bool NxuPhysicsExport::Write(NxJoint *j,const char *userProperties,const char *id)
{
	bool ret = false;

	NxSceneDesc *current = getCurrentScene();

	CustomCopy cc(mCollection,current);

	NxJointDesc *joint = 0;

	switch ( j->getType() )
	{
		case NX_JOINT_PRISMATIC:
			if ( 1 )
			{
				::NxPrismaticJointDesc d1;
				NxPrismaticJoint *sj = j->isPrismaticJoint();
				sj->saveToDesc(d1);
				addActor( d1.actor[0] );
				addActor( d1.actor[1] );
				NxPrismaticJointDesc *desc = new NxPrismaticJointDesc;
				desc->copyFrom(d1,cc);
				joint = static_cast<NxJointDesc *>(desc);
			}
			break;
		case NX_JOINT_REVOLUTE:
			if ( 1 )
			{
				::NxRevoluteJointDesc d1;
				NxRevoluteJoint *sj = j->isRevoluteJoint();
				sj->saveToDesc(d1);
				addActor( d1.actor[0] );
				addActor( d1.actor[1] );
				NxRevoluteJointDesc *desc = new NxRevoluteJointDesc;
				desc->copyFrom(d1,cc);
				joint = static_cast<NxJointDesc *>(desc);
			}
			break;
		case NX_JOINT_CYLINDRICAL:
			if ( 1 )
			{
				::NxCylindricalJointDesc d1;
				NxCylindricalJoint *sj = j->isCylindricalJoint();
				sj->saveToDesc(d1);
				addActor( d1.actor[0] );
				addActor( d1.actor[1] );
				NxCylindricalJointDesc *desc = new NxCylindricalJointDesc;
				desc->copyFrom(d1,cc);
				joint = static_cast<NxJointDesc *>(desc);
			}
			break;
		case NX_JOINT_SPHERICAL:
			if ( 1 )
			{
				::NxSphericalJointDesc d1;
				NxSphericalJoint *sj = j->isSphericalJoint();
				sj->saveToDesc(d1);
				addActor( d1.actor[0] );
				addActor( d1.actor[1] );
				NxSphericalJointDesc *desc = new NxSphericalJointDesc;
				desc->copyFrom(d1,cc);
				joint = static_cast<NxJointDesc *>(desc);
			}
			break;
		case NX_JOINT_POINT_ON_LINE:
			if ( 1 )
			{
				::NxPointOnLineJointDesc d1;
				NxPointOnLineJoint *sj = j->isPointOnLineJoint();
				sj->saveToDesc(d1);
				addActor( d1.actor[0] );
				addActor( d1.actor[1] );
				NxPointOnLineJointDesc *desc = new NxPointOnLineJointDesc;
				desc->copyFrom(d1,cc);
				joint = static_cast<NxJointDesc *>(desc);
			}
			break;
		case NX_JOINT_POINT_IN_PLANE:
			if ( 1 )
			{
				::NxPointInPlaneJointDesc d1;
				NxPointInPlaneJoint *sj = j->isPointInPlaneJoint();
				sj->saveToDesc(d1);
				addActor( d1.actor[0] );
				addActor( d1.actor[1] );
				NxPointInPlaneJointDesc *desc = new NxPointInPlaneJointDesc;
				desc->copyFrom(d1,cc);
				joint = static_cast<NxJointDesc *>(desc);
			}
			break;
		case NX_JOINT_DISTANCE:
			if ( 1 )
			{
				::NxDistanceJointDesc d1;
				NxDistanceJoint *sj = j->isDistanceJoint();
				sj->saveToDesc(d1);
				addActor( d1.actor[0] );
				addActor( d1.actor[1] );
				NxDistanceJointDesc *desc = new NxDistanceJointDesc;
				desc->copyFrom(d1,cc);
				joint = static_cast<NxJointDesc *>(desc);
			}
			break;
		case NX_JOINT_PULLEY:
			if ( 1 )
			{
				::NxPulleyJointDesc d1;
				NxPulleyJoint *sj = j->isPulleyJoint();
				sj->saveToDesc(d1);
				addActor( d1.actor[0] );
				addActor( d1.actor[1] );
				NxPulleyJointDesc *desc = new NxPulleyJointDesc;
				desc->copyFrom(d1,cc);
				joint = static_cast<NxJointDesc *>(desc);
			}
			break;
		case NX_JOINT_FIXED:
			if ( 1 )
			{
				::NxFixedJointDesc d1;
				NxFixedJoint *sj = j->isFixedJoint();
				sj->saveToDesc(d1);
				addActor( d1.actor[0] );
				addActor( d1.actor[1] );
				NxFixedJointDesc *desc = new NxFixedJointDesc;
				desc->copyFrom(d1,cc);
				joint = static_cast<NxJointDesc *>(desc);
			}
			break;
		case NX_JOINT_D6:
			if ( 1 )
			{
				::NxD6JointDesc d1;
				NxD6Joint *sj = j->isD6Joint();
				sj->saveToDesc(d1);
				addActor( d1.actor[0] );
				addActor( d1.actor[1] );
				NxD6JointDesc *desc = new NxD6JointDesc;
				desc->copyFrom(d1,cc);
				joint = static_cast<NxJointDesc *>(desc);
			}
			break;
		default:
			break;

	}


	//Add	Limits
	// in	addition,	we also	have to	write	out	its	limit	planes!
	j->resetLimitPlaneIterator();
	if (j->hasMoreLimitPlanes())
	{
		// write limit point
		joint->mOnActor2 = j->getLimitPoint(joint->mPlaneLimitPoint);

		NxArray< NxPlaneInfoDesc *> plist;


		// write the plane normals
		while	(j->hasMoreLimitPlanes())
		{
			NxPlaneInfoDesc *pInfo	=	new	NxPlaneInfoDesc();
#if NX_SDK_VERSION_NUMBER >= 272
			j->getNextLimitPlane(pInfo->mPlaneNormal,	pInfo->mPlaneD, &pInfo->restitution);
#else
			j->getNextLimitPlane(pInfo->mPlaneNormal,	pInfo->mPlaneD);
#endif
			plist.push_back(pInfo);
		}

		if ( plist.size() )
		{
			for (int i=plist.size()-1; i>=0; i--)
			{
				NxPlaneInfoDesc *p = plist[i];
				joint->mPlaneInfo.pushBack(p);
			}
		}

	}


	if ( joint )
	{
		if ( id )
		{
			joint->mId = id;
		}
		else
		{
      char scratch[512];
      sprintf(scratch,"Joint_%d", current->mJoints.size());
      joint->mId = getGlobalString(scratch);
      joint->mUserProperties = getGlobalString(userProperties);
    }
		current->mJoints.push_back(joint);
		ret = true;
	}

  return ret;
}