From 71cff1c45e96cb3d2a012b2c1871611038cb8946 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 11 Jun 2015 18:36:26 -0400 Subject: [PATCH] allow creating shaders from file sources and specifying shader source length --- include/glcxx/Shader.hpp | 4 +++- src/glcxx/Shader.cpp | 27 +++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/include/glcxx/Shader.hpp b/include/glcxx/Shader.hpp index 6841f22..5684d4e 100644 --- a/include/glcxx/Shader.hpp +++ b/include/glcxx/Shader.hpp @@ -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; } diff --git a/src/glcxx/Shader.cpp b/src/glcxx/Shader.cpp index 39d78f0..a94ce3b 100644 --- a/src/glcxx/Shader.cpp +++ b/src/glcxx/Shader.cpp @@ -1,6 +1,8 @@ #include "glcxx/Shader.hpp" #include "glcxx/Error.hpp" #include +#include +#include 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 file_contents(length); + ifs.read(&file_contents[0], length); + create(shader_type, &file_contents[0], length); + } }