Suckless OGL 1.0.0
A lean, high-performance C11 PBR Renderer
Loading...
Searching...
No Matches
dvec3.h
Go to the documentation of this file.
1
19#ifndef DVEC3_H
20#define DVEC3_H
21
22#include <math.h>
23
25typedef double dvec3[3];
26
27/* ── Element access ─────────────────────────────────────────────────── */
28
30static inline void dvec3_zero(dvec3 dest)
31{
32 dest[0] = 0.0;
33 dest[1] = 0.0;
34 dest[2] = 0.0;
35}
36
38static 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
46static 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
57static 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
65static 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
73static 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
81static 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
89static 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
97static 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
107static 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
116static inline double dvec3_norm2(const dvec3 v_vec)
117{
118 return dvec3_dot(v_vec, v_vec);
119}
120
122static inline double dvec3_norm(const dvec3 v_vec)
123{
124 return sqrt(dvec3_norm2(v_vec));
125}
126
128static 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