diff options
Diffstat (limited to 'src/screen')
| -rw-r--r-- | src/screen/screen.c | 46 | ||||
| -rw-r--r-- | src/screen/screen.h | 6 | ||||
| -rw-r--r-- | src/screen/view.c | 2 | ||||
| -rw-r--r-- | src/screen/view.h | 8 |
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; |