aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/Graphics/Shader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin/Graphics/Shader.cpp')
-rw-r--r--src/libjin/Graphics/Shader.cpp36
1 files changed, 15 insertions, 21 deletions
diff --git a/src/libjin/Graphics/Shader.cpp b/src/libjin/Graphics/Shader.cpp
index 6c8e3b5..a45fcf0 100644
--- a/src/libjin/Graphics/Shader.cpp
+++ b/src/libjin/Graphics/Shader.cpp
@@ -24,11 +24,11 @@ namespace graphics
#include "Shaders/base.shader.h"
#include "Shaders/default.shader.h"
- const char* Shader::PROJECTION_MATRIX = "_projectionMatrix_";
- const char* Shader::MODEL_MATRIX = "_modelMatrix_";
- const char* Shader::MAIN_TEXTURE = "_main_texture_";
- const char* Shader::VERTEX_COORDS = "_vert_coord_";
- const char* Shader::TEXTURE_COORDS = "_tex_coord_";
+ const char* Shader::SHADER_PROJECTION_MATRIX = "jin_ProjectionMatrix";
+ const char* Shader::SHADER_MODEL_MATRIX = "jin_ModelMatrix";
+ const char* Shader::SHADER_MAIN_TEXTURE = "jin_MainTexture";
+ const char* Shader::SHADER_VERTEX_COORDS = "jin_VertexCoords";
+ const char* Shader::SHADER_TEXTURE_COORDS = "jin_TextureCoords";
/**
* https://stackoverflow.com/questions/27941496/use-sampler-without-passing-through-value
@@ -86,6 +86,7 @@ namespace graphics
bool Shader::compile(const string& program)
{
+ /* parse shader source, need some optimizations */
int loc_VERTEX_SHADER = program.find("#VERTEX_SHADER");
int loc_END_VERTEX_SHADER = program.find("#END_VERTEX_SHADER");
int loc_FRAGMENT_SHADER = program.find("#FRAGMENT_SHADER");
@@ -96,12 +97,13 @@ namespace graphics
|| loc_END_FRAGMENT_SHADER == string::npos
)
return false;
- int p = loc_VERTEX_SHADER + strlen("#VERTEX_SHADER");
- string vertex_shader = program.substr(p, loc_END_VERTEX_SHADER - p);
+ /* load vertex and fragment shader source into buffers */
+ int start = loc_VERTEX_SHADER + strlen("#VERTEX_SHADER");
+ string vertex_shader = program.substr(start, loc_END_VERTEX_SHADER - start);
Buffer vbuffer = Buffer(vertex_shader.length() + BASE_VERTEX_SHADER_SIZE);
formatVertexShader((char*)vbuffer.data, vertex_shader.c_str());
- p = loc_FRAGMENT_SHADER + strlen("#FRAGMENT_SHADER");
- string fragment_shader = program.substr(p, loc_END_FRAGMENT_SHADER - p);
+ start = loc_FRAGMENT_SHADER + strlen("#FRAGMENT_SHADER");
+ string fragment_shader = program.substr(start, loc_END_FRAGMENT_SHADER - start);
Buffer fbuffer = Buffer(fragment_shader.length() + BASE_FRAGMENT_SHADER_SIZE);
formatFragmentShader((char*)fbuffer.data, fragment_shader.c_str());
/* compile */
@@ -110,18 +112,12 @@ namespace graphics
glShaderSource(vshader, 1, (const GLchar**)&vbuffer.data, NULL);
glCompileShader(vshader);
glGetShaderiv(vshader, GL_COMPILE_STATUS, &success);
- //std::cout << (char*)vbuffer.data << std::endl;
- //Buffer log = Buffer(1024);
- //int len;
- //glGetShaderInfoLog(vshader, sizeof(log), &len, (GLchar*)log.data);
- //std::cout << (char*)log.data << std::endl;
if (success == GL_FALSE)
return false;
GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fshader, 1, (const GLchar**)&fbuffer.data, NULL);
glCompileShader(fshader);
glGetShaderiv(fshader, GL_COMPILE_STATUS, &success);
- //std::cout << (char*)fbuffer.data << std::endl;
if (success == GL_FALSE)
return false;
pid = glCreateProgram();
@@ -129,8 +125,6 @@ namespace graphics
glAttachShader(pid, fshader);
glLinkProgram(pid);
glGetProgramiv(pid, GL_LINK_STATUS, &success);
- //glGetProgramInfoLog(pid, 1024, &len, (GLchar*)log.data);
- //std::cout << (char*)log.data << std::endl;
if (success == GL_FALSE)
throw false;
}
@@ -141,12 +135,12 @@ namespace graphics
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
return maxTextureUnits;
}
-
+
void Shader::use()
{
glUseProgram(pid);
currentShader = this;
- sendInt(Shader::MAIN_TEXTURE, DEFAULT_TEXTURE_UNIT);
+ sendInt(Shader::SHADER_MAIN_TEXTURE, DEFAULT_TEXTURE_UNIT);
}
/*static*/ void Shader::unuse()
@@ -277,14 +271,14 @@ namespace graphics
void Shader::bindVertexPointer(int n, GLenum type, GLsizei stride, const GLvoid * pointers)
{
- GLint loc = glGetAttribLocation(pid, VERTEX_COORDS);
+ GLint loc = glGetAttribLocation(pid, SHADER_VERTEX_COORDS);
glEnableVertexAttribArray(0);
glVertexAttribPointer(loc, n, type, GL_FALSE, stride, pointers);
}
void Shader::bindUVPointer(int n, GLenum type, GLsizei stride, const GLvoid * pointers)
{
- GLint loc = glGetAttribLocation(pid, TEXTURE_COORDS);
+ GLint loc = glGetAttribLocation(pid, SHADER_TEXTURE_COORDS);
glEnableVertexAttribArray(1);
glVertexAttribPointer(loc, n, type, GL_FALSE, stride, pointers);
}