From 3d4d464f0d985001bc44a55b657c88a81965fe7f Mon Sep 17 00:00:00 2001 From: jmacey Date: Fri, 2 Jun 2023 08:17:41 +0100 Subject: [PATCH] working shader lib with templates, need some tidy ups and comments, all tests are passing. --- include/ngl/ShaderLib.inl | 105 +------------- include/ngl/ShaderProgram.inl | 6 +- include/ngl/TemplateHelpers.h | 15 ++ src/ShaderLib.cpp | 263 ---------------------------------- src/ShaderProgram.cpp | 2 +- 5 files changed, 25 insertions(+), 366 deletions(-) diff --git a/include/ngl/ShaderLib.inl b/include/ngl/ShaderLib.inl index 1a9a10e4..e3c5ab2f 100644 --- a/include/ngl/ShaderLib.inl +++ b/include/ngl/ShaderLib.inl @@ -23,28 +23,12 @@ bool ShaderLib::getUniform(std::string_view _paramName, Ts &&o_arg) noexcept { return m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), o_arg); } - else if constexpr (std::is_same::value ) //|| std::is_same::value || std::is_same::value) + else if constexpr (is_ngl_vec::value) { - std::array data; + std::vector data(o_arg.m_openGL.size()); auto ret = m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), data); - o_arg.m_openGL = data; - - return ret; - } - else if constexpr (std::is_same::value ) //|| std::is_same::value || std::is_same::value) - { - std::array data; - auto ret = m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), data); - o_arg.m_openGL = data; - - return ret; - } - else if constexpr (std::is_same::value ) //|| std::is_same::value || std::is_same::value) - { - std::array data; - auto ret = m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), data); - o_arg.m_openGL = data; - + //o_arg.m_openGL = data; + std::copy_n(std::begin(data), data.size(), std::begin(o_arg.m_openGL)); return ret; } @@ -56,92 +40,11 @@ bool ShaderLib::getUniform(std::string_view _paramName, Ts &&o_arg) noexcept template bool ShaderLib::getUniform(std::string_view _paramName, Ts &&...o_args) noexcept { - //auto values = std::forward_as_tuple(std::forward(o_args)...); std::array, sizeof...(Ts)> data; auto ret = m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), data); std::size_t i = 0; // fold expression to copy data to o_args ((o_args = data[i++]), ...); - // for(auto &a : data) - // { - // std::cout<<"data "< -bool ShaderLib::setUniform(std::string_view _varname ,Ts &&...args) noexcept -{ - // uses variadic templates to forward a variable number of arguments to a function. - // The function std::forward_as_tuple takes the arguments and returns a tuple of references to the arguments. - // The code then extracts the first argument from the tuple using std::get<0>(values) and assigns it to a variable v. - // Finally, the code uses a static assertion to check that all the arguments passed to the function are of the same type Ts. - // If the assertion fails, it will print an error message. - - // extract the arugments and get first type - auto values = std::forward_as_tuple(args...); - auto v=std::get<0>(values); - // now ensure we have all the same type (this is a compile time check) - static_assert(std::conjunction_v...> , - "setUniform must have values of all the same types"); - static_assert(sizeof...(args) <= 4, "setUniform can only handle upto 4 values"); - - // now we can just expand based on the size of args - // we only have 4 types so it's simple. - if constexpr (sizeof...(args) == 2) - { - auto values =std::forward_as_tuple(args...); - m_shaderPrograms[m_currentShader]->setRegisteredUniform(_varname,static_cast(std::get<0>(values)), - static_cast(std::get<1>(values))); - return true; - } - else if constexpr (sizeof...(args) == 3) - { - auto values =std::forward_as_tuple(args...); - m_shaderPrograms[m_currentShader]->setRegisteredUniform(_varname,static_cast(std::get<0>(values)), - static_cast(std::get<1>(values)), - static_cast(std::get<2>(values))); - return true; - } - else if constexpr (sizeof...(args) == 4) - { - auto values =std::forward_as_tuple(args...); - m_shaderPrograms[m_currentShader]->setRegisteredUniform(_varname,static_cast(std::get<0>(values)), - static_cast(std::get<1>(values)), - static_cast(std::get<2>(values)), - static_cast(std::get<3>(values))); - return true; - } - return false; -} - - - template< typename Ts> - bool ShaderLib::getUniform(std::string_view _paramName, Ts &&o_arg) noexcept - { - return m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), o_arg); - - } - - - template< typename ... Ts> - bool ShaderLib::getUniform(std::string_view _paramName, Ts &&...o_args) noexcept - { - auto values = std::forward_as_tuple(o_args...); - auto v=std::get<0>(values); - - std::array data; - auto ret=m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(),data); - size_t i=0; - std::apply([data,&i](auto&&... args) {((args=data[i++] ), ...);}, values); - - // for(size_t i=0; i(values)=data[i]; - // } - return ret; - } -*/ \ No newline at end of file diff --git a/include/ngl/ShaderProgram.inl b/include/ngl/ShaderProgram.inl index b0f76fe2..eddf6173 100644 --- a/include/ngl/ShaderProgram.inl +++ b/include/ngl/ShaderProgram.inl @@ -33,6 +33,7 @@ bool ShaderProgram::setRegisteredUniform(std::string_view _varname ,Ts &&arg ) c glUniformMatrix4fv(uniform->second.loc, 1, GL_FALSE, &arg.m_openGL[0]); return true; } // end of mat4 + #ifdef USE_GLM else if constexpr(std::is_same::value) { glUniformMatrix2fv(uniform->second.loc, 1, GL_FALSE, &arg[0][0]); @@ -48,6 +49,7 @@ bool ShaderProgram::setRegisteredUniform(std::string_view _varname ,Ts &&arg ) c glUniformMatrix4fv(uniform->second.loc, 1, GL_FALSE, &arg[0][0]); return true; } // end of glmmat2 + #endif else if constexpr(std::is_same::value) { glUniform2f(uniform->second.loc,arg.m_x,arg.m_y); @@ -63,6 +65,7 @@ bool ShaderProgram::setRegisteredUniform(std::string_view _varname ,Ts &&arg ) c glUniform4f(uniform->second.loc,arg.m_x,arg.m_y,arg.m_z,arg.m_w); return true; } + #ifdef USE_GLM else if constexpr(std::is_same::value) { glUniform2f(uniform->second.loc,arg.x,arg.y); @@ -78,6 +81,7 @@ bool ShaderProgram::setRegisteredUniform(std::string_view _varname ,Ts &&arg ) c glUniform4f(uniform->second.loc,arg.x,arg.y,arg.z,arg.w); return true; } + #endif // handle arrays as matrix else if constexpr(is_std_array>::value || is_std_vector>::value || @@ -205,7 +209,7 @@ bool ShaderProgram::getRegisteredUniform(std::string_view _varname ,Ts &o_arg ) glGetUniformiv(m_programID, uniform->second.loc, &o_arg); return true; } // end of float - else if constexpr(is_std_array::value) + else if constexpr(is_std_array::value || is_std_vector::value) { if constexpr (std::is_same,float>::value ) { diff --git a/include/ngl/TemplateHelpers.h b/include/ngl/TemplateHelpers.h index fdc00750..7702a857 100644 --- a/include/ngl/TemplateHelpers.h +++ b/include/ngl/TemplateHelpers.h @@ -15,6 +15,7 @@ template struct is_std_array> : std::true_type {}; // traits for matrix types +// see if forwarding this helps template struct is_ngl_matrix : std::false_type {}; template<> @@ -23,7 +24,15 @@ template<> struct is_ngl_matrix : std::true_type {}; template<> struct is_ngl_matrix : std::true_type {}; +template<> +struct is_ngl_matrix : std::true_type {}; +template<> +struct is_ngl_matrix : std::true_type {}; +template<> +struct is_ngl_matrix : std::true_type {}; + template +// vec traits struct is_ngl_vec : std::false_type {}; template<> struct is_ngl_vec : std::true_type {}; @@ -31,6 +40,12 @@ template<> struct is_ngl_vec : std::true_type {}; template<> struct is_ngl_vec : std::true_type {}; +template<> +struct is_ngl_vec : std::true_type {}; +template<> +struct is_ngl_vec : std::true_type {}; +template<> +struct is_ngl_vec : std::true_type {}; // get the value type of the array template diff --git a/src/ShaderLib.cpp b/src/ShaderLib.cpp index 3947287e..9792748b 100644 --- a/src/ShaderLib.cpp +++ b/src/ShaderLib.cpp @@ -631,13 +631,6 @@ void ShaderLib::bindFragDataLocation(std::string_view _programName, GLuint _inde } } -////---------------------------------------------------------------------------------------------------------------------- -// void ceckGLError( const std::string &_file, const int _line ) noexcept -//{ - -// NGLCheckGLError(_file,_line); - -//} void ShaderLib::useNullProgram() noexcept { @@ -804,262 +797,6 @@ void ShaderLib::printProperties() noexcept } } -// bool ShaderLib::getUniform(std::string_view _paramName, Real &o_v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), o_v0); -// } - -// bool ShaderLib::getUniform(std::string_view _paramName, Real &o_v0, Real &o_v1) noexcept -// { -// std::array v; -// auto ret=m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), v); -// o_v0=v[0]; -// o_v1= v[1]; -// return ret; - -// } - -// bool ShaderLib::getUniform(std::string_view _paramName, ngl::Vec2 &o_v) noexcept -// { -// std::array v; -// auto ret=m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), v); -// o_v.set(v[0], v[1]); -// return ret; - -// } - -// bool ShaderLib::getUniform(std::string_view _paramName, Real &o_v0, Real &o_v1, Real &o_v2) noexcept -// { -// std::array v; -// auto ret=m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), v); -// o_v0=v[0]; -// o_v1= v[1]; -// o_v2= v[2]; -// return ret; - -// } - -// bool ShaderLib::getUniform(std::string_view _paramName, ngl::Vec3 &o_v) noexcept -// { -// std::array v; -// auto ret=m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), v); -// o_v.set(v[0], v[1], v[2] ); -// return ret; -// } - -// bool ShaderLib::getUniform(std::string_view _paramName, Real &o_v0, Real &o_v1, Real &o_v2, Real &o_v3) noexcept -// { -// std::array v; -// auto ret=m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), v); -// o_v0=v[0]; -// o_v1= v[1]; -// o_v2= v[2]; -// o_v3= v[3]; -// return ret; -// } - -// bool ShaderLib::getUniform(std::string_view _paramName, ngl::Vec4 &o_v) noexcept -// { -// std::array v; -// auto ret=m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), v); -// o_v.set(v[0], v[1],v[2], v[3]); -// return ret; -// } - - - -// bool ShaderLib::getUniform(std::string_view _paramName, GLint &o_v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), o_v0); -// } - - - -// bool ShaderLib::getUniform(std::string_view _paramName, GLint &o_v0,GLint &o_v1) noexcept -// { -// std::array v; -// auto ret=m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), v); -// o_v0=v[0]; -// o_v1= v[1]; -// return ret; -// } - - -// bool ShaderLib::getUniform(std::string_view _paramName, GLint &o_v0,GLint &o_v1,GLint &o_v2) noexcept -// { -// std::array v; -// auto ret=m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), v); -// o_v0=v[0]; -// o_v1= v[1]; -// o_v2= v[2]; -// return ret; -// } - - -// bool ShaderLib::getUniform(std::string_view _paramName, GLint &o_v0,GLint &o_v1,GLint &o_v2,GLint &o_v3) noexcept -// { - -// std::array v; -// auto ret=m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), v); -// o_v0=v[0]; -// o_v1= v[1]; -// o_v2= v[2]; -// o_v3= v[3]; -// return ret; -// } - - - -// bool ShaderLib::getUniform(std::string_view _paramName, ngl::Mat2 &o_v) noexcept -// { -// return m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), o_v); -// } - - -// bool ShaderLib::getUniform(std::string_view _paramName, ngl::Mat3 &o_v) noexcept -// { -// return m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), o_v); -// } - - - -// bool ShaderLib::getUniform(std::string_view _paramName, ngl::Mat4 &o_v) noexcept -// { -// return m_shaderPrograms[m_currentShader]->getRegisteredUniform(_paramName.data(), o_v); -// } - - -// bool ShaderLib::setUniform(std::string_view _paramName, Real _v0, Real _v1) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0, _v1); -// } - -// bool ShaderLib::setUniform(std::string_view _paramName, Real _v0, Real _v1, Real _v2) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0, _v1, _v2); -// } - -// bool ShaderLib::setUniform(std::string_view _paramName, Real _v0, Real _v1, Real _v2, Real _v3) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0, _v1, _v2, _v3); -// } - -// bool ShaderLib::setUniform(std::string_view _paramName, GLint _v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0); -// } - - -// bool ShaderLib::getUniform(std::string_view _paramName, GLint &o_v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->getRegisteredUniform1i(_paramName.data(), o_v0); -// } - - -// bool ShaderLib::setUniform(std::string_view _paramName, GLint _v0, GLint _v1) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0, _v1); -// } - - - -// bool ShaderLib::setUniform(std::string_view _paramName, GLint _v0, GLint _v1, GLint _v2) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0, _v1, _v2); -// } - - - - -// bool ShaderLib::setUniform(std::string_view _paramName, GLint _v0, GLint _v1, GLint _v2, GLint _v3) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0, _v1, _v2, _v3); -// } - - - - -// bool ShaderLib::setUniform(std::string_view _paramName, Vec2 _v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0.m_x, _v0.m_y); -// } - -// bool ShaderLib::setUniform(std::string_view _paramName, Vec3 _v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0.m_x, _v0.m_y, _v0.m_z); -// } - -// bool ShaderLib::setUniform(std::string_view _paramName, Vec4 _v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0.m_x, _v0.m_y, _v0.m_z, _v0.m_w); -// } - -// bool ShaderLib::setUniform(std::string_view _paramName, Mat2 _v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0); -// } - - -// bool ShaderLib::setUniform(std::string_view _paramName, Mat3 _v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0); -// } - - - -// bool ShaderLib::setUniform(std::string_view _paramName, Mat4 _v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0); -// } - - - -#ifdef USEGLM -// bool ShaderLib::setUniform(std::string_view _paramName, glm::vec2 _v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0.x, _v0.y); -// } - -// bool ShaderLib::setUniform(std::string_view _paramName, glm::vec3 _v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0.x, _v0.y, _v0.z); -// } - -// bool ShaderLib::setUniform(std::string_view _paramName, glm::vec4 _v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0.x, _v0.y, _v0.z, _v0.w); -// } - -// bool ShaderLib::setUniform(std::string_view _paramName, glm::mat3 _v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0); -// } -// bool ShaderLib::setUniform(std::string_view _paramName, glm::mat4 _v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0); -// } - -// bool ShaderLib::setUniform(std::string_view _paramName, glm::mat2 _v0) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _v0); -// } - -#endif - -// bool ShaderLib::setUniformMatrix4fv(std::string_view _paramName, const GLfloat *_value, MatrixTranspose _transpose) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _value); -// } -// bool ShaderLib::setUniformMatrix3fv(std::string_view _paramName, const GLfloat *_value, MatrixTranspose _transpose) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniform(_paramName.data(), _value); -// } - -// bool ShaderLib::setUniformMatrix2fv(std::string_view _paramName, const GLfloat *_value, MatrixTranspose _transpose) noexcept -// { -// return m_shaderPrograms[m_currentShader]->setRegisteredUniformMatrix2fv(_paramName.data(), 1, static_cast< bool >(_transpose), _value); -// } - } // namespace ngl diff --git a/src/ShaderProgram.cpp b/src/ShaderProgram.cpp index 049d067a..9da7f497 100644 --- a/src/ShaderProgram.cpp +++ b/src/ShaderProgram.cpp @@ -298,7 +298,7 @@ void ShaderProgram::autoRegisterUniformBlocks() noexcept data.loc = glGetUniformBlockIndex(m_programID, &name[0]); glGenBuffers(1, &data.buffer); m_registeredUniformBlocks[std::string(name.data())] = data; - NGLMessage::addMessage(fmt::format("Uniform Block {0} {1} {2}", name, data.loc, data.buffer), Colours::WHITE, TimeFormat::NONE); + NGLMessage::addMessage(fmt::format("Uniform Block {0} {1} {2}", name.data(), data.loc, data.buffer), Colours::WHITE, TimeFormat::NONE); } }