
///////////////////////////////////////////////////////////////////////////////
//
// File   : AVP_Physics_OBBTests.h
// Author : Andy Tate
// Date   : 7-Feb-2008
//
// Copyright (C) 2008 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

#ifdef ASURA_USE_PRAGMA_ONCE
	#pragma once
#endif   // ifdef ASURA_USE_PRAGMA_ONCE

#ifndef __AVP_PHYSICS_OBBTESTS_H__
#define __AVP_PHYSICS_OBBTESTS_H__

////////////////////////////////////////////////////////////////////////////////
// Include files...
////////////////////////////////////////////////////////////////////////////////

#include "Core/Asura_Maths.h"


////////////////////////////////////////////////////////////////////////////////
// Forward class declarations...
////////////////////////////////////////////////////////////////////////////////

class Asura_OBB;
class Asura_Physics_Tri;


////////////////////////////////////////////////////////////////////////////////
// Class declaration...
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Class        : AVP_Physics_OBBTests
// Author       : Andy Tate
// Date         : 7-Feb-2008
//
// Description  : Static class used to hide OBB tests which have been copied
//				  from "Asura_Physics_CCD". This is not being used directly
//				  because its an internal physics class and may change in
//				  the future.
////////////////////////////////////////////////////////////////////////////////

class AVP_Physics_OBBTests
{
public:
	// Public functions...
	static u_int	FindContactPoints_OBBTri(const Asura_OBB& xOBB, const Asura_Physics_Tri& xTri, const Asura_AVector3& xAxis, Asura_AVector3* pxContactPoints);


protected:
	// Protected variables...

	// Protected functions...
	static u_int	ClipPolyToPlane(Asura_AVector3* pxInVertices, u_int uNumberOfVertices, Asura_AVector3* pxOutVertices, Asura_AVector3& xPlaneNormal, float fPlaneConstant);
	static u_int	ClipEdgeToPlane(Asura_AVector3* pxInVertices, Asura_AVector3* pxOutVertices, Asura_AVector3& xPlaneNormal, float fPlaneConstant);
	static u_int	ClipPolyToPoly(const Asura_AVector3* pxClipperVertices, const u_int uNumberOfClipperVertices, const Asura_AVector3* pxClippeeVertices, u_int uNumberOfClippeeVertices, Asura_AVector3* pxClippedVertices);
	static u_int	ClipEdgeToPoly(const Asura_AVector3* pxClipperVertices, const u_int uNumberOfClipperVertices, const Asura_AVector3* pxClippeeVertices, Asura_AVector3* pxClippedVertices);

	static void		ProjectVertexOntoEdge(const Asura_AVector3& xVertex, const Asura_AVector3* pxEdge, Asura_AVector3& xProjectedVertex);
	static void		ProjectEdgeOntoEdge(const Asura_AVector3* pxEdgeA, const Asura_AVector3* pxEdgeB, Asura_AVector3& xProjectedVertexA, Asura_AVector3& xProjectedVertexB);;
	static void		ProjectVertexOntoFace(const Asura_AVector3& xVertex, const Asura_AVector3* pxFace, Asura_AVector3& xProjectedVertex);
	static u_int	ProjectEdgeOntoFace(const Asura_AVector3* pxEdge, const Asura_AVector3* pxFace, Asura_AVector3* pxProjectedVerticesEdge, Asura_AVector3* pxProjectedVerticesFace, u_int uNumberOfVertsInFace);
	static u_int	ProjectFaceOntoFace(const Asura_AVector3* pxFaceA, const Asura_AVector3* pxFaceB, Asura_AVector3* pxProjectedVerticesFaceA, Asura_AVector3* pxProjectedVerticesFaceB, u_int uNumberOfVertsInFaceA, u_int uNumberOfVertsInFaceB);


private:
	// Private variables...

	// Private functions...
	AVP_Physics_OBBTests(void);
	AVP_Physics_OBBTests(const AVP_Physics_OBBTests& xOther);
	~AVP_Physics_OBBTests();

	AVP_Physics_OBBTests&	operator=(const AVP_Physics_OBBTests& xOther);

};   // End of class 'AVP_Physics_OBBTests'.


#endif   // ifndef __AVP_PHYSICS_OBBTESTS_H__


/// End of file. ///
