conworlds

changeset 4:e6948e131526

adding a vr wrapper
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 20 Aug 2014 06:33:43 +0300
parents a797e426e309
children 8b7da5ab814e
files .clang_complete Makefile src/game.cc src/vr/vr.c src/vr/vr.h src/vr/vr_impl.h src/vr/vr_libovr.c src/vr/vr_modules.c src/vr/vr_null.c
diffstat 9 files changed, 394 insertions(+), 5 deletions(-) [+]
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/.clang_complete	Wed Aug 20 06:33:43 2014 +0300
     1.3 @@ -0,0 +1,2 @@
     1.4 +-Isrc
     1.5 +-Isrc/vr
     2.1 --- a/Makefile	Tue Aug 19 11:01:04 2014 +0300
     2.2 +++ b/Makefile	Wed Aug 20 06:33:43 2014 +0300
     2.3 @@ -1,4 +1,4 @@
     2.4 -csrc = $(wildcard src/*.c)
     2.5 +csrc = $(wildcard src/*.c) $(wildcard src/vr/*.c)
     2.6  ccsrc = $(wildcard src/*.cc)
     2.7  obj = $(csrc:.c=.o) $(ccsrc:.cc=.o)
     2.8  dep = $(obj:.o=.d)
     3.1 --- a/src/game.cc	Tue Aug 19 11:01:04 2014 +0300
     3.2 +++ b/src/game.cc	Wed Aug 20 06:33:43 2014 +0300
     3.3 @@ -2,7 +2,7 @@
     3.4  #include "opengl.h"
     3.5  #include "camera.h"
     3.6  #include "texture.h"
     3.7 -//#include "OVR_CAPI_GL.h"
     3.8 +#include "vr/vr.h"
     3.9  
    3.10  static void draw_scene();
    3.11  
    3.12 @@ -15,6 +15,8 @@
    3.13  
    3.14  bool game_init()
    3.15  {
    3.16 +	vr_init();
    3.17 +
    3.18  	glEnable(GL_DEPTH_TEST);
    3.19  	glEnable(GL_CULL_FACE);
    3.20  	glEnable(GL_LIGHTING);
    3.21 @@ -33,6 +35,7 @@
    3.22  void game_cleanup()
    3.23  {
    3.24  	floor_tex.destroy();
    3.25 +	vr_shutdown();
    3.26  }
    3.27  
    3.28  
    3.29 @@ -71,17 +74,26 @@
    3.30  
    3.31  void game_render(int eye)
    3.32  {
    3.33 +	float mat[16];
    3.34  	Matrix4x4 view_matrix = cam.get_matrix().inverse();
    3.35  
    3.36  	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    3.37  
    3.38  	glMatrixMode(GL_PROJECTION);
    3.39  	glLoadIdentity();
    3.40 -	gluPerspective(60.0, (float)fb_width / (float)fb_height, 0.5, 500.0);
    3.41 +	if(eye == 0 || !vr_proj_matrix(eye < 0 ? 0 : 1, mat)) {
    3.42 +		gluPerspective(60.0, (float)fb_width / (float)fb_height, 0.5, 500.0);
    3.43 +	} else {
    3.44 +		glLoadTransposeMatrixf(mat);
    3.45 +	}
    3.46  
    3.47  	glMatrixMode(GL_MODELVIEW);
    3.48 -	glLoadIdentity();
    3.49 -	glLoadTransposeMatrixf(view_matrix[0]);
    3.50 +	if(eye == 0 || !vr_view_matrix(eye < 0 ? 0 : 1, mat)) {
    3.51 +		glLoadIdentity();
    3.52 +	} else {
    3.53 +		glLoadTransposeMatrixf(mat);
    3.54 +	}
    3.55 +	glMultTransposeMatrixf(view_matrix[0]);
    3.56  
    3.57  	draw_scene();
    3.58  }
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/src/vr/vr.c	Wed Aug 20 06:33:43 2014 +0300
     4.3 @@ -0,0 +1,124 @@
     4.4 +#include <stdio.h>
     4.5 +#include <string.h>
     4.6 +#include "vr.h"
     4.7 +#include "vr_impl.h"
     4.8 +
     4.9 +
    4.10 +static struct vr_module *vrm;
    4.11 +static float idmat[] = {
    4.12 +	1, 0, 0, 0,
    4.13 +	0, 1, 0, 0,
    4.14 +	0, 0, 1, 0,
    4.15 +	0, 0, 0, 1
    4.16 +};
    4.17 +static float fbtex_rect[] = {
    4.18 +	0, 0, 1, 1
    4.19 +};
    4.20 +
    4.21 +int vr_init(void)
    4.22 +{
    4.23 +	int i, nmodules;
    4.24 +
    4.25 +	if(vrm) {
    4.26 +		vr_shutdown();
    4.27 +	}
    4.28 +
    4.29 +	vr_init_modules();
    4.30 +
    4.31 +	nmodules = vr_get_num_modules();
    4.32 +	for(i=0; i<nmodules; i++) {
    4.33 +		struct vr_module *m = vr_get_module(i);
    4.34 +		if(m->init() != -1) {
    4.35 +			/* add to the active modules array */
    4.36 +			vr_activate_module(i);
    4.37 +			if(!vrm) {
    4.38 +				vr_use_module(0);
    4.39 +			}
    4.40 +		}
    4.41 +	}
    4.42 +
    4.43 +	if(!vrm) {
    4.44 +		return -1;
    4.45 +	}
    4.46 +	return 0;
    4.47 +}
    4.48 +
    4.49 +void vr_shutdown(void)
    4.50 +{
    4.51 +	vr_clear_modules();
    4.52 +	vrm = 0;
    4.53 +	fbtex_rect[0] = fbtex_rect[1] = 0;
    4.54 +	fbtex_rect[2] = fbtex_rect[3] = 1;
    4.55 +}
    4.56 +
    4.57 +int vr_module_count(void)
    4.58 +{
    4.59 +	return vr_get_num_active_modules();
    4.60 +}
    4.61 +
    4.62 +const char *vr_module_name(int idx)
    4.63 +{
    4.64 +	struct vr_module *m = vr_get_active_module(idx);
    4.65 +	if(!m) {
    4.66 +		return 0;
    4.67 +	}
    4.68 +	return m->name;
    4.69 +}
    4.70 +
    4.71 +int vr_use_module(int idx)
    4.72 +{
    4.73 +	if(idx >= 0 && idx < vr_get_num_active_modules()) {
    4.74 +		vrm = vr_get_active_module(idx);
    4.75 +		printf("using vr module: %s\n", vrm->name);
    4.76 +		return 0;
    4.77 +	}
    4.78 +	return -1;
    4.79 +}
    4.80 +
    4.81 +int vr_use_module_named(const char *name)
    4.82 +{
    4.83 +	int i, count = vr_get_num_active_modules();
    4.84 +
    4.85 +	for(i=0; i<count; i++) {
    4.86 +		struct vr_module *m = vr_get_active_module(i);
    4.87 +		if(strcmp(m->name, name) == 0) {
    4.88 +			return vr_use_module(i);
    4.89 +		}
    4.90 +	}
    4.91 +	return -1;
    4.92 +}
    4.93 +
    4.94 +int vr_view_matrix(int eye, float *mat)
    4.95 +{
    4.96 +	if(vrm && vrm->view_matrix) {
    4.97 +		vrm->view_matrix(eye, mat);
    4.98 +		return 1;
    4.99 +	}
   4.100 +	memcpy(mat, idmat, sizeof idmat);
   4.101 +	return 0;
   4.102 +}
   4.103 +
   4.104 +int vr_proj_matrix(int eye, float *mat)
   4.105 +{
   4.106 +	if(vrm && vrm->proj_matrix) {
   4.107 +		vrm->proj_matrix(eye, mat);
   4.108 +		return 1;
   4.109 +	}
   4.110 +	memcpy(mat, idmat, sizeof idmat);
   4.111 +	return 0;
   4.112 +}
   4.113 +
   4.114 +void vr_present(unsigned int fbtex)
   4.115 +{
   4.116 +	if(vrm && vrm->draw) {
   4.117 +		vrm->draw(fbtex, fbtex_rect[0], fbtex_rect[2], fbtex_rect[1], fbtex_rect[3]);
   4.118 +	}
   4.119 +}
   4.120 +
   4.121 +void vr_fbrect(float u, float umax, float v, float vmax)
   4.122 +{
   4.123 +	fbtex_rect[0] = u;
   4.124 +	fbtex_rect[1] = v;
   4.125 +	fbtex_rect[2] = umax;
   4.126 +	fbtex_rect[3] = vmax;
   4.127 +}
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/src/vr/vr.h	Wed Aug 20 06:33:43 2014 +0300
     5.3 @@ -0,0 +1,33 @@
     5.4 +#ifndef VR_H_
     5.5 +#define VR_H_
     5.6 +
     5.7 +#ifdef __cplusplus
     5.8 +extern "C" {
     5.9 +#endif
    5.10 +
    5.11 +int vr_init(void);
    5.12 +void vr_shutdown(void);
    5.13 +
    5.14 +int vr_module_count(void);
    5.15 +const char *vr_module_name(int idx);
    5.16 +
    5.17 +int vr_use_module(int idx);
    5.18 +int vr_use_module_named(const char *name);
    5.19 +
    5.20 +/* returns non-zero if the active vr module provides this kind of matrix
    5.21 + * information, otherwise it returns zero, and sets mat to identity
    5.22 + */
    5.23 +int vr_view_matrix(int eye, float *mat);
    5.24 +int vr_proj_matrix(int eye, float *mat);
    5.25 +
    5.26 +/* fbtex should be a texture containing both eye views side by side (LR) */
    5.27 +void vr_present(unsigned int fbtex);
    5.28 +
    5.29 +/* set the area of the framebuffer texture to be used */
    5.30 +void vr_fbrect(float u, float umax, float v, float vmax);
    5.31 +
    5.32 +#ifdef __cplusplus
    5.33 +}
    5.34 +#endif
    5.35 +
    5.36 +#endif	/* VR_H_ */
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/src/vr/vr_impl.h	Wed Aug 20 06:33:43 2014 +0300
     6.3 @@ -0,0 +1,29 @@
     6.4 +#ifndef VR_IMPL_H_
     6.5 +#define VR_IMPL_H_
     6.6 +
     6.7 +struct vr_module {
     6.8 +	char *name;
     6.9 +
    6.10 +	int (*init)(void);
    6.11 +	void (*cleanup)(void);
    6.12 +
    6.13 +	void (*view_matrix)(int eye, float *mat);
    6.14 +	void (*proj_matrix)(int eye, float *mat);
    6.15 +
    6.16 +	void (*draw)(unsigned int fbtex, float u, float maxu, float v, float maxv);
    6.17 +};
    6.18 +
    6.19 +void vr_init_modules(void);
    6.20 +
    6.21 +void vr_clear_modules(void);
    6.22 +void vr_register_module(struct vr_module *mod);
    6.23 +
    6.24 +int vr_get_num_modules(void);
    6.25 +struct vr_module *vr_get_module(int idx);
    6.26 +
    6.27 +void vr_activate_module(int idx);
    6.28 +
    6.29 +int vr_get_num_active_modules(void);
    6.30 +struct vr_module *vr_get_active_module(int idx);
    6.31 +
    6.32 +#endif	/* VR_IMPL_H_ */
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/src/vr/vr_libovr.c	Wed Aug 20 06:33:43 2014 +0300
     7.3 @@ -0,0 +1,37 @@
     7.4 +#include "vr_impl.h"
     7.5 +
     7.6 +static int init(void)
     7.7 +{
     7.8 +	return -1;
     7.9 +}
    7.10 +
    7.11 +static void cleanup(void)
    7.12 +{
    7.13 +}
    7.14 +
    7.15 +static void view_matrix(int eye, float *mat)
    7.16 +{
    7.17 +}
    7.18 +
    7.19 +static void proj_matrix(int eye, float *mat)
    7.20 +{
    7.21 +}
    7.22 +
    7.23 +static void draw(unsigned int fbtex, float u, float maxu, float v, float maxv)
    7.24 +{
    7.25 +}
    7.26 +
    7.27 +struct vr_module *vr_module_libovr(void)
    7.28 +{
    7.29 +	static struct vr_module m;
    7.30 +
    7.31 +	if(!m.init) {
    7.32 +		m.name = "libovr";
    7.33 +		m.init = init;
    7.34 +		m.cleanup = cleanup;
    7.35 +		m.view_matrix = view_matrix;
    7.36 +		m.proj_matrix = proj_matrix;
    7.37 +		m.draw = draw;
    7.38 +	}
    7.39 +	return &m;
    7.40 +}
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/src/vr/vr_modules.c	Wed Aug 20 06:33:43 2014 +0300
     8.3 @@ -0,0 +1,91 @@
     8.4 +/* XXX this might become partly auto-generated in the future */
     8.5 +#include <stdio.h>
     8.6 +#include <stdlib.h>
     8.7 +#include "vr_impl.h"
     8.8 +
     8.9 +struct vr_module *vr_module_libovr(void);
    8.10 +struct vr_module *vr_module_null(void);
    8.11 +
    8.12 +static struct vr_module *modules;
    8.13 +static int num_modules, modules_max_size;
    8.14 +
    8.15 +static int *active_modules;
    8.16 +static int num_act_modules, act_modules_max_size;
    8.17 +
    8.18 +
    8.19 +void vr_init_modules(void)
    8.20 +{
    8.21 +	struct vr_module *m;
    8.22 +
    8.23 +	vr_clear_modules();
    8.24 +
    8.25 +	if((m = vr_module_libovr())) {
    8.26 +		vr_register_module(m);
    8.27 +	}
    8.28 +
    8.29 +	if((m = vr_module_null())) {
    8.30 +		vr_register_module(m);
    8.31 +	}
    8.32 +
    8.33 +	/* more ... */
    8.34 +}
    8.35 +
    8.36 +void vr_clear_modules(void)
    8.37 +{
    8.38 +	free(modules);
    8.39 +	free(active_modules);
    8.40 +	modules = 0;
    8.41 +	num_modules = modules_max_size = 0;
    8.42 +	active_modules = 0;
    8.43 +	num_act_modules = act_modules_max_size = 0;
    8.44 +}
    8.45 +
    8.46 +void vr_register_module(struct vr_module *mod)
    8.47 +{
    8.48 +	if(num_modules >= modules_max_size) {
    8.49 +		int newsz = modules_max_size ? modules_max_size * 2 : 2;
    8.50 +		struct vr_module *newmods = realloc(modules, newsz * sizeof *newmods);
    8.51 +		if(!newmods) {
    8.52 +			fprintf(stderr, "failed to resize modules array up to %d\n", newsz);
    8.53 +			return;
    8.54 +		}
    8.55 +		modules = newmods;
    8.56 +		modules_max_size = newsz;
    8.57 +	}
    8.58 +	modules[num_modules++] = *mod;
    8.59 +}
    8.60 +
    8.61 +int vr_get_num_modules(void)
    8.62 +{
    8.63 +	return num_modules;
    8.64 +}
    8.65 +
    8.66 +struct vr_module *vr_get_module(int idx)
    8.67 +{
    8.68 +	return modules + idx;
    8.69 +}
    8.70 +
    8.71 +void vr_activate_module(int idx)
    8.72 +{
    8.73 +	if(num_act_modules >= act_modules_max_size) {
    8.74 +		int newsz = act_modules_max_size ? act_modules_max_size * 2 : 2;
    8.75 +		int *newact = realloc(active_modules, newsz * sizeof *newact);
    8.76 +		if(!newact) {
    8.77 +			fprintf(stderr, "failed to resize active modules array up to %d\n", newsz);
    8.78 +			return;
    8.79 +		}
    8.80 +		active_modules = newact;
    8.81 +		act_modules_max_size = newsz;
    8.82 +	}
    8.83 +	active_modules[num_act_modules++] = idx;
    8.84 +}
    8.85 +
    8.86 +int vr_get_num_active_modules(void)
    8.87 +{
    8.88 +	return num_act_modules;
    8.89 +}
    8.90 +
    8.91 +struct vr_module *vr_get_active_module(int idx)
    8.92 +{
    8.93 +	return modules + active_modules[idx];
    8.94 +}
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/src/vr/vr_null.c	Wed Aug 20 06:33:43 2014 +0300
     9.3 @@ -0,0 +1,61 @@
     9.4 +#ifdef WIN32
     9.5 +#define WIN32_LEAN_AND_MEAN
     9.6 +#include <windows.h>
     9.7 +#endif
     9.8 +
     9.9 +#ifdef __APPLE__
    9.10 +#include <OpenGL/gl.h>
    9.11 +#else
    9.12 +#include <GL/gl.h>
    9.13 +#endif
    9.14 +
    9.15 +#include "vr_impl.h"
    9.16 +
    9.17 +static int init(void)
    9.18 +{
    9.19 +	return 0;
    9.20 +}
    9.21 +
    9.22 +static void draw(unsigned int fbtex, float u, float maxu, float v, float maxv)
    9.23 +{
    9.24 +	glPushAttrib(GL_ENABLE_BIT | GL_TRANSFORM_BIT);
    9.25 +
    9.26 +	glDisable(GL_LIGHTING);
    9.27 +	glDisable(GL_DEPTH_TEST);
    9.28 +	glDisable(GL_FOG);
    9.29 +	glDisable(GL_CULL_FACE);
    9.30 +
    9.31 +	glMatrixMode(GL_MODELVIEW);
    9.32 +	glLoadIdentity();
    9.33 +	glMatrixMode(GL_PROJECTION);
    9.34 +	glLoadIdentity();
    9.35 +
    9.36 +	glBegin(GL_QUADS);
    9.37 +	glTexCoord2f(u, v);
    9.38 +	glVertex2f(-1, -1);
    9.39 +	glTexCoord2f((u + maxu) / 2, v);
    9.40 +	glVertex2f(1, -1);
    9.41 +	glTexCoord2f((u + maxu) / 2, maxv);
    9.42 +	glVertex2f(1, 1);
    9.43 +	glTexCoord2f(u, maxv);
    9.44 +	glVertex2f(-1, 1);
    9.45 +	glEnd();
    9.46 +
    9.47 +	glPopMatrix();
    9.48 +	glMatrixMode(GL_MODELVIEW);
    9.49 +	glPopMatrix();
    9.50 +
    9.51 +	glPopAttrib();
    9.52 +}
    9.53 +
    9.54 +struct vr_module *vr_module_null(void)
    9.55 +{
    9.56 +	static struct vr_module m;
    9.57 +
    9.58 +	if(!m.init) {
    9.59 +		m.name = "null";
    9.60 +		m.init = init;
    9.61 +		m.draw = draw;
    9.62 +	}
    9.63 +	return &m;
    9.64 +}