26 const float s = 1.0f - t;
28 r[0] = s * a[0] + t *
b[0];
29 r[1] = s * a[1] + t *
b[1];
33 float r[2],
const float a[2],
const float b[2],
const float c[2],
const float t[3])
35 r[0] = a[0] * t[0] +
b[0] * t[1] + c[0] * t[2];
36 r[1] = a[1] * t[0] +
b[1] * t[1] + c[1] * t[2];
41 const float s = 1.0f - t;
43 r[0] = s * a[0] + t *
b[0];
44 r[1] = s * a[1] + t *
b[1];
45 r[2] = s * a[2] + t *
b[2];
50 const float s = 1.0f - t;
52 r[0] = s * a[0] + t *
b[0];
53 r[1] = s * a[1] + t *
b[1];
54 r[2] = s * a[2] + t *
b[2];
55 r[3] = s * a[3] + t *
b[3];
68 if (
UNLIKELY(cosom < (-1.0f + FLT_EPSILON))) {
74 target[0] =
w[0] * a[0] +
w[1] *
b[0];
75 target[1] =
w[0] * a[1] +
w[1] *
b[1];
76 target[2] =
w[0] * a[2] +
w[1] *
b[2];
110 float q0[2], q1[2], q2[2], r0[2], r1[2];
123 float p[3],
const float v1[3],
const float v2[3],
const float v3[3],
const float w[3])
125 p[0] = v1[0] *
w[0] +
v2[0] *
w[1] + v3[0] *
w[2];
126 p[1] = v1[1] *
w[0] +
v2[1] *
w[1] + v3[1] *
w[2];
127 p[2] = v1[2] *
w[0] +
v2[2] *
w[1] + v3[2] *
w[2];
137 p[0] = v1[0] *
w[0] +
v2[0] *
w[1] + v3[0] *
w[2] + v4[0] *
w[3];
138 p[1] = v1[1] *
w[0] +
v2[1] *
w[1] + v3[1] *
w[2] + v4[1] *
w[3];
139 p[2] = v1[2] *
w[0] +
v2[2] *
w[1] + v3[2] *
w[2] + v4[2] *
w[3];
143 float p[4],
const float v1[4],
const float v2[4],
const float v3[4],
const float w[3])
145 p[0] = v1[0] *
w[0] +
v2[0] *
w[1] + v3[0] *
w[2];
146 p[1] = v1[1] *
w[0] +
v2[1] *
w[1] + v3[1] *
w[2];
147 p[2] = v1[2] *
w[0] +
v2[2] *
w[1] + v3[2] *
w[2];
148 p[3] = v1[3] *
w[0] +
v2[3] *
w[1] + v3[3] *
w[2];
158 p[0] = v1[0] *
w[0] +
v2[0] *
w[1] + v3[0] *
w[2] + v4[0] *
w[3];
159 p[1] = v1[1] *
w[0] +
v2[1] *
w[1] + v3[1] *
w[2] + v4[1] *
w[3];
160 p[2] = v1[2] *
w[0] +
v2[2] *
w[1] + v3[2] *
w[2] + v4[2] *
w[3];
161 p[3] = v1[3] *
w[0] +
v2[3] *
w[1] + v3[3] *
w[2] + v4[3] *
w[3];
165 float p[3],
const float v1[3],
const float v2[3],
const float v3[3],
const float uv[2])
167 p[0] = v1[0] + ((
v2[0] - v1[0]) * uv[0]) + ((v3[0] - v1[0]) * uv[1]);
168 p[1] = v1[1] + ((
v2[1] - v1[1]) * uv[0]) + ((v3[1] - v1[1]) * uv[1]);
169 p[2] = v1[2] + ((
v2[2] - v1[2]) * uv[0]) + ((v3[2] - v1[2]) * uv[1]);
174 const float s = 1.0f - t;
176 target[0] = char(
floorf(s * a[0] + t *
b[0]));
177 target[1] = char(
floorf(s * a[1] + t *
b[1]));
178 target[2] = char(
floorf(s * a[2] + t *
b[2]));
183 r[0] = 0.5f * (a[0] +
b[0]);
184 r[1] = 0.5f * (a[1] +
b[1]);
185 r[2] = 0.5f * (a[2] +
b[2]);
190 r[0] = 0.5f * (a[0] +
b[0]);
191 r[1] = 0.5f * (a[1] +
b[1]);
196 v[0] = (v1[0] +
v2[0] + v3[0]) / 3.0f;
197 v[1] = (v1[1] +
v2[1] + v3[1]) / 3.0f;
202 v[0] = (v1[0] +
v2[0] + v3[0]) / 3.0f;
203 v[1] = (v1[1] +
v2[1] + v3[1]) / 3.0f;
204 v[2] = (v1[2] +
v2[2] + v3[2]) / 3.0f;
208 float v[3],
const float v1[3],
const float v2[3],
const float v3[3],
const float v4[3])
210 v[0] = (v1[0] +
v2[0] + v3[0] + v4[0]) / 4.0f;
211 v[1] = (v1[1] +
v2[1] + v3[1] + v4[1]) / 4.0f;
212 v[2] = (v1[2] +
v2[2] + v3[2] + v4[2]) / 4.0f;
217 const float factor = 1.0f /
float(vec_arr_num);
220 for (
uint i = 0;
i < vec_arr_num;
i++) {
252 float vec1[3], vec2[3];
262float cos_v3v3v3(
const float p1[3],
const float p2[3],
const float p3[3])
264 float vec1[3], vec2[3];
276 float vec1[3], vec2[3];
286 float vec1[2], vec2[2];
288 vec1[0] =
b[0] - a[0];
289 vec1[1] =
b[1] - a[1];
291 vec2[0] =
b[0] - c[0];
292 vec2[1] =
b[1] - c[1];
300float cos_v2v2v2(
const float p1[2],
const float p2[2],
const float p3[2])
302 float vec1[2], vec2[2];
314 float vec1[2], vec2[2];
330 const float perp_dot = (v1[1] *
v2[0]) - (v1[0] *
v2[1]);
368 float v1_proj[3], v2_proj[3];
379 float v1_proj[3], v2_proj[3], tproj[3];
402 float vec1[3], vec2[3];
415 float vec1[3], vec2[3];
423void angle_tri_v3(
float angles[3],
const float v1[3],
const float v2[3],
const float v3[3])
425 float ed1[3], ed2[3], ed3[3];
438 angles[2] =
float(
M_PI) - (angles[0] + angles[1]);
442 float angles[4],
const float v1[3],
const float v2[3],
const float v3[3],
const float v4[3])
444 float ed1[3], ed2[3], ed3[3], ed4[3];
469 for (
i = 0;
i <
len;
i++) {
549 float d_12[3], d_23[3];
561 const float dot2 = 2.0f *
dot_v3v3(
v, normal);
568 const float eps = FLT_EPSILON;
572 const float d = 1.0f /
sqrtf(f);
579 r_n2[0] = -n[2] * r_n1[1];
580 r_n2[1] = n[2] * r_n1[0];
581 r_n2[2] = n[0] * r_n1[1] - n[1] * r_n1[0];
585 r_n1[0] = (n[2] < 0.0f) ? -1.0f : 1.0f;
586 r_n1[1] = r_n1[2] = r_n2[0] = r_n2[2] = 0.0f;
599 out[0] = -
v[1] -
v[2];
605 out[1] = -
v[0] -
v[2];
611 out[2] = -
v[0] -
v[1];
631 r[0] = co * p[0] - si * p[1];
632 r[1] = si * p[0] + co * p[1];
646 out[0] = ((costheta + (1 - costheta) * axis[0] * axis[0]) * p[0]) +
647 (((1 - costheta) * axis[0] * axis[1] - axis[2] * sintheta) * p[1]) +
648 (((1 - costheta) * axis[0] * axis[2] + axis[1] * sintheta) * p[2]);
650 out[1] = (((1 - costheta) * axis[0] * axis[1] + axis[2] * sintheta) * p[0]) +
651 ((costheta + (1 - costheta) * axis[1] * axis[1]) * p[1]) +
652 (((1 - costheta) * axis[1] * axis[2] - axis[0] * sintheta) * p[2]);
654 out[2] = (((1 - costheta) * axis[0] * axis[2] - axis[1] * sintheta) * p[0]) +
655 (((1 - costheta) * axis[1] * axis[2] + axis[0] * sintheta) * p[1]) +
656 ((costheta + (1 - costheta) * axis[2] * axis[2]) * p[2]);
688 printf(
"%s: %.8f %.8f %.8f %.8f\n",
str,
v[0],
v[1],
v[2],
v[3]);
703 min[0] = std::min(
min[0], vec[0]);
704 min[1] = std::min(
min[1], vec[1]);
705 min[2] = std::min(
min[2], vec[2]);
706 min[3] = std::min(
min[3], vec[3]);
708 max[0] = std::max(
max[0], vec[0]);
709 max[1] = std::max(
max[1], vec[1]);
710 max[2] = std::max(
max[2], vec[2]);
711 max[3] = std::max(
max[3], vec[3]);
716 min[0] = std::min(
min[0], vec[0]);
717 min[1] = std::min(
min[1], vec[1]);
718 min[2] = std::min(
min[2], vec[2]);
720 max[0] = std::max(
max[0], vec[0]);
721 max[1] = std::max(
max[1], vec[1]);
722 max[2] = std::max(
max[2], vec[2]);
727 min[0] = std::min(
min[0], vec[0]);
728 min[1] = std::min(
min[1], vec[1]);
730 max[0] = std::max(
max[0], vec[0]);
731 max[1] = std::max(
max[1], vec[1]);
761#define SWAP_AXIS(a, b) \
763 SWAP(float, v[a], v[b]); \
764 SWAP(int, r_axis_order[a], r_axis_order[b]); \
799double dot_vn_vn(
const float *array_src_a,
const float *array_src_b,
const int size)
802 const float *array_pt_a = array_src_a + (
size - 1);
803 const float *array_pt_b = array_src_b + (
size - 1);
806 d += double(*(array_pt_a--) * *(array_pt_b--));
814 const float *array_pt =
array + (
size - 1);
817 d +=
sqr_db(
double(*(array_pt)--));
844 int *array_pt = array_tar + (
size - 1);
845 int j = start + (
size - 1);
854 uint *array_pt = array_tar + (
size - 1);
864 float *array_pt = array_tar + (
size - 1);
867 *(array_pt--) = start +
step *
float(
i);
873 float *array_pt = array_tar + (
size - 1);
876 *(array_pt--) *= -1.0f;
882 float *tar = array_tar + (
size - 1);
883 const float *src = array_src + (
size - 1);
886 *(tar--) = -*(src--);
892 float *tar = array_tar + (
size - 1);
893 const float *src = array_src + (
size - 1);
896 *(tar--) *= *(src--);
901 const float *array_src_a,
902 const float *array_src_b,
905 float *tar = array_tar + (
size - 1);
906 const float *src_a = array_src_a + (
size - 1);
907 const float *src_b = array_src_b + (
size - 1);
910 *(tar--) = *(src_a--) * *(src_b--);
916 float *array_pt = array_tar + (
size - 1);
925 float *tar = array_tar + (
size - 1);
926 const float *src = array_src + (
size - 1);
929 *(tar--) = *(src--) * f;
935 float *tar = array_tar + (
size - 1);
936 const float *src = array_src + (
size - 1);
939 *(tar--) += *(src--);
944 const float *array_src_a,
945 const float *array_src_b,
948 float *tar = array_tar + (
size - 1);
949 const float *src_a = array_src_a + (
size - 1);
950 const float *src_b = array_src_b + (
size - 1);
953 *(tar--) = *(src_a--) + *(src_b--);
959 float *tar = array_tar + (
size - 1);
960 const float *src = array_src + (
size - 1);
963 *(tar--) -= *(src--);
968 const float *array_src_a,
969 const float *array_src_b,
972 float *tar = array_tar + (
size - 1);
973 const float *src_a = array_src_a + (
size - 1);
974 const float *src_b = array_src_b + (
size - 1);
977 *(tar--) = *(src_a--) - *(src_b--);
983 const float s = 1.0f - t;
984 float *tar = array_tar + (
size - 1);
985 const float *src = array_src + (
size - 1);
988 *(tar) = (s * *(tar)) + (t * *(src));
996 int *tar = array_tar + (
size - 1);
1005 short *tar = array_tar + (
size - 1);
1014 float *tar = array_tar + (
size - 1);
1029 double *tar = array_tar + (
size - 1);
1030 const double *src = array_src + (
size - 1);
1033 *(tar--) += *(src--);
1038 const double *array_src_a,
1039 const double *array_src_b,
1042 double *tar = array_tar + (
size - 1);
1043 const double *src_a = array_src_a + (
size - 1);
1044 const double *src_b = array_src_b + (
size - 1);
1047 *(tar--) = *(src_a--) + *(src_b--);
1053 double *array_pt = array_tar + (
size - 1);
1062 const double s = 1.0f - t;
1064 target[0] = s * a[0] + t *
b[0];
1065 target[1] = s * a[1] + t *
b[1];
1066 target[2] = s * a[2] + t *
b[2];
1071 const double s = 1.0f - t;
1073 target[0] = s * a[0] + t *
b[0];
1074 target[1] = s * a[1] + t *
b[1];
#define BLI_ASSERT_UNIT_V2(v)
#define BLI_ASSERT_UNIT_V3(v)
MINLINE float safe_asinf(float a)
MINLINE int axis_dominant_v3_single(const float vec[3])
void interp_dot_slerp(float t, float cosom, float r_w[2])
MINLINE float len_squared_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_squared_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], float f)
MINLINE bool equals_v3v3(const float v1[3], const float v2[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE float len_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE bool is_zero_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void negate_v3_v3(float r[3], const float a[3])
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void negate_v2_v2(float r[2], const float a[2])
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE bool equals_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float normalize_v3_v3(float r[3], const float a[3])
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE bool is_zero_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void zero_v2(float r[2])
MINLINE float dot_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float normalize_v2(float n[2])
MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
MINLINE void zero_v3(float r[3])
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f)
MINLINE float normalize_v3(float n[3])
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
static void mul(btAlignedObjectArray< T > &items, const Q &value)
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
void mid_v3_v3v3v3v3(float v[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3])
void copy_vn_fl(float *array_tar, const int size, const float val)
void project_v2_v2v2_normalized(float out[2], const float p[2], const float v_proj[2])
void add_vn_vn_d(double *array_tar, const double *array_src, const int size)
void negate_vn(float *array_tar, const int size)
void interp_v2_v2v2(float r[2], const float a[2], const float b[2], const float t)
void angle_quad_v3(float angles[4], const float v1[3], const float v2[3], const float v3[3], const float v4[3])
void axis_sort_v3(const float axis_values[3], int r_axis_order[3])
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], const float t)
void sub_vn_vn(float *array_tar, const float *array_src, const int size)
void mul_vn_db(double *array_tar, const int size, const double f)
void minmax_v3v3_v3(float min[3], float max[3], const float vec[3])
void rotate_v2_v2fl(float r[2], const float p[2], const float angle)
void mul_vn_vn_fl(float *array_tar, const float *array_src, const int size, const float f)
void copy_vn_i(int *array_tar, const int size, const int val)
void print_v3(const char *str, const float v[3])
float angle_on_axis_v3v3_v3(const float v1[3], const float v2[3], const float axis[3])
float normalize_vn(float *array_tar, const int size)
float angle_v3v3v3(const float a[3], const float b[3], const float c[3])
void reflect_v3_v3v3(float out[3], const float v[3], const float normal[3])
void interp_v3_v3v3v3(float p[3], const float v1[3], const float v2[3], const float v3[3], const float w[3])
float angle_normalized_v3v3(const float v1[3], const float v2[3])
void interp_v4_v4v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float v4[4], const float w[4])
void sub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size)
void interp_v3_v3v3_db(double target[3], const double a[3], const double b[3], const double t)
double dot_vn_vn(const float *array_src_a, const float *array_src_b, const int size)
void angle_tri_v3(float angles[3], const float v1[3], const float v2[3], const float v3[3])
void add_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size)
float angle_v3v3(const float a[3], const float b[3])
void interp_v4_v4v4(float r[4], const float a[4], const float b[4], const float t)
void mid_v2_v2v2v2(float v[2], const float v1[2], const float v2[2], const float v3[2])
void project_v3_plane(float out[3], const float plane_no[3], const float plane_co[3])
float cos_v3v3v3(const float p1[3], const float p2[3], const float p3[3])
void add_vn_vn(float *array_tar, const float *array_src, const int size)
void project_v3_v3v3_normalized(float out[3], const float p[3], const float v_proj[3])
void interp_v2_v2v2v2(float r[2], const float a[2], const float b[2], const float c[2], const float t[3])
void print_v4(const char *str, const float v[4])
bool interp_v3_v3v3_slerp(float target[3], const float a[3], const float b[3], const float t)
float normalize_vn_vn(float *array_tar, const float *array_src, const int size)
void negate_vn_vn(float *array_tar, const float *array_src, const int size)
void project_v3_v3v3(float out[3], const float p[3], const float v_proj[3])
void minmax_v2v2_v2(float min[2], float max[2], const float vec[2])
void project_plane_v3_v3v3(float out[3], const float p[3], const float v_plane[3])
void interp_v3_v3v3_slerp_safe(float target[3], const float a[3], const float b[3], const float t)
void copy_vn_short(short *array_tar, const int size, const short val)
void project_plane_normalized_v3_v3v3(float out[3], const float p[3], const float v_plane[3])
void interp_v3_v3v3_uchar(uchar target[3], const uchar a[3], const uchar b[3], const float t)
void print_v2(const char *str, const float v[2])
void mid_v3_v3v3_angle_weighted(float r[3], const float a[3], const float b[3])
void rotate_v3_v3v3fl(float r[3], const float p[3], const float axis[3], const float angle)
void ortho_v3_v3(float out[3], const float v[3])
float angle_v2v2(const float a[2], const float b[2])
void interp_v2_v2v2_db(double target[2], const double a[2], const double b[2], const double t)
void interp_v4_v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float w[3])
float cos_v2v2v2(const float p1[2], const float p2[2], const float p3[2])
void print_vn(const char *str, const float v[], const int n)
void interp_v3_v3v3v3v3(float p[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3], const float w[4])
void minmax_v4v4_v4(float min[4], float max[4], const float vec[4])
void dist_ensure_v2_v2fl(float v1[2], const float v2[2], const float dist)
void mid_v2_v2v2(float r[2], const float a[2], const float b[2])
void range_vn_u(uint *array_tar, const int size, const uint start)
void ortho_v2_v2(float out[2], const float v[2])
void mul_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size)
void angle_poly_v3(float *angles, const float *verts[3], int len)
void range_vn_fl(float *array_tar, const int size, const float start, const float step)
void interp_vn_vn(float *array_tar, const float *array_src, const float t, const int size)
double len_squared_vn(const float *array, const int size)
void mid_v3_v3v3(float r[3], const float a[3], const float b[3])
void ortho_basis_v3v3_v3(float r_n1[3], float r_n2[3], const float n[3])
void mul_vn_vn(float *array_tar, const float *array_src, const int size)
void add_vn_vnvn_d(double *array_tar, const double *array_src_a, const double *array_src_b, const int size)
void mid_v3_v3_array(float r[3], const float(*vec_arr)[3], const uint vec_arr_num)
void range_vn_i(int *array_tar, const int size, const int start)
float angle_v2v2v2(const float a[2], const float b[2], const float c[2])
float angle_normalized_v2v2(const float a[2], const float b[2])
void dist_ensure_v3_v3fl(float v1[3], const float v2[3], const float dist)
float angle_on_axis_v3v3v3_v3(const float v1[3], const float v2[3], const float v3[3], const float axis[3])
void mul_vn_fl(float *array_tar, const int size, const float f)
void interp_v3_v3v3v3_uv(float p[3], const float v1[3], const float v2[3], const float v3[3], const float uv[2])
float angle_signed_on_axis_v3v3v3_v3(const float v1[3], const float v2[3], const float v3[3], const float axis[3])
void rotate_normalized_v3_v3v3fl(float out[3], const float p[3], const float axis[3], const float angle)
MINLINE double sqr_db(double f)
float angle_signed_on_axis_v3v3_v3(const float v1[3], const float v2[3], const float axis[3])
void mid_v3_v3v3v3(float v[3], const float v1[3], const float v2[3], const float v3[3])
void interp_v2_v2v2v2v2_cubic(float p[2], const float v1[2], const float v2[2], const float v3[2], const float v4[2], const float u)
void project_v2_v2v2(float out[2], const float p[2], const float v_proj[2])
void bisect_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3])
float angle_signed_v2v2(const float v1[2], const float v2[2])