Muto 0.0.1
Cross-Platform Application Template
GitHub Repo | Muto Updates | Muto's Author
Loading...
Searching...
No Matches
Muto::OpenGLShader Class Reference

#include <OpenGLShader.h>

Inheritance diagram for Muto::OpenGLShader:
Muto::Shader

Public Member Functions

void Bind () const override
 connects the shader program for use.
 
virtual const std::string & GetName () const override
 
 OpenGLShader (const std::string &filepath)
 
 OpenGLShader (const std::string &name, const std::string &vertexSrc, const std::string &fragmentSrc)
 
virtual void SetFloat (const std::string &name, float value) override
 Sets a single float uniform in the shader.
 
virtual void SetFloat3 (const std::string &name, const glm::vec3 &value) override
 Sets a 3-component float vector uniform in the shader.
 
virtual void SetFloat4 (const std::string &name, const glm::vec4 &value) override
 Sets a 4-component float vector uniform in the shader.
 
virtual void SetInt (const std::string &name, int value) override
 Sets a single integer uniform in the shader.
 
virtual void SetIntArray (const std::string &name, int *values, uint32_t count) override
 Sets an array of integers uniform in the shader.
 
virtual void SetMat4 (const std::string &name, const glm::mat4 &value) override
 Sets a 4x4 matrix uniform in the shader.
 
void Unbind () const override
 disconnects the shader program.
 
void UploadUniformFloat (const std::string &name, float value)
 
void UploadUniformFloat2 (const std::string &name, const glm::vec2 &values)
 
void UploadUniformFloat3 (const std::string &name, const glm::vec3 &values)
 
void UploadUniformFloat4 (const std::string &name, const glm::vec4 &values)
 
void UploadUniformInt (const std::string &name, int value)
 
void UploadUniformMat3 (const std::string &name, const glm::mat3 &matrix)
 
void UploadUniformMat4 (const std::string &name, const glm::mat4 &matrix)
 
 ~OpenGLShader ()
 
- Public Member Functions inherited from Muto::Shader
virtual ~Shader ()=default
 

Private Member Functions

void Compile (std::unordered_map< GLenum, std::string > &shaderSources)
 
std::unordered_map< GLenum, std::string > PreProcess (const std::string &source)
 
std::string ReadFile (const std::string &filepath)
 

Private Attributes

std::string m_Name
 
unsigned int m_RendererID
 

Additional Inherited Members

- Static Public Member Functions inherited from Muto::Shader
static Ref< Shader > Create (const std::string &filepath)
 Creates a shader from a file.
 
static Ref< Shader > Create (const std::string &name, const std::string &vertexSrc, const std::string &fragmentSrc)
 Creates a new shader from vertex and fragment shader source code.
 

Constructor & Destructor Documentation

◆ OpenGLShader() [1/2]

Muto::OpenGLShader::OpenGLShader ( const std::string &  filepath)
22 {
24 std::string shaderSrc = ReadFile(filepath);
27
28 // Extract name from filepath
29 auto lastSlash = filepath.find_last_of("/\\");
30 lastSlash = lastSlash == std::string::npos ? 0 : lastSlash + 1;
31 auto lastDot = filepath.rfind('.');
32 auto count = lastDot == std::string::npos ? filepath.size() - lastSlash : lastDot - lastSlash;
33 m_Name = filepath.substr(lastSlash, count);
34 }
#define MU_PROFILE_FUNCTION()
Definition Instrumentor.h:240
std::string ReadFile(const std::string &filepath)
Definition OpenGLShader.cpp:52
std::string m_Name
Definition OpenGLShader.h:46
std::unordered_map< GLenum, std::string > PreProcess(const std::string &source)
Definition OpenGLShader.cpp:72
void Compile(std::unordered_map< GLenum, std::string > &shaderSources)
Definition OpenGLShader.cpp:97
constexpr Scope< T > CreateScope(Args &&... args)
Creates a Scope (unique_ptr) for the given type and constructor arguments.
Definition Defines_Macros.h:51

References m_Name, and ReadFile().

◆ OpenGLShader() [2/2]

Muto::OpenGLShader::OpenGLShader ( const std::string &  name,
const std::string &  vertexSrc,
const std::string &  fragmentSrc 
)
37 : m_Name(name)
38 {
40 std::unordered_map<GLenum, std::string> sources;
44 }

References m_Name.

◆ ~OpenGLShader()

Muto::OpenGLShader::~OpenGLShader ( )
47 {
50 }
unsigned int m_RendererID
Definition OpenGLShader.h:45

References m_RendererID.

Member Function Documentation

◆ Bind()

void Muto::OpenGLShader::Bind ( ) const
overridevirtual

connects the shader program for use.

Implements Muto::Shader.

174 {
177 }

References m_RendererID.

◆ Compile()

void Muto::OpenGLShader::Compile ( std::unordered_map< GLenum, std::string > &  shaderSources)
private
98 {
101
102 std::array<GLenum, 2> shaderIDs;
103 MU_CORE_ASSERT(shaderSources.size() <= shaderIDs.size(), "We only support 2 shaders for now!");
104 int glShaderIDIndex = 0;
105
106 for (auto& kv : shaderSources)
107 {
108 GLenum type = kv.first;
109 const std::string& source = kv.second;
110
112
113 const GLchar* shaderSource = source.c_str();
115
117
118 GLint isCompiled = 0;
120 if (isCompiled == GL_FALSE)
121 {
122 GLint maxLength = 0;
124
125 std::vector<GLchar> infoLog(maxLength);
127
129
130 MU_CORE_ERROR("{0}", infoLog.data());
131 MU_CORE_ASSERT(false, "Shader compilation failure!");
132 break;
133 }
136 }
137
138 // Link our program
140
141 // Note the different functions here: glGetProgram* instead of glGetShader*.
142 GLint isLinked = 0;
144 if (isLinked == GL_FALSE)
145 {
146 GLint maxLength = 0;
148
149 // The maxLength includes the NULL character
150 std::vector<GLchar> infoLog(maxLength);
152
153 // We don't need the program anymore.
155
156 for (auto id : shaderIDs)
158
159 MU_CORE_ERROR("{0}", infoLog.data());
160 MU_CORE_ASSERT(false, "Shader link failure!");
161 return;
162 }
163
164 for (auto id : shaderIDs)
165 {
167 }
168
170
171 }
#define MU_CORE_ASSERT(x,...)
Definition Asserts.h:32
#define MU_CORE_ERROR(...)
error: indicates an error that has occurred
Definition Log.h:42
unsigned int GLenum
Definition OpenGLShader.h:7

References m_RendererID.

◆ GetName()

virtual const std::string & Muto::OpenGLShader::GetName ( ) const
inlineoverridevirtual

Implements Muto::Shader.

28{ return m_Name; }

References m_Name.

◆ PreProcess()

std::unordered_map< GLenum, std::string > Muto::OpenGLShader::PreProcess ( const std::string &  source)
private
73 {
75 std::unordered_map<GLenum, std::string> shaderSources;
76
77 const char* typeToken = "#type";
79 size_t pos = source.find(typeToken, 0); // Start of shader type declaration line
80 while (pos != std::string::npos)
81 {
82 size_t eol = source.find_first_of("\r\n", pos); // End of shader type declaration line
83 MU_CORE_ASSERT(eol != std::string::npos, "Syntax error");
84
85 size_t begin = pos + typeTokenLength + 1; // Start of shader type name (after "#type " keyword)
86 std::string type = source.substr(begin, eol - begin);
87 MU_CORE_ASSERT(ShaderTypeFromString(type), "Invalid shader type specified");
88 size_t nextLinePos = source.find_first_not_of("\r\n", eol); // Start of shader code after shader type declaration line
89 MU_CORE_ASSERT(nextLinePos != std::string::npos, "Syntax error");
90
91 pos = source.find(typeToken, nextLinePos); // Start of next shader type declaration line
92 shaderSources[ShaderTypeFromString(type)] = (pos == std::string::npos) ? source.substr(nextLinePos) : source.substr(nextLinePos, pos - nextLinePos);
93 }
94 return shaderSources;
95 }
static GLenum ShaderTypeFromString(const std::string &type)
Definition OpenGLShader.cpp:10

References Muto::ShaderTypeFromString().

◆ ReadFile()

std::string Muto::OpenGLShader::ReadFile ( const std::string &  filepath)
private
53 {
55 std::string result;
56 std::ifstream in(filepath, std::ios::in | std::ios::binary);
57 if (in)
58 {
59 in.seekg(0, std::ios::end);
60 result.resize(in.tellg());
61 in.seekg(0, std::ios::beg);
62 in.read(&result[0], result.size());
63 }
64 else
65 {
66 MU_CORE_ERROR("Could not open file '{0}'", filepath);
67 MU_CORE_ASSERT(false, "Failed to open file!");
68 }
69 return result;
70 }

Referenced by OpenGLShader().

◆ SetFloat()

void Muto::OpenGLShader::SetFloat ( const std::string &  name,
float  value 
)
overridevirtual

Sets a single float uniform in the shader.

Implements Muto::Shader.

199 {
202 }
void UploadUniformFloat(const std::string &name, float value)
Definition OpenGLShader.cpp:254

References UploadUniformFloat().

◆ SetFloat3()

void Muto::OpenGLShader::SetFloat3 ( const std::string &  name,
const glm::vec3 &  value 
)
overridevirtual

Sets a 3-component float vector uniform in the shader.

Implements Muto::Shader.

193 {
196 }
void UploadUniformFloat3(const std::string &name, const glm::vec3 &values)
Definition OpenGLShader.cpp:242

◆ SetFloat4()

void Muto::OpenGLShader::SetFloat4 ( const std::string &  name,
const glm::vec4 &  value 
)
overridevirtual

Sets a 4-component float vector uniform in the shader.

Implements Muto::Shader.

187 {
190 }
void UploadUniformFloat4(const std::string &name, const glm::vec4 &values)
Definition OpenGLShader.cpp:236

◆ SetInt()

void Muto::OpenGLShader::SetInt ( const std::string &  name,
int  value 
)
overridevirtual

Sets a single integer uniform in the shader.

Implements Muto::Shader.

205 {
208 }
void UploadUniformInt(const std::string &name, int value)
Definition OpenGLShader.cpp:260

References UploadUniformInt().

◆ SetIntArray()

void Muto::OpenGLShader::SetIntArray ( const std::string &  name,
int *  values,
uint32_t  count 
)
overridevirtual

Sets an array of integers uniform in the shader.

Implements Muto::Shader.

◆ SetMat4()

void Muto::OpenGLShader::SetMat4 ( const std::string &  name,
const glm::mat4 &  value 
)
overridevirtual

Sets a 4x4 matrix uniform in the shader.

Implements Muto::Shader.

218 {
221 }
void UploadUniformMat4(const std::string &name, const glm::mat4 &matrix)
Definition OpenGLShader.cpp:224

◆ Unbind()

void Muto::OpenGLShader::Unbind ( ) const
overridevirtual

disconnects the shader program.

Implements Muto::Shader.

180 {
182 glUseProgram(0);
183 }

◆ UploadUniformFloat()

void Muto::OpenGLShader::UploadUniformFloat ( const std::string &  name,
float  value 
)

Referenced by SetFloat().

◆ UploadUniformFloat2()

void Muto::OpenGLShader::UploadUniformFloat2 ( const std::string &  name,
const glm::vec2 &  values 
)

◆ UploadUniformFloat3()

void Muto::OpenGLShader::UploadUniformFloat3 ( const std::string &  name,
const glm::vec3 &  values 
)

◆ UploadUniformFloat4()

void Muto::OpenGLShader::UploadUniformFloat4 ( const std::string &  name,
const glm::vec4 &  values 
)

◆ UploadUniformInt()

void Muto::OpenGLShader::UploadUniformInt ( const std::string &  name,
int  value 
)

Referenced by SetInt().

◆ UploadUniformMat3()

void Muto::OpenGLShader::UploadUniformMat3 ( const std::string &  name,
const glm::mat3 &  matrix 
)
231 {
233 glUniformMatrix3fv(location, 1, GL_FALSE, glm::value_ptr(matrix));
234 }

◆ UploadUniformMat4()

void Muto::OpenGLShader::UploadUniformMat4 ( const std::string &  name,
const glm::mat4 &  matrix 
)
225 {
227 glUniformMatrix4fv(location, 1, GL_FALSE, glm::value_ptr(matrix));
228 }

Member Data Documentation

◆ m_Name

std::string Muto::OpenGLShader::m_Name
private

Referenced by GetName(), OpenGLShader(), and OpenGLShader().

◆ m_RendererID

unsigned int Muto::OpenGLShader::m_RendererID
private

Referenced by Bind(), Compile(), and ~OpenGLShader().


The documentation for this class was generated from the following files: