$darkmode
Suckless OGL 1.0.0
A lean, high-performance C11 PBR Renderer
dvec3.h
Go to the documentation of this file.
1 
19 #ifndef DVEC3_H
20 #define DVEC3_H
21 
22 #include <math.h>
23 
25 typedef double dvec3[3];
26 
27 /* ── Element access ─────────────────────────────────────────────────── */
28 
30 static inline void dvec3_zero(dvec3 dest)
31 {
32  dest[0] = 0.0;
33  dest[1] = 0.0;
34  dest[2] = 0.0;
35 }
36 
38 static inline void dvec3_copy(const dvec3 src, dvec3 dest)
39 {
40  dest[0] = src[0];
41  dest[1] = src[1];
42  dest[2] = src[2];
43 }
44 
46 static inline void dvec3_set(dvec3 dest, double x_val, double y_val,
47  double z_val)
48 {
49  dest[0] = x_val;
50  dest[1] = y_val;
51  dest[2] = z_val;
52 }
53 
54 /* ── Arithmetic ─────────────────────────────────────────────────────── */
55 
57 static inline void dvec3_add(const dvec3 a_vec, const dvec3 b_vec, dvec3 dest)
58 {
59  dest[0] = a_vec[0] + b_vec[0];
60  dest[1] = a_vec[1] + b_vec[1];
61  dest[2] = a_vec[2] + b_vec[2];
62 }
63 
65 static inline void dvec3_addto(dvec3 dest, const dvec3 b_vec)
66 {
67  dest[0] += b_vec[0];
68  dest[1] += b_vec[1];
69  dest[2] += b_vec[2];
70 }
71 
73 static inline void dvec3_sub(const dvec3 a_vec, const dvec3 b_vec, dvec3 dest)
74 {
75  dest[0] = a_vec[0] - b_vec[0];
76  dest[1] = a_vec[1] - b_vec[1];
77  dest[2] = a_vec[2] - b_vec[2];
78 }
79 
81 static inline void dvec3_subfrom(dvec3 dest, const dvec3 b_vec)
82 {
83  dest[0] -= b_vec[0];
84  dest[1] -= b_vec[1];
85  dest[2] -= b_vec[2];
86 }
87 
89 static inline void dvec3_scale(const dvec3 v_vec, double scalar, dvec3 dest)
90 {
91  dest[0] = v_vec[0] * scalar;
92  dest[1] = v_vec[1] * scalar;
93  dest[2] = v_vec[2] * scalar;
94 }
95 
97 static inline void dvec3_muladds(dvec3 dest, const dvec3 v_vec, double scalar)
98 {
99  dest[0] += v_vec[0] * scalar;
100  dest[1] += v_vec[1] * scalar;
101  dest[2] += v_vec[2] * scalar;
102 }
103 
104 /* ── Products ───────────────────────────────────────────────────────── */
105 
107 static inline double dvec3_dot(const dvec3 a_vec, const dvec3 b_vec)
108 {
109  return (a_vec[0] * b_vec[0]) + (a_vec[1] * b_vec[1]) +
110  (a_vec[2] * b_vec[2]);
111 }
112 
113 /* ── Length / Normalize ──────────────────────────────────────────────── */
114 
116 static inline double dvec3_norm2(const dvec3 v_vec)
117 {
118  return dvec3_dot(v_vec, v_vec);
119 }
120 
122 static inline double dvec3_norm(const dvec3 v_vec)
123 {
124  return sqrt(dvec3_norm2(v_vec));
125 }
126 
128 static inline void dvec3_normalize(dvec3 v_vec)
129 {
130  double len = dvec3_norm(v_vec);
131  if (len > 0.0) {
132  double inv = 1.0 / len;
133  v_vec[0] *= inv;
134  v_vec[1] *= inv;
135  v_vec[2] *= inv;
136  }
137 }
138 
139 #endif /* DVEC3_H */
static void dvec3_subfrom(dvec3 dest, const dvec3 b_vec)
Definition: dvec3.h:81
static void dvec3_muladds(dvec3 dest, const dvec3 v_vec, double scalar)
Definition: dvec3.h:97
static void dvec3_set(dvec3 dest, double x_val, double y_val, double z_val)
Definition: dvec3.h:46
static double dvec3_norm(const dvec3 v_vec)
Definition: dvec3.h:122
static double dvec3_dot(const dvec3 a_vec, const dvec3 b_vec)
Definition: dvec3.h:107
static void dvec3_add(const dvec3 a_vec, const dvec3 b_vec, dvec3 dest)
Definition: dvec3.h:57
static void dvec3_scale(const dvec3 v_vec, double scalar, dvec3 dest)
Definition: dvec3.h:89
static void dvec3_copy(const dvec3 src, dvec3 dest)
Definition: dvec3.h:38
static void dvec3_normalize(dvec3 v_vec)
Definition: dvec3.h:128
double dvec3[3]
Definition: dvec3.h:25
static void dvec3_zero(dvec3 dest)
Definition: dvec3.h:30
static void dvec3_sub(const dvec3 a_vec, const dvec3 b_vec, dvec3 dest)
Definition: dvec3.h:73
static double dvec3_norm2(const dvec3 v_vec)
Definition: dvec3.h:116
static void dvec3_addto(dvec3 dest, const dvec3 b_vec)
Definition: dvec3.h:65