scene: add camera_fps2

main
Dominik Madarász 2024-02-21 13:40:04 +01:00
parent a864065dd8
commit 47c8b3c689
6 changed files with 84 additions and 20 deletions

View File

@ -1461,11 +1461,11 @@ typedef struct skybox_t {
typedef struct camera_t {
mat44 view, proj;
vec3 position, updir, lookdir;
float yaw, pitch;
float yaw, pitch, roll;
float speed, fov;
float move_friction, move_damping;
float look_friction, look_damping;
vec2 last_look; vec3 last_move;
vec3 last_look; vec3 last_move;
bool damping;
bool orthographic;
float distance;
@ -1475,6 +1475,7 @@ typedef struct camera_t {
void camera_moveby(camera_t *cam, vec3 inc);
void camera_fov(camera_t *cam, float fov);
void camera_fps(camera_t *cam, float yaw, float pitch);
void camera_fps2(camera_t *cam, float yaw, float pitch, float roll);
void camera_orbit(camera_t *cam, float yaw, float pitch, float inc_distance);
void camera_lookat(camera_t *cam, vec3 target);
void camera_enable(camera_t *cam);

View File

@ -17760,12 +17760,12 @@ API bool gizmo_hover();
typedef struct camera_t {
mat44 view, proj;
vec3 position, updir, lookdir;
float yaw, pitch; // mirror of (x,y) lookdir in deg;
float yaw, pitch, roll; // mirror of (x,y) lookdir in deg;
float speed, fov; // fov in deg(45)
float move_friction, move_damping;
float look_friction, look_damping;
vec2 last_look; vec3 last_move; // used for friction and damping
vec3 last_look; vec3 last_move; // used for friction and damping
bool damping;
bool orthographic; // 0 perspective, 1 orthographic; when ortho: dimetric[if pitch == -30º], isometric[if pitch == 35.264º]
@ -17779,6 +17779,7 @@ API void camera_teleport(camera_t *cam, vec3 pos);
API void camera_moveby(camera_t *cam, vec3 inc);
API void camera_fov(camera_t *cam, float fov);
API void camera_fps(camera_t *cam, float yaw, float pitch);
API void camera_fps2(camera_t *cam, float yaw, float pitch, float roll);
API void camera_orbit(camera_t *cam, float yaw, float pitch, float inc_distance);
API void camera_lookat(camera_t *cam, vec3 target);
API void camera_enable(camera_t *cam);
@ -374859,7 +374860,7 @@ camera_t camera() {
cam.move_damping = 0.96f;
cam.look_friction = 0.30f;
cam.look_damping = 0.96f;
cam.last_look = vec2(0,0);
cam.last_look = vec3(0,0,0);
cam.last_move = vec3(0,0,0);
// update proj & view
@ -374958,7 +374959,7 @@ void camera_fov(camera_t *cam, float fov) {
}
}
void camera_fps(camera_t *cam, float yaw, float pitch) {
void camera_fps2(camera_t *cam, float yaw, float pitch, float roll) {
last_camera = cam;
// camera damping
@ -374966,23 +374967,43 @@ void camera_fps(camera_t *cam, float yaw, float pitch) {
float fr = cam->look_friction; fr *= fr; fr *= fr; fr *= fr;
float sm = clampf(cam->look_damping, 0, 0.999f); sm *= sm; sm *= sm;
cam->last_look = scale2(cam->last_look, 1 - fr);
cam->last_look = scale3(cam->last_look, 1 - fr);
yaw = cam->last_look.y = yaw * (1 - sm) + cam->last_look.y * sm;
pitch = cam->last_look.x = pitch * (1 - sm) + cam->last_look.x * sm;
roll = cam->last_look.z = roll * (1 - sm) + cam->last_look.z * sm;
}
cam->yaw += yaw;
cam->yaw = fmod(cam->yaw, 360);
cam->pitch += pitch;
cam->pitch = cam->pitch > 89 ? 89 : cam->pitch < -89 ? -89 : cam->pitch;
cam->roll += roll;
cam->roll += fmod(cam->roll, 360);
const float deg2rad = 0.0174532f, y = cam->yaw * deg2rad, p = cam->pitch * deg2rad;
const float deg2rad = 0.0174532f, y = cam->yaw * deg2rad, p = cam->pitch * deg2rad, r = cam->roll * deg2rad;
cam->lookdir = norm3(vec3(cos(y) * cos(p), sin(p), sin(y) * cos(p)));
vec3 up = vec3(0,1,0);
// calculate updir
{
float cosfa = cosf(r);
float sinfa = sinf(r);
vec3 right = cross3(cam->lookdir, up);
float th = dot3(cam->lookdir, up);
cam->updir.x = up.x * cosfa + right.x * sinfa + cam->lookdir.x * th * (1.0f - cosfa);
cam->updir.y = up.y * cosfa + right.y * sinfa + cam->lookdir.y * th * (1.0f - cosfa);
cam->updir.z = up.z * cosfa + right.z * sinfa + cam->lookdir.z * th * (1.0f - cosfa);
}
lookat44(cam->view, cam->position, add3(cam->position, cam->lookdir), cam->updir); // eye,center,up
camera_fov(cam, cam->fov);
}
void camera_fps(camera_t *cam, float yaw, float pitch) {
camera_fps2(cam, yaw, pitch, 0.0f);
}
void camera_orbit( camera_t *cam, float yaw, float pitch, float inc_distance ) {
last_camera = cam;

View File

@ -20,7 +20,7 @@ camera_t camera() {
cam.move_damping = 0.96f;
cam.look_friction = 0.30f;
cam.look_damping = 0.96f;
cam.last_look = vec2(0,0);
cam.last_look = vec3(0,0,0);
cam.last_move = vec3(0,0,0);
// update proj & view
@ -119,7 +119,7 @@ void camera_fov(camera_t *cam, float fov) {
}
}
void camera_fps(camera_t *cam, float yaw, float pitch) {
void camera_fps2(camera_t *cam, float yaw, float pitch, float roll) {
last_camera = cam;
// camera damping
@ -127,23 +127,43 @@ void camera_fps(camera_t *cam, float yaw, float pitch) {
float fr = cam->look_friction; fr *= fr; fr *= fr; fr *= fr;
float sm = clampf(cam->look_damping, 0, 0.999f); sm *= sm; sm *= sm;
cam->last_look = scale2(cam->last_look, 1 - fr);
cam->last_look = scale3(cam->last_look, 1 - fr);
yaw = cam->last_look.y = yaw * (1 - sm) + cam->last_look.y * sm;
pitch = cam->last_look.x = pitch * (1 - sm) + cam->last_look.x * sm;
roll = cam->last_look.z = roll * (1 - sm) + cam->last_look.z * sm;
}
cam->yaw += yaw;
cam->yaw = fmod(cam->yaw, 360);
cam->pitch += pitch;
cam->pitch = cam->pitch > 89 ? 89 : cam->pitch < -89 ? -89 : cam->pitch;
cam->roll += roll;
cam->roll += fmod(cam->roll, 360);
const float deg2rad = 0.0174532f, y = cam->yaw * deg2rad, p = cam->pitch * deg2rad;
const float deg2rad = 0.0174532f, y = cam->yaw * deg2rad, p = cam->pitch * deg2rad, r = cam->roll * deg2rad;
cam->lookdir = norm3(vec3(cos(y) * cos(p), sin(p), sin(y) * cos(p)));
vec3 up = vec3(0,1,0);
// calculate updir
{
float cosfa = cosf(r);
float sinfa = sinf(r);
vec3 right = cross3(cam->lookdir, up);
float th = dot3(cam->lookdir, up);
cam->updir.x = up.x * cosfa + right.x * sinfa + cam->lookdir.x * th * (1.0f - cosfa);
cam->updir.y = up.y * cosfa + right.y * sinfa + cam->lookdir.y * th * (1.0f - cosfa);
cam->updir.z = up.z * cosfa + right.z * sinfa + cam->lookdir.z * th * (1.0f - cosfa);
}
lookat44(cam->view, cam->position, add3(cam->position, cam->lookdir), cam->updir); // eye,center,up
camera_fov(cam, cam->fov);
}
void camera_fps(camera_t *cam, float yaw, float pitch) {
camera_fps2(cam, yaw, pitch, 0.0f);
}
void camera_orbit( camera_t *cam, float yaw, float pitch, float inc_distance ) {
last_camera = cam;

View File

@ -7,12 +7,12 @@
typedef struct camera_t {
mat44 view, proj;
vec3 position, updir, lookdir;
float yaw, pitch; // mirror of (x,y) lookdir in deg;
float yaw, pitch, roll; // mirror of (x,y) lookdir in deg;
float speed, fov; // fov in deg(45)
float move_friction, move_damping;
float look_friction, look_damping;
vec2 last_look; vec3 last_move; // used for friction and damping
vec3 last_look; vec3 last_move; // used for friction and damping
bool damping;
bool orthographic; // 0 perspective, 1 orthographic; when ortho: dimetric[if pitch == -30º], isometric[if pitch == 35.264º]
@ -26,6 +26,7 @@ API void camera_teleport(camera_t *cam, vec3 pos);
API void camera_moveby(camera_t *cam, vec3 inc);
API void camera_fov(camera_t *cam, float fov);
API void camera_fps(camera_t *cam, float yaw, float pitch);
API void camera_fps2(camera_t *cam, float yaw, float pitch, float roll);
API void camera_orbit(camera_t *cam, float yaw, float pitch, float inc_distance);
API void camera_lookat(camera_t *cam, vec3 target);
API void camera_enable(camera_t *cam);

View File

@ -21997,7 +21997,7 @@ camera_t camera() {
cam.move_damping = 0.96f;
cam.look_friction = 0.30f;
cam.look_damping = 0.96f;
cam.last_look = vec2(0,0);
cam.last_look = vec3(0,0,0);
cam.last_move = vec3(0,0,0);
// update proj & view
@ -22096,7 +22096,7 @@ void camera_fov(camera_t *cam, float fov) {
}
}
void camera_fps(camera_t *cam, float yaw, float pitch) {
void camera_fps2(camera_t *cam, float yaw, float pitch, float roll) {
last_camera = cam;
// camera damping
@ -22104,23 +22104,43 @@ void camera_fps(camera_t *cam, float yaw, float pitch) {
float fr = cam->look_friction; fr *= fr; fr *= fr; fr *= fr;
float sm = clampf(cam->look_damping, 0, 0.999f); sm *= sm; sm *= sm;
cam->last_look = scale2(cam->last_look, 1 - fr);
cam->last_look = scale3(cam->last_look, 1 - fr);
yaw = cam->last_look.y = yaw * (1 - sm) + cam->last_look.y * sm;
pitch = cam->last_look.x = pitch * (1 - sm) + cam->last_look.x * sm;
roll = cam->last_look.z = roll * (1 - sm) + cam->last_look.z * sm;
}
cam->yaw += yaw;
cam->yaw = fmod(cam->yaw, 360);
cam->pitch += pitch;
cam->pitch = cam->pitch > 89 ? 89 : cam->pitch < -89 ? -89 : cam->pitch;
cam->roll += roll;
cam->roll += fmod(cam->roll, 360);
const float deg2rad = 0.0174532f, y = cam->yaw * deg2rad, p = cam->pitch * deg2rad;
const float deg2rad = 0.0174532f, y = cam->yaw * deg2rad, p = cam->pitch * deg2rad, r = cam->roll * deg2rad;
cam->lookdir = norm3(vec3(cos(y) * cos(p), sin(p), sin(y) * cos(p)));
vec3 up = vec3(0,1,0);
// calculate updir
{
float cosfa = cosf(r);
float sinfa = sinf(r);
vec3 right = cross3(cam->lookdir, up);
float th = dot3(cam->lookdir, up);
cam->updir.x = up.x * cosfa + right.x * sinfa + cam->lookdir.x * th * (1.0f - cosfa);
cam->updir.y = up.y * cosfa + right.y * sinfa + cam->lookdir.y * th * (1.0f - cosfa);
cam->updir.z = up.z * cosfa + right.z * sinfa + cam->lookdir.z * th * (1.0f - cosfa);
}
lookat44(cam->view, cam->position, add3(cam->position, cam->lookdir), cam->updir); // eye,center,up
camera_fov(cam, cam->fov);
}
void camera_fps(camera_t *cam, float yaw, float pitch) {
camera_fps2(cam, yaw, pitch, 0.0f);
}
void camera_orbit( camera_t *cam, float yaw, float pitch, float inc_distance ) {
last_camera = cam;

View File

@ -3827,12 +3827,12 @@ API bool gizmo_hover();
typedef struct camera_t {
mat44 view, proj;
vec3 position, updir, lookdir;
float yaw, pitch; // mirror of (x,y) lookdir in deg;
float yaw, pitch, roll; // mirror of (x,y) lookdir in deg;
float speed, fov; // fov in deg(45)
float move_friction, move_damping;
float look_friction, look_damping;
vec2 last_look; vec3 last_move; // used for friction and damping
vec3 last_look; vec3 last_move; // used for friction and damping
bool damping;
bool orthographic; // 0 perspective, 1 orthographic; when ortho: dimetric[if pitch == -30º], isometric[if pitch == 35.264º]
@ -3846,6 +3846,7 @@ API void camera_teleport(camera_t *cam, vec3 pos);
API void camera_moveby(camera_t *cam, vec3 inc);
API void camera_fov(camera_t *cam, float fov);
API void camera_fps(camera_t *cam, float yaw, float pitch);
API void camera_fps2(camera_t *cam, float yaw, float pitch, float roll);
API void camera_orbit(camera_t *cam, float yaw, float pitch, float inc_distance);
API void camera_lookat(camera_t *cam, vec3 target);
API void camera_enable(camera_t *cam);