21 #include <xmmintrin.h> 40 static inline void vec4_zero(
struct vec4 *v)
42 v->
m = _mm_setzero_ps();
45 static inline void vec4_set(
struct vec4 *dst,
float x,
float y,
float z,
48 dst->
m = _mm_set_ps(w, z, y, x);
51 static inline void vec4_copy(
struct vec4 *dst,
const struct vec4 *v)
58 static inline void vec4_add(
struct vec4 *dst,
const struct vec4 *v1,
59 const struct vec4 *v2)
61 dst->
m = _mm_add_ps(v1->
m, v2->
m);
64 static inline void vec4_sub(
struct vec4 *dst,
const struct vec4 *v1,
65 const struct vec4 *v2)
67 dst->
m = _mm_sub_ps(v1->
m, v2->
m);
70 static inline void vec4_mul(
struct vec4 *dst,
const struct vec4 *v1,
71 const struct vec4 *v2)
73 dst->
m = _mm_mul_ps(v1->
m, v2->
m);
76 static inline void vec4_div(
struct vec4 *dst,
const struct vec4 *v1,
77 const struct vec4 *v2)
79 dst->
m = _mm_div_ps(v1->
m, v2->
m);
82 static inline void vec4_addf(
struct vec4 *dst,
const struct vec4 *v,
float f)
84 dst->
m = _mm_add_ps(v->
m, _mm_set1_ps(f));
87 static inline void vec4_subf(
struct vec4 *dst,
const struct vec4 *v,
float f)
89 dst->
m = _mm_sub_ps(v->
m, _mm_set1_ps(f));
92 static inline void vec4_mulf(
struct vec4 *dst,
const struct vec4 *v,
float f)
94 dst->
m = _mm_mul_ps(v->
m, _mm_set1_ps(f));
97 static inline void vec4_divf(
struct vec4 *dst,
const struct vec4 *v,
float f)
99 dst->
m = _mm_div_ps(v->
m, _mm_set1_ps(f));
102 static inline float vec4_dot(
const struct vec4 *v1,
const struct vec4 *v2)
105 __m128 mul = _mm_mul_ps(v1->
m, v2->
m);
106 add.m = _mm_add_ps(_mm_movehl_ps(mul, mul), mul);
107 add.m = _mm_add_ps(_mm_shuffle_ps(add.m, add.m, 0x55), add.m);
111 static inline void vec4_neg(
struct vec4 *dst,
const struct vec4 *v)
119 static inline float vec4_len(
const struct vec4 *v)
121 float dot_val = vec4_dot(v, v);
122 return (dot_val > 0.0f) ? sqrtf(dot_val) : 0.0f;
125 static inline float vec4_dist(
const struct vec4 *v1,
const struct vec4 *v2)
130 vec4_sub(&temp, v1, v2);
131 dot_val = vec4_dot(&temp, &temp);
132 return (dot_val > 0.0f) ? sqrtf(dot_val) : 0.0f;
135 static inline void vec4_norm(
struct vec4 *dst,
const struct vec4 *v)
137 float dot_val = vec4_dot(v, v);
138 dst->
m = (dot_val > 0.0f)
139 ? _mm_mul_ps(v->
m, _mm_set1_ps(1.0f / sqrtf(dot_val)))
143 static inline int vec4_close(
const struct vec4 *v1,
const struct vec4 *v2,
147 vec4_sub(&test, v1, v2);
148 return test.x < epsilon && test.y < epsilon && test.z < epsilon &&
152 static inline void vec4_min(
struct vec4 *dst,
const struct vec4 *v1,
153 const struct vec4 *v2)
155 dst->
m = _mm_min_ps(v1->
m, v2->
m);
158 static inline void vec4_minf(
struct vec4 *dst,
const struct vec4 *v,
float f)
160 dst->
m = _mm_min_ps(v->
m, _mm_set1_ps(f));
163 static inline void vec4_max(
struct vec4 *dst,
const struct vec4 *v1,
164 const struct vec4 *v2)
166 dst->
m = _mm_max_ps(v1->
m, v2->
m);
169 static inline void vec4_maxf(
struct vec4 *dst,
const struct vec4 *v,
float f)
171 dst->
m = _mm_max_ps(v->
m, _mm_set1_ps(f));
174 static inline void vec4_abs(
struct vec4 *dst,
const struct vec4 *v)
176 dst->
x = fabsf(v->
x);
177 dst->
y = fabsf(v->
y);
178 dst->
z = fabsf(v->
z);
179 dst->
w = fabsf(v->
w);
182 static inline void vec4_floor(
struct vec4 *dst,
const struct vec4 *v)
184 dst->
x = floorf(v->
x);
185 dst->
y = floorf(v->
y);
186 dst->
z = floorf(v->
z);
187 dst->
w = floorf(v->
w);
190 static inline void vec4_ceil(
struct vec4 *dst,
const struct vec4 *v)
192 dst->
x = ceilf(v->
x);
193 dst->
y = ceilf(v->
y);
194 dst->
z = ceilf(v->
z);
195 dst->
w = ceilf(v->
w);
198 static inline uint32_t vec4_to_rgba(
const struct vec4 *src)
201 val = (
uint32_t)((
double)src->
x * 255.0);
202 val |= (
uint32_t)((
double)src->
y * 255.0) << 8;
203 val |= (
uint32_t)((
double)src->
z * 255.0) << 16;
204 val |= (
uint32_t)((
double)src->
w * 255.0) << 24;
208 static inline uint32_t vec4_to_bgra(
const struct vec4 *src)
211 val = (
uint32_t)((
double)src->
z * 255.0);
212 val |= (
uint32_t)((
double)src->
y * 255.0) << 8;
213 val |= (
uint32_t)((
double)src->
x * 255.0) << 16;
214 val |= (
uint32_t)((
double)src->
w * 255.0) << 24;
218 static inline void vec4_from_rgba(
struct vec4 *dst,
uint32_t rgba)
220 dst->
x = (float)((
double)(rgba & 0xFF) * (1.0 / 255.0));
222 dst->
y = (float)((
double)(rgba & 0xFF) * (1.0 / 255.0));
224 dst->
z = (float)((
double)(rgba & 0xFF) * (1.0 / 255.0));
226 dst->
w = (float)((
double)(rgba & 0xFF) * (1.0 / 255.0));
229 static inline void vec4_from_bgra(
struct vec4 *dst,
uint32_t bgra)
231 dst->
z = (float)((
double)(bgra & 0xFF) * (1.0 / 255.0));
233 dst->
y = (float)((
double)(bgra & 0xFF) * (1.0 / 255.0));
235 dst->
x = (float)((
double)(bgra & 0xFF) * (1.0 / 255.0));
237 dst->
w = (float)((
double)(bgra & 0xFF) * (1.0 / 255.0));
EXPORT void vec4_transform(struct vec4 *dst, const struct vec4 *v, const struct matrix4 *m)
EXPORT void vec4_from_vec3(struct vec4 *dst, const struct vec3 *v)
unsigned uint32_t
Definition: vc_stdint.h:31
float ptr[4]
Definition: vec4.h:35
__m128 m
Definition: vec4.h:36
#define EXPORT
Definition: c99defs.h:49
float w
Definition: vec4.h:33
float z
Definition: vec4.h:33
float x
Definition: vec4.h:33
float y
Definition: vec4.h:33