From 85ad4900890d13e30d755c7fe08799f28979181b Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Fri, 25 Jan 2019 21:56:55 -0500 Subject: [PATCH] Offers a less error-prone route to attribute binding. --- Outputs/OpenGL/Primitives/Shader.cpp | 14 +++++++++++ Outputs/OpenGL/Primitives/Shader.hpp | 10 ++++++++ Outputs/OpenGL/ScanTargetGLSLFragments.cpp | 28 +++++++++++----------- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/Outputs/OpenGL/Primitives/Shader.cpp b/Outputs/OpenGL/Primitives/Shader.cpp index 7290cfe39..b838e3b06 100644 --- a/Outputs/OpenGL/Primitives/Shader.cpp +++ b/Outputs/OpenGL/Primitives/Shader.cpp @@ -46,6 +46,20 @@ GLuint Shader::compile_shader(const std::string &source, GLenum type) { } Shader::Shader(const std::string &vertex_shader, const std::string &fragment_shader, const std::vector &attribute_bindings) { + init(vertex_shader, fragment_shader, attribute_bindings); +} + +Shader::Shader(const std::string &vertex_shader, const std::string &fragment_shader, const std::vector &binding_names) { + std::vector bindings; + GLuint index = 0; + for(const auto &name: binding_names) { + bindings.emplace_back(name, index); + ++index; + } + init(vertex_shader, fragment_shader, bindings); +} + +void Shader::init(const std::string &vertex_shader, const std::string &fragment_shader, const std::vector &attribute_bindings) { shader_program_ = glCreateProgram(); const GLuint vertex = compile_shader(vertex_shader, GL_VERTEX_SHADER); const GLuint fragment = compile_shader(fragment_shader, GL_FRAGMENT_SHADER); diff --git a/Outputs/OpenGL/Primitives/Shader.hpp b/Outputs/OpenGL/Primitives/Shader.hpp index 8610a2c7e..995bbb704 100644 --- a/Outputs/OpenGL/Primitives/Shader.hpp +++ b/Outputs/OpenGL/Primitives/Shader.hpp @@ -34,6 +34,7 @@ public: }; struct AttributeBinding { + AttributeBinding(const std::string &name, GLuint index) : name(name), index(index) {} const std::string name; const GLuint index; }; @@ -45,6 +46,13 @@ public: @param attribute_bindings A vector of attribute bindings. */ Shader(const std::string &vertex_shader, const std::string &fragment_shader, const std::vector &attribute_bindings = {}); + /*! + Attempts to compile a shader, throwing @c VertexShaderCompilationError, @c FragmentShaderCompilationError or @c ProgramLinkageError upon failure. + @param vertex_shader The vertex shader source code. + @param fragment_shader The fragment shader source code. + @param binding_names A list of attributes to generate bindings for; these will be given indices 0...n-1. + */ + Shader(const std::string &vertex_shader, const std::string &fragment_shader, const std::vector &binding_names); ~Shader(); /*! @@ -109,6 +117,8 @@ public: void set_uniform_matrix(const std::string &name, GLint size, GLsizei count, bool transpose, const GLfloat *values); private: + void init(const std::string &vertex_shader, const std::string &fragment_shader, const std::vector &attribute_bindings); + GLuint compile_shader(const std::string &source, GLenum type); GLuint shader_program_; diff --git a/Outputs/OpenGL/ScanTargetGLSLFragments.cpp b/Outputs/OpenGL/ScanTargetGLSLFragments.cpp index 31bd7c9e8..f9a65df07 100644 --- a/Outputs/OpenGL/ScanTargetGLSLFragments.cpp +++ b/Outputs/OpenGL/ScanTargetGLSLFragments.cpp @@ -179,12 +179,12 @@ std::unique_ptr ScanTarget::composition_shader() const { vertex_shader, fragment_shader + "}", { - {"startDataX", 0}, - {"startClock", 1}, - {"endDataX", 2}, - {"endClock", 3}, - {"dataY", 4}, - {"lineY", 5}, + "startDataX", + "startClock", + "endDataX", + "endClock", + "dataY", + "lineY", } )); } @@ -491,14 +491,14 @@ std::unique_ptr ScanTarget::conversion_shader() const { vertex_shader, fragment_shader, { - {"startPoint", 0}, - {"endPoint", 1}, - {"startClock", 2}, - {"endClock", 3}, - {"lineY", 4}, - {"lineCompositeAmplitude", 5}, - {"startCompositeAngle", 6}, - {"endCompositeAngle", 7}, + "startPoint", + "endPoint", + "startClock", + "endClock", + "lineY", + "lineCompositeAmplitude", + "startCompositeAngle", + "endCompositeAngle" } );