nngn
Loading...
Searching...
No Matches
camera.h
Go to the documentation of this file.
1#ifndef NNGN_MATH_CAMERA_H
2#define NNGN_MATH_CAMERA_H
3
4#include "utils/def.h"
5#include "utils/flags.h"
6
7#include "mat4.h"
8#include "math.h"
9#include "vec2.h"
10#include "vec3.h"
11
12namespace nngn {
13
14struct Timing;
15
46struct Camera {
48 enum Flag : u8 {
54 UPDATED = 1u << 0,
61 SCREEN_UPDATED = 1u << 1,
63 DASH = 1u << 2,
65 PERSPECTIVE = 1u << 3,
67 IGNORE_BOUNDS = 1u << 4,
68 };
70 static constexpr float NEAR = 0.01f;
72 static constexpr float FAR = 2048;
74 static constexpr float FOVY = static_cast<float>(Math::pi() / 3);
90 static constexpr float fov(float z, float w);
91 // Flags
92 bool dash(void) const { return this->flags.is_set(Flag::DASH); }
93 bool perspective(void) const;
94 void set_dash(bool b) { this->flags.set(Flag::DASH, b); }
95 void set_perspective(bool b);
96 void set_ignore_bounds(bool b);
97 // Positions / vectors
99 vec3 center(void) const;
101 vec3 up(void) const;
103 vec3 world_to_view(vec3 p) const;
105 vec3 view_to_clip(vec3 p) const;
107 vec3 clip_to_view(vec3 p) const;
109 vec3 view_to_world(vec3 p) const;
110 // Screen
124 float z_for_fov(void) const;
141 float scale_for_fov(void) const;
142 // Mutators
143 void set_pos(vec3 p);
144 void set_rot(vec3 r);
145 void set_zoom(float z);
146 void set_fov_y(float f);
147 void set_screen(uvec2 s);
148 void set_bounds(vec3 bl, vec3 tr);
149 void look_at(vec3 center, vec3 pos, vec3 up);
150 bool update(const Timing &t);
151 // Data
153 vec3 p = {};
155 vec3 v = {};
157 vec3 a = {};
159 vec3 rot = {};
165 vec3 bl_bound = {-INFINITY, -INFINITY, -INFINITY};
167 vec3 tr_bound = {+INFINITY, +INFINITY, +INFINITY};
169 float zoom = 1;
171 float zoom_v = {};
173 float zoom_a = {};
175 float max_v = INFINITY;
177 float max_rot_v = INFINITY;
179 float max_zoom_v = INFINITY;
181 float fov_y = FOVY;
183 float damp = {};
195};
196
197inline constexpr float Camera::fov(float z, float w) {
198 const auto a = w / 2.0f / z;
199 return 2.0f * std::atan(a);
200}
201
202inline bool Camera::perspective(void) const {
203 return this->flags.is_set(Flag::PERSPECTIVE);
204}
205
206inline void Camera::set_perspective(bool b) {
207 this->flags.set(Flag::PERSPECTIVE, b);
208 this->flags.set(Flag::UPDATED);
209}
210
211inline void Camera::set_ignore_bounds(bool b) {
212 this->flags.set(Flag::IGNORE_BOUNDS, b);
213 this->flags.set(Flag::UPDATED);
214}
215
217 const vec4 ret = this->view * vec4{wp, 1};
218 return ret.xyz() / ret.w;
219}
220
222 const vec4 ret = this->proj * vec4{vp, 1};
223 return ret.xyz() / ret.w;
224}
225
227 const vec4 ret = this->inv_proj * vec4{cp, 1};
228 return ret.xyz() / ret.w;
229}
230
232 const vec4 ret = this->inv_view * vec4{vp, 1};
233 return ret.xyz() / ret.w;
234}
235
236inline float Camera::z_for_fov(void) const {
237 return static_cast<float>(this->screen.y)
238 / 2.0f
239 / std::tan(this->fov_y / 2);
240}
241
242inline float Camera::scale_for_fov(void) const {
243 return this->zoom * this->z_for_fov() / this->p.z;
244}
245
246inline void Camera::set_pos(vec3 pos) {
247 this->p = pos;
248 this->flags.set(Flag::UPDATED);
249}
250
251inline void Camera::set_rot(vec3 r) {
252 this->rot = r;
253 this->flags.set(Flag::UPDATED);
254}
255
256inline void Camera::set_zoom(float z) {
257 this->zoom = z;
258 this->flags.set(Flag::UPDATED);
259}
260
261inline void Camera::set_fov_y(float f) {
262 this->fov_y = f;
263 this->flags.set(Flag::UPDATED);
264}
265
267 this->screen = s;
268 this->flags.set(Flag::SCREEN_UPDATED);
269}
270
271inline void Camera::set_bounds(vec3 bl, vec3 tr) {
272 this->bl_bound = bl;
273 this->tr_bound = tr;
274 this->flags.set(Flag::UPDATED);
275}
276
277}
278
279#endif
static constexpr T pi(void)
Definition: math.h:183
Definition: debug.h:45
std::uint8_t u8
Definition: def.h:12
set_perspective
Definition: camera.lua:41
function f()) end
w
Definition: strict.lua:12
Abstract orthographic/perspective camera.
Definition: camera.h:46
float fov_y
Field of view in perspective mode.
Definition: camera.h:181
void set_perspective(bool b)
Definition: camera.h:206
vec3 rot_a
Rotational acceleration.
Definition: camera.h:163
float damp
Damping factor when not accelerating.
Definition: camera.h:183
vec3 up(void) const
The "up" vector for the view direction.
Definition: camera.cpp:59
void set_fov_y(float f)
Definition: camera.h:261
void set_ignore_bounds(bool b)
Definition: camera.h:211
vec3 clip_to_view(vec3 p) const
Projects a point from clip to view space.
Definition: camera.h:226
void set_screen(uvec2 s)
Definition: camera.h:266
static constexpr float NEAR
Perspective projection near plane.
Definition: camera.h:70
bool dash(void) const
Definition: camera.h:92
float zoom_a
Scaling factor acceleration.
Definition: camera.h:173
float z_for_fov(void) const
Derives Z coordinate from camera's screen size and field of view.
Definition: camera.h:236
void set_zoom(float z)
Definition: camera.h:256
float zoom
Scaling factor.
Definition: camera.h:169
bool perspective(void) const
Definition: camera.h:202
void set_bounds(vec3 bl, vec3 tr)
Definition: camera.h:271
uvec2 screen
Screen size.
Definition: camera.h:185
vec3 a
Acceleration.
Definition: camera.h:157
mat4 view
View matrix.
Definition: camera.h:189
mat4 inv_view
Inverse matrix of view.
Definition: camera.h:193
vec3 v
Velocity.
Definition: camera.h:155
float max_rot_v
Maximum value for rot_v.
Definition: camera.h:177
float max_zoom_v
Maximum value for zoom_v.
Definition: camera.h:179
vec3 tr_bound
Top right point of the bounding box for p.
Definition: camera.h:167
static constexpr float fov(float z, float w)
Calculates field of view based on screen size and distance.
Definition: camera.h:197
vec3 view_to_clip(vec3 p) const
Projects a point from view to clip space.
Definition: camera.h:221
float zoom_v
Scaling factor velocity.
Definition: camera.h:171
vec3 rot_v
Rotational velocity.
Definition: camera.h:161
vec3 center(void) const
p added to a unit vector in the view direction.
Definition: camera.cpp:55
static constexpr float FAR
Perspective projection far plane.
Definition: camera.h:72
Flag
State flags and configuration.
Definition: camera.h:48
@ DASH
Increases the speed of displacement/rotation/etc.
Definition: camera.h:63
@ PERSPECTIVE
Chooses between orthographic/perspective mode.
Definition: camera.h:65
@ UPDATED
Parameters of the camera have changed.
Definition: camera.h:54
@ IGNORE_BOUNDS
The camera bounding box does not restrict movement when set.
Definition: camera.h:67
@ SCREEN_UPDATED
The screen size has changed.
Definition: camera.h:61
void set_pos(vec3 p)
Definition: camera.h:246
vec3 bl_bound
Bottom left point of the bounding box for p.
Definition: camera.h:165
mat4 inv_proj
Inverse matrix of proj.
Definition: camera.h:191
void set_rot(vec3 r)
Definition: camera.h:251
vec3 world_to_view(vec3 p) const
Projects a point from world to view space.
Definition: camera.h:216
vec3 view_to_world(vec3 p) const
Projects a point from view to world space.
Definition: camera.h:231
void set_dash(bool b)
Definition: camera.h:94
float max_v
Maximum value for v.
Definition: camera.h:175
vec3 rot
Rotational Euler angles (ZYX).
Definition: camera.h:159
void look_at(vec3 center, vec3 pos, vec3 up)
Definition: camera.cpp:65
vec3 p
Position.
Definition: camera.h:153
Flags< Flag > flags
Definition: camera.h:194
static constexpr float FOVY
Perspective projection field of view along the Y axis (default).
Definition: camera.h:74
float scale_for_fov(void) const
Derives orthographic scaling factor from camera parameters.
Definition: camera.h:242
mat4 proj
Projection matrix (orthographic/perspective).
Definition: camera.h:187
Wrapper for a small unsigned integral representing flags.
Definition: flags.h:18
constexpr bool is_set(AT a) const
Definition: flags.h:45
constexpr Flags & set(AT a)
Definition: flags.h:47
Definition: timing.h:20
T y
Definition: vec2.h:12
T z
Definition: vec3.h:13
Definition: vec4.h:12
constexpr vec3_base< T > xyz() const
Definition: vec4.h:43
T w
Definition: vec4.h:13
std::chrono::seconds s
Definition: timing.cpp:6
update
Definition: tools.lua:26