#ifndef SALMON_RENDER_INTERFACE_H_INCLUDED
#define SALMON_RENDER_INTERFACE_H_INCLUDED

#include "include/Utils/Utils.h"

#include "include/SimpleLand/SimpleLand.h"

#include "include/Render/RenderMisc.h"

#include "include/Render/SalmonRender/BackgroundCubemap.h"

#include "include/Render/RenderInterface.h"

namespace SE
{

class TSalmonRendererInterface : public TRendererInterface
{
protected:
	
	float CamAlpha;
	float CamPhi;
	float CamDist;
	vec3 CamShift;
	vec3 CamPos;  //Do not change - call CalcCamPosVec instead
	vec3 CamVec;  //Do not change - call CalcCamPosVec instead

	mat4 CamModelViewMatrix;
	mat4 CamInversedModelViewMatrix;

	float GlobalShadowAreaHalfSize;

	cardinal BkgTexID;
	std::string BkgShaderName;

	float FogBeginDistance;
	float FogEndDistance;
	vec4 FogColor;


	void CalcCamPosVec();

	virtual void DrawQuad(const T2DQuad& quad) = 0;
public:

	TSalmonRendererInterface();
	
	virtual void InitOpenGL(int screenWidth, int screenHeight, float matrixWidth, float matrixHeight);

	virtual void SetUniforms();

	void SetPerspectiveFullScreenViewport();
	void SetOrthoFullScreenViewport();

	mat4 GetModelviewMatrix();

	void SetPerspectiveProjectionMatrix(float angle, float aspect, float zNear, float zFar);
    void PushPerspectiveProjectionMatrix(float angle, float aspect, float zNear, float zFar);

	void SetGLCamAngleView();
	void SetGLCamView();
	void SetGlIdentityView();
	void SetGlPosXView(bool renderToFrame = false);
	void SetGlNegXView(bool renderToFrame = false);
	void SetGlPosYView(bool renderToFrame = false);
	void SetGlNegYView(bool renderToFrame = false);
	void SetGlPosZView(bool renderToFrame = false);
	void SetGlNegZView(bool renderToFrame = false);


	void MoveAlpha(float dAlpha);
	void MovePhi(float dPhi);
	void MoveDist(float dDist);

	void SetAlpha(float alpha);
	vec3 GetCamPos();

	void MoveForward();
	void MoveBackward();
	void MoveLeft();
	void MoveRight();

	virtual void SwitchToScreen();
	virtual void SwitchToFrameBuffer(const std::string& frameName);
	void SwitchToCubemapBuffer(const std::string& frameName,cardinal cubeSide);
	
	void BeginDrawToDepthBufferGlobal(std::string& globalBufferName);
	void BeginDrawToDepthBufferLocal(std::string& localBufferName);
	void EndDrawToDepthBuffer();

	void SetBackgroundCubemap(cardinal bkgTex) { BkgTexID = bkgTex; }
	void SetBackgroundShader(const std::string& shaderName) { BkgShaderName = shaderName; }

	void DrawBackground();

	float GetFogBeginDistance();
	float GetFogEndDistance();
	vec4 GetFogColor();


	void SetFogBeginDistance(float distance);
	void SetFogEndDistance(float distance);
	
};

} //namespace SE

#endif