aboutsummaryrefslogtreecommitdiff
path: root/include/math/spatial3.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/math/spatial3.h')
-rw-r--r--include/math/spatial3.h27
1 files changed, 14 insertions, 13 deletions
diff --git a/include/math/spatial3.h b/include/math/spatial3.h
index f8caf5d..8de38bf 100644
--- a/include/math/spatial3.h
+++ b/include/math/spatial3.h
@@ -23,8 +23,9 @@ static inline mat4 spatial3_transform(const Spatial3* spatial) {
23 const vec3 r = spatial->r; 23 const vec3 r = spatial->r;
24 const vec3 u = spatial->u; 24 const vec3 u = spatial->u;
25 const vec3 f = spatial->f; 25 const vec3 f = spatial->f;
26 return mat4_make(r.x, u.x, -f.x, p.x, r.y, u.y, -f.y, p.y, r.z, u.z, -f.z, 26 return mat4_make(
27 p.z, 0.0, 0.0, 0.0, 1.0f); 27 r.x, u.x, -f.x, p.x, r.y, u.y, -f.y, p.y, r.z, u.z, -f.z, p.z, 0.0, 0.0,
28 0.0, 1.0f);
28} 29}
29 30
30/// Return the spatial's inverse transformation matrix (from world to local 31/// Return the spatial's inverse transformation matrix (from world to local
@@ -70,10 +71,10 @@ static inline void spatial3_move_down(Spatial3* spatial, R speed) {
70 71
71/// Rotate the spatial about the given axis by the given angle. 72/// Rotate the spatial about the given axis by the given angle.
72static inline void spatial3_rotate(Spatial3* spatial, vec3 axis, R angle) { 73static inline void spatial3_rotate(Spatial3* spatial, vec3 axis, R angle) {
73 mat4 transf = spatial3_transform(spatial); 74 mat4 transf = spatial3_transform(spatial);
74 const vec3 local_axis = 75 const vec3 local_axis =
75 vec3_normalize(mat4_mul_vec3(mat4_inverse_transform(transf), axis, 0.0)); 76 vec3_normalize(mat4_mul_vec3(mat4_inverse_transform(transf), axis, 0.0));
76 transf = mat4_mul(transf, mat4_rot(local_axis, angle)); 77 transf = mat4_mul(transf, mat4_rot(local_axis, angle));
77 spatial->r = vec3_normalize(mat4_v0(transf)); 78 spatial->r = vec3_normalize(mat4_v0(transf));
78 spatial->u = vec3_normalize(mat4_v1(transf)); 79 spatial->u = vec3_normalize(mat4_v1(transf));
79 spatial->f = vec3_normalize(vec3_neg(mat4_v2(transf))); 80 spatial->f = vec3_normalize(vec3_neg(mat4_v2(transf)));
@@ -131,8 +132,8 @@ static inline void spatial3_lookat(Spatial3* spatial, vec3 target) {
131} 132}
132 133
133/// Make the spatial look at the given target. 134/// Make the spatial look at the given target.
134static inline void spatial3_lookat_spatial(Spatial3* spatial, 135static inline void spatial3_lookat_spatial(
135 const Spatial3* target) { 136 Spatial3* spatial, const Spatial3* target) {
136 spatial3_set_forward(spatial, vec3_sub(target->p, spatial->p)); 137 spatial3_set_forward(spatial, vec3_sub(target->p, spatial->p));
137} 138}
138 139
@@ -141,14 +142,15 @@ static inline void spatial3_lookat_spatial(Spatial3* spatial,
141/// \param radius Radial distance. 142/// \param radius Radial distance.
142/// \param azimuth Azimuthal (horizontal) angle. 143/// \param azimuth Azimuthal (horizontal) angle.
143/// \param zenith Polar (vertical) angle. 144/// \param zenith Polar (vertical) angle.
144static inline void spatial3_orbit(Spatial3* spatial, vec3 target, R radius, 145static inline void spatial3_orbit(
145 R azimuth, R zenith) { 146 Spatial3* spatial, vec3 target, R radius, R azimuth, R zenith) {
146 const R sx = sin(azimuth); 147 const R sx = sin(azimuth);
147 const R sy = sin(zenith); 148 const R sy = sin(zenith);
148 const R cx = cos(azimuth); 149 const R cx = cos(azimuth);
149 const R cy = cos(zenith); 150 const R cy = cos(zenith);
150 spatial->p = (vec3){target.x + radius * cy * sx, target.y + radius * sy, 151 spatial->p = (vec3){
151 target.z + radius * cx * cy}; 152 target.x + radius * cy * sx, target.y + radius * sy,
153 target.z + radius * cx * cy};
152} 154}
153 155
154/// Make the spatial orbit around the given target. 156/// Make the spatial orbit around the given target.
@@ -156,9 +158,8 @@ static inline void spatial3_orbit(Spatial3* spatial, vec3 target, R radius,
156/// \param radius Radial distance. 158/// \param radius Radial distance.
157/// \param azimuth Azimuthal (horizontal) angle. 159/// \param azimuth Azimuthal (horizontal) angle.
158/// \param zenith Polar (vertical) angle. 160/// \param zenith Polar (vertical) angle.
159static inline void spatial3_orbit_spatial(Spatial3* spatial, 161static inline void spatial3_orbit_spatial(
160 const Spatial3* target, R radius, 162 Spatial3* spatial, const Spatial3* target, R radius, R azimuth, R zenith) {
161 R azimuth, R zenith) {
162 spatial3_orbit(spatial, target->p, radius, azimuth, zenith); 163 spatial3_orbit(spatial, target->p, radius, azimuth, zenith);
163} 164}
164 165