Vesper 0.5.1
Vesper is short form for the Latin word for "Bat", as Vesper is designed to be small, lightweight, and easily handle things like particles and flocking behaviors in accordance with the nature of bats. \n It is meant to be a particle simulation, VFX editor, and CAN be used secondarily as a small game engine.
GitHub | Vesper Updates | Creator
Loading...
Searching...
No Matches
Vesper::OpenGLShader Class Reference

#include <OpenGLShader.h>

Inheritance diagram for Vesper::OpenGLShader:
Vesper::Shader

Public Member Functions

 OpenGLShader (const std::string &filepath)
 OpenGLShader (const std::string &name, const std::string &vertexSrc, const std::string &fragmentSrc)
 ~OpenGLShader ()
void Bind () const override
 connects the shader program for use.
void Unbind () const override
 disconnects the shader program.
virtual void SetMat4 (const std::string &name, const glm::mat4 &value) override
 Sets a 4x4 matrix 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 SetFloat3 (const std::string &name, const glm::vec3 &value) override
 Sets a 3-component float vector uniform in the shader.
virtual void SetFloat (const std::string &name, float value) override
 Sets a single float 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 const std::string & GetName () const override
void UploadUniformMat4 (const std::string &name, const glm::mat4 &matrix)
void UploadUniformMat3 (const std::string &name, const glm::mat3 &matrix)
void UploadUniformFloat4 (const std::string &name, const glm::vec4 &values)
void UploadUniformFloat3 (const std::string &name, const glm::vec3 &values)
void UploadUniformFloat2 (const std::string &name, const glm::vec2 &values)
void UploadUniformFloat (const std::string &name, float value)
void UploadUniformInt (const std::string &name, int value)
Public Member Functions inherited from Vesper::Shader
virtual ~Shader ()=default

Private Member Functions

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

Private Attributes

unsigned int m_RendererID
std::string m_Name

Additional Inherited Members

Static Public Member Functions inherited from Vesper::Shader
static Ref< ShaderCreate (const std::string &name, const std::string &vertexSrc, const std::string &fragmentSrc)
static Ref< ShaderCreate (const std::string &filepath)

Constructor & Destructor Documentation

◆ OpenGLShader() [1/2]

Vesper::OpenGLShader::OpenGLShader ( const std::string & filepath)
22 {
24 std::string shaderSrc = ReadFile(filepath);
25 auto shaderSources = PreProcess(shaderSrc);
26 Compile(shaderSources);
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 VZ_PROFILE_FUNCTION()
Definition Instrumentor.h:240
void Compile(std::unordered_map< GLenum, std::string > &shaderSources)
Definition OpenGLShader.cpp:98
std::string ReadFile(const std::string &filepath)
Definition OpenGLShader.cpp:52
std::unordered_map< GLenum, std::string > PreProcess(const std::string &source)
Definition OpenGLShader.cpp:72
std::string m_Name
Definition OpenGLShader.h:46

◆ OpenGLShader() [2/2]

Vesper::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;
41 sources[GL_VERTEX_SHADER] = vertexSrc;
42 sources[GL_FRAGMENT_SHADER] = fragmentSrc;
43 Compile(sources);
44 }

References OpenGLShader().

Referenced by OpenGLShader().

◆ ~OpenGLShader()

Vesper::OpenGLShader::~OpenGLShader ( )
47 {
49 glDeleteProgram(m_RendererID);
50 }
unsigned int m_RendererID
Definition OpenGLShader.h:45

References m_RendererID.

Member Function Documentation

◆ Bind()

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

connects the shader program for use.

Implements Vesper::Shader.

176 {
178 glUseProgram(m_RendererID);
179 }

References m_RendererID.

◆ Compile()

void Vesper::OpenGLShader::Compile ( std::unordered_map< GLenum, std::string > & shaderSources)
private
99 {
101 GLuint program = glCreateProgram();
102
103 std::array<GLenum, 2> shaderIDs;
104 VZ_CORE_ASSERT(shaderSources.size() <= shaderIDs.size(), "We only support 2 shaders for now!");
105
106 int glShaderIDIndex = 0;
107
108 for (auto& kv : shaderSources)
109 {
110 GLenum type = kv.first;
111 const std::string& source = kv.second;
112
113 GLuint shader = glCreateShader(type);
114
115 const GLchar* shaderSource = source.c_str();
116 glShaderSource(shader, 1, &shaderSource, 0);
117
118 glCompileShader(shader);
119
120 GLint isCompiled = 0;
121 glGetShaderiv(shader, GL_COMPILE_STATUS, &isCompiled);
122 if (isCompiled == GL_FALSE)
123 {
124 GLint maxLength = 0;
125 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
126
127 std::vector<GLchar> infoLog(maxLength);
128 glGetShaderInfoLog(shader, maxLength, &maxLength, &infoLog[0]);
129
130 glDeleteShader(shader);
131
132 VZ_CORE_ERROR("{0}", infoLog.data());
133 VZ_CORE_ASSERT(false, "Shader compilation failure!");
134 break;
135 }
136 glAttachShader(program, shader);
137 shaderIDs[glShaderIDIndex++] = shader;
138 }
139
140 // Link our program
141 glLinkProgram(program);
142
143 // Note the different functions here: glGetProgram* instead of glGetShader*.
144 GLint isLinked = 0;
145 glGetProgramiv(program, GL_LINK_STATUS, (int*)&isLinked);
146 if (isLinked == GL_FALSE)
147 {
148 GLint maxLength = 0;
149 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);
150
151 // The maxLength includes the NULL character
152 std::vector<GLchar> infoLog(maxLength);
153 glGetProgramInfoLog(program, maxLength, &maxLength, &infoLog[0]);
154
155 // We don't need the program anymore.
156 glDeleteProgram(program);
157
158 for (auto id : shaderIDs)
159 glDeleteShader(id);
160
161 VZ_CORE_ERROR("{0}", infoLog.data());
162 VZ_CORE_ASSERT(false, "Shader link failure!");
163 return;
164 }
165
166 for (auto id : shaderIDs)
167 {
168 glDetachShader(program, id);
169 }
170
171 m_RendererID = program;
172
173 }
#define VZ_CORE_ASSERT(x,...)
Definition Asserts.h:20
#define VZ_CORE_ERROR(...)
error: indicates an error that has occurred
Definition Log.h:41
unsigned int GLenum
Definition OpenGLShader.h:7

References m_RendererID.

◆ GetName()

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

Implements Vesper::Shader.

28{ return m_Name; }

◆ PreProcess()

std::unordered_map< GLenum, std::string > Vesper::OpenGLShader::PreProcess ( const std::string & source)
private
73 {
75 std::unordered_map<GLenum, std::string> shaderSources;
76
77 const char* typeToken = "#type";
78 size_t typeTokenLength = strlen(typeToken);
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 VZ_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 VZ_CORE_ASSERT(ShaderTypeFromString(type), "Invalid shader type specified");
88
89 size_t nextLinePos = source.find_first_not_of("\r\n", eol); // Start of shader code after shader type declaration line
90 VZ_CORE_ASSERT(nextLinePos != std::string::npos, "Syntax error");
91
92 pos = source.find(typeToken, nextLinePos); // Start of next shader type declaration line
93 shaderSources[ShaderTypeFromString(type)] = (pos == std::string::npos) ? source.substr(nextLinePos) : source.substr(nextLinePos, pos - nextLinePos);
94 }
95 return shaderSources;
96 }
static GLenum ShaderTypeFromString(const std::string &type)
Definition OpenGLShader.cpp:10

◆ ReadFile()

std::string Vesper::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 VZ_CORE_ERROR("Could not open file '{0}'", filepath);
67 VZ_CORE_ASSERT(false, "Failed to open file!");
68 }
69 return result;
70 }

◆ SetFloat()

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

Sets a single float uniform in the shader.

Implements Vesper::Shader.

201 {
203 UploadUniformFloat(name, value);
204 }
void UploadUniformFloat(const std::string &name, float value)
Definition OpenGLShader.cpp:256

References UploadUniformFloat().

◆ SetFloat3()

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

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

Implements Vesper::Shader.

195 {
197 UploadUniformFloat3(name, value);
198 }
void UploadUniformFloat3(const std::string &name, const glm::vec3 &values)
Definition OpenGLShader.cpp:244

◆ SetFloat4()

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

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

Implements Vesper::Shader.

189 {
191 UploadUniformFloat4(name, value);
192 }
void UploadUniformFloat4(const std::string &name, const glm::vec4 &values)
Definition OpenGLShader.cpp:238

◆ SetInt()

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

Sets a single integer uniform in the shader.

Implements Vesper::Shader.

207 {
209 UploadUniformInt(name, value);
210 }
void UploadUniformInt(const std::string &name, int value)
Definition OpenGLShader.cpp:262

References UploadUniformInt().

◆ SetIntArray()

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

Sets an array of integers uniform in the shader.

Implements Vesper::Shader.

213 {
215 GLint location = glGetUniformLocation(m_RendererID, name.c_str());
216 glUniform1iv(location, count, values);
217 }

◆ SetMat4()

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

Sets a 4x4 matrix uniform in the shader.

Implements Vesper::Shader.

220 {
222 UploadUniformMat4(name, value);
223 }
void UploadUniformMat4(const std::string &name, const glm::mat4 &matrix)
Definition OpenGLShader.cpp:226

◆ Unbind()

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

disconnects the shader program.

Implements Vesper::Shader.

182 {
184 glUseProgram(0);
185 }

◆ UploadUniformFloat()

void Vesper::OpenGLShader::UploadUniformFloat ( const std::string & name,
float value )
257 {
258 GLint location = glGetUniformLocation(m_RendererID, name.c_str());
259 glUniform1f(location, value);
260 }

Referenced by SetFloat().

◆ UploadUniformFloat2()

void Vesper::OpenGLShader::UploadUniformFloat2 ( const std::string & name,
const glm::vec2 & values )
251 {
252 GLint location = glGetUniformLocation(m_RendererID, name.c_str());
253 glUniform2f(location, values.x, values.y);
254 }

◆ UploadUniformFloat3()

void Vesper::OpenGLShader::UploadUniformFloat3 ( const std::string & name,
const glm::vec3 & values )
245 {
246 GLint location = glGetUniformLocation(m_RendererID, name.c_str());
247 glUniform3f(location, values.x, values.y, values.z);
248 }

◆ UploadUniformFloat4()

void Vesper::OpenGLShader::UploadUniformFloat4 ( const std::string & name,
const glm::vec4 & values )
239 {
240 GLint location = glGetUniformLocation(m_RendererID, name.c_str());
241 glUniform4f(location, values.x, values.y, values.z, values.w);
242 }

◆ UploadUniformInt()

void Vesper::OpenGLShader::UploadUniformInt ( const std::string & name,
int value )
263 {
264 GLint location = glGetUniformLocation(m_RendererID, name.c_str());
265 glUniform1i(location, value);
266 }

Referenced by SetInt().

◆ UploadUniformMat3()

void Vesper::OpenGLShader::UploadUniformMat3 ( const std::string & name,
const glm::mat3 & matrix )
233 {
234 GLint location = glGetUniformLocation(m_RendererID, name.c_str());
235 glUniformMatrix3fv(location, 1, GL_FALSE, glm::value_ptr(matrix));
236 }

◆ UploadUniformMat4()

void Vesper::OpenGLShader::UploadUniformMat4 ( const std::string & name,
const glm::mat4 & matrix )
227 {
228 GLint location = glGetUniformLocation(m_RendererID, name.c_str());
229 glUniformMatrix4fv(location, 1, GL_FALSE, glm::value_ptr(matrix));
230 }

Member Data Documentation

◆ m_Name

std::string Vesper::OpenGLShader::m_Name
private

◆ m_RendererID

unsigned int Vesper::OpenGLShader::m_RendererID
private

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


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