diff options
Diffstat (limited to 'include/math/spatial3.h')
-rw-r--r-- | include/math/spatial3.h | 27 |
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. |
72 | static inline void spatial3_rotate(Spatial3* spatial, vec3 axis, R angle) { | 73 | static 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. |
134 | static inline void spatial3_lookat_spatial(Spatial3* spatial, | 135 | static 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. |
144 | static inline void spatial3_orbit(Spatial3* spatial, vec3 target, R radius, | 145 | static 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. |
159 | static inline void spatial3_orbit_spatial(Spatial3* spatial, | 161 | static 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 | ||