vrchess

changeset 6:3c36bc28c6c2

more stuff in the vr test
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 21 Aug 2014 01:08:03 +0300
parents 8b7da5ab814e
children bd8202d6d28d
files Makefile src/game.cc src/main.cc src/texture.cc src/texture.h src/vr/vr.c src/vr/vr.h src/vr/vr_libovr.c
diffstat 8 files changed, 117 insertions(+), 14 deletions(-) [+]
line diff
     1.1 --- a/Makefile	Wed Aug 20 16:34:43 2014 +0300
     1.2 +++ b/Makefile	Thu Aug 21 01:08:03 2014 +0300
     1.3 @@ -4,9 +4,13 @@
     1.4  dep = $(obj:.o=.d)
     1.5  bin = vrchess
     1.6  
     1.7 -CFLAGS = -pedantic -Wall -g
     1.8 +# comment out to disable LibOVR (oculus sdk)
     1.9 +#ovr_cflags = -DUSE_LIBOVR
    1.10 +#ovr_libs = -lovr
    1.11 +
    1.12 +CFLAGS = -pedantic -Wall -g $(ovr_cflags)
    1.13  CXXFLAGS = -std=c++11 $(CFLAGS)
    1.14 -LDFLAGS = $(libgl_$(sys)) -lm -lvmath -limago
    1.15 +LDFLAGS = $(libgl_$(sys)) -lm -lvmath -limago $(ovr_libs)
    1.16  
    1.17  libgl_unix = -lGL -lGLU -lglut -lGLEW
    1.18  libgl_mac = -framework OpenGL -framework GLUT -lGLEW
     2.1 --- a/src/game.cc	Wed Aug 20 16:34:43 2014 +0300
     2.2 +++ b/src/game.cc	Thu Aug 21 01:08:03 2014 +0300
     2.3 @@ -5,6 +5,10 @@
     2.4  #include "vr/vr.h"
     2.5  
     2.6  static void draw_scene();
     2.7 +static bool setup_rtarg(int x, int y);
     2.8 +
     2.9 +static Texture *rtarg[2];
    2.10 +static unsigned int fbo, rtarg_depth;
    2.11  
    2.12  static const float move_speed = 10.0f;
    2.13  
    2.14 @@ -24,6 +28,7 @@
    2.15  
    2.16  	glClearColor(0.1, 0.1, 0.1, 1);
    2.17  
    2.18 +
    2.19  	if(!floor_tex.load("data/tiles.png")) {
    2.20  		return false;
    2.21  	}
    2.22 @@ -36,9 +41,15 @@
    2.23  {
    2.24  	floor_tex.destroy();
    2.25  	vr_shutdown();
    2.26 +
    2.27 +	if(fbo) {
    2.28 +		glDeleteFramebuffers(1, &fbo);
    2.29 +		glDeleteRenderbuffers(1, &rtarg_depth);
    2.30 +		delete rtarg[0];
    2.31 +		delete rtarg[1];
    2.32 +	}
    2.33  }
    2.34  
    2.35 -
    2.36  void game_update(unsigned int msec)
    2.37  {
    2.38  	static unsigned int prev_msec;
    2.39 @@ -74,6 +85,8 @@
    2.40  
    2.41  void game_render(int eye)
    2.42  {
    2.43 +	vr_begin(eye <= 0 ? VR_EYE_LEFT : VR_EYE_RIGHT);
    2.44 +
    2.45  	float mat[16];
    2.46  	Matrix4x4 view_matrix = cam.get_matrix().inverse();
    2.47  
    2.48 @@ -96,6 +109,8 @@
    2.49  	glMultTransposeMatrixf(view_matrix[0]);
    2.50  
    2.51  	draw_scene();
    2.52 +
    2.53 +	vr_end();
    2.54  }
    2.55  
    2.56  void game_reshape(int x, int y)
    2.57 @@ -103,6 +118,8 @@
    2.58  	glViewport(0, 0, x, y);
    2.59  	fb_width = x;
    2.60  	fb_height = y;
    2.61 +
    2.62 +	setup_rtarg(x, y);
    2.63  }
    2.64  
    2.65  void game_keyboard(int key, bool pressed, int x, int y)
    2.66 @@ -195,3 +212,39 @@
    2.67  
    2.68  	glPopMatrix();
    2.69  }
    2.70 +
    2.71 +static bool setup_rtarg(int x, int y)
    2.72 +{
    2.73 +	int tex_width = next_pow2(x);
    2.74 +	int tex_height = next_pow2(y);
    2.75 +
    2.76 +	/* create render targets for each eye */
    2.77 +	if(!fbo) {
    2.78 +		glGenFramebuffers(1, &fbo);
    2.79 +		glGenRenderbuffers(1, &rtarg_depth);
    2.80 +
    2.81 +		for(int i=0; i<2; i++) {
    2.82 +			rtarg[i] = new Texture;
    2.83 +		}
    2.84 +	}
    2.85 +
    2.86 +	glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    2.87 +
    2.88 +	glBindRenderbuffer(GL_RENDERBUFFER, rtarg_depth);
    2.89 +	glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, tex_width, tex_height);
    2.90 +	glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rtarg_depth);
    2.91 +
    2.92 +	for(int i=0; i<2; i++) {
    2.93 +		rtarg[i] = new Texture;
    2.94 +		rtarg[i]->create2d(tex_width, tex_height);
    2.95 +		glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
    2.96 +				GL_TEXTURE_2D, rtarg[i]->get_texture_id(), 0);
    2.97 +	}
    2.98 +
    2.99 +	if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
   2.100 +		fprintf(stderr, "incomplete framebuffer!\n");
   2.101 +		return false;
   2.102 +	}
   2.103 +	glBindFramebuffer(GL_FRAMEBUFFER, 0);
   2.104 +	return true;
   2.105 +}
     3.1 --- a/src/main.cc	Wed Aug 20 16:34:43 2014 +0300
     3.2 +++ b/src/main.cc	Thu Aug 21 01:08:03 2014 +0300
     3.3 @@ -2,6 +2,7 @@
     3.4  #include <stdlib.h>
     3.5  #include "opengl.h"
     3.6  #include "game.h"
     3.7 +#include "vr/vr.h"
     3.8  
     3.9  static bool init();
    3.10  static void cleanup();
    3.11 @@ -64,7 +65,9 @@
    3.12  	game_update(msec);
    3.13  	game_render(0);
    3.14  
    3.15 -	glutSwapBuffers();
    3.16 +	if(!vr_swap_buffers()) {
    3.17 +		glutSwapBuffers();
    3.18 +	}
    3.19  }
    3.20  
    3.21  static void idle()
     4.1 --- a/src/texture.cc	Wed Aug 20 16:34:43 2014 +0300
     4.2 +++ b/src/texture.cc	Thu Aug 21 01:08:03 2014 +0300
     4.3 @@ -75,3 +75,14 @@
     4.4  	set_image(image);
     4.5  	return true;
     4.6  }
     4.7 +
     4.8 +unsigned int next_pow2(unsigned int x)
     4.9 +{
    4.10 +	x -= 1;
    4.11 +	x |= x >> 1;
    4.12 +	x |= x >> 2;
    4.13 +	x |= x >> 4;
    4.14 +	x |= x >> 8;
    4.15 +	x |= x >> 16;
    4.16 +	return x + 1;
    4.17 +}
     5.1 --- a/src/texture.h	Wed Aug 20 16:34:43 2014 +0300
     5.2 +++ b/src/texture.h	Thu Aug 21 01:08:03 2014 +0300
     5.3 @@ -26,4 +26,6 @@
     5.4  	bool load(const char *fname);
     5.5  };
     5.6  
     5.7 +unsigned int next_pow2(unsigned int x);
     5.8 +
     5.9  #endif	// TEXTURE_H_
     6.1 --- a/src/vr/vr.c	Wed Aug 20 16:34:43 2014 +0300
     6.2 +++ b/src/vr/vr.c	Thu Aug 21 01:08:03 2014 +0300
     6.3 @@ -108,17 +108,25 @@
     6.4  	return 0;
     6.5  }
     6.6  
     6.7 -void vr_present(unsigned int fbtex)
     6.8 +void vr_begin(int eye)
     6.9  {
    6.10 -	if(vrm && vrm->draw) {
    6.11 -		vrm->draw(fbtex, fbtex_rect[0], fbtex_rect[2], fbtex_rect[1], fbtex_rect[3]);
    6.12 +	if(vrm && vrm->begin) {
    6.13 +		vrm->begin(eye);
    6.14  	}
    6.15  }
    6.16  
    6.17 -void vr_fbrect(float u, float umax, float v, float vmax)
    6.18 +void vr_end(void)
    6.19  {
    6.20 -	fbtex_rect[0] = u;
    6.21 -	fbtex_rect[1] = v;
    6.22 -	fbtex_rect[2] = umax;
    6.23 -	fbtex_rect[3] = vmax;
    6.24 +	if(vrm && vrm->end) {
    6.25 +		vrm->end();
    6.26 +	}
    6.27  }
    6.28 +
    6.29 +int vr_swap_buffers(void)
    6.30 +{
    6.31 +	if(vrm && vrm->present) {
    6.32 +		vrm->present();
    6.33 +		return 1;
    6.34 +	}
    6.35 +	return 0;
    6.36 +}
     7.1 --- a/src/vr/vr.h	Wed Aug 20 16:34:43 2014 +0300
     7.2 +++ b/src/vr/vr.h	Thu Aug 21 01:08:03 2014 +0300
     7.3 @@ -33,7 +33,7 @@
     7.4  
     7.5  void vr_begin(int eye);
     7.6  void vr_end(void);
     7.7 -void vr_present(void);
     7.8 +int vr_swap_buffers(void);
     7.9  
    7.10  #ifdef __cplusplus
    7.11  }
     8.1 --- a/src/vr/vr_libovr.c	Wed Aug 20 16:34:43 2014 +0300
     8.2 +++ b/src/vr/vr_libovr.c	Thu Aug 21 01:08:03 2014 +0300
     8.3 @@ -4,9 +4,11 @@
     8.4  
     8.5  #include <stdio.h>
     8.6  #include <stdlib.h>
     8.7 +#include "vr_impl.h"
     8.8 +
     8.9 +#ifdef USE_LIBOVR
    8.10  #include <OVR_CAPI.h>
    8.11  #include <OVR_CAPI_GL.h>
    8.12 -#include "vr_impl.h"
    8.13  
    8.14  static ovrHmd hmd;
    8.15  
    8.16 @@ -105,3 +107,23 @@
    8.17  	}
    8.18  	return &m;
    8.19  }
    8.20 +
    8.21 +#else	/* no libovr */
    8.22 +
    8.23 +static int init(void)
    8.24 +{
    8.25 +	return -1;
    8.26 +}
    8.27 +
    8.28 +struct vr_module *vr_module_libovr(void)
    8.29 +{
    8.30 +	static struct vr_module m;
    8.31 +
    8.32 +	if(!m.init) {
    8.33 +		m.name = "libovr";
    8.34 +		m.init = init;
    8.35 +	}
    8.36 +	return &m;
    8.37 +}
    8.38 +
    8.39 +#endif	/* USE_LIBOVR */