Offset HUD screen rects for out-of-screen stereo parallax on HUD overlays.

Used 1x VR_eye_offset to track image shift adjustments via OGL frustum planes
instead of 2x VR_eye_offset used in Descent 1.5 image shift adjustments.

Without any HUD rect offset, HUD overlays would appear to match the zero-parallax
view plane instead of appearing in an out-of-screen parallax view plane.
This commit is contained in:
Dave Milici 2021-03-17 18:01:03 -07:00
parent 6bc0e822d2
commit 23bbe7dde8
3 changed files with 24 additions and 18 deletions

View file

@ -217,7 +217,6 @@ void init_stereo()
VR_eye_width = (F1_0 * 7) / 10; // Descent 1.5 defaults
VR_eye_offset = (VR_half_width) ? -6 : -12;
PlayerCfg.CockpitMode[1] = CM_FULL_SCREEN;
reset_cockpit();
}
else {
VR_stereo = VR_half_width = VR_half_height = false;
@ -331,23 +330,27 @@ void game_init_render_sub_buffers( int x, int y, int w, int h )
gr_clear_canvas(*grd_curcanv, 0);
gr_init_sub_canvas(Screen_3d_window, grd_curscreen->sc_canvas, x, y, w, h);
switch (VR_stereo) {
if (VR_stereo) {
// offset HUD screen rects to force out-of-screen parallax on HUD overlays
int dx = (VR_eye_offset < 0) ? -VR_eye_offset : 0;
switch (VR_stereo) {
case STEREO_NONE:
gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x, y, w, h);
gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x, y, w, h);
gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x+dx, y, w-dx, h);
gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x, y, w-dx, h);
break;
case STEREO_ABOVE_BELOW:
gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x, y, w, h);
gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x, y+h, w, h);
gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x+dx, y, w-dx, h);
gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x, y+h, w-dx, h);
break;
case STEREO_SIDE_BY_SIDE:
gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x, y, w, h);
gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x+w, y, w, h);
gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x+dx, y, w-dx, h);
gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x+w, y, w-dx, h);
break;
case STEREO_SIDE_BY_SIDE2:
gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x, y+h/2, w, h);
gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x+w, y+h/2, w, h);
gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, x+dx, y+h/2, w-dx, h);
gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, x+w, y+h/2, w-dx, h);
break;
}
}
}

View file

@ -912,28 +912,34 @@ static window_event_result HandleSystemKey(int key)
break;
#endif
#ifdef DXX_USE_OGL
#if DXX_USE_OGL
case KEY_SHIFTED + KEY_F5:
VR_eye_offset -= 1;
reset_cockpit();
break;
case KEY_SHIFTED + KEY_F6:
VR_eye_offset += 1;
reset_cockpit();
break;
case KEY_SHIFTED + KEY_ALTED + KEY_F5:
VR_eye_width -= (F1_0/10); //*= 10/11;
reset_cockpit();
break;
case KEY_SHIFTED + KEY_ALTED + KEY_F6:
VR_eye_width += (F1_0/10); //*= 11/10;
reset_cockpit();
break;
case KEY_SHIFTED + KEY_F7:
case KEY_SHIFTED + KEY_ALTED + KEY_F7:
VR_eye_width = F1_0;
VR_eye_offset = 0;
reset_cockpit();
break;
case KEY_SHIFTED + KEY_F8:
case KEY_SHIFTED + KEY_ALTED + KEY_F8:
++VR_stereo %= STEREO_MAX_FORMAT;
init_stereo();
++VR_stereo %= STEREO_MAX_FORMAT;
init_stereo();
reset_cockpit();
break;
#endif

View file

@ -778,7 +778,7 @@ int BigWindowSwitch=0;
//render a frame for the game
void game_render_frame_mono(const control_info &Controls)
{
int no_draw_hud = 0; //VR_stereo;
int no_draw_hud = 0;
gr_set_current_canvas(Screen_3d_window);
#if defined(DXX_BUILD_DESCENT_II)
@ -869,14 +869,11 @@ void game_render_frame_mono(const control_info &Controls)
gr_set_current_canvas(Screen_3d_window);
if (!no_draw_hud) {
if (VR_stereo) {
// gr_set_current_canvas(VR_hud_left);
game_draw_hud_stuff(VR_hud_left, Controls);
// gr_set_current_canvas(VR_hud_right);
game_draw_hud_stuff(VR_hud_right, Controls);
// gr_set_default_canvas();
}
else
game_draw_hud_stuff(*grd_curcanv, Controls);
game_draw_hud_stuff(*grd_curcanv, Controls);
}
#if defined(DXX_BUILD_DESCENT_II)