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

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

#ifndef __AVP_CALCULATESURFACEREORIENTATIONNORMAL_ENVCACHE_H__
#define __AVP_CALCULATESURFACEREORIENTATIONNORMAL_ENVCACHE_H__

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

#include "Physics/Asura_Physics_EnvironmentCache.h"

#include "Physics/AVP_CalculateSurfaceReorientationNormal.h"


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


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

////////////////////////////////////////////////////////////////////////////////
// Class        : AVP_CalculateSurfaceReorientationNormal_EnvCache
// Author       : Andy Tate
// Date         : 5-Feb-2008
//
// Description  : Class used to calculate the normal to be used when applying
//				  surface-reorientation to a physics-object using a separate
//				  environment-cache.
////////////////////////////////////////////////////////////////////////////////

class AVP_CalculateSurfaceReorientationNormal_EnvCache : public AVP_CalculateSurfaceReorientationNormal
{
public:
	// Public functions...
	AVP_CalculateSurfaceReorientationNormal_EnvCache(const float fCosLimit, const u_short usPolyFlagsToIgnore);
	//virtual ~AVP_CalculateSurfaceReorientationNormal_EnvCache();

	// Overridden functions...
	virtual void	Update(Asura_Physics_Object& xPhysicsObject, Asura_AVector3_InParam xInputVelocity, Asura_AVector3_InParam xInputNormal);


protected:
	// Protected variables...
	Asura_Physics_EnvironmentCache	m_xEnvironmentCache;	// The environment-cache to use for surface re-orientation.

	Asura_OBB						m_xPhysicsOBB;			// The OBB used for the current physics-object.
	Asura_OBB						m_xQueryOBB;			// The OBB used for the querying of collision polygons.

	// Protected functions...
	void	UpdateNormalAndVelocityForTriangle(const Asura_Physics_Tri& xTriangle, Asura_AVector3_InParam xInputVelocity);
	void	UpdateNormalForEnvironment(const Asura_Physics_Object& xPhysicsObject, Asura_AVector3_InParam xInputVelocity);
	void	UpdateNormalForObject(const Asura_Physics_Object& xPhysicsObject, Asura_AVector3_InParam xInputVelocity);


private:
	// Private typedefs...
	typedef AVP_CalculateSurfaceReorientationNormal PARENT;

	// Private variables...

	// Private functions...
	AVP_CalculateSurfaceReorientationNormal_EnvCache(void);
	AVP_CalculateSurfaceReorientationNormal_EnvCache(const AVP_CalculateSurfaceReorientationNormal_EnvCache& xOther);

	AVP_CalculateSurfaceReorientationNormal_EnvCache&	operator=(const AVP_CalculateSurfaceReorientationNormal_EnvCache& xOther);

};   // End of class 'AVP_CalculateSurfaceReorientationNormal_EnvCache'.


#endif   // ifndef __AVP_CALCULATESURFACEREORIENTATIONNORMAL_ENVCACHE_H__


/// End of file. ///
