diff options
author | Brian Paul <[email protected]> | 2010-02-18 16:54:14 -0700 |
---|---|---|
committer | Brian Paul <[email protected]> | 2010-02-18 16:58:38 -0700 |
commit | 86bf224cac4600ad4706ee101ced9e3f1a9886b4 (patch) | |
tree | 3208382c64e3aa219c256ea5eede91124dd51ec0 /progs/demos/arbocclude.c | |
parent | 00d1d8aad3b97899e3fab1cc4e4296c3f6ee8513 (diff) |
progs/demos: update arbocclude.c to do multiple queries at once
Issue a whole bunch of queries then get the results and render.
Draw the test object in red instead of orange if the result was not
ready when we first queried it.
Diffstat (limited to 'progs/demos/arbocclude.c')
-rw-r--r-- | progs/demos/arbocclude.c | 213 |
1 files changed, 108 insertions, 105 deletions
diff --git a/progs/demos/arbocclude.c b/progs/demos/arbocclude.c index f669a1f26ba..cc787eeb8a7 100644 --- a/progs/demos/arbocclude.c +++ b/progs/demos/arbocclude.c @@ -32,11 +32,12 @@ #include <GL/glew.h> #include <GL/glut.h> -#define TEST_DISPLAY_LISTS 0 +#define NUM_OCC 10 static GLboolean Anim = GL_TRUE; -static GLfloat Xpos = 0; -static GLuint OccQuery; +static GLfloat Xpos[NUM_OCC], Ypos[NUM_OCC]; +static GLfloat Sign[NUM_OCC]; +static GLuint OccQuery[NUM_OCC]; static GLint Win = 0; @@ -54,38 +55,43 @@ PrintString(const char *s) static void Idle(void) { static int lastTime = 0; - static int sign = +1; int time = glutGet(GLUT_ELAPSED_TIME); float step; + int i; if (lastTime == 0) lastTime = time; else if (time - lastTime < 20) /* 50Hz update */ return; - step = (time - lastTime) / 1000.0 * sign; - lastTime = time; + for (i = 0; i < NUM_OCC; i++) { - Xpos += step; + step = (time - lastTime) / 1000.0 * Sign[i]; + + Xpos[i] += step; + + if (Xpos[i] > 2.5) { + Xpos[i] = 2.5; + Sign[i] = -1; + } + else if (Xpos[i] < -2.5) { + Xpos[i] = -2.5; + Sign[i] = +1; + } - if (Xpos > 2.5) { - Xpos = 2.5; - sign = -1; - } - else if (Xpos < -2.5) { - Xpos = -2.5; - sign = +1; } + + lastTime = time; + glutPostRedisplay(); } static void Display( void ) { - GLuint passed; - GLint ready; - char s[100]; + int i; + glClearColor(0.25, 0.25, 0.25, 0.0); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glMatrixMode( GL_PROJECTION ); @@ -96,97 +102,84 @@ static void Display( void ) glTranslatef( 0.0, 0.0, -15.0 ); /* draw the occluding polygons */ - glColor3f(0, 0.6, 0.8); + glColor3f(0, 0.4, 0.6); glBegin(GL_QUADS); - glVertex2f(-1.6, -1.5); - glVertex2f(-0.4, -1.5); - glVertex2f(-0.4, 1.5); - glVertex2f(-1.6, 1.5); - - glVertex2f( 0.4, -1.5); - glVertex2f( 1.6, -1.5); - glVertex2f( 1.6, 1.5); - glVertex2f( 0.4, 1.5); + glVertex2f(-1.6, -2.5); + glVertex2f(-0.4, -2.5); + glVertex2f(-0.4, 2.5); + glVertex2f(-1.6, 2.5); + glVertex2f( 0.4, -2.5); + glVertex2f( 1.6, -2.5); + glVertex2f( 1.6, 2.5); + glVertex2f( 0.4, 2.5); glEnd(); - /* draw the test polygon with occlusion testing */ - glPushMatrix(); - glTranslatef(Xpos, 0, -0.5); - glScalef(0.3, 0.3, 1.0); - glRotatef(-90.0 * Xpos, 0, 0, 1); - -#if defined(GL_ARB_occlusion_query) -#if TEST_DISPLAY_LISTS - glNewList(10, GL_COMPILE); - glBeginQueryARB(GL_SAMPLES_PASSED_ARB, OccQuery); - glEndList(); - glCallList(10); -#else - glBeginQueryARB(GL_SAMPLES_PASSED_ARB, OccQuery); -#endif glColorMask(0, 0, 0, 0); glDepthMask(GL_FALSE); - glBegin(GL_POLYGON); - glVertex3f(-1, -1, 0); - glVertex3f( 1, -1, 0); - glVertex3f( 1, 1, 0); - glVertex3f(-1, 1, 0); - glEnd(); + /* draw the test polygons with occlusion testing */ + for (i = 0; i < NUM_OCC; i++) { + glPushMatrix(); + glTranslatef(Xpos[i], Ypos[i], -0.5); + glScalef(0.2, 0.2, 1.0); + glRotatef(-90.0 * Xpos[i], 0, 0, 1); + + glBeginQueryARB(GL_SAMPLES_PASSED_ARB, OccQuery[i]); + glBegin(GL_POLYGON); + glVertex3f(-1, -1, 0); + glVertex3f( 1, -1, 0); + glVertex3f( 1, 1, 0); + glVertex3f(-1, 1, 0); + glEnd(); + glEndQueryARB(GL_SAMPLES_PASSED_ARB); + + glPopMatrix(); + } -#if TEST_DISPLAY_LISTS - glNewList(11, GL_COMPILE); - glEndQueryARB(GL_SAMPLES_PASSED_ARB); - glEndList(); - glCallList(11); -#else - glEndQueryARB(GL_SAMPLES_PASSED_ARB); -#endif - - do { - /* do useful work here, if any */ - glGetQueryObjectivARB(OccQuery, GL_QUERY_RESULT_AVAILABLE_ARB, &ready); - } while (!ready); - glGetQueryObjectuivARB(OccQuery, GL_QUERY_RESULT_ARB, &passed); - - /* turn off occlusion testing */ glColorMask(1, 1, 1, 1); glDepthMask(GL_TRUE); -#endif /* GL_ARB_occlusion_query */ - - /* draw the orange rect, so we can see what's going on */ - glColor3f(0.8, 0.5, 0); - glBegin(GL_POLYGON); - glVertex3f(-1, -1, 0); - glVertex3f( 1, -1, 0); - glVertex3f( 1, 1, 0); - glVertex3f(-1, 1, 0); - glEnd(); - glPopMatrix(); - - - /* Print result message */ - glMatrixMode( GL_PROJECTION ); - glLoadIdentity(); - glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 ); - glMatrixMode( GL_MODELVIEW ); - glLoadIdentity(); - - glColor3f(1, 1, 1); -#if defined(GL_ARB_occlusion_query) - sprintf(s, " %4d Fragments Visible", passed); - glRasterPos3f(-0.50, -0.7, 0); - PrintString(s); - if (!passed) { - glRasterPos3f(-0.25, -0.8, 0); - PrintString("Fully Occluded"); + /* Draw the rectangles now. + * Draw orange if result was ready + * Draw red if result was not ready. + */ + for (i = 0; i < NUM_OCC; i++) { + GLuint passed; + GLint ready; + + glGetQueryObjectivARB(OccQuery[i], GL_QUERY_RESULT_AVAILABLE_ARB, &ready); + + glGetQueryObjectuivARB(OccQuery[i], GL_QUERY_RESULT_ARB, &passed); + + if (!ready) + glColor3f(1, 0, 0); + else + glColor3f(0.8, 0.5, 0); + + if (!ready || passed) { + glPushMatrix(); + glTranslatef(Xpos[i], Ypos[i], -0.5); + glScalef(0.2, 0.2, 1.0); + glRotatef(-90.0 * Xpos[i], 0, 0, 1); + + glBegin(GL_POLYGON); + glVertex3f(-1, -1, 0); + glVertex3f( 1, -1, 0); + glVertex3f( 1, 1, 0); + glVertex3f(-1, 1, 0); + glEnd(); + + glPopMatrix(); + } + + { + char s[10]; + glRasterPos3f(0.45, Ypos[i], 1.0); + sprintf(s, "%4d", passed); + PrintString(s); + } } -#else - glRasterPos3f(-0.25, -0.8, 0); - PrintString("GL_ARB_occlusion_query not available at compile time"); -#endif /* GL_ARB_occlusion_query */ glutSwapBuffers(); } @@ -222,14 +215,17 @@ static void Key( unsigned char key, int x, int y ) static void SpecialKey( int key, int x, int y ) { const GLfloat step = 0.1; + int i; (void) x; (void) y; switch (key) { case GLUT_KEY_LEFT: - Xpos -= step; + for (i = 0; i < NUM_OCC; i++) + Xpos[i] -= step; break; case GLUT_KEY_RIGHT: - Xpos += step; + for (i = 0; i < NUM_OCC; i++) + Xpos[i] += step; break; } glutPostRedisplay(); @@ -240,29 +236,33 @@ static void Init( void ) { const char *ext = (const char *) glGetString(GL_EXTENSIONS); GLint bits; + int i; if (!strstr(ext, "GL_ARB_occlusion_query")) { printf("Sorry, this demo requires the GL_ARB_occlusion_query extension\n"); exit(-1); } -#if defined(GL_ARB_occlusion_query) glGetQueryivARB(GL_SAMPLES_PASSED_ARB, GL_QUERY_COUNTER_BITS_ARB, &bits); if (!bits) { printf("Hmmm, GL_QUERY_COUNTER_BITS_ARB is zero!\n"); exit(-1); } -#endif /* GL_ARB_occlusion_query */ glGetIntegerv(GL_DEPTH_BITS, &bits); printf("Depthbits: %d\n", bits); -#if defined(GL_ARB_occlusion_query) - glGenQueriesARB(1, &OccQuery); - assert(OccQuery > 0); -#endif /* GL_ARB_occlusion_query */ + glGenQueriesARB(NUM_OCC, OccQuery); glEnable(GL_DEPTH_TEST); + + for (i = 0; i < NUM_OCC; i++) { + float t = (float) i / (NUM_OCC - 1); + Xpos[i] = 2.5 * t; + Ypos[i] = 4.0 * (t - 0.5); + Sign[i] = 1.0; + } + } @@ -276,7 +276,10 @@ int main( int argc, char *argv[] ) glutReshapeFunc( Reshape ); glutKeyboardFunc( Key ); glutSpecialFunc( SpecialKey ); - glutIdleFunc( Idle ); + if (Anim) + glutIdleFunc(Idle); + else + glutIdleFunc(NULL); glutDisplayFunc( Display ); Init(); glutMainLoop(); |