summaryrefslogtreecommitdiff
path: root/src/screen
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen')
-rw-r--r--src/screen/screen.c46
-rw-r--r--src/screen/screen.h6
-rw-r--r--src/screen/view.c2
-rw-r--r--src/screen/view.h8
4 files changed, 39 insertions, 23 deletions
diff --git a/src/screen/screen.c b/src/screen/screen.c
index d0d78e2..ee6b1e9 100644
--- a/src/screen/screen.c
+++ b/src/screen/screen.c
@@ -40,8 +40,6 @@ static void do_resize(struct camu_screen *scr, u32 width, u32 height)
al_assert(width > 0 && height > 0);
scr->width = width;
scr->height = height;
- scr->calibrate_x = scr->width / 2.0;
- scr->calibrate_y = scr->height / 2.0;
struct camu_screen_video *video;
al_array_foreach_ptr(scr->videos, i, video) {
camu_view_calculate(&video->view, scr->width, scr->height);
@@ -308,8 +306,6 @@ static bool key_callback(void *userdata, u8 state, u16 button)
break;
#endif
case STELA_KEY_R: {
- scr->calibrate_x = scr->last_pointer_x;
- scr->calibrate_y = scr->last_pointer_y;
struct camu_view *view = get_view_from_mouse_pos(scr);
if (view) {
if (SCREEN_MOD2(scr)) {
@@ -344,6 +340,8 @@ static bool key_callback(void *userdata, u8 state, u16 button)
view->rotation = CAMU_VIEW_ROTATION_0;
break;
}
+ } else if (scr->vr_emulation) {
+ view->fov = AL_TO_RADIANS(CAMU_DEFAULT_FOV);
} else {
view->mode = CAMU_DEFAULT_VIEW;
}
@@ -393,19 +391,29 @@ static bool key_callback(void *userdata, u8 state, u16 button)
al_atomic_add(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED);
return true;
case STELA_KEY_V: {
- struct camu_view *view = get_view_from_mouse_pos(scr);
- if (view) {
- view->mode = CAMU_DEFAULT_VIEW;
- camu_view_calculate(view, scr->width, scr->height);
- }
- if (!scr->vr_emulation) {
- scr->flags = (scr->flags & ~CAMU_SCREEN_ZOOM_PAN_SIMPLE) | CAMU_SCREEN_ZOOM_FOV;
- scr->window->set_cursor(scr->window, STELA_CURSOR_HIDDEN);
- scr->vr_emulation = true;
+ if (SCREEN_MOD1(scr)) {
+ scr->vr_calibrate_x = scr->last_pointer_x / scr->width;
+ scr->vr_calibrate_y = scr->last_pointer_y / scr->height;
} else {
- scr->flags = (scr->flags & ~CAMU_SCREEN_ZOOM_FOV) | CAMU_SCREEN_ZOOM_PAN_SIMPLE;
- scr->window->set_cursor(scr->window, STELA_CURSOR_NORMAL);
- scr->vr_emulation = false;
+ struct camu_view *view = get_view_from_mouse_pos(scr);
+ if (SCREEN_MOD2(scr) && scr->vr_emulation == CAMU_VR_180) {
+ scr->vr_emulation = CAMU_VR_360;
+ break;
+ }
+ if (!scr->vr_emulation) {
+ if (view) view->mode = CAMU_VIEW_AUTOFIT;
+ scr->flags = (scr->flags & ~CAMU_SCREEN_ZOOM_PAN_SIMPLE) | CAMU_SCREEN_ZOOM_FOV;
+ scr->window->set_cursor(scr->window, STELA_CURSOR_HIDDEN);
+ scr->vr_emulation = SCREEN_MOD2(scr) ? CAMU_VR_360 : CAMU_VR_180;
+ } else {
+ if (view) view->mode = CAMU_DEFAULT_VIEW;
+ scr->flags = (scr->flags & ~CAMU_SCREEN_ZOOM_FOV) | CAMU_SCREEN_ZOOM_PAN_SIMPLE;
+ scr->window->set_cursor(scr->window, STELA_CURSOR_NORMAL);
+ scr->vr_emulation = CAMU_VR_DISABLED;
+ }
+ if (view) {
+ camu_view_calculate(view, scr->width, scr->height);
+ }
}
break;
}
@@ -466,7 +474,9 @@ bool camu_screen_init(struct camu_screen *scr)
#ifdef CAMU_SCREEN_DRAG_SEEK
scr->last_seek_ts = 0;
#endif
- scr->vr_emulation = false;
+ scr->vr_emulation = CAMU_VR_DISABLED;
+ scr->vr_calibrate_x = 0.5;
+ scr->vr_calibrate_y = 0.5;
al_array_init(scr->videos);
#ifdef CAMU_SCREEN_THREADED
al_array_init(scr->add_queue);
@@ -499,8 +509,6 @@ bool camu_screen_create_window(struct camu_screen *scr, const char *name)
}
scr->width = scr->window->width;
scr->height = scr->window->height;
- scr->calibrate_x = scr->width / 2.0;
- scr->calibrate_y = scr->height / 2.0;
scr->fullscreen = false;
scr->scaling_disabled = false;
scr->transparent_background = false;
diff --git a/src/screen/screen.h b/src/screen/screen.h
index 4c6e205..e03fdb3 100644
--- a/src/screen/screen.h
+++ b/src/screen/screen.h
@@ -75,9 +75,9 @@ struct camu_screen {
#ifdef CAMU_SCREEN_DRAG_SEEK
u64 last_seek_ts;
#endif
- f64 calibrate_x;
- f64 calibrate_y;
- bool vr_emulation;
+ u8 vr_emulation;
+ f64 vr_calibrate_x;
+ f64 vr_calibrate_y;
array(struct camu_screen_video) videos;
#ifdef CAMU_SCREEN_THREADED
array(struct camu_video_buffer *) add_queue;
diff --git a/src/screen/view.c b/src/screen/view.c
index 4719062..81d19a9 100644
--- a/src/screen/view.c
+++ b/src/screen/view.c
@@ -27,7 +27,7 @@ void camu_view_init(struct camu_view *view, u32 width, u32 height)
view->height = height;
view->zindex = 0;
view->stretch = 1.0;
- view->fov = AL_TO_RADIANS(80.0);
+ view->fov = AL_TO_RADIANS(CAMU_DEFAULT_FOV);
}
void camu_view_calculate(struct camu_view *view, u32 window_width, u32 window_height)
diff --git a/src/screen/view.h b/src/screen/view.h
index 2fc1742..5fd86c0 100644
--- a/src/screen/view.h
+++ b/src/screen/view.h
@@ -17,8 +17,16 @@ enum {
CAMU_VIEW_ROTATION_360
};
+enum {
+ CAMU_VR_DISABLED = 0,
+ CAMU_VR_180,
+ CAMU_VR_360
+};
+
#define CAMU_DEFAULT_VIEW CAMU_VIEW_AUTOFIT
+#define CAMU_DEFAULT_FOV 80.0
+
struct camu_view {
u8 mode;
u8 rotation;