}
/* set viewport for improved rendering */
-void opengl_viewport(int view_width, int view_height, int split, int benson_at_line, double fov, double benson_size)
+void opengl_viewport(int view_width, int view_height, int split, int benson_at_line, double fov, double benson_size, int stereo)
{
int view_x = 0, view_y = 0;
double factor_height = 1.0;
return;
/* projection matrix */
- glViewport((GLsizei)view_x, (GLsizei)view_y, (GLsizei)view_width, (GLsizei)view_height);
+ switch (stereo) {
+ case 0: /* left eye */
+ glViewport((GLsizei)view_x, (GLsizei)view_y, (GLsizei)view_width / 2, (GLsizei)view_height);
+ break;
+ case 1: /* right eye */
+ glViewport((GLsizei)view_x + (GLsizei)view_width / 2, (GLsizei)view_y, (GLsizei)view_width / 2, (GLsizei)view_height);
+ break;
+ default:
+ glViewport((GLsizei)view_x, (GLsizei)view_y, (GLsizei)view_width, (GLsizei)view_height);
+ }
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
double top = slope * ((double)image_height - benson_start_at_position) / (double)image_width;
double bottom = -slope * ((double)image_height * 2.0 - ((double)image_height - benson_start_at_position)) / (double)image_width;
glFrustum(left * factor_width, right * factor_width, bottom * factor_height, top * factor_height, 1.0, 5000000000.0);
+ switch (stereo) {
+ case 0: /* left eye */
+ glTranslated(2.52 / 2.0, 0, 0);
+ break;
+ case 1: /* right eye */
+ glTranslated(-2.52 / 2.0, 0, 0);
+ break;
+ }
glMatrixMode(GL_MODELVIEW);
}
int init_opengl_image(int _image_width, int _image_height);
int init_opengl_osd(int num, int _osd_width, int _osd_height);
void opengl_clear(int flip_y);
-void opengl_viewport(int view_width, int view_height, int split, int benson_at_line, double fov, double benson_size);
+void opengl_viewport(int view_width, int view_height, int split, int benson_at_line, double fov, double benson_size, int stereo);
void opengl_blit_image(uint8_t *rgb, int filter, int benson_at_line, int render_benson_only, double fov, double monitor_distance, double benson_size, int benson_case);
void opengl_blit_osd(int num, uint8_t *rgba, int filter, int benson_at_line, double fov, double monitor_distnace, double benson_size, double scale_x, double scale_y, double offset_x, double offset_y);
void opengl_render_color(double r, double g, double b, double a);
#ifdef HAVE_OVR
static double config_benson_size = 0.7;
static double config_fov = FOV_JOLLY;
+static int config_stereo = 1;
#else
static double config_benson_size = 1.0;
static double config_fov = FOV_NOVAGEN;
+static int config_stereo = 0;
#endif
static double config_monitor_distance = 41.5; /* inch */
#ifdef HAVE_OVR
print_info(" stretched. This compensates the vertical stretch of NTSC vs PAL video.\n");
print_info(" The original (stretched) sphere makes the game authentic.\n");
print_info(" This option requires OpenGL rendering. (default = %d)\n", config_improve_round_planets);
+#ifndef HAVE_OVR
+ print_info(" --stereo\n");
+ print_info(" Render Stereoscopic side-by-side.\n");
+#endif
print_info("Debug options:\n");
print_info(" -o --debug-opengl\n");
print_info(" Use split screen to display both Amiga and OpenGL rendering.\n");
goto missing_parameter;
config_improve_round_planets = atoi(argv[i]);
} else
+#ifndef HAVE_OVR
+ if (!strcmp(argv[i], "--stereo")) {
+ config_stereo = 1;
+ } else
+#endif
if (!strcmp(argv[i], "-o") || !strcmp(argv[i], "--debug-opengl")) {
config_debug_opengl = 1;
} else
uint32_t palette_address;
uint16_t palette[16];
int all_white = 0;
-#ifdef HAVE_OVR
int eye;
+#ifdef HAVE_OVR
int vr = 1;
#else
int vr = 0;
/* STEP 2: transfer legacy image (or just benson) in memory to OpenGL texture */
#ifdef HAVE_OVR
begin_render_ovr();
+#else
+ /* clear screen */
+ opengl_clear(vr);
+#endif
- for (eye = 0; eye < 2; eye++) {
+ for (eye = 0; eye < ((config_stereo) ? 2 : 1); eye++) {
+#ifdef HAVE_OVR
double camera_x, camera_y, camera_z;
/* begin of rendering eye, viewport and frustum is set here */
begin_render_ovr_eye(eye, &camera_x, &camera_y, &camera_z);
-#else
- {
-#endif
/* clear screen */
opengl_clear(vr);
+#endif
/* render benson + osd ontop of improved opengl rendering, if enabled */
if (render_improved) {
#ifndef HAVE_OVR
/* viewport and frustum is set here */
- opengl_viewport(window_width, window_height, (debug_opengl) ? 2 : 0, (double_pixel_size) ? BENSON_AT_LINE * 2 : BENSON_AT_LINE, config_fov, benson_size);
+ opengl_viewport(window_width, window_height, (debug_opengl) ? 2 : 0, (double_pixel_size) ? BENSON_AT_LINE * 2 : BENSON_AT_LINE, config_fov, benson_size, (config_stereo) ? eye : -1);
#endif
/* render improved graphics, interpolate, if required,
* if no item list is available, for legacy rendering
emul_video(image, memory, palette, IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_DIWSTART, chipreg, 0, BENSON_AT_LINE, double_pixel_size);
#ifndef HAVE_OVR
/* viewport and frustum is set here */
- opengl_viewport(window_width, window_height, (debug_opengl) ? 1 : 0, (double_pixel_size) ? BENSON_AT_LINE * 2 : BENSON_AT_LINE, FOV_NOVAGEN, 1.0);
+ opengl_viewport(window_width, window_height, (debug_opengl) ? 1 : 0, (double_pixel_size) ? BENSON_AT_LINE * 2 : BENSON_AT_LINE, FOV_NOVAGEN, 1.0, (config_stereo) ? eye : -1);
#endif
opengl_blit_image(image, config_video_filter, (double_pixel_size) ? BENSON_AT_LINE * 2 : BENSON_AT_LINE, 0, FOV_NOVAGEN, config_monitor_distance, 1.0, 0);
if (help_view)