]> git.lizzy.rs Git - dragonstd.git/blob - number.c
Replace DRAGONTYPE_ARRAY_REALLOC_EXTRA by DRAGONSTD_ARRAY_REALLOC_EXTRA
[dragonstd.git] / number.c
1 #include "number.h"
2
3 #define DEFINE_CLAMP(scalar) \
4         scalar scalar ## _clamp(scalar v, scalar min, scalar max) \
5         { \
6                 return v < min ? min : v > max ? max : v; \
7         }
8
9 #define DEFINE_VECTOR2(vector, clamp) \
10         bool vector ## _equals(vector a, vector b) \
11         { \
12                 return a.x == b.x && a.y == b.y; \
13         } \
14         vector vector ## _add(vector a, vector b) \
15         { \
16                 return (vector) {a.x + b.x, a.y + b.y}; \
17         } \
18         vector vector ## _clamp(vector v, vector min, vector max) \
19         { \
20                 return (vector) {clamp(v.x, min.x, max.x), clamp(v.y, min.y, max.y)}; \
21         }
22
23 #define DEFINE_VECTOR3(vector, clamp) \
24         bool vector ## _equals(vector a, vector b) \
25         { \
26                 return a.x == b.x && a.y == b.y && a.z == b.z; \
27         } \
28         vector vector ## _add(vector a, vector b) \
29         { \
30                 return (vector) {a.x + b.x, a.y + b.y, a.z + b.z}; \
31         } \
32         vector vector ## _clamp(vector v, vector min, vector max) \
33         { \
34                 return (vector) {clamp(v.x, min.x, max.x), clamp(v.y, min.y, max.y), clamp(v.z, min.z, max.z)}; \
35         }
36
37 #define DEFINE_VECTOR4(vector, clamp) \
38         bool vector ## _equals(vector a, vector b) \
39         { \
40                 return a.x == b.x && a.y == b.y && a.z == b.z  && a.w == b.w; \
41         } \
42         vector vector ## _add(vector a, vector b) \
43         { \
44                 return (vector) {a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w}; \
45         } \
46         vector vector ## _clamp(vector v, vector min, vector max) \
47         { \
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)}; \
49         }
50
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)
56
57 #define DEFINE_INTEGER(bits) \
58         DEFINE_SCALAR(s ## bits) \
59         DEFINE_SCALAR(u ## bits)
60
61 #define DEFINE_MIX_VECTOR2(vector, scalar, mix) \
62         vector vector ## _mix(vector a, vector b, scalar f) \
63         { \
64                 return (vector) {mix(a.x, b.x, f), mix(a.y, b.y, f)}; \
65         }
66
67 #define DEFINE_MIX_VECTOR3(vector, scalar, mix) \
68         vector vector ## _mix(vector a, vector b, scalar f) \
69         { \
70                 return (vector) {mix(a.x, b.x, f), mix(a.y, b.y, f), mix(a.z, b.z, f)}; \
71         }
72
73 #define DEFINE_MIX_VECTOR4(vector, scalar, mix) \
74         vector vector ## _mix(vector a, vector b, scalar f) \
75         { \
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)}; \
77         }
78
79 #define DEFINE_FLOAT(type) \
80         DEFINE_SCALAR(type) \
81         type type ## _mix(type a, type b, type f) \
82         { \
83                 return (1.0 - f) * a + b * f; \
84         } \
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)
88
89 DEFINE_INTEGER(8)
90 DEFINE_INTEGER(16)
91 DEFINE_INTEGER(32)
92 DEFINE_INTEGER(64)
93
94 DEFINE_FLOAT(f32)
95 DEFINE_FLOAT(f64)