/* SPDX-License-Identifier: GPL-2.0-or-later * Copyright 2022 Blender Foundation. */ #pragma once /** \file * \ingroup bli */ #include #include #include #include "BLI_math_base_safe.h" #include "BLI_math_vec_types.hh" #include "BLI_utildefines.h" #ifdef WITH_GMP # include "BLI_math_mpq.hh" #endif namespace blender::math { /* To avoid being overly specific about what a "basic" type is, for now simply allow anything that * isn't a `vec_base` type. In the future, if another implementation of these functions is needed, * this would have to become more specific. */ #define BLI_ENABLE_IF_BASE(T) BLI_ENABLE_IF((!is_math_vec_type)) #ifdef WITH_GMP # define BLI_ENABLE_IF_FLT(T) \ BLI_ENABLE_IF_BASE(T), \ BLI_ENABLE_IF((std::is_floating_point_v || std::is_same_v)) #else # define BLI_ENABLE_IF_FLT(T) BLI_ENABLE_IF_BASE(T), BLI_ENABLE_IF((std::is_floating_point_v)) #endif #define BLI_ENABLE_IF_INT(T) BLI_ENABLE_IF_BASE(T), BLI_ENABLE_IF((std::is_integral_v)) template inline bool is_zero(const T &a) { return a == T(0); } template inline bool is_any_zero(const T &a) { return is_zero(a); } template inline T abs(const T &a) { return std::abs(a); } template inline T min(const T &a, const T &b) { return std::min(a, b); } template inline T max(const T &a, const T &b) { return std::max(a, b); } template inline T clamp(const T &a, const T &min, const T &max) { return std::clamp(a, min, max); } template inline T mod(const T &a, const T &b) { return std::fmod(a, b); } template inline T safe_mod(const T &a, const T &b) { return (b != 0) ? std::fmod(a, b) : 0; } template inline void min_max(const T &vector, T &min_vec, T &max_vec) { min_vec = min(vector, min_vec); max_vec = max(vector, max_vec); } template inline T safe_divide(const T &a, const T &b) { return (b != 0) ? a / b : T(0.0f); } template inline T floor(const T &a) { return std::floor(a); } template inline T ceil(const T &a) { return std::ceil(a); } template inline T fract(const T &a) { return a - std::floor(a); } template inline T interpolate(const T &a, const T &b, const FactorT &t) { return a * (1 - t) + b * t; } template inline T midpoint(const T &a, const T &b) { return (a + b) * 0.5; } #undef BLI_ENABLE_IF_BASE #undef BLI_ENABLE_IF_FLT #undef BLI_ENABLE_IF_INT } // namespace blender::math