3 #define DEFINE_CLAMP(scalar) \
4 scalar scalar ## _clamp(scalar v, scalar min, scalar max) \
6 return v < min ? min : v > max ? max : v; \
9 #define DEFINE_VECTOR2(vector, clamp) \
10 bool vector ## _equals(vector a, vector b) \
12 return a.x == b.x && a.y == b.y; \
14 vector vector ## _add(vector a, vector b) \
16 return (vector) {a.x + b.x, a.y + b.y}; \
18 vector vector ## _clamp(vector v, vector min, vector max) \
20 return (vector) {clamp(v.x, min.x, max.x), clamp(v.y, min.y, max.y)}; \
23 #define DEFINE_VECTOR3(vector, clamp) \
24 bool vector ## _equals(vector a, vector b) \
26 return a.x == b.x && a.y == b.y && a.z == b.z; \
28 vector vector ## _add(vector a, vector b) \
30 return (vector) {a.x + b.x, a.y + b.y, a.z + b.z}; \
32 vector vector ## _clamp(vector v, vector min, vector max) \
34 return (vector) {clamp(v.x, min.x, max.x), clamp(v.y, min.y, max.y), clamp(v.z, min.z, max.z)}; \
37 #define DEFINE_VECTOR4(vector, clamp) \
38 bool vector ## _equals(vector a, vector b) \
40 return a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w; \
42 vector vector ## _add(vector a, vector b) \
44 return (vector) {a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w}; \
46 vector vector ## _clamp(vector v, vector min, vector max) \
48 return (vector) {clamp(v.x, min.x, max.x), clamp(v.y, min.y, max.y), clamp(v.z, min.z, max.z), clamp(v.w, min.w, max.w)}; \
51 #define DEFINE_SCALAR(scalar) \
52 DEFINE_CLAMP(scalar) \
53 DEFINE_VECTOR2(v2 ## scalar, scalar ## _clamp) \
54 DEFINE_VECTOR3(v3 ## scalar, scalar ## _clamp) \
55 DEFINE_VECTOR4(v4 ## scalar, scalar ## _clamp)
57 #define DEFINE_INTEGER(bits) \
58 DEFINE_SCALAR(s ## bits) \
59 DEFINE_SCALAR(u ## bits)
61 #define DEFINE_MIX_VECTOR2(vector, scalar, mix) \
62 vector vector ## _mix(vector a, vector b, scalar f) \
64 return (vector) {mix(a.x, b.x, f), mix(a.y, b.y, f)}; \
67 #define DEFINE_MIX_VECTOR3(vector, scalar, mix) \
68 vector vector ## _mix(vector a, vector b, scalar f) \
70 return (vector) {mix(a.x, b.x, f), mix(a.y, b.y, f), mix(a.z, b.z, f)}; \
73 #define DEFINE_MIX_VECTOR4(vector, scalar, mix) \
74 vector vector ## _mix(vector a, vector b, scalar f) \
76 return (vector) {mix(a.x, b.x, f), mix(a.y, b.y, f), mix(a.z, b.z, f), mix(a.w, b.w, f)}; \
79 #define DEFINE_FLOAT(type) \
81 type type ## _mix(type a, type b, type f) \
83 return (1.0 - f) * a + b * f; \
85 DEFINE_MIX_VECTOR2(v2 ## type, type, type ## _mix) \
86 DEFINE_MIX_VECTOR3(v3 ## type, type, type ## _mix) \
87 DEFINE_MIX_VECTOR4(v4 ## type, type, type ## _mix)