engine/include/ShaderManager/ShaderManager.h
2013-02-10 19:08:19 +00:00

161 lines
6.2 KiB
C++

#ifndef SHADER_MANAGER_H_INCLUDED
#define SHADER_MANAGER_H_INCLUDED
/*
This code contains shader manager
*/
#include <stack>
#ifdef TARGET_WIN32
#include "../OpenGlExt/OpenGlExt.h"
#endif
#include "include/Utils/Utils.h"
namespace SE
{
//==============================================
//=============== CONST AREA ===================
//==============================================
//Global uniforms (must remain same from shader to shader)
//If you add a new one - put it to SetCurrentShader() too
const std::string CONST_STRING_TEXTURE_UNIFORM = "Texture";
const std::string CONST_STRING_NORMALMAP_UNIFORM = "NormalMap";
const std::string CONST_STRING_SHADOWMAPGLOBAL_UNIFORM = "ShadowMapGlobal";
const std::string CONST_STRING_SHADOWMAPLOCAL_UNIFORM = "ShadowMapLocal";
const std::string CONST_STRING_ENV_UNIFORM = "Env";
const std::string CONST_STRING_NORMALMAPEXISTS_UNIFORM = "NormalMapExists";
const std::string CONST_STRING_LIGHT_POS_UNIFORM = "LightPos";
const std::string CONST_STRING_LIGHT_DIRECTION_UNIFORM = "LightDirection";
const std::string CONST_STRING_LIGHT_COLOR_UNIFORM = "LightColor";
const std::string CONST_STRING_CAMPOS_UNIFORM = "CamPos";
const std::string CONST_STRING_SHADOWCLAMPVALUE_UNIFORM = "ShadowClampValue";
const std::string CONST_STRING_FOG_BEGIN_DISTANCE_UNIFORM = "FogBeginDistance";
const std::string CONST_STRING_FOG_END_DISTANCE_UNIFORM = "FogEndDistance";
const std::string CONST_STRING_FOG_COLOR_UNIFORM = "FogColor";
const std::string CONST_STRING_MATERIAL_COLOR_UNIFORM = "MaterialColor";
const std::string CONST_STRING_TRANSPARENCY_UNIFORM = "Transparency";
//For Halibut Render
const std::string CONST_STRING_HALIBUT_PROJECTION_MATRIX_UNIFORM = "ProjectionMatrix";
//Local uniforms (need to be setup before each draw)
const std::string CONST_STRING_MODELROTATEMATRIX_UNIFORM = "ModelRotateMatrix";
const std::string CONST_STRING_MODELTRANSLATEVECTOR_UNIFORM = "ModelTranslateVector";
//Attributes
const std::string CONST_STRING_POSITION_ATTRIB = "vPosition";
const std::string CONST_STRING_TEXCOORD_ATTRIB = "vTexCoord";
const std::string CONST_STRING_NORMAL_ATTRIB = "Normal";
const std::string CONST_STRING_TANGENT_ATTRIB = "Tangent";
const std::string CONST_STRING_BINORMAL_ATTRIB = "Binormal";
//======================================
class TShaderManager; //see below
class TShaderResource
{
protected:
cardinal ShaderProgram;
std::map<std::string,cardinal,std::less<std::string> > UniformList;
std::map<std::string,cardinal,std::less<std::string> > AttribList;
public:
TShaderResource();
~TShaderResource();
bool CompileShader(boost::shared_array<char> vertexCode, boost::shared_array<char> fragmentCode);
void FreeShader();
int GetAttribIndex(const std::string& attribName);
int GetUniformIndex(const std::string& uniformName);
friend void RenderUniform1f(const std::string& uniformName, const float value);
friend void RenderUniform3fv(const std::string& uniformName, const float* value);
friend void RenderUniform4fv(const std::string& uniformName, const float* value);
friend void RenderUniformMatrix3fv(const std::string& uniformName, bool transpose, const float* value);
friend void RenderUniformMatrix4fv(const std::string& uniformName, bool transpose, const float* value);
friend void RenderUniform1i(const std::string& uniformName, const int value);
friend void VertexAttrib2fv(const std::string& attribName, const float* value);
friend void VertexAttrib3fv(const std::string& attribName, const float* value);
friend void VertexAttribPointer2fv(const std::string& attribName,int stride, const char* pointer);
friend void VertexAttribPointer3fv(const std::string& attribName,int stride, const char* pointer);
friend void EnableVertexAttribArray(const std::string& attribName);
friend void DisableVertexAttribArray(const std::string& attribName);
#ifdef TARGET_WIN32
friend void RefreshAttribBuffer2fv(const std::string& attribName, std::map<std::string, std::vector<vec2> >& vec2CoordArr);
friend void RefreshAttribBuffer3fv(const std::string& attribName, std::map<std::string, std::vector<vec3> >& vec3CoordArr);
#endif
friend class TShaderManager;
};
class TShaderManager : public TSerializeInterface
{
protected:
std::map<std::string, std::shared_ptr<TShaderResource>, std::less<std::string> > ShaderList;
std::stack<std::string> ShaderNameStack;
//To be called only by SalmonRander/HalibutRender!!!
void PushShader(const std::string& shaderName);
void PopShader();
public:
TShaderManager() {}
~TShaderManager();
std::shared_ptr<TShaderResource> GetCurrentShader();
virtual void Serialize(boost::property_tree::ptree& propertyTree);
bool AddShader(const std::string& shaderName, const std::string& vertexFileName, const std::string& fragmentFileName);
void Clear();
friend class TSalmonRendererInterface;
};
//Dont forget to make them friend to TShaderResource
void RenderUniform1f(const std::string& uniformName, const float value);
void RenderUniform3fv(const std::string& uniformName, const float* value);
void RenderUniform4fv(const std::string& uniformName, const float* value);
void RenderUniformMatrix3fv(const std::string& uniformName, bool transpose, const float* value);
void RenderUniformMatrix4fv(const std::string& uniformName, bool transpose, const float* value);
void RenderUniform1i(const std::string& uniformName, const int value);
void VertexAttrib2fv(const std::string& attribName, const float* value);
void VertexAttrib3fv(const std::string& attribName, const float* value);
void VertexAttribPointer2fv(const std::string& attribName, int stride, const char* pointer);
void VertexAttribPointer3fv(const std::string& attribName, int stride, const char* pointer);
void EnableVertexAttribArray(const std::string& attribName);
void DisableVertexAttribArray(const std::string& attribName);
#ifdef TARGET_WIN32
void RefreshAttribBuffer2fv(const std::string& attribName, std::map<std::string, std::vector<vec2> >& vec2CoordArr);
void RefreshAttribBuffer3fv(const std::string& attribName, std::map<std::string, std::vector<vec3> >& vec3CoordArr);
#endif
} //namespace SE
#endif