From 08128c14ec49a2b357e830c832ccd0a8e63c175d Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 14 Jan 2024 11:38:09 +0000 Subject: Add traits wrapper for setting uniforms --- lib/gl_traits.h | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'lib') diff --git a/lib/gl_traits.h b/lib/gl_traits.h index 934b505..2d3d85d 100644 --- a/lib/gl_traits.h +++ b/lib/gl_traits.h @@ -4,6 +4,8 @@ #include #include #include +#include +#include template struct gl_traits; @@ -37,6 +39,9 @@ struct gl_traits_integer : public gl_traits_base { template<> struct gl_traits : public gl_traits_float { static constexpr GLenum type {GL_FLOAT}; + static constexpr auto glUniformFunc {&glUniform1f}; + static constexpr std::array glUniformvFunc {&glUniform1fv, &glUniform2fv, &glUniform3fv, &glUniform4fv}; + static constexpr std::array glUniformmFunc {&glUniformMatrix2fv, &glUniformMatrix3fv, &glUniformMatrix4fv}; }; template<> struct gl_traits : public gl_traits_longfloat { @@ -53,6 +58,8 @@ template<> struct gl_traits : public gl_traits_integer { template<> struct gl_traits : public gl_traits_integer { static constexpr GLenum type {GL_INT}; + static constexpr auto glUniformFunc {&glUniform1i}; + static constexpr std::array glUniformvFunc {&glUniform1iv, &glUniform2iv, &glUniform3iv, &glUniform4iv}; }; template<> struct gl_traits : public gl_traits_integer { @@ -65,6 +72,9 @@ template<> struct gl_traits : public gl_traits_integer { template<> struct gl_traits : public gl_traits_integer { static constexpr GLenum type {GL_UNSIGNED_INT}; + static constexpr auto glUniformFunc {&glUniform1ui}; + static constexpr std::array glUniformvFunc { + &glUniform1uiv, &glUniform2uiv, &glUniform3uiv, &glUniform4uiv}; }; template struct gl_traits> : public gl_traits { @@ -87,3 +97,49 @@ struct gl_traits> : public gl_traits { return R; }}; }; + +template +void +glUniform(GLint location, T v) +{ + static_assert( + requires { gl_traits::glUniformFunc; }, "Has glUnform1T"); + (*gl_traits::glUniformFunc)(location, v); +} + +template +void +glUniform(GLint location, const glm::vec & v) +{ + static_assert( + requires { gl_traits::glUniformFunc; }, "Has glUnformNTv"); + (*gl_traits::glUniformvFunc[L - 1])(location, 1, glm::value_ptr(v)); +} + +template +void +glUniform(GLint location, std::span> v) +{ + static_assert( + requires { gl_traits::glUniformvFunc; }, "Has glUnformNTv"); + (*gl_traits::glUniformvFunc[L - 1])(location, static_cast(v.size()), glm::value_ptr(v.front())); +} + +template +void +glUniform(GLint location, const glm::mat & v) +{ + static_assert( + requires { gl_traits::glUniformmFunc; }, "Has glUnformMatrixNTv"); + (*gl_traits::glUniformmFunc[L - 2])(location, 1, GL_FALSE, glm::value_ptr(v)); +} + +template +void +glUniform(GLint location, std::span> v) +{ + static_assert( + requires { gl_traits::glUniformmFunc; }, "Has glUnformMatrixNTv"); + (*gl_traits::glUniformmFunc[L - 2])( + location, static_cast(v.size()), GL_FALSE, glm::value_ptr(v.front())); +} -- cgit v1.2.3