Blender V5.0
BLI_math_base.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
47
48#include "BLI_assert.h"
49#include "BLI_math_constants.h" // IWYU pragma: export
50#include "BLI_math_inline.h" // IWYU pragma: export
51#include "BLI_sys_types.h"
52
53#if defined(__GNUC__)
54# define NAN_FLT __builtin_nanf("")
55#else /* evil quiet NaN definition */
56static const int NAN_INT = 0x7FC00000;
57# define NAN_FLT (*((float *)(&NAN_INT)))
58#endif
59
60#if BLI_MATH_DO_INLINE
61# include "intern/math_base_inline.cc" // IWYU pragma: export
62#endif
63
64#ifdef BLI_MATH_GCC_WARN_PRAGMA
65# pragma GCC diagnostic push
66# pragma GCC diagnostic ignored "-Wredundant-decls"
67#endif
68
69/******************************* Float ******************************/
70
71/* `powf` is really slow for raising to integer powers. */
72
73MINLINE float pow2f(float x);
74MINLINE float pow3f(float x);
75MINLINE float pow4f(float x);
76MINLINE float pow7f(float x);
77
78MINLINE float sqrt3f(float f);
79MINLINE double sqrt3d(double d);
80
81MINLINE float sqrtf_signed(float f);
82
83/* Compute linear interpolation (lerp) between origin and target. */
84MINLINE float interpf(float target, float origin, float t);
85MINLINE double interpd(double target, double origin, double t);
86
87MINLINE float ratiof(float min, float max, float pos);
88MINLINE double ratiod(double min, double max, double pos);
89
90/* NOTE: Compilers will up-cast all types smaller than int to int when performing arithmetic
91 * operation. */
92
93MINLINE int square_s(short a);
94
95MINLINE int square_i(int a);
96MINLINE unsigned int square_uint(unsigned int a);
97MINLINE float square_f(float a);
98
99MINLINE int cube_i(int a);
100MINLINE float cube_f(float a);
101
102MINLINE float min_ff(float a, float b);
103MINLINE float max_ff(float a, float b);
104MINLINE float min_fff(float a, float b, float c);
105MINLINE float max_fff(float a, float b, float c);
106MINLINE float min_ffff(float a, float b, float c, float d);
107MINLINE float max_ffff(float a, float b, float c, float d);
108
109MINLINE double min_dd(double a, double b);
110MINLINE double max_dd(double a, double b);
111MINLINE double max_ddd(double a, double b, double c);
112
113MINLINE int min_ii(int a, int b);
114MINLINE int max_ii(int a, int b);
115MINLINE int min_iii(int a, int b, int c);
116MINLINE int max_iii(int a, int b, int c);
117MINLINE int min_iiii(int a, int b, int c, int d);
118MINLINE int max_iiii(int a, int b, int c, int d);
119
122
123MINLINE int clamp_i(int value, int min, int max);
124MINLINE float clamp_f(float value, float min, float max);
125
131MINLINE int compare_ff(float a, float b, float max_diff);
151MINLINE uint ulp_diff_ff(float a, float b);
163MINLINE int compare_ff_relative(float a, float b, float max_diff, int max_ulps);
164MINLINE bool compare_threshold_relative(float value1, float value2, float thresh);
165
174MINLINE float increment_ulp(float value);
175
184MINLINE float decrement_ulp(float value);
185
186MINLINE float signf(float f);
187MINLINE int signum_i_ex(float a, float eps);
188MINLINE int signum_i(float a);
189
193MINLINE float power_of_2(float f);
194
199MINLINE int integer_digits_f(float f);
204MINLINE int integer_digits_d(double d);
205MINLINE int integer_digits_i(int i);
206
207/* These don't really fit anywhere but were being copied about a lot. */
208
209MINLINE int is_power_of_2_i(int n);
210
211MINLINE unsigned int log2_floor_u(unsigned int x);
212MINLINE unsigned int log2_ceil_u(unsigned int x);
213
217MINLINE int power_of_2_max_i(int n);
218MINLINE int power_of_2_min_i(int n);
219MINLINE unsigned int power_of_2_max_u(unsigned int x);
220
225MINLINE int divide_round_i(int a, int b);
226
232
238
247MINLINE int mod_i(int i, int n);
248
257MINLINE float floored_fmod(float f, float n);
258
262MINLINE float round_to_even(float f);
263
264MINLINE unsigned char round_fl_to_uchar(float a);
265MINLINE short round_fl_to_short(float a);
266MINLINE int round_fl_to_int(float a);
267MINLINE unsigned int round_fl_to_uint(float a);
268
269MINLINE int round_db_to_int(double a);
270
271MINLINE unsigned char round_fl_to_uchar_clamp(float a);
272MINLINE int round_fl_to_int_clamp(float a);
273
274MINLINE unsigned char round_db_to_uchar_clamp(double a);
275MINLINE short round_db_to_short_clamp(double a);
276MINLINE int round_db_to_int_clamp(double a);
277
278int pow_i(int base, int exp);
279
283double double_round(double x, int ndigits);
284
294float floor_power_of_10(float f);
304float ceil_power_of_10(float f);
305
306#ifdef BLI_MATH_GCC_WARN_PRAGMA
307# pragma GCC diagnostic pop
308#endif
309
310/* Asserts, some math functions expect normalized inputs
311 * check the vector is unit length, or zero length (which can't be helped in some cases). */
312
313#ifndef NDEBUG
315# define BLI_ASSERT_UNIT_EPSILON 0.0002f
316# define BLI_ASSERT_UNIT_EPSILON_DB 0.0002
322# define BLI_ASSERT_UNIT_V3(v) \
323 { \
324 const float _test_unit = len_squared_v3(v); \
325 BLI_assert(!(fabsf(_test_unit - 1.0f) >= BLI_ASSERT_UNIT_EPSILON) || \
326 !(fabsf(_test_unit) >= BLI_ASSERT_UNIT_EPSILON)); \
327 } \
328 (void)0
329
330# define BLI_ASSERT_UNIT_V2(v) \
331 { \
332 const float _test_unit = len_squared_v2(v); \
333 BLI_assert(!(fabsf(_test_unit - 1.0f) >= BLI_ASSERT_UNIT_EPSILON) || \
334 !(fabsf(_test_unit) >= BLI_ASSERT_UNIT_EPSILON)); \
335 } \
336 (void)0
337
338# define BLI_ASSERT_UNIT_QUAT(q) \
339 { \
340 const float _test_unit = dot_qtqt(q, q); \
341 BLI_assert(!(fabsf(_test_unit - 1.0f) >= BLI_ASSERT_UNIT_EPSILON * 10) || \
342 !(fabsf(_test_unit) >= BLI_ASSERT_UNIT_EPSILON * 10)); \
343 } \
344 (void)0
345
346# define BLI_ASSERT_ZERO_M3(m) \
347 { \
348 BLI_assert(dot_vn_vn((const float *)m, (const float *)m, 9) != 0.0); \
349 } \
350 (void)0
351
352# define BLI_ASSERT_ZERO_M4(m) \
353 { \
354 BLI_assert(dot_vn_vn((const float *)m, (const float *)m, 16) != 0.0); \
355 } \
356 (void)0
357# define BLI_ASSERT_UNIT_M3(m) \
358 { \
359 BLI_ASSERT_UNIT_V3((m)[0]); \
360 BLI_ASSERT_UNIT_V3((m)[1]); \
361 BLI_ASSERT_UNIT_V3((m)[2]); \
362 } \
363 (void)0
364#else
365# define BLI_ASSERT_UNIT_V2(v) (void)(v)
366# define BLI_ASSERT_UNIT_V3(v) (void)(v)
367# define BLI_ASSERT_UNIT_QUAT(v) (void)(v)
368# define BLI_ASSERT_ZERO_M3(m) (void)(m)
369# define BLI_ASSERT_ZERO_M4(m) (void)(m)
370# define BLI_ASSERT_UNIT_M3(m) (void)(m)
371#endif
MINLINE int round_fl_to_int_clamp(float a)
MINLINE unsigned char round_fl_to_uchar(float a)
MINLINE float max_fff(float a, float b, float c)
MINLINE int integer_digits_f(float f)
MINLINE uint ceil_to_multiple_u(uint a, uint b)
MINLINE double max_ddd(double a, double b, double c)
MINLINE uint min_uu(uint a, uint b)
MINLINE float max_ffff(float a, float b, float c, float d)
MINLINE unsigned int log2_ceil_u(unsigned int x)
MINLINE int power_of_2_min_i(int n)
MINLINE int round_fl_to_int(float a)
MINLINE short round_db_to_short_clamp(double a)
MINLINE float max_ff(float a, float b)
int pow_i(int base, int exp)
Definition math_base.cc:13
MINLINE int min_ii(int a, int b)
MINLINE uint divide_ceil_u(uint a, uint b)
MINLINE int power_of_2_max_i(int n)
MINLINE int integer_digits_d(double d)
MINLINE float min_ffff(float a, float b, float c, float d)
MINLINE unsigned int power_of_2_max_u(unsigned int x)
MINLINE uint max_uu(uint a, uint b)
MINLINE int cube_i(int a)
MINLINE float pow2f(float x)
MINLINE float increment_ulp(float value)
MINLINE double ratiod(double min, double max, double pos)
MINLINE float clamp_f(float value, float min, float max)
MINLINE float min_ff(float a, float b)
MINLINE int square_i(int a)
MINLINE int max_ii(int a, int b)
MINLINE short round_fl_to_short(float a)
MINLINE uint64_t divide_ceil_ul(uint64_t a, uint64_t b)
MINLINE double min_dd(double a, double b)
float floor_power_of_10(float f)
Definition math_base.cc:65
MINLINE float cube_f(float a)
MINLINE int integer_digits_i(int i)
MINLINE unsigned char round_fl_to_uchar_clamp(float a)
static const int NAN_INT
MINLINE int min_iii(int a, int b, int c)
MINLINE float floored_fmod(float f, float n)
MINLINE int divide_round_i(int a, int b)
MINLINE int mod_i(int i, int n)
MINLINE float power_of_2(float f)
MINLINE float decrement_ulp(float value)
MINLINE float square_f(float a)
MINLINE unsigned int round_fl_to_uint(float a)
MINLINE float sqrtf_signed(float f)
MINLINE double max_dd(double a, double b)
MINLINE uint ulp_diff_ff(float a, float b)
MINLINE int round_db_to_int_clamp(double a)
MINLINE int is_power_of_2_i(int n)
MINLINE float pow3f(float x)
MINLINE double sqrt3d(double d)
MINLINE float interpf(float target, float origin, float t)
MINLINE int round_db_to_int(double a)
MINLINE int max_iiii(int a, int b, int c, int d)
MINLINE float min_fff(float a, float b, float c)
MINLINE int signum_i_ex(float a, float eps)
MINLINE int min_iiii(int a, int b, int c, int d)
MINLINE unsigned int log2_floor_u(unsigned int x)
MINLINE double interpd(double target, double origin, double t)
MINLINE float signf(float f)
MINLINE int max_iii(int a, int b, int c)
float ceil_power_of_10(float f)
Definition math_base.cc:74
MINLINE bool compare_threshold_relative(float value1, float value2, float thresh)
MINLINE int clamp_i(int value, int min, int max)
MINLINE int signum_i(float a)
MINLINE float ratiof(float min, float max, float pos)
MINLINE float round_to_even(float f)
double double_round(double x, int ndigits)
Definition math_base.cc:28
MINLINE unsigned int square_uint(unsigned int a)
MINLINE int square_s(short a)
MINLINE uint64_t ceil_to_multiple_ul(uint64_t a, uint64_t b)
MINLINE int compare_ff_relative(float a, float b, float max_diff, int max_ulps)
MINLINE unsigned char round_db_to_uchar_clamp(double a)
MINLINE int compare_ff(float a, float b, float max_diff)
MINLINE float pow4f(float x)
MINLINE float sqrt3f(float f)
MINLINE float pow7f(float x)
#define MINLINE
unsigned int uint
unsigned long long int uint64_t
uint pos
#define exp
const btScalar eps
Definition poly34.cpp:11
#define min(a, b)
Definition sort.cc:36
i
Definition text_draw.cc:230
max
Definition text_draw.cc:251