//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Model loading / unloading interface
//
// $NoKeywords: $
//=============================================================================//

#ifndef OVERLAY_H
#define OVERLAY_H

#ifdef _WIN32
#pragma once
#endif


// This is a workaround for the fact that we get massive decal flicker
// when looking at a decal at a glancing angle while standing right next to it.
#define OVERLAY_AVOID_FLICKER_NORMAL_OFFSET	0.1f


//-----------------------------------------------------------------------------
// Overlay fragments
//-----------------------------------------------------------------------------
typedef unsigned short OverlayFragmentHandle_t;

enum
{
	OVERLAY_FRAGMENT_INVALID = (OverlayFragmentHandle_t)~0
};


//=============================================================================
//
// Overlay Manager Interface
//
class IOverlayMgr
{
public:
	// Memory allocation/de-allocation.
	virtual bool	LoadOverlays( ) = 0;
	virtual void	UnloadOverlays( ) = 0;

	virtual void	CreateFragments( void ) = 0;

	virtual void	ReSortMaterials( void ) = 0;

	// Drawing
	// clears all
	virtual void	ClearRenderLists() = 0;
	// clears a particular sort group
	virtual void	ClearRenderLists( int nSortGroup ) = 0;
	virtual void	AddFragmentListToRenderList( int nSortGroup, OverlayFragmentHandle_t iFragment, bool bDisp ) = 0;
	virtual void	RenderOverlays( int nSortGroup ) = 0;

	// Sets the client renderable for an overlay's material proxy to bind to
	virtual void	SetOverlayBindProxy( int iOverlayID, void *pBindProxy ) = 0;
};


//-----------------------------------------------------------------------------
// Overlay manager singleton
//-----------------------------------------------------------------------------
IOverlayMgr *OverlayMgr();

#endif // OVERLAY_H