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,
float f)
89 dst->
m = _mm_add_ps(v->
m, _mm_set1_ps(f));
93 static inline void vec3_subf(
struct vec3 *dst,
const struct vec3 *v,
float f)
95 dst->
m = _mm_sub_ps(v->
m, _mm_set1_ps(f));
99 static inline void vec3_mulf(
struct vec3 *dst,
const struct vec3 *v,
float f)
101 dst->
m = _mm_mul_ps(v->
m, _mm_set1_ps(f));
104 static inline void vec3_divf(
struct vec3 *dst,
const struct vec3 *v,
float f)
106 dst->
m = _mm_div_ps(v->
m, _mm_set1_ps(f));
110 static inline float vec3_dot(
const struct vec3 *v1,
const struct vec3 *v2)
113 __m128 mul = _mm_mul_ps(v1->
m, v2->
m);
114 add.m = _mm_add_ps(_mm_movehl_ps(mul, mul), mul);
115 add.m = _mm_add_ps(_mm_shuffle_ps(add.m, add.m, 0x55), add.m);
119 static inline void vec3_cross(
struct vec3 *dst,
const struct vec3 *v1,
120 const struct vec3 *v2)
122 __m128 s1v1 = _mm_shuffle_ps(v1->
m, v1->
m, _MM_SHUFFLE(3, 0, 2, 1));
123 __m128 s1v2 = _mm_shuffle_ps(v2->
m, v2->
m, _MM_SHUFFLE(3, 1, 0, 2));
124 __m128 s2v1 = _mm_shuffle_ps(v1->
m, v1->
m, _MM_SHUFFLE(3, 1, 0, 2));
125 __m128 s2v2 = _mm_shuffle_ps(v2->
m, v2->
m, _MM_SHUFFLE(3, 0, 2, 1));
126 dst->
m = _mm_sub_ps(_mm_mul_ps(s1v1, s1v2), _mm_mul_ps(s2v1, s2v2));
129 static inline void vec3_neg(
struct vec3 *dst,
const struct vec3 *v)
137 static inline float vec3_len(
const struct vec3 *v)
139 float dot_val = vec3_dot(v, v);
140 return (dot_val > 0.0f) ? sqrtf(dot_val) : 0.0f;
143 static inline float vec3_dist(
const struct vec3 *v1,
const struct vec3 *v2)
148 vec3_sub(&temp, v1, v2);
149 dot_val = vec3_dot(&temp, &temp);
150 return (dot_val > 0.0f) ? sqrtf(dot_val) : 0.0f;
153 static inline void vec3_norm(
struct vec3 *dst,
const struct vec3 *v)
155 float dot_val = vec3_dot(v, v);
156 dst->
m = (dot_val > 0.0f)
157 ? _mm_mul_ps(v->
m, _mm_set1_ps(1.0f / sqrtf(dot_val)))
161 static inline bool vec3_close(
const struct vec3 *v1,
const struct vec3 *v2,
165 vec3_sub(&test, v1, v2);
166 return test.x < epsilon && test.y < epsilon && test.z < epsilon;
169 static inline void vec3_min(
struct vec3 *dst,
const struct vec3 *v1,
170 const struct vec3 *v2)
172 dst->
m = _mm_min_ps(v1->
m, v2->
m);
176 static inline void vec3_minf(
struct vec3 *dst,
const struct vec3 *v,
float f)
178 dst->
m = _mm_min_ps(v->
m, _mm_set1_ps(f));
182 static inline void vec3_max(
struct vec3 *dst,
const struct vec3 *v1,
183 const struct vec3 *v2)
185 dst->
m = _mm_max_ps(v1->
m, v2->
m);
189 static inline void vec3_maxf(
struct vec3 *dst,
const struct vec3 *v,
float f)
191 dst->
m = _mm_max_ps(v->
m, _mm_set1_ps(f));
195 static inline void vec3_abs(
struct vec3 *dst,
const struct vec3 *v)
197 dst->
x = fabsf(v->
x);
198 dst->
y = fabsf(v->
y);
199 dst->
z = fabsf(v->
z);
203 static inline void vec3_floor(
struct vec3 *dst,
const struct vec3 *v)
205 dst->
x = floorf(v->
x);
206 dst->
y = floorf(v->
y);
207 dst->
z = floorf(v->
z);
211 static inline void vec3_ceil(
struct vec3 *dst,
const struct vec3 *v)
213 dst->
x = ceilf(v->
x);
214 dst->
y = ceilf(v->
y);
215 dst->
z = ceilf(v->
z);
230 const struct plane *p);
232 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:49
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)