23 #include "../util/sse-intrin.h"
44 static inline void vec3_zero(
struct vec3 *v)
46 v->
m = _mm_setzero_ps();
49 static inline void vec3_set(
struct vec3 *dst,
float x,
float y,
float z)
51 dst->
m = _mm_set_ps(0.0f, z, y, x);
54 static inline void vec3_copy(
struct vec3 *dst,
const struct vec3 *v)
61 static inline void vec3_add(
struct vec3 *dst,
const struct vec3 *v1,
62 const struct vec3 *v2)
64 dst->
m = _mm_add_ps(v1->
m, v2->
m);
68 static inline void vec3_sub(
struct vec3 *dst,
const struct vec3 *v1,
69 const struct vec3 *v2)
71 dst->
m = _mm_sub_ps(v1->
m, v2->
m);
75 static inline void vec3_mul(
struct vec3 *dst,
const struct vec3 *v1,
76 const struct vec3 *v2)
78 dst->
m = _mm_mul_ps(v1->
m, v2->
m);
81 static inline void vec3_div(
struct vec3 *dst,
const struct vec3 *v1,
82 const struct vec3 *v2)
84 dst->
m = _mm_div_ps(v1->
m, v2->
m);
88 static inline void vec3_addf(
struct vec3 *dst,
const struct vec3 *v,
float f)
90 dst->
m = _mm_add_ps(v->
m, _mm_set1_ps(f));
94 static inline void vec3_subf(
struct vec3 *dst,
const struct vec3 *v,
float f)
96 dst->
m = _mm_sub_ps(v->
m, _mm_set1_ps(f));
100 static inline void vec3_mulf(
struct vec3 *dst,
const struct vec3 *v,
float f)
102 dst->
m = _mm_mul_ps(v->
m, _mm_set1_ps(f));
105 static inline void vec3_divf(
struct vec3 *dst,
const struct vec3 *v,
float f)
107 dst->
m = _mm_div_ps(v->
m, _mm_set1_ps(f));
111 static inline float vec3_dot(
const struct vec3 *v1,
const struct vec3 *v2)
114 __m128 mul = _mm_mul_ps(v1->
m, v2->
m);
115 add.m = _mm_add_ps(_mm_movehl_ps(mul, mul), mul);
116 add.m = _mm_add_ps(_mm_shuffle_ps(add.m, add.m, 0x55), add.m);
120 static inline void vec3_cross(
struct vec3 *dst,
const struct vec3 *v1,
121 const struct vec3 *v2)
123 __m128 s1v1 = _mm_shuffle_ps(v1->
m, v1->
m, _MM_SHUFFLE(3, 0, 2, 1));
124 __m128 s1v2 = _mm_shuffle_ps(v2->
m, v2->
m, _MM_SHUFFLE(3, 1, 0, 2));
125 __m128 s2v1 = _mm_shuffle_ps(v1->
m, v1->
m, _MM_SHUFFLE(3, 1, 0, 2));
126 __m128 s2v2 = _mm_shuffle_ps(v2->
m, v2->
m, _MM_SHUFFLE(3, 0, 2, 1));
127 dst->
m = _mm_sub_ps(_mm_mul_ps(s1v1, s1v2), _mm_mul_ps(s2v1, s2v2));
130 static inline void vec3_neg(
struct vec3 *dst,
const struct vec3 *v)
138 static inline float vec3_len(
const struct vec3 *v)
140 float dot_val = vec3_dot(v, v);
141 return (dot_val > 0.0f) ? sqrtf(dot_val) : 0.0f;
144 static inline float vec3_dist(
const struct vec3 *v1,
const struct vec3 *v2)
149 vec3_sub(&temp, v1, v2);
150 dot_val = vec3_dot(&temp, &temp);
151 return (dot_val > 0.0f) ? sqrtf(dot_val) : 0.0f;
154 static inline void vec3_norm(
struct vec3 *dst,
const struct vec3 *v)
156 float dot_val = vec3_dot(v, v);
157 dst->
m = (dot_val > 0.0f)
158 ? _mm_mul_ps(v->
m, _mm_set1_ps(1.0f / sqrtf(dot_val)))
162 static inline bool vec3_close(
const struct vec3 *v1,
const struct vec3 *v2,
166 vec3_sub(&test, v1, v2);
167 return test.x < epsilon && test.y < epsilon && test.z < epsilon;
170 static inline void vec3_min(
struct vec3 *dst,
const struct vec3 *v1,
171 const struct vec3 *v2)
173 dst->
m = _mm_min_ps(v1->
m, v2->
m);
177 static inline void vec3_minf(
struct vec3 *dst,
const struct vec3 *v,
float f)
179 dst->
m = _mm_min_ps(v->
m, _mm_set1_ps(f));
183 static inline void vec3_max(
struct vec3 *dst,
const struct vec3 *v1,
184 const struct vec3 *v2)
186 dst->
m = _mm_max_ps(v1->
m, v2->
m);
190 static inline void vec3_maxf(
struct vec3 *dst,
const struct vec3 *v,
float f)
192 dst->
m = _mm_max_ps(v->
m, _mm_set1_ps(f));
196 static inline void vec3_abs(
struct vec3 *dst,
const struct vec3 *v)
198 dst->
x = fabsf(v->
x);
199 dst->
y = fabsf(v->
y);
200 dst->
z = fabsf(v->
z);
204 static inline void vec3_floor(
struct vec3 *dst,
const struct vec3 *v)
206 dst->
x = floorf(v->
x);
207 dst->
y = floorf(v->
y);
208 dst->
z = floorf(v->
z);
212 static inline void vec3_ceil(
struct vec3 *dst,
const struct vec3 *v)
214 dst->
x = ceilf(v->
x);
215 dst->
y = ceilf(v->
y);
216 dst->
z = ceilf(v->
z);
231 const struct plane *p);
233 const struct vec3 *vec);