22 #include <xmmintrin.h> 43 static inline void vec3_zero(
struct vec3 *v)
45 v->
m = _mm_setzero_ps();
48 static inline void vec3_set(
struct vec3 *dst,
float x,
float y,
float z)
50 dst->
m = _mm_set_ps(0.0f, z, y, x);
53 static inline void vec3_copy(
struct vec3 *dst,
const struct vec3 *v)
60 static inline void vec3_add(
struct vec3 *dst,
const struct vec3 *v1,
61 const struct vec3 *v2)
63 dst->
m = _mm_add_ps(v1->
m, v2->
m);
67 static inline void vec3_sub(
struct vec3 *dst,
const struct vec3 *v1,
68 const struct vec3 *v2)
70 dst->
m = _mm_sub_ps(v1->
m, v2->
m);
74 static inline void vec3_mul(
struct vec3 *dst,
const struct vec3 *v1,
75 const struct vec3 *v2)
77 dst->
m = _mm_mul_ps(v1->
m, v2->
m);
80 static inline void vec3_div(
struct vec3 *dst,
const struct vec3 *v1,
81 const struct vec3 *v2)
83 dst->
m = _mm_div_ps(v1->
m, v2->
m);
87 static inline void vec3_addf(
struct vec3 *dst,
const struct vec3 *v,
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,
97 dst->
m = _mm_sub_ps(v->
m, _mm_set1_ps(f));
101 static inline void vec3_mulf(
struct vec3 *dst,
const struct vec3 *v,
104 dst->
m = _mm_mul_ps(v->
m, _mm_set1_ps(f));
107 static inline void vec3_divf(
struct vec3 *dst,
const struct vec3 *v,
110 dst->
m = _mm_div_ps(v->
m, _mm_set1_ps(f));
114 static inline float vec3_dot(
const struct vec3 *v1,
const struct vec3 *v2)
117 __m128 mul = _mm_mul_ps(v1->
m, v2->
m);
118 add.
m = _mm_add_ps(_mm_movehl_ps(mul, mul), mul);
119 add.
m = _mm_add_ps(_mm_shuffle_ps(add.
m, add.
m, 0x55), add.
m);
123 static inline void vec3_cross(
struct vec3 *dst,
const struct vec3 *v1,
124 const struct vec3 *v2)
126 __m128 s1v1 = _mm_shuffle_ps(v1->
m, v1->
m, _MM_SHUFFLE(3, 0, 2, 1));
127 __m128 s1v2 = _mm_shuffle_ps(v2->
m, v2->
m, _MM_SHUFFLE(3, 1, 0, 2));
128 __m128 s2v1 = _mm_shuffle_ps(v1->
m, v1->
m, _MM_SHUFFLE(3, 1, 0, 2));
129 __m128 s2v2 = _mm_shuffle_ps(v2->
m, v2->
m, _MM_SHUFFLE(3, 0, 2, 1));
130 dst->
m = _mm_sub_ps(_mm_mul_ps(s1v1, s1v2), _mm_mul_ps(s2v1, s2v2));
133 static inline void vec3_neg(
struct vec3 *dst,
const struct vec3 *v)
141 static inline float vec3_len(
const struct vec3 *v)
143 float dot_val = vec3_dot(v, v);
144 return (dot_val > 0.0f) ? sqrtf(dot_val) : 0.0f;
147 static inline float vec3_dist(
const struct vec3 *v1,
const struct vec3 *v2)
152 vec3_sub(&temp, v1, v2);
153 dot_val = vec3_dot(&temp, &temp);
154 return (dot_val > 0.0f) ? sqrtf(dot_val) : 0.0f;
157 static inline void vec3_norm(
struct vec3 *dst,
const struct vec3 *v)
159 float dot_val = vec3_dot(v, v);
160 dst->
m = (dot_val > 0.0f) ?
161 _mm_mul_ps(v->
m, _mm_set1_ps(1.0f/sqrtf(dot_val))) :
165 static inline bool vec3_close(
const struct vec3 *v1,
const struct vec3 *v2,
169 vec3_sub(&test, v1, v2);
170 return test.
x < epsilon && test.
y < epsilon && test.
z < epsilon;
173 static inline void vec3_min(
struct vec3 *dst,
const struct vec3 *v1,
174 const struct vec3 *v2)
176 dst->
m = _mm_min_ps(v1->
m, v2->
m);
180 static inline void vec3_minf(
struct vec3 *dst,
const struct vec3 *v,
183 dst->
m = _mm_min_ps(v->
m, _mm_set1_ps(f));
187 static inline void vec3_max(
struct vec3 *dst,
const struct vec3 *v1,
188 const struct vec3 *v2)
190 dst->
m = _mm_max_ps(v1->
m, v2->
m);
194 static inline void vec3_maxf(
struct vec3 *dst,
const struct vec3 *v,
197 dst->
m = _mm_max_ps(v->
m, _mm_set1_ps(f));
201 static inline void vec3_abs(
struct vec3 *dst,
const struct vec3 *v)
203 dst->
x = fabsf(v->
x);
204 dst->
y = fabsf(v->
y);
205 dst->
z = fabsf(v->
z);
209 static inline void vec3_floor(
struct vec3 *dst,
const struct vec3 *v)
211 dst->
x = floorf(v->
x);
212 dst->
y = floorf(v->
y);
213 dst->
z = floorf(v->
z);
217 static inline void vec3_ceil(
struct vec3 *dst,
const struct vec3 *v)
219 dst->
x = ceilf(v->
x);
220 dst->
y = ceilf(v->
y);
221 dst->
z = ceilf(v->
z);
236 const struct plane *p);
238 const struct vec3 *vec);
EXPORT float vec3_plane_dist(const struct vec3 *v, const struct plane *p)
EXPORT void vec3_rotate(struct vec3 *dst, const struct vec3 *v, const struct matrix3 *m)
EXPORT void vec3_from_vec4(struct vec3 *dst, const struct vec4 *v)
EXPORT void vec3_rand(struct vec3 *dst, int positive_only)
float w
Definition: vec3.h:36
float z
Definition: vec3.h:36
#define EXPORT
Definition: c99defs.h:53
EXPORT void vec3_transform(struct vec3 *dst, const struct vec3 *v, const struct matrix4 *m)
EXPORT void vec3_mirrorv(struct vec3 *dst, const struct vec3 *v, const struct vec3 *vec)
__m128 m
Definition: vec3.h:39
float ptr[4]
Definition: vec3.h:38
EXPORT void vec3_transform3x4(struct vec3 *dst, const struct vec3 *v, const struct matrix3 *m)
float x
Definition: vec3.h:36
float y
Definition: vec3.h:36
EXPORT void vec3_mirror(struct vec3 *dst, const struct vec3 *v, const struct plane *p)