added singleton shader manager, custom widget attribute forward, parse border thickness and color for Border widget, parse and cache uniform locations, remove unused attrubutes code
This commit is contained in:
@@ -1,7 +1,10 @@
|
||||
#include "pch.h"
|
||||
#include "shader.hpp"
|
||||
|
||||
bool Shader::create(std::string vertex, std::string fragment)
|
||||
std::map<kShader, Shader> ShaderManager::m_shaders;
|
||||
Shader* ShaderManager::m_current;
|
||||
|
||||
bool Shader::create(const char* vertex, const char* fragment)
|
||||
{
|
||||
GLint status;
|
||||
static char infolog[4096];
|
||||
@@ -13,7 +16,7 @@ bool Shader::create(std::string vertex, std::string fragment)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
source = vertex.c_str();
|
||||
source = vertex;
|
||||
glShaderSource(vs, 1, &source, nullptr);
|
||||
glCompileShader(vs);
|
||||
glGetShaderiv(vs, GL_COMPILE_STATUS, &status);
|
||||
@@ -32,7 +35,7 @@ bool Shader::create(std::string vertex, std::string fragment)
|
||||
glDeleteShader(vs);
|
||||
return false;
|
||||
}
|
||||
source = fragment.c_str();
|
||||
source = fragment;
|
||||
glShaderSource(fs, 1, &source, nullptr);
|
||||
glCompileShader(fs);
|
||||
glGetShaderiv(fs, GL_COMPILE_STATUS, &status);
|
||||
@@ -71,6 +74,23 @@ bool Shader::create(std::string vertex, std::string fragment)
|
||||
glDeleteProgram(ps);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Parse shader uniforms
|
||||
{
|
||||
GLint count;
|
||||
GLint size; // size of the variable
|
||||
GLenum type; // type of the variable (float, vec3 or mat4, etc)
|
||||
const GLsizei bufSize = 16; // maximum name length
|
||||
GLchar name[bufSize]; // variable name in GLSL
|
||||
GLsizei length; // name length
|
||||
glGetProgramiv(ps, GL_ACTIVE_UNIFORMS, &count);
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
glGetActiveUniform(ps, (GLuint)i, bufSize, &length, &size, &type, name);
|
||||
m_umap[(kShaderUniform)const_hash(name)] = glGetUniformLocation(ps, name);
|
||||
//printf("Uniform #%d Type: %u Name: %s Loc: %d\n", i, type, name, glGetUniformLocation(ps, name));
|
||||
}
|
||||
}
|
||||
|
||||
prog = ps;
|
||||
|
||||
@@ -80,18 +100,47 @@ void Shader::use()
|
||||
{
|
||||
glUseProgram(prog);
|
||||
}
|
||||
void Shader::u_vec4(const char* name, const glm::vec4& v)
|
||||
void Shader::u_vec4(kShaderUniform id, const glm::vec4& v)
|
||||
{
|
||||
auto loc = glGetUniformLocation(prog, name);
|
||||
glUniform4fv(loc, 1, glm::value_ptr(v));
|
||||
glUniform4fv(m_umap[id], 1, glm::value_ptr(v));
|
||||
}
|
||||
void Shader::u_mat4(const char* name, const glm::mat4& m)
|
||||
void Shader::u_mat4(kShaderUniform id, const glm::mat4& m)
|
||||
{
|
||||
auto loc = glGetUniformLocation(prog, name);
|
||||
glUniformMatrix4fv(loc, 1, GL_FALSE, glm::value_ptr(m));
|
||||
glUniformMatrix4fv(m_umap[id], 1, GL_FALSE, glm::value_ptr(m));
|
||||
}
|
||||
void Shader::u_int(const char* name, int i)
|
||||
void Shader::u_int(kShaderUniform id, int i)
|
||||
{
|
||||
auto loc = glGetUniformLocation(prog, name);
|
||||
glUniform1i(loc, i);
|
||||
glUniform1i(m_umap[id], i);
|
||||
}
|
||||
|
||||
bool ShaderManager::create(kShader id, const char* vertex, const char* fragment)
|
||||
{
|
||||
return m_shaders[id].create(vertex, fragment);
|
||||
}
|
||||
|
||||
void ShaderManager::use(kShader id)
|
||||
{
|
||||
m_current = &m_shaders[id];
|
||||
m_current->use();
|
||||
}
|
||||
|
||||
void ShaderManager::use(const char* name)
|
||||
{
|
||||
m_current = &m_shaders[(kShader)const_hash(name)];
|
||||
m_current->use();
|
||||
}
|
||||
|
||||
void ShaderManager::u_vec4(kShaderUniform id, const glm::vec4& v)
|
||||
{
|
||||
m_current->u_vec4(id, v);
|
||||
}
|
||||
|
||||
void ShaderManager::u_mat4(kShaderUniform id, const glm::mat4& m)
|
||||
{
|
||||
m_current->u_mat4(id, m);
|
||||
}
|
||||
|
||||
void ShaderManager::u_int(kShaderUniform id, int i)
|
||||
{
|
||||
m_current->u_int(id, i);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user