/* -----------------------------------------------------------------------------
	GSFramework
	Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */


#ifndef	__NRENDERERENVINTERFACE__
#define	__NRENDERERENVINTERFACE__


		#include "core/render_data.h"
		#include "color/color.h"
		#include "container/nlist.h"


namespace GS {
	struct Vector4;
	class Frustum;

	namespace Core {
		class Camera;
		class Light;
	}
	namespace Render {

/*
	@short	Renderer environment interface.
	Used by the renderer to communicate events and query environment informations.
*/
struct	IEnvironment
{
		/// Get environment clock.
virtual	float		GetClock() const { return 0; }

		/// Get environment time of day.
virtual	float		GetTimeOfDay() const { return 0.f; }
		/// Get user sky box shader.
virtual	Shader		 *GetSkyboxShader() const { return 0; }
		/// Get sky box texture layers.
virtual	bool		GetSkyboxLayers(sTexture [2]) const { return false; }

		/// Get clear color.
virtual	Color		GetClearColor() const { return Color::Black; }
		/// Get ambient color.
virtual	Color		GetAmbientColor() const { return Color::Black; }
		/// Get environment probe.
virtual	void		GetEnvironmentProbe(sTexture &/*radiance*/, sTexture &/*irradiance*/) const {}

		/// Get current camera.
virtual	Core::Camera *GetCurrentCamera() const { return 0; }

		/// Get all lights in frustum.
virtual	void		GetLightsInFrustum(const Vector4 &/*world_pos*/, const Frustum &/*frustum*/, List <Core::Light *> &/*list*/, uint /*limit*/ = 0) const = 0;
		/// Get closest lights.
virtual	void		GetClosestLights(const Vector4 &/*world_pos*/, List <Core::Light *> &/*list*/, uint /*limit*/ = 0) const = 0;

		/// Get fog enabled.
virtual	bool		IsFogEnabled() const { return false; }
		/// Get fog configuration.
virtual	bool		GetFogConfiguration(Color &color, float &fog_near, float &fog_far) const { return false; }

		/// Render user/debug primitive hook.
virtual	void		OnRenderUser(Renderer *) const {}

virtual	~IEnvironment() {}
};

	} // Render
} // GS


#endif	// __NRENDERERENVINTERFACE__
