void btTransformUtil_calculateDiffAxisAngleQuaternion(btScalar* orn0, btScalar* orn1a, btScalar* axis, btScalar* angle)
{
	QUATERNION_CONV(orn0);
	QUATERNION_CONV(orn1a);
	VECTOR3_DEF(axis);
	btTransformUtil::calculateDiffAxisAngleQuaternion(QUATERNION_USE(orn0), QUATERNION_USE(orn1a), VECTOR3_USE(axis), *angle);
	VECTOR3_DEF_OUT(axis);
}
void btMultiBody_setupSpherical2(btMultiBody* obj, int linkIndex, btScalar mass, const btScalar* inertia, int parent, const btScalar* rotParentToThis, const btScalar* parentComToThisPivotOffset, const btScalar* thisPivotToThisComOffset, bool disableParentCollision)
{
	VECTOR3_CONV(inertia);
	QUATERNION_CONV(rotParentToThis);
	VECTOR3_CONV(parentComToThisPivotOffset);
	VECTOR3_CONV(thisPivotToThisComOffset);
	obj->setupSpherical(linkIndex, mass, VECTOR3_USE(inertia), parent, QUATERNION_USE(rotParentToThis), VECTOR3_USE(parentComToThisPivotOffset), VECTOR3_USE(thisPivotToThisComOffset), disableParentCollision);
}
void btMultiBody_setupPlanar2(btMultiBody* obj, int i, btScalar mass, const btScalar* inertia, int parent, const btScalar* rotParentToThis, const btScalar* rotationAxis, const btScalar* parentComToThisComOffset, bool disableParentCollision)
{
	VECTOR3_CONV(inertia);
	QUATERNION_CONV(rotParentToThis);
	VECTOR3_CONV(rotationAxis);
	VECTOR3_CONV(parentComToThisComOffset);
	obj->setupPlanar(i, mass, VECTOR3_USE(inertia), parent, QUATERNION_USE(rotParentToThis), VECTOR3_USE(rotationAxis), VECTOR3_USE(parentComToThisComOffset), disableParentCollision);
}
void btMultiBody_setupFixed(btMultiBody* obj, int linkIndex, btScalar mass, const btScalar* inertia, int parent, const btScalar* rotParentToThis, const btScalar* parentComToThisPivotOffset, const btScalar* thisPivotToThisComOffset)
{
	VECTOR3_CONV(inertia);
	QUATERNION_CONV(rotParentToThis);
	VECTOR3_CONV(parentComToThisPivotOffset);
	VECTOR3_CONV(thisPivotToThisComOffset);
	obj->setupFixed(linkIndex, mass, VECTOR3_USE(inertia), parent, QUATERNION_USE(rotParentToThis), VECTOR3_USE(parentComToThisPivotOffset), VECTOR3_USE(thisPivotToThisComOffset));
}
void btTransformUtil_calculateVelocityQuaternion(btScalar* pos0, btScalar* pos1, btScalar* orn0, btScalar* orn1, btScalar timeStep, btScalar* linVel, btScalar* angVel)
{
	VECTOR3_CONV(pos0);
	VECTOR3_CONV(pos1);
	QUATERNION_CONV(orn0);
	QUATERNION_CONV(orn1);
	VECTOR3_DEF(linVel);
	VECTOR3_DEF(angVel);
	btTransformUtil::calculateVelocityQuaternion(VECTOR3_USE(pos0), VECTOR3_USE(pos1), QUATERNION_USE(orn0), QUATERNION_USE(orn1), timeStep, VECTOR3_USE(linVel), VECTOR3_USE(angVel));
	VECTOR3_DEF_OUT(linVel);
	VECTOR3_DEF_OUT(angVel);
}
#undef Native
#define Native static_cast<btConvexPlaneCollisionAlgorithm*>(_native)

ConvexPlaneCollisionAlgorithm::ConvexPlaneCollisionAlgorithm(btConvexPlaneCollisionAlgorithm* native)
	: CollisionAlgorithm(native)
{
}

ConvexPlaneCollisionAlgorithm::ConvexPlaneCollisionAlgorithm(PersistentManifold mf,
	CollisionAlgorithmConstructionInfo^ ci, CollisionObjectWrapper^ body0Wrap, CollisionObjectWrapper^ body1Wrap,
	bool isSwapped, int numPerturbationIterations, int minimumPointsPerturbationThreshold)
	: CollisionAlgorithm(new btConvexPlaneCollisionAlgorithm(mf._native,
		*ci->_native, body0Wrap->_native, body1Wrap->_native, isSwapped, numPerturbationIterations,
		minimumPointsPerturbationThreshold))
{
}

void ConvexPlaneCollisionAlgorithm::CollideSingleContact(Quaternion perturbeRot,
	CollisionObjectWrapper^ body0Wrap, CollisionObjectWrapper^ body1Wrap, DispatcherInfo^ dispatchInfo,
	ManifoldResult^ resultOut)
{
	QUATERNION_CONV(perturbeRot);
	Native->collideSingleContact(QUATERNION_USE(perturbeRot), body0Wrap->_native,
		body1Wrap->_native, *dispatchInfo->_native, (btManifoldResult*)resultOut->_native);
	QUATERNION_DEL(perturbeRot);
}

#endif
#endif
void btConeTwistConstraint_setMotorTargetInConstraintSpace(btConeTwistConstraint* obj, const btScalar* q)
{
	QUATERNION_CONV(q);
	obj->setMotorTargetInConstraintSpace(QUATERNION_USE(q));
}
void btMultiBody_setWorldToBaseRot(btMultiBody* obj, const btScalar* rot)
{
	QUATERNION_CONV(rot);
	obj->setWorldToBaseRot(QUATERNION_USE(rot));
}