nngn
Loading...
Searching...
No Matches
camera.h
Go to the documentation of this file.
1#ifndef NNGN_CAMERA_H
2#define NNGN_CAMERA_H
3
4#include <bitset>
5#include <vector>
6
7#include "utils/flags.h"
8
9#include "mat4.h"
10#include "math.h"
11#include "vec2.h"
12#include "vec3.h"
13
14namespace nngn {
15
16struct Timing;
17
18struct Camera {
19 enum Flag : uint8_t {
20 UPDATED = 1u << 1,
21 SCREEN_UPDATED = 1u << 2,
22 DASH = 1u << 3,
23 PERSPECTIVE = 1u << 4,
24 N_FLAGS = 1u << 5,
25 };
26 static constexpr float NEAR = 0.01f, FAR = 2048.0f;
27 static constexpr float FOVY = Math::radians(60.0f);
28 static const float TAN_FOVY;
29 static const float TAN_HALF_FOVY;
30 vec3 p = {}, v = {}, a = {};
31 vec3 r = {}, rv = {}, ra = {};
32 float zoom = 1, zoom_v = {}, zoom_a = {};
34 float fov_y = FOVY;
36 float max_v = std::numeric_limits<float>::infinity();
37 float max_rv = std::numeric_limits<float>::infinity();
38 float max_zv = std::numeric_limits<float>::infinity();
39 float damp = {};
41 static constexpr float fov(float distance, float length);
42 bool dash(void) const { return this->flags.is_set(Flag::DASH); }
43 bool perspective(void) const;
44 vec3 pos(void) const;
45 vec3 eye(void) const;
46 vec3 up(void) const;
47 mat4 gen_proj(void) const;
48 mat4 gen_screen_proj(void) const;
49 mat4 gen_view(void) const;
50 float fov_z(void) const;
51 vec3 to_clip(vec3 vp) const;
52 vec4 to_view(vec3 vp) const;
53 vec3 to_world(vec3 vp) const;
54 void set_perspective(bool b);
55 void set_screen(const uvec2 &s);
56 void set_pos(const vec3 &pos);
57 void set_rot(const vec3 &rot);
58 void set_zoom(float z);
59 void set_fov_y(float f);
60 void set_dash(bool b) { this->flags.set(Flag::DASH, b); }
61 void look_at(const vec3 &pos, const vec3 &eye, const vec3 &up);
62 bool update(const Timing &t);
63};
64
65inline bool Camera::perspective(void) const {
66 return this->flags.is_set(Flag::PERSPECTIVE);
67}
68
69inline constexpr float Camera::fov(float distance, float width) {
70 return 2.0f * std::atan(static_cast<float>(width) / 2 / distance);
71}
72
73}
74
75#endif
static constexpr T radians(T d)
Definition: math.h:194
update
Definition: img_common.lua:42
pos
Definition: lua_audio.cpp:17
set_perspective
Definition: camera.lua:44
z
Definition: input.lua:25
function f()) end
std::chrono::seconds s
Definition: timing.cpp:6
Definition: audio.cpp:7
mat4_base< float > mat4
Definition: mat4.h:62
Abstract orthographic/perspective camera.
Definition: camera.h:18
float fov_y
Field of view in perspective mode.
Definition: camera.h:34
void set_rot(const vec3 &rot)
Definition: camera.cpp:116
mat4 gen_screen_proj(void) const
Definition: camera.cpp:44
float damp
Damping factor when not accelerating.
Definition: camera.h:39
vec4 to_view(vec3 vp) const
Definition: camera.cpp:80
vec3 up(void) const
Definition: camera.cpp:25
Flag
Definition: camera.h:19
void set_fov_y(float f)
Definition: camera.cpp:126
static constexpr float FAR
Perspective projection far plane.
Definition: camera.h:26
mat4 screen_proj
Projection matrix for screen coordinates.
Definition: camera.h:35
vec3 pos(void) const
Definition: camera.cpp:10
Flags< Flag > flags
Definition: camera.h:40
static const float TAN_HALF_FOVY
Definition: camera.h:29
bool dash(void) const
Definition: camera.h:42
float zoom_a
Scaling factor acceleration.
Definition: camera.h:32
void set_zoom(float z)
Definition: camera.cpp:121
float zoom
Scaling factor.
Definition: camera.h:32
bool perspective(void) const
Definition: camera.h:65
uvec2 screen
Screen size.
Definition: camera.h:33
vec3 a
Acceleration.
Definition: camera.h:30
static const float TAN_FOVY
Definition: camera.h:28
mat4 view
View matrix.
Definition: camera.h:35
vec3 v
Velocity.
Definition: camera.h:30
static constexpr float FOVY
Perspective projection field of view along the Y axis (default).
Definition: camera.h:27
static constexpr float NEAR
Perspective projection near plane.
Definition: camera.h:26
float zoom_v
Scaling factor velocity.
Definition: camera.h:32
vec3 eye(void) const
Definition: camera.cpp:18
@ PERSPECTIVE
Chooses between orthographic/perspective mode.
Definition: camera.h:23
@ N_FLAGS
Definition: camera.h:24
@ UPDATED
Parameters of the camera have changed.
Definition: camera.h:20
@ SCREEN_UPDATED
The screen size has changed.
Definition: camera.h:21
@ DASH
Increases the speed of displacement/rotation/etc.
Definition: camera.h:22
vec3 r
Definition: camera.h:31
float max_zv
Definition: camera.h:38
mat4 gen_view(void) const
Definition: camera.cpp:49
vec3 rv
Definition: camera.h:31
void set_dash(bool b)
Definition: camera.h:60
float max_v
Maximum value for v.
Definition: camera.h:36
static constexpr float fov(float distance, float length)
Definition: camera.h:69
mat4 gen_proj(void) const
Definition: camera.cpp:34
vec3 to_world(vec3 vp) const
Definition: camera.cpp:84
void set_screen(const uvec2 &s)
Definition: camera.cpp:104
vec3 rot
Rotational Euler angles (ZYX).
Definition: camera.h:187
vec3 p
Position.
Definition: camera.h:30
void look_at(const vec3 &pos, const vec3 &eye, const vec3 &up)
Definition: camera.cpp:131
float max_rv
Definition: camera.h:37
vec3 to_clip(vec3 vp) const
Definition: camera.cpp:71
vec3 ra
Definition: camera.h:31
void set_pos(const vec3 &pos)
Definition: camera.cpp:111
float fov_z(void) const
mat4 proj
Projection matrix (orthographic/perspective).
Definition: camera.h:35
Wrapper for an unsigned integral representing flags.
Definition: flags.h:18
constexpr bool is_set(AT a) const
Definition: flags.h:26
constexpr Flags & set(AT a)
Definition: flags.h:28
Definition: timing.h:20