2023-05-31 16:19:06 +02:00
|
|
|
/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
2010-04-15 10:28:32 +00:00
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
|
* \ingroup bli
|
2011-02-27 20:37:56 +00:00
|
|
|
*/
|
|
|
|
|
|
2012-11-23 15:12:13 +00:00
|
|
|
#ifndef __MATH_GEOM_INLINE_C__
|
|
|
|
|
#define __MATH_GEOM_INLINE_C__
|
2011-02-27 20:37:56 +00:00
|
|
|
|
2020-03-06 16:45:06 +01:00
|
|
|
#include "BLI_math_vector.h"
|
2010-04-15 10:28:32 +00:00
|
|
|
|
2012-11-23 15:12:13 +00:00
|
|
|
#include <string.h>
|
2010-04-15 10:28:32 +00:00
|
|
|
|
2014-04-19 22:12:50 +10:00
|
|
|
/* A few small defines. Keep'em local! */
|
|
|
|
|
#define SMALL_NUMBER 1.e-8f
|
|
|
|
|
|
2013-11-30 15:57:16 +11:00
|
|
|
/********************************** Polygons *********************************/
|
|
|
|
|
|
|
|
|
|
MINLINE float cross_tri_v2(const float v1[2], const float v2[2], const float v3[2])
|
|
|
|
|
{
|
|
|
|
|
return (v1[0] - v2[0]) * (v2[1] - v3[1]) + (v1[1] - v2[1]) * (v3[0] - v2[0]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MINLINE float area_tri_signed_v2(const float v1[2], const float v2[2], const float v3[2])
|
|
|
|
|
{
|
|
|
|
|
return 0.5f * ((v1[0] - v2[0]) * (v2[1] - v3[1]) + (v1[1] - v2[1]) * (v3[0] - v2[0]));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MINLINE float area_tri_v2(const float v1[2], const float v2[2], const float v3[2])
|
|
|
|
|
{
|
|
|
|
|
return fabsf(area_tri_signed_v2(v1, v2, v3));
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-13 19:01:40 +11:00
|
|
|
MINLINE float area_squared_tri_v2(const float v1[2], const float v2[2], const float v3[2])
|
|
|
|
|
{
|
|
|
|
|
float area = area_tri_signed_v2(v1, v2, v3);
|
|
|
|
|
return area * area;
|
|
|
|
|
}
|
|
|
|
|
|
2014-03-16 16:31:19 +01:00
|
|
|
MINLINE void axis_dominant_v3(int *r_axis_a, int *r_axis_b, const float axis[3])
|
|
|
|
|
{
|
|
|
|
|
const float xn = fabsf(axis[0]);
|
|
|
|
|
const float yn = fabsf(axis[1]);
|
|
|
|
|
const float zn = fabsf(axis[2]);
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2014-03-16 16:31:19 +01:00
|
|
|
if (zn >= xn && zn >= yn) {
|
|
|
|
|
*r_axis_a = 0;
|
|
|
|
|
*r_axis_b = 1;
|
|
|
|
|
}
|
|
|
|
|
else if (yn >= xn && yn >= zn) {
|
|
|
|
|
*r_axis_a = 0;
|
|
|
|
|
*r_axis_b = 2;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
*r_axis_a = 1;
|
|
|
|
|
*r_axis_b = 2;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MINLINE float axis_dominant_v3_max(int *r_axis_a, int *r_axis_b, const float axis[3])
|
|
|
|
|
{
|
|
|
|
|
const float xn = fabsf(axis[0]);
|
|
|
|
|
const float yn = fabsf(axis[1]);
|
|
|
|
|
const float zn = fabsf(axis[2]);
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2014-03-16 16:31:19 +01:00
|
|
|
if (zn >= xn && zn >= yn) {
|
|
|
|
|
*r_axis_a = 0;
|
|
|
|
|
*r_axis_b = 1;
|
|
|
|
|
return zn;
|
|
|
|
|
}
|
|
|
|
|
else if (yn >= xn && yn >= zn) {
|
|
|
|
|
*r_axis_a = 0;
|
|
|
|
|
*r_axis_b = 2;
|
|
|
|
|
return yn;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
*r_axis_a = 1;
|
|
|
|
|
*r_axis_b = 2;
|
|
|
|
|
return xn;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MINLINE int axis_dominant_v3_single(const float vec[3])
|
|
|
|
|
{
|
|
|
|
|
const float x = fabsf(vec[0]);
|
|
|
|
|
const float y = fabsf(vec[1]);
|
|
|
|
|
const float z = fabsf(vec[2]);
|
|
|
|
|
return ((x > y) ? ((x > z) ? 0 : 2) : ((y > z) ? 1 : 2));
|
|
|
|
|
}
|
|
|
|
|
|
2015-12-09 13:57:18 +11:00
|
|
|
MINLINE int axis_dominant_v3_ortho_single(const float vec[3])
|
|
|
|
|
{
|
|
|
|
|
const float x = fabsf(vec[0]);
|
|
|
|
|
const float y = fabsf(vec[1]);
|
|
|
|
|
const float z = fabsf(vec[2]);
|
|
|
|
|
return ((x < y) ? ((x < z) ? 0 : 2) : ((y < z) ? 1 : 2));
|
|
|
|
|
}
|
|
|
|
|
|
2012-10-24 02:25:00 +00:00
|
|
|
MINLINE int max_axis_v3(const float vec[3])
|
2012-10-23 16:32:39 +00:00
|
|
|
{
|
|
|
|
|
const float x = vec[0];
|
|
|
|
|
const float y = vec[1];
|
|
|
|
|
const float z = vec[2];
|
2012-10-24 02:25:00 +00:00
|
|
|
return ((x > y) ? ((x > z) ? 0 : 2) : ((y > z) ? 1 : 2));
|
|
|
|
|
}
|
2012-10-23 16:32:39 +00:00
|
|
|
|
2012-10-24 02:25:00 +00:00
|
|
|
MINLINE int min_axis_v3(const float vec[3])
|
|
|
|
|
{
|
|
|
|
|
const float x = vec[0];
|
|
|
|
|
const float y = vec[1];
|
|
|
|
|
const float z = vec[2];
|
|
|
|
|
return ((x < y) ? ((x < z) ? 0 : 2) : ((y < z) ? 1 : 2));
|
2012-10-23 16:32:39 +00:00
|
|
|
}
|
|
|
|
|
|
2012-12-27 03:51:45 +00:00
|
|
|
MINLINE int poly_to_tri_count(const int poly_count, const int corner_count)
|
|
|
|
|
{
|
2014-03-30 13:22:01 +11:00
|
|
|
BLI_assert(!poly_count || corner_count > poly_count * 2);
|
2014-03-30 12:00:11 +11:00
|
|
|
return corner_count - (poly_count * 2);
|
2012-12-27 03:51:45 +00:00
|
|
|
}
|
|
|
|
|
|
2013-08-22 15:30:24 +00:00
|
|
|
MINLINE float plane_point_side_v3(const float plane[4], const float co[3])
|
|
|
|
|
{
|
|
|
|
|
return dot_v3v3(co, plane) + plane[3];
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-19 22:12:50 +10:00
|
|
|
MINLINE float shell_angle_to_dist(const float angle)
|
|
|
|
|
{
|
|
|
|
|
return (UNLIKELY(angle < SMALL_NUMBER)) ? 1.0f : fabsf(1.0f / cosf(angle));
|
|
|
|
|
}
|
|
|
|
|
MINLINE float shell_v3v3_normalized_to_dist(const float a[3], const float b[3])
|
|
|
|
|
{
|
|
|
|
|
const float angle_cos = fabsf(dot_v3v3(a, b));
|
|
|
|
|
BLI_ASSERT_UNIT_V3(a);
|
|
|
|
|
BLI_ASSERT_UNIT_V3(b);
|
|
|
|
|
return (UNLIKELY(angle_cos < SMALL_NUMBER)) ? 1.0f : (1.0f / angle_cos);
|
|
|
|
|
}
|
|
|
|
|
MINLINE float shell_v2v2_normalized_to_dist(const float a[2], const float b[2])
|
|
|
|
|
{
|
|
|
|
|
const float angle_cos = fabsf(dot_v2v2(a, b));
|
|
|
|
|
BLI_ASSERT_UNIT_V2(a);
|
|
|
|
|
BLI_ASSERT_UNIT_V2(b);
|
|
|
|
|
return (UNLIKELY(angle_cos < SMALL_NUMBER)) ? 1.0f : (1.0f / angle_cos);
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-23 04:23:54 +10:00
|
|
|
MINLINE float shell_v3v3_mid_normalized_to_dist(const float a[3], const float b[3])
|
|
|
|
|
{
|
|
|
|
|
float angle_cos;
|
|
|
|
|
float ab[3];
|
|
|
|
|
BLI_ASSERT_UNIT_V3(a);
|
|
|
|
|
BLI_ASSERT_UNIT_V3(b);
|
|
|
|
|
add_v3_v3v3(ab, a, b);
|
|
|
|
|
angle_cos = (normalize_v3(ab) != 0.0f) ? fabsf(dot_v3v3(a, ab)) : 0.0f;
|
|
|
|
|
return (UNLIKELY(angle_cos < SMALL_NUMBER)) ? 1.0f : (1.0f / angle_cos);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MINLINE float shell_v2v2_mid_normalized_to_dist(const float a[2], const float b[2])
|
|
|
|
|
{
|
|
|
|
|
float angle_cos;
|
|
|
|
|
float ab[2];
|
|
|
|
|
BLI_ASSERT_UNIT_V2(a);
|
|
|
|
|
BLI_ASSERT_UNIT_V2(b);
|
|
|
|
|
add_v2_v2v2(ab, a, b);
|
|
|
|
|
angle_cos = (normalize_v2(ab) != 0.0f) ? fabsf(dot_v2v2(a, ab)) : 0.0f;
|
|
|
|
|
return (UNLIKELY(angle_cos < SMALL_NUMBER)) ? 1.0f : (1.0f / angle_cos);
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-19 22:12:50 +10:00
|
|
|
#undef SMALL_NUMBER
|
|
|
|
|
|
2012-02-25 09:02:05 +00:00
|
|
|
#endif /* __MATH_GEOM_INLINE_C__ */
|