//////////////////////////////////////////////////////////////////////////////
//
// AVP_LOS.h
//
// Copyright (c) 2005 Rebellion. All rights reserved.
//
// Description:
//
//     basic shell to handle switching between Game and Tools
//
//////////////////////////////////////////////////////////////////////////////

// B E G I N   F I L E   W R A P P E R ///////////////////////////////////////

#ifdef ASURA_USE_PRAGMA_ONCE
    #pragma once
#endif

#ifndef ___AVP_LOS_H___
#define ___AVP_LOS_H___ 1

//////////////////////////////////////////////////////////////////////////
// I N C L U D E   F I L E S /////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////

#include "Core/Asura_LOS.h"

//////////////////////////////////////////////////////////////////////////
// F O R W A R D   D E C L A R A T I O N S ///////////////////////////////
//////////////////////////////////////////////////////////////////////////
class Asura_LOS_OutputData;
class Asura_LOS_InputData;
class Asura_Entity_Renderable;

//////////////////////////////////////////////////////////////////////////
// C L A S S   D E C L A R A T I O N S ///////////////////////////////////
//////////////////////////////////////////////////////////////////////////
class AVP_LOS
{
public:
	static const Asura_LOS_OutputData* TestAgainstAlmostEverything( const Asura_LOS_InputData* pxInputData, const u_int uNumClassificationExceptions = 0, const u_short* ausClassification = NULL, const u_int uNumGuidExceptions = 0, const Asura_Guid* auGuid = NULL );
	static const Asura_LOS_OutputData* TestAgainstEnvironmentAndMoveableObjects( const Asura_LOS_InputData* pxData );

	static unsigned int GetLOSTestCount()    { return s_uLOSTestCount; }
	static void         ResetLOSTestStats()  { s_uLOSTestCount = 0; }

	class ExceptionFunctor
	{
	public:
		ExceptionFunctor( Asura_LOS_OutputData& xOutputData, const u_int uNumClassificationExceptions, const u_short* ausClassification, const u_int uNumGuidExceptions, const Asura_Guid* auGuid );

		bool CheckEntity( Asura_Entity_Renderable* pxEntity, const Asura_LOS_InputData& xInputData );
		float GetInitialMaxDistance() { return m_rxOutData.m_fDistanceToIntersection; }
		float GetMaxDistance() { return m_rxOutData.m_fDistanceToIntersection; }
		bool ShouldStop() { return false; }

	private:
		Asura_LOS_OutputData&	m_rxOutData;
		const u_int				m_uNumClassificationExceptions;
		const u_short* const	m_ausClassification;
		const u_int				m_uNumGuidExceptions;
		const Asura_Guid* const	m_auGuid;
	};

private:
	static bool TestAgainstPhysics( const Asura_LOS_InputData* pxData );
	static bool TestAgainstLifts( const Asura_LOS_InputData* pxData );
	static Asura_LOS_OutputData s_xOutData;
	static unsigned int         s_uLOSTestCount;
};


// E N D   F I L E   W R A P P E R ///////////////////////////////////////////

#endif // #ifndef ___AVP_LOS_H___
