From 949a94fd81c3f5f1788c17bb986dd9dde2f9c735 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Wed, 3 Apr 2024 21:21:49 +0200 Subject: entity: fix getting vector min/max Leads to returning {0,0} and the field becoming uneditable in the GUI. --- entity/constraints.hpp | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) (limited to 'entity') diff --git a/entity/constraints.hpp b/entity/constraints.hpp index 472b8c0b..c807fddc 100644 --- a/entity/constraints.hpp +++ b/entity/constraints.hpp @@ -1,16 +1,47 @@ #pragma once +#include "compat/limits.hpp" #include "erased-constraints.hpp" #include -#include #include #include +namespace floormat::entities::limit_detail { + +template struct limit_traits; + +template +requires Math::IsVector::value +struct limit_traits +{ + static constexpr auto min() { return T(limits::min); } + static constexpr auto max() { return T(limits::max); } +}; + +template +requires std::is_arithmetic_v +struct limit_traits +{ + static constexpr auto min() { return limits::min; } + static constexpr auto max() { return limits::max; } +}; + +template +struct limit_traits +{ + static_assert(std::is_nothrow_default_constructible_v); + static constexpr T min() { return T{}; } + static constexpr T max() { return T{}; } +}; + +} // namespace floormat::entities::limit_detail + + namespace floormat::entities::constraints { template struct range { - using limits = std::numeric_limits; - T min = limits::min(), max = limits::max(); + T min = limit_detail::limit_traits::min(); + T max = limit_detail::limit_traits::max(); constexpr operator erased_constraints::range() const noexcept; constexpr operator std::pair() const noexcept; @@ -41,14 +72,13 @@ constexpr erased_constraints::range erased_range_from_range(const Math::Vector; using type = erased_constraints::range::type_; using Element = std::conditional_t, float, std::conditional_t, size_t, std::make_signed_t>>; - Math::Vector4 min{limits::min()}, max{limits::max()}; + Math::Vector4 min{limits::min}, max{limits::max}; for (auto i = 0u; i < N; i++) { min[i] = Element(min0[i]); -- cgit v1.2.3