allow creating shaders from file sources and specifying shader source length

This commit is contained in:
Josh Holtrop 2015-06-11 18:36:26 -04:00
parent f7955dea0b
commit 71cff1c45e
2 changed files with 26 additions and 5 deletions

View File

@ -12,7 +12,9 @@ namespace glcxx
~Shader();
void create(GLenum shaderType, const char *source);
void create(GLenum shader_type, const char * source, int length = -1);
void create_from_file(GLenum shader_type, const char * filename);
GLuint id() const { return m_id; }

View File

@ -1,6 +1,8 @@
#include "glcxx/Shader.hpp"
#include "glcxx/Error.hpp"
#include <string>
#include <fstream>
#include <vector>
namespace glcxx
{
@ -17,17 +19,18 @@ namespace glcxx
}
}
void Shader::create(GLenum shaderType, const char *source)
void Shader::create(GLenum shader_type, const char * source, int length)
{
GLint status;
m_id = glCreateShader(shaderType);
m_id = glCreateShader(shader_type);
if (m_id == 0u)
{
throw Error("Failed to allocate an OpenGL shader");
}
glShaderSource(m_id, 1, &source, NULL);
GLint lengths[1] = {length};
glShaderSource(m_id, 1, &source, &lengths[0]);
glCompileShader(m_id);
@ -38,7 +41,7 @@ namespace glcxx
}
std::string message = "Error compiling ";
switch (shaderType)
switch (shader_type)
{
case GL_VERTEX_SHADER:
message += "vertex";
@ -66,4 +69,20 @@ namespace glcxx
glDeleteShader(m_id);
throw Error(message);
}
void Shader::create_from_file(GLenum shader_type, const char * filename)
{
std::ifstream ifs;
ifs.open(filename);
if (!ifs.is_open())
{
throw Error(std::string("Error opening ") + filename);
}
ifs.seekg(0, ifs.end);
int length = ifs.tellg();
ifs.seekg(0, ifs.beg);
std::vector<char> file_contents(length);
ifs.read(&file_contents[0], length);
create(shader_type, &file_contents[0], length);
}
}