Supermodel/Src/Graphics/New3D/R3DShader.h

135 lines
3.1 KiB
C
Raw Normal View History

#ifndef _R3DSHADER_H_
#define _R3DSHADER_H_
2020-07-31 19:18:51 +00:00
#include <GL/glew.h>
#include "Util/NewConfig.h"
#include "Model.h"
#include <map>
#include <string>
namespace New3D {
class R3DShader
{
public:
R3DShader(const Util::Config::Node &config);
bool LoadShader (const char* vertexShader = nullptr, const char* fragmentShader = nullptr);
void UnloadShader ();
void SetMeshUniforms (const Mesh* m);
void SetModelStates (const Model* model);
void SetViewportUniforms (const Viewport *vp);
void Start ();
void SetShader (bool enable = true);
GLint GetVertexAttribPos (const std::string& attrib);
void DiscardAlpha (bool discard); // use to remove alpha from texture alpha only polys for 1st pass
void SetLayer (Layer layer);
private:
void PrintShaderResult(GLuint shader);
void PrintProgramResult(GLuint program);
// run-time config
const Util::Config::Node &m_config;
// shader IDs
GLuint m_shaderProgram;
GLuint m_vertexShader;
GLuint m_geoShader;
GLuint m_fragmentShader;
// mesh uniform locations
GLint m_locTextureBank[2]; // 2 banks
GLint m_locTexture1Enabled; // base texture
GLint m_locTexture2Enabled; // micro texture
GLint m_locTexturePage;
GLint m_locTextureAlpha;
GLint m_locAlphaTest;
2017-08-10 15:43:03 +00:00
GLint m_locMicroTexScale;
GLint m_locMicroTexID;
GLint m_locBaseTexInfo;
GLint m_locBaseTexType;
2017-08-10 15:43:03 +00:00
GLint m_locTextureInverted;
GLint m_locTexWrapMode;
GLint m_locTranslatorMap;
GLint m_locColourLayer;
GLint m_locPolyAlpha;
2017-08-10 15:43:03 +00:00
// cached mesh values
bool m_textured1;
2016-05-04 00:35:07 +00:00
bool m_textured2;
bool m_textureAlpha; // use alpha in texture
bool m_alphaTest; // discard fragment based on alpha (ogl does this with fixed function)
float m_fogIntensity;
2017-08-10 15:43:03 +00:00
bool m_lightEnabled;
float m_shininess;
float m_specularValue;
bool m_specularEnabled;
bool m_fixedShading;
bool m_translatorMap;
bool m_polyAlpha;
int m_texturePage;
2017-08-10 15:43:03 +00:00
bool m_layered;
bool m_noLosReturn;
2017-08-10 15:43:03 +00:00
float m_microTexScale;
int m_microTexID;
int m_baseTexInfo[4];
int m_baseTexType;
int m_texWrapMode[2];
2017-08-10 15:43:03 +00:00
bool m_textureInverted;
2017-08-10 15:43:03 +00:00
// cached model values
float m_modelScale;
float m_nodeAlpha;
int m_transX;
int m_transY;
int m_transPage;
// are our cache values dirty
bool m_dirtyMesh;
bool m_dirtyModel;
// viewport uniform locations
GLint m_locFogIntensity;
GLint m_locFogDensity;
GLint m_locFogStart;
GLint m_locFogColour;
GLint m_locFogAttenuation;
GLint m_locFogAmbient;
GLint m_locProjMat;
// lighting / other
GLint m_locLighting;
GLint m_locLightEnabled;
2017-08-10 15:43:03 +00:00
GLint m_locSunClamp;
GLint m_locIntensityClamp;
GLint m_locShininess;
GLint m_locSpecularValue;
GLint m_locSpecularEnabled;
GLint m_locFixedShading;
2017-08-10 15:43:03 +00:00
GLint m_locSpotEllipse;
GLint m_locSpotRange;
GLint m_locSpotColor;
GLint m_locSpotFogColor;
2017-08-10 15:43:03 +00:00
// model uniforms
GLint m_locModelScale;
GLint m_locNodeAlpha;
GLint m_locModelMat;
// global uniforms
GLint m_locHardwareStep;
GLint m_locDiscardAlpha;
// vertex attribute position cache
std::map<std::string, GLint> m_vertexLocCache;
};
} // New3D
#endif