GlistEngine
Loading...
Searching...
No Matches
gShader.h
Go to the documentation of this file.
1/*
2 * gShader.h
3 *
4 * Created on: May 7, 2020
5 * Author: noyan
6 */
7
8#ifndef ENGINE_GRAPHICS_GSHADER_H_
9#define ENGINE_GRAPHICS_GSHADER_H_
10
11#include "gRenderer.h"
12#include <string>
13#include <unordered_map>
14#include "gRenderObject.h"
15
16template<typename T>
17class gUbo;
18
19class gShader : public gRenderObject {
20public:
22 gShader(const std::string& shaderFullPath);
23 gShader(const std::string& vertexFullPath, const std::string& fragmentFullPath, const std::string& geometryFullPath = "");
25
26 void load(const std::string& shaderFullPath);
27 void load(const std::string& vertexFullPath, const std::string& fragmentFullPath, const std::string& geometryFullPath = "");
28
29 void loadShader(const std::string& shaderFilename);
30 void loadShader(const std::string& vertexFileName, const std::string& fragmentFileName, const std::string& geometryFileName = "");
31
32 void loadProgram(const std::string& vertexSource, const std::string& fragmentSource, const std::string& geometrySource = "");
33 void loadProgram(const std::string& shaderSource);
34
35 template<typename T>
36 void attachUbo(const std::string& uboName, const gUbo<T>* ubo) {
37 ubos[uboName] = ubo->getBindingPoint();
38 use();
39 renderer->attachUbo(id, ubo->getBindingPoint(), uboName);
40 }
41
42 bool loaded;
43 GLuint id;
44
45 void use() const;
46 void setBool(const std::string &name, bool value);
47 void setInt(const std::string &name, int value);
48 void setUnsignedInt(const std::string &name, unsigned int value);
49 void setFloat(const std::string &name, float value);
50 void setVec2(const std::string &name, const glm::vec2 &value);
51 void setVec2(const std::string &name, float x, float y);
52 void setVec3(const std::string &name, const glm::vec3 &value);
53 void setVec3(const std::string &name, float x, float y, float z);
54 void setVec4(const std::string &name, const glm::vec4 &value);
55 void setVec4(const std::string &name, float x, float y, float z, float w);
56 void setMat2(const std::string &name, const glm::mat2 &mat);
57 void setMat3(const std::string &name, const glm::mat3 &mat);
58 void setMat4(const std::string &name, const glm::mat4 &mat);
59
60 GLint getUniformLocation(const std::string& name);
61
62private:
63 enum class ShaderType {
64 VERTEX,
65 FRAGMENT,
66 GEOMETRY
67 };
68
69 void loadProgramInternal(const char* vertexSource, const char* fragmentSource, const char* geometrySource);
70
71 void checkCompileErrors(GLuint shader, const std::string& type, const char* shaderCode);
72 std::string preprocessShader(const std::string& shaderCode, std::unordered_map<std::string, std::string> defines);
73 std::unordered_map<std::string, std::string> generateDefines(ShaderType type);
74
75 std::unordered_map<std::string, GLint> uniformlocations;
76 std::unordered_map<std::string, GLuint> ubos;
77
78 std::unordered_map<GLint, int> cachedints;
79 std::unordered_map<GLint, float> cachedfloats;
80 std::unordered_map<GLint, glm::vec2> cachedvec2s;
81 std::unordered_map<GLint, glm::vec3> cachedvec3s;
82 std::unordered_map<GLint, glm::vec4> cachedvec4s;
83 std::unordered_map<GLint, glm::mat2> cachedmat2s;
84 std::unordered_map<GLint, glm::mat3> cachedmat3s;
85 std::unordered_map<GLint, glm::mat4> cachedmat4s;
86 void clearUniformCaches();
87};
88
89#endif /* ENGINE_GRAPHICS_GSHADER_H_ */
Definition gRenderObject.h:25
virtual void attachUbo(GLuint id, int bindingpoint, const std::string &uboName)=0
Definition gShader.h:19
void setMat2(const std::string &name, const glm::mat2 &mat)
void load(const std::string &shaderFullPath)
void setInt(const std::string &name, int value)
gShader(const std::string &shaderFullPath)
void setVec3(const std::string &name, const glm::vec3 &value)
gShader(const std::string &vertexFullPath, const std::string &fragmentFullPath, const std::string &geometryFullPath="")
void setVec4(const std::string &name, const glm::vec4 &value)
GLuint id
Definition gShader.h:43
void setVec2(const std::string &name, float x, float y)
void setUnsignedInt(const std::string &name, unsigned int value)
GLint getUniformLocation(const std::string &name)
void loadShader(const std::string &vertexFileName, const std::string &fragmentFileName, const std::string &geometryFileName="")
void attachUbo(const std::string &uboName, const gUbo< T > *ubo)
Definition gShader.h:36
void loadProgram(const std::string &vertexSource, const std::string &fragmentSource, const std::string &geometrySource="")
void setBool(const std::string &name, bool value)
bool loaded
Definition gShader.h:42
void setVec4(const std::string &name, float x, float y, float z, float w)
void use() const
void setFloat(const std::string &name, float value)
void loadProgram(const std::string &shaderSource)
void setMat3(const std::string &name, const glm::mat3 &mat)
void setVec2(const std::string &name, const glm::vec2 &value)
void loadShader(const std::string &shaderFilename)
void setVec3(const std::string &name, float x, float y, float z)
void setMat4(const std::string &name, const glm::mat4 &mat)
void load(const std::string &vertexFullPath, const std::string &fragmentFullPath, const std::string &geometryFullPath="")
Definition gUbo.h:12
int getBindingPoint() const
Definition gUbo.h:61
gRenderer * renderer