diff --git a/include/ngl/ShaderProgram.inl b/include/ngl/ShaderProgram.inl index 87b40596..7b6b89c1 100644 --- a/include/ngl/ShaderProgram.inl +++ b/include/ngl/ShaderProgram.inl @@ -91,7 +91,28 @@ bool ShaderProgram::setRegisteredUniform(std::string_view _varname ,Ts &&arg ) c glUniform4f(uniform->second.loc,arg.x,arg.y,arg.z,arg.w); return true; } - + // handle arrays as matrix + else if constexpr(is_std_array>::value || + is_std_vector>::value || + std::is_array::value) + { + if(arg.size() == 4) + { + glUniformMatrix2fv(uniform->second.loc, 1, GL_FALSE, &arg[0]); + return true; + } + else if (arg.size() == 9) + { + glUniformMatrix3fv(uniform->second.loc, 1, GL_FALSE, &arg[0]); + return true; + } + else if (arg.size() == 16) + { + glUniformMatrix4fv(uniform->second.loc, 1, GL_FALSE, &arg[0]); + return true; + } + } + } else { diff --git a/tests/ShaderLibTests.cpp b/tests/ShaderLibTests.cpp index 5ed4dc5e..46d2356b 100644 --- a/tests/ShaderLibTests.cpp +++ b/tests/ShaderLibTests.cpp @@ -134,7 +134,7 @@ TEST(ShaderLib,testSetUniform) } - /* + { ngl::Vec2 vec2(0.5f,2.0f); EXPECT_TRUE(ngl::ShaderLib::setUniform("testVec2",vec2)); @@ -267,11 +267,11 @@ TEST(ShaderLib,testSetUniform) EXPECT_TRUE(ngl::ShaderLib::getUniform("testMat2",result)); EXPECT_TRUE(result==ngl::Mat2()); - // //float array[4]={1.0f,2.0f,3.0f,4.0f}; - std::vector array={1.0f,2.0f,3.0f,4.0f}; - //EXPECT_TRUE(ngl::ShaderLib::setUniform("testMat2",array)); - //EXPECT_TRUE(ngl::ShaderLib::setUniform("testMat2",std::array{1.0f,2.0f,3.0f,4.0f})); - // ngl::ShaderLib::setUniform("testMat2",array); + std::vector varray={1.0f,2.0f,3.0f,4.0f}; + std::array array={1.0f,2.0f,3.0f,4.0f}; + EXPECT_TRUE(ngl::ShaderLib::setUniform("testMat2",array)); + EXPECT_TRUE(ngl::ShaderLib::setUniform("testMat2",std::array{1.0f,2.0f,3.0f,4.0f})); + EXPECT_TRUE(ngl::ShaderLib::setUniform("testMat2",varray)); ngl::Mat2 result2(1.0f,2.0f,3.0f,4.0f); EXPECT_TRUE(ngl::ShaderLib::getUniform("testMat2",result)); EXPECT_TRUE(result==result2); @@ -287,11 +287,16 @@ TEST(ShaderLib,testSetUniform) EXPECT_TRUE(ngl::ShaderLib::getUniform("testMat3",result)); EXPECT_TRUE(result==ngl::Mat3()); - // float array[9]={1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f,8.0f,9.0f}; - // EXPECT_TRUE(ngl::ShaderLib::setUniformMatrix3fv("testMat3",array)); - // ngl::Mat3 result2(1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f,8.0f,9.0f); - // EXPECT_TRUE(ngl::ShaderLib::getUniform("testMat3",result)); - // EXPECT_TRUE(result==result2); + std::array array={1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f,8.0f,9.0f}; + std::vector varray={1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f,8.0f,9.0f}; + EXPECT_TRUE(ngl::ShaderLib::setUniform("testMat3",array)); + EXPECT_TRUE(ngl::ShaderLib::setUniform("testMat3",varray)); + EXPECT_TRUE(ngl::ShaderLib::setUniform("testMat3",std::array{1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f,8.0f,9.0f})); + + + ngl::Mat3 result2(1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f,8.0f,9.0f); + EXPECT_TRUE(ngl::ShaderLib::getUniform("testMat3",result)); + EXPECT_TRUE(result==result2); glm::mat3 glmMat3(1.5f,2.5f,3.5f,4.5f,5.5f,6.5f,7.5f,8.5f,9.5f); EXPECT_TRUE(ngl::ShaderLib::setUniform("testMat3",glmMat3)); @@ -305,22 +310,28 @@ TEST(ShaderLib,testSetUniform) ngl::Mat4 result; EXPECT_TRUE(ngl::ShaderLib::getUniform("testMat4",result)); EXPECT_TRUE(result==ngl::Mat4()); - // float array[16]={1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f,8.0f,9.0f, - // 10.0f,11.0f,12.0f,13.0f,14.0f,15.0f,16.0f}; - // EXPECT_TRUE(ngl::ShaderLib::setUniformMatrix4fv("testMat4",array)); - // ngl::Mat4 result2(1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f,8.0f,9.0f, - // 10.0f,11.0f,12.0f,13.0f,14.0f,15.0f,16.0f); - // EXPECT_TRUE(ngl::ShaderLib::getUniform("testMat4",result)); - // EXPECT_TRUE(result==result2); - - // glm::mat4 glmMat4(1.5f,2.5f,3.5f,4.5f,5.5f,6.5f,7.5f,8.5f,9.5f, - // 10.5f,11.5f,12.5f,13.5f,14.5f,15.5f,16.5f); - // EXPECT_TRUE(ngl::ShaderLib::setUniform("testMat4",glmMat4)); - // EXPECT_TRUE(ngl::ShaderLib::getUniform("testMat4",result)); - // EXPECT_TRUE(result==ngl::Mat4(1.5f,2.5f,3.5f,4.5f,5.5f,6.5f,7.5f,8.5f,9.5f, - // 10.5f,11.5f,12.5f,13.5f,14.5f,15.5f,16.5f)); + std::array array={1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f,8.0f,9.0f, + 10.0f,11.0f,12.0f,13.0f,14.0f,15.0f,16.0f}; + std::vector varray={1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f,8.0f,9.0f, + 10.0f,11.0f,12.0f,13.0f,14.0f,15.0f,16.0f}; + EXPECT_TRUE(ngl::ShaderLib::setUniform("testMat4",array)); + EXPECT_TRUE(ngl::ShaderLib::setUniform("testMat4",varray)); + EXPECT_TRUE(ngl::ShaderLib::setUniform("testMat4",std::array{1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f,8.0f,9.0f, + 10.0f,11.0f,12.0f,13.0f,14.0f,15.0f,16.0f})); + + ngl::Mat4 result2(1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f,8.0f,9.0f, + 10.0f,11.0f,12.0f,13.0f,14.0f,15.0f,16.0f); + EXPECT_TRUE(ngl::ShaderLib::getUniform("testMat4",result)); + EXPECT_TRUE(result==result2); + + glm::mat4 glmMat4(1.5f,2.5f,3.5f,4.5f,5.5f,6.5f,7.5f,8.5f,9.5f, + 10.5f,11.5f,12.5f,13.5f,14.5f,15.5f,16.5f); + EXPECT_TRUE(ngl::ShaderLib::setUniform("testMat4",glmMat4)); + EXPECT_TRUE(ngl::ShaderLib::getUniform("testMat4",result)); + EXPECT_TRUE(result==ngl::Mat4(1.5f,2.5f,3.5f,4.5f,5.5f,6.5f,7.5f,8.5f,9.5f, + 10.5f,11.5f,12.5f,13.5f,14.5f,15.5f,16.5f)); } - ngl::ShaderLib::printRegisteredUniforms(shaderName);*/ + ngl::ShaderLib::printRegisteredUniforms(shaderName); } TEST(ShaderLib,testUniformBuffers)