#pragma once #include #include #include "CAngle.h" #include "U_Types.h" template bool almost_equal(T a, T b, E epsilon = std::numeric_limits::epsilon()) { if (std::abs(a - b) <= epsilon) { return true; } return std::abs(a - b) <= epsilon * std::max(std::abs(a), std::abs(b)); } template bool almost_equal(glm::vec a, glm::vec b, E epsilon = std::numeric_limits::epsilon()) { for(size_t i = 0; i < L; i++) { if(!almost_equal(a[i], b[i], epsilon)) { return false; } } return true; } template bool almost_equal(glm::qua a, glm::qua b, E epsilon = std::numeric_limits::epsilon()) { for(size_t i = 0; i < glm::qua::length(); i++) { if(!almost_equal(a[i], b[i], epsilon)) { return false; } } return true; } template bool almost_equal(CAngles a, CAngles b, E epsilon = std::numeric_limits::epsilon()) { for(size_t i = 0; i < CAngles::length(); i++) { if(!almost_equal(a[i], b[i], epsilon)) { return false; } } return true; } template bool almost_equal(CAngle a, CAngle b, E epsilon = std::numeric_limits::epsilon()) { return almost_equal(a.asRadians(), b.asRadians(), epsilon); } template bool almost_equal(glm::mat a, glm::mat b, E epsilon = std::numeric_limits::epsilon()) { for(size_t y = 0; y < T::col_type::length(); y++) { for(size_t x = 0; x < T::length(); x++) { if(!almost_equal(a[x][y], b[x][y], epsilon)) { return false; } } } return true; }