oculus1

changeset 18:1b107de821c1

fixed the test to work with non-pow2 textures
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 26 Sep 2013 10:33:08 +0300
parents cfe4979ab3eb
children 899cf9ebffb4 0c76f70fb7e9
files sdr/sdr.glsl src/main.cc src/vr.cc src/vr.h
diffstat 4 files changed, 118 insertions(+), 24 deletions(-) [+]
line diff
     1.1 --- a/sdr/sdr.glsl	Sat Sep 21 07:09:48 2013 +0300
     1.2 +++ b/sdr/sdr.glsl	Thu Sep 26 10:33:08 2013 +0300
     1.3 @@ -2,6 +2,7 @@
     1.4  uniform float aspect, scale;
     1.5  uniform float lens_center_offset;
     1.6  uniform vec4 dist_factors;
     1.7 +uniform vec2 tex_scale;
     1.8  
     1.9  vec2 distort_texcoords(in vec2 tc);
    1.10  float barrel_scale(float x, in vec4 k);
    1.11 @@ -10,9 +11,9 @@
    1.12  {
    1.13  	vec2 tc = distort_texcoords(gl_TexCoord[0].xy);
    1.14  
    1.15 -	float vis = any(greaterThan(tc, vec2(1.0)) || lessThan(tc, vec2(0.0))) ? 0.0 : 1.0;
    1.16 +	float vis = any(greaterThan(tc, vec2(1.0))) || any(lessThan(tc, vec2(0.0))) ? 0.0 : 1.0;
    1.17  
    1.18 -	gl_FragColor.rgb = texture2D(tex, tc).rgb * vis;
    1.19 +	gl_FragColor.rgb = texture2D(tex, tc * tex_scale).rgb * vis;
    1.20  	gl_FragColor.a = 1.0;
    1.21  }
    1.22  
     2.1 --- a/src/main.cc	Sat Sep 21 07:09:48 2013 +0300
     2.2 +++ b/src/main.cc	Thu Sep 26 10:33:08 2013 +0300
     2.3 @@ -7,6 +7,12 @@
     2.4  #include "camera.h"
     2.5  #include "sdr.h"
     2.6  
     2.7 +#ifdef __APPLE__
     2.8 +#include <OpenGL/OpenGL.h>
     2.9 +#include <OpenGL/CGLCurrent.h>
    2.10 +#include <ApplicationServices/ApplicationServices.h>
    2.11 +#endif
    2.12 +
    2.13  static bool init();
    2.14  static void cleanup();
    2.15  static void disp();
    2.16 @@ -26,6 +32,8 @@
    2.17  static void passive(int x, int y);
    2.18  static void sball_rotate(int rx, int ry, int rz);
    2.19  static bool parse_args(int argc, char **argv);
    2.20 +static void printfps();
    2.21 +static int next_pow2(int x);
    2.22  
    2.23  static VRFpsCamera cam;
    2.24  static int width, height;
    2.25 @@ -33,13 +41,15 @@
    2.26  
    2.27  static bool keystate[256];
    2.28  
    2.29 -static int rtarg_width, rtarg_height;
    2.30 +static int rtarg_width, rtarg_height, rtarg_tex_width, rtarg_tex_height;
    2.31 +static float tex_scale_x, tex_scale_y;
    2.32  static unsigned int fbo, tex[2], zbuf;
    2.33  
    2.34  static unsigned int teapot_sdr;
    2.35  
    2.36  static bool fullscreen_pending;
    2.37  
    2.38 +
    2.39  int main(int argc, char **argv)
    2.40  {
    2.41  	glutInitWindowSize(1280, 800);
    2.42 @@ -102,7 +112,12 @@
    2.43  		rtarg_width = (xsz + xsz / 2) / 2;
    2.44  		rtarg_height = ysz + ysz / 2;
    2.45  
    2.46 -		printf("render target: %dx%d\n", rtarg_width, rtarg_height);
    2.47 +		rtarg_tex_width = next_pow2(rtarg_width);
    2.48 +		rtarg_tex_height = next_pow2(rtarg_height);
    2.49 +		tex_scale_x = (float)rtarg_width / (float)rtarg_tex_width;
    2.50 +		tex_scale_y = (float)rtarg_height / (float)rtarg_tex_height;
    2.51 +
    2.52 +		printf("render target: %dx%d (%dx%d)\n", rtarg_width, rtarg_height, rtarg_tex_width, rtarg_tex_height);
    2.53  
    2.54  		// create render targets for each eye
    2.55  		GLenum wrap_mode = GL_CLAMP_TO_EDGE;
    2.56 @@ -117,31 +132,43 @@
    2.57  			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    2.58  			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_mode);
    2.59  			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_mode);
    2.60 -			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, rtarg_width, rtarg_height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
    2.61 +			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, rtarg_tex_width, rtarg_tex_height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
    2.62  		}
    2.63  
    2.64  		// create the depth render buffer
    2.65 -		glGenRenderbuffers(1, &zbuf);
    2.66 -		glBindRenderbuffer(GL_RENDERBUFFER, zbuf);
    2.67 -		glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, rtarg_width, rtarg_height);
    2.68 +		glGenRenderbuffersEXT(1, &zbuf);
    2.69 +		glBindRenderbufferEXT(GL_RENDERBUFFER, zbuf);
    2.70 +		glRenderbufferStorageEXT(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, rtarg_tex_width, rtarg_tex_height);
    2.71  
    2.72  		// create the FBO
    2.73 -		glGenFramebuffers(1, &fbo);
    2.74 -		glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    2.75 -		glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex[0], 0);
    2.76 -		glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, zbuf);
    2.77 +		glGenFramebuffersEXT(1, &fbo);
    2.78 +		glBindFramebufferEXT(GL_FRAMEBUFFER, fbo);
    2.79 +		glFramebufferTextureEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex[0], 0);
    2.80 +		glFramebufferRenderbufferEXT(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, zbuf);
    2.81  	}
    2.82  
    2.83  	teapot_sdr = create_program_load("sdr/phong.v.glsl", "sdr/phong.p.glsl");
    2.84  
    2.85 +	// enable vsync
    2.86 +#ifdef __APPLE__
    2.87 +	int swapint = 1;
    2.88 +	CGLContextObj ctx = CGLGetCurrentContext();
    2.89 +	CGLSetParameter(ctx, kCGLCPSwapInterval, &swapint);
    2.90 +#endif
    2.91 +
    2.92 +#ifdef __APPLE__
    2.93 +	// this is required for glutWarpPointer to work correctly, otherwise after every
    2.94 +	// warp, mac os x freezes event processing for 1/4 second.
    2.95 +	CGSetLocalEventsSuppressionInterval(0.0);
    2.96 +#endif
    2.97  	return true;
    2.98  }
    2.99  
   2.100  static void cleanup()
   2.101  {
   2.102  	glDeleteTextures(2, tex);
   2.103 -	glDeleteRenderbuffers(1, &zbuf);
   2.104 -	glDeleteFramebuffers(1, &fbo);
   2.105 +	glDeleteRenderbuffersEXT(1, &zbuf);
   2.106 +	glDeleteFramebuffersEXT(1, &fbo);
   2.107  	vr_shutdown();
   2.108  }
   2.109  
   2.110 @@ -189,6 +216,8 @@
   2.111  
   2.112  	glutSwapBuffers();
   2.113  	assert(glGetError() == GL_NO_ERROR);
   2.114 +
   2.115 +	printfps();
   2.116  }
   2.117  
   2.118  // display function used in VR mode
   2.119 @@ -211,8 +240,8 @@
   2.120  	glClearColor(0.1, 0.1, 0.1, 1.0);
   2.121  
   2.122  	// draw left view
   2.123 -	glBindFramebuffer(GL_FRAMEBUFFER, fbo);
   2.124 -	glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex[0], 0);
   2.125 +	glBindFramebufferEXT(GL_FRAMEBUFFER, fbo);
   2.126 +	glFramebufferTextureEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex[0], 0);
   2.127  
   2.128  	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   2.129  
   2.130 @@ -228,8 +257,8 @@
   2.131  
   2.132  
   2.133  	// draw right view
   2.134 -	glBindFramebuffer(GL_FRAMEBUFFER, fbo);
   2.135 -	glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex[1], 0);
   2.136 +	glBindFramebufferEXT(GL_FRAMEBUFFER, fbo);
   2.137 +	glFramebufferTextureEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex[1], 0);
   2.138  
   2.139  	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   2.140  
   2.141 @@ -250,13 +279,15 @@
   2.142  	glClearColor(0, 0, 0, 0);
   2.143  	glClear(GL_COLOR_BUFFER_BIT);
   2.144  
   2.145 -	vr_draw_eye(tex[0], VR_EYE_LEFT);
   2.146 -	vr_draw_eye(tex[1], VR_EYE_RIGHT);
   2.147 +	vr_draw_eye(VR_EYE_LEFT, tex[0], tex_scale_x, tex_scale_y);
   2.148 +	vr_draw_eye(VR_EYE_RIGHT, tex[1], tex_scale_x, tex_scale_y);
   2.149  
   2.150  	glutSwapBuffers();
   2.151  	assert(glGetError() == GL_NO_ERROR);
   2.152  
   2.153  	glFinish();
   2.154 +
   2.155 +	printfps();
   2.156  }
   2.157  
   2.158  static void draw_scene()
   2.159 @@ -473,6 +504,21 @@
   2.160  	if(!use_vr) {
   2.161  		rtarg_width = width;
   2.162  		rtarg_height = height;
   2.163 +
   2.164 +		int new_tex_width = next_pow2(width);
   2.165 +		int new_tex_height = next_pow2(height);
   2.166 +
   2.167 +		if(new_tex_width != rtarg_tex_width || new_tex_height != rtarg_tex_width) {
   2.168 +			// TODO
   2.169 +			exit(1);
   2.170 +		}
   2.171 +
   2.172 +		rtarg_tex_width = new_tex_width;
   2.173 +		rtarg_tex_height = new_tex_height;
   2.174 +
   2.175 +		tex_scale_x = (float)rtarg_width / (float)rtarg_tex_width;
   2.176 +		tex_scale_y = (float)rtarg_height / (float)rtarg_tex_height;
   2.177 +
   2.178  	}
   2.179  }
   2.180  
   2.181 @@ -526,7 +572,7 @@
   2.182  	int center_y = height / 2;
   2.183  
   2.184  	int dx = x - center_x;
   2.185 -	int dy = y - center_y;
   2.186 +	int dy = use_vr ? 0 : y - center_y;
   2.187  
   2.188  	if(!dx && !dy) {
   2.189  		return;
   2.190 @@ -537,8 +583,8 @@
   2.191  
   2.192  	cam.input_rotate(DEG_TO_RAD(dtheta_deg), DEG_TO_RAD(dphi_deg), 0);
   2.193  
   2.194 +	glutWarpPointer(center_x, center_y);
   2.195  	glutPostRedisplay();
   2.196 -	glutWarpPointer(center_x, center_y);
   2.197  }
   2.198  
   2.199  static void sball_rotate(int rx, int ry, int rz)
   2.200 @@ -564,3 +610,33 @@
   2.201  	}
   2.202  	return true;
   2.203  }
   2.204 +
   2.205 +static void printfps()
   2.206 +{
   2.207 +	static unsigned int last_upd, frames;
   2.208 +	unsigned int msec = glutGet(GLUT_ELAPSED_TIME);
   2.209 +	unsigned int dmsec = msec - last_upd;
   2.210 +
   2.211 +	frames++;
   2.212 +
   2.213 +	if(dmsec > 2000) {
   2.214 +		float dt = (float)dmsec / 1000.0f;
   2.215 +
   2.216 +		printf("fps: %.2f        \r", (float)frames / dt);
   2.217 +		fflush(stdout);
   2.218 +
   2.219 +		frames = 0;
   2.220 +		last_upd = msec;
   2.221 +	}
   2.222 +}
   2.223 +
   2.224 +static int next_pow2(int x)
   2.225 +{
   2.226 +	x--;
   2.227 +	x = (x >> 1) | x;
   2.228 +	x = (x >> 2) | x;
   2.229 +	x = (x >> 4) | x;
   2.230 +	x = (x >> 8) | x;
   2.231 +	x = (x >> 16) | x;
   2.232 +	return x + 1;
   2.233 +}
     3.1 --- a/src/vr.cc	Sat Sep 21 07:09:48 2013 +0300
     3.2 +++ b/src/vr.cc	Thu Sep 26 10:33:08 2013 +0300
     3.3 @@ -4,6 +4,7 @@
     3.4  #include "vr_impl.h"
     3.5  #include "vr_sdr.h"
     3.6  
     3.7 +static void init_ctx();
     3.8  static bool init_ovr();
     3.9  static bool init_sdr();
    3.10  
    3.11 @@ -14,6 +15,8 @@
    3.12  {
    3.13  	glewInit();
    3.14  
    3.15 +	init_ctx();
    3.16 +
    3.17  	if(!init_ovr()) {
    3.18  		return -1;
    3.19  	}
    3.20 @@ -31,6 +34,16 @@
    3.21  	//System::Destroy();
    3.22  }
    3.23  
    3.24 +static void init_ctx()
    3.25 +{
    3.26 +	vr_ctx.info.width = 1280;
    3.27 +	vr_ctx.info.height = 800;
    3.28 +	vr_ctx.info.fov = M_PI / 2.0;
    3.29 +	vr_ctx.info.aspect = (float)vr_ctx.info.width / (float)vr_ctx.info.height;
    3.30 +	vr_ctx.info.ipd = 0.035;
    3.31 +	vr_ctx.info.scale = 1.0;
    3.32 +}
    3.33 +
    3.34  static bool init_ovr()
    3.35  {
    3.36  	LogMaskConstants log_level = LogMask_All;
    3.37 @@ -312,7 +325,7 @@
    3.38  	oq.GetEulerAngles<Axis_Y, Axis_X, Axis_Z>(euler + 1, euler, euler + 2);
    3.39  }
    3.40  
    3.41 -extern "C" void vr_draw_eye(unsigned int tex, int eye)
    3.42 +extern "C" void vr_draw_eye(int eye, unsigned int tex, float tex_scale_x, float tex_scale_y)
    3.43  {
    3.44  	static const float rects[3][4] = {
    3.45  		{-1, -1, 1, 1},
    3.46 @@ -342,6 +355,10 @@
    3.47  			float offset = vr_ctx.info.lens_center_offset * offs_scale[eye];
    3.48  			glUniform1f(loc, offset);
    3.49  		}
    3.50 +
    3.51 +		if((loc = glGetUniformLocation(sdrprog, "tex_scale")) != -1) {
    3.52 +			glUniform2f(loc, tex_scale_x, tex_scale_y);
    3.53 +		}
    3.54  	}
    3.55  
    3.56  	glBindTexture(GL_TEXTURE_2D, tex);
     4.1 --- a/src/vr.h	Sat Sep 21 07:09:48 2013 +0300
     4.2 +++ b/src/vr.h	Thu Sep 26 10:33:08 2013 +0300
     4.3 @@ -54,7 +54,7 @@
     4.4  void vr_get_rotation_euler(float *euler);
     4.5  
     4.6  /* OpenGL stuff */
     4.7 -void vr_draw_eye(unsigned int tex, int eye);
     4.8 +void vr_draw_eye(int eye, unsigned int tex, float tex_scale_x, float tex_scale_y);
     4.9  
    4.10  #ifdef __cplusplus
    4.11  }