//
// Asura_SpecialFX.h
//
// Created by Kevin Lea - 03/10/2001 11:18:39
// 
// Copyright (C) 2001 Rebellion, All Rights Reserved.
//

#ifdef ASURA_USE_PRAGMA_ONCE
    #pragma once
#endif

#ifndef __ASURA_SPECIALFX_H__
#define __ASURA_SPECIALFX_H__

#include "Core/Asura_Hash.h"

class Asura_SpecialFX_System
{
	public:
		static void Initialise(void);
		static void Shutdown(void);
		static void Reset(void);

		static void Update(void);
		static void FinishAllJobs(void);
		static void Render(void);
		static void RenderHUDEffects(void);
		static void RenderDecals();
		static void RenderSkyboxEffects();
		static void RenderProjectEffects();
		static void Render2DEffects();
#ifdef ASURA_USE_3DDECAL_SYSTEM
		static void Render3dDecalsPreWorld();
		static void Render3dDecalsPostWorld();
#endif

#if defined(ASURA_USE_MULTIPLE_ZONE_HANDLERS)
		// Create handlers for all subsystems
		static void	CreateSubsystemHandlers(const Asura_Hash_ID uHash);
		static void	DestroySubsystemHandlers(const Asura_Hash_ID uHash);
		static void	CreateAndSetSubsystemHandlers(const Asura_Hash_ID uHash);
		static void SetCurrentSubsystemHandlers(const Asura_Hash_ID uHash);
#endif	// defined(ASURA_USE_MULTIPLE_ZONE_HANDLERS)
	private:
		enum RenderType
		{
			RT_MAIN,
			RT_HUD_EFFECTS,
			RT_DECALS,
			RT_SKYBOX_EFFECTS,
			RT_PROJECT_EFFECTS,
			RT_2D_EFFECTS,
#if defined(ASURA_USE_3DDECAL_SYSTEM)
			RT_3D_DECALS_PRE_WORLD,
			RT_3D_DECALS_POST_WORLD,
#endif	//defined(ASURA_USE_3DDECAL_SYSTEM)

			MAX_RENDER_TYPES
		};

		static void Project_Initialise(void);
		static void Project_Shutdown(void);
		static void Project_Reset(void);
		static void Project_Update(void);
		static void Project_Render(void);
		static void Project_RenderLate(void);
#ifdef ASURA_USE_HDR
		static void Project_RenderPostToneMap(void);
#endif

		static void Platform_Initialise(void);
		static void Platform_Shutdown(void);
		static void Platform_Reset(void);
		static void Platform_Update(void);

		static void Platform_BeginRender(const RenderType eRenderType);
		static void Platform_Render(void);
		static void Platform_EndRender(const RenderType eRenderType);
};


#endif//__ASURA_SPECIALFX_H__
