void btBU_Simplex1to4_addVertex(btBU_Simplex1to4* obj, const btScalar* pt)
{
	VECTOR3_CONV(pt);
	obj->addVertex(VECTOR3_USE(pt));
}
HingeConstraint::HingeConstraint(btHingeConstraint* native)
	: TypedConstraint(native)
{
}

HingeConstraint::HingeConstraint(RigidBody^ rigidBodyA, RigidBody^ rigidBodyB, Vector3 pivotInA,
	Vector3 pivotInB, Vector3 axisInA, Vector3 axisInB, bool useReferenceFrameA)
	: TypedConstraint(0)
{
	VECTOR3_CONV(pivotInA);
	VECTOR3_CONV(pivotInB);
	VECTOR3_CONV(axisInA);
	VECTOR3_CONV(axisInB);
	UnmanagedPointer = new btHingeConstraint(*(btRigidBody*)rigidBodyA->_native, *(btRigidBody*)rigidBodyB->_native,
		VECTOR3_USE(pivotInA), VECTOR3_USE(pivotInB), VECTOR3_USE(axisInA), VECTOR3_USE(axisInB),
		useReferenceFrameA);
	VECTOR3_DEL(pivotInA);
	VECTOR3_DEL(pivotInB);
	VECTOR3_DEL(axisInA);
	VECTOR3_DEL(axisInB);

	_rigidBodyA = rigidBodyA;
	_rigidBodyB = rigidBodyB;
}

HingeConstraint::HingeConstraint(RigidBody^ rigidBodyA, RigidBody^ rigidBodyB, Vector3 pivotInA,
	Vector3 pivotInB, Vector3 axisInA, Vector3 axisInB)
	: TypedConstraint(0)
{
	VECTOR3_CONV(pivotInA);
btBU_Simplex1to4* btBU_Simplex1to4_new2(const btScalar* pt0)
{
	VECTOR3_CONV(pt0);
	return new btBU_Simplex1to4(VECTOR3_USE(pt0));
}
btBU_Simplex1to4* btBU_Simplex1to4_new3(const btScalar* pt0, const btScalar* pt1)
{
	VECTOR3_CONV(pt0);
	VECTOR3_CONV(pt1);
	return new btBU_Simplex1to4(VECTOR3_USE(pt0), VECTOR3_USE(pt1));
}
void btCharacterControllerInterface_warp(btCharacterControllerInterface* obj, const btScalar* origin)
{
	VECTOR3_CONV(origin);
	obj->warp(VECTOR3_USE(origin));
}
void btCharacterControllerInterface_setVelocityForTimeInterval(btCharacterControllerInterface* obj, const btScalar* velocity, btScalar timeInterval)
{
	VECTOR3_CONV(velocity);
	obj->setVelocityForTimeInterval(VECTOR3_USE(velocity), timeInterval);
}
void btCharacterControllerInterface_setWalkDirection(btCharacterControllerInterface* obj, const btScalar* walkDirection)
{
	VECTOR3_CONV(walkDirection);
	obj->setWalkDirection(VECTOR3_USE(walkDirection));
}
void MultibodyLink::SetAxisTop(int dof, Vector3 axis)
{
	VECTOR3_DEF(axis);
	_native->setAxisTop(dof, VECTOR3_USE(axis));
	VECTOR3_DEL(axis);
}
BroadphaseProxy::BroadphaseProxy()
{
	UnmanagedPointer = new btBroadphaseProxy();
}

BroadphaseProxy::BroadphaseProxy(Vector3 aabbMin, Vector3 aabbMax, Object^ userObject,
	CollisionFilterGroups collisionFilterGroup, CollisionFilterGroups collisionFilterMask,
	IntPtr multiSapParentProxy)
{
	VECTOR3_DEF(aabbMin);
	VECTOR3_DEF(aabbMax);

	_clientObject = userObject;

	UnmanagedPointer = new btBroadphaseProxy(VECTOR3_USE(aabbMin), VECTOR3_USE(aabbMax), 0,
		(short int)collisionFilterGroup, (short int)collisionFilterMask,
		multiSapParentProxy.ToPointer()
		);

	VECTOR3_DEL(aabbMin);
	VECTOR3_DEL(aabbMax);
}

BroadphaseProxy::BroadphaseProxy(Vector3 aabbMin, Vector3 aabbMax, Object^ userObject,
	CollisionFilterGroups collisionFilterGroup, CollisionFilterGroups collisionFilterMask)
{
	VECTOR3_DEF(aabbMin);
	VECTOR3_DEF(aabbMax);

	_clientObject = userObject;