#include #include #include #include BOOL fDouble = FALSE; int nIter = 128; #define WIDTH 512 #define HEIGHT 512 double clip_val; #define CLIP clip_val #define CLIP_CENTER 1 void Draw(void) { glLoadIdentity(); glBegin(GL_LINES); glVertex2d(-CLIP, -CLIP); glVertex2d(CLIP, CLIP); glVertex2d(-CLIP, CLIP); glVertex2d(CLIP, -CLIP); glEnd(); glBegin(GL_LINE_LOOP); glVertex2d(0, .25); glVertex2d(-CLIP, CLIP); glVertex2d(-.25, 0); glVertex2d(-CLIP, -CLIP); glVertex2d(0, -.25); glVertex2d(CLIP, -CLIP); glVertex2d(.25, 0); glVertex2d(CLIP, CLIP); glEnd(); glBegin(GL_POLYGON); glVertex2d(0, .25); glVertex2d(0, CLIP); glVertex2d(-CLIP, CLIP); glVertex2d(-CLIP, 0); glVertex2d(-.25, 0); glEnd(); glBegin(GL_POLYGON); glVertex2d(-.25, 0); glVertex2d(-CLIP, 0); glVertex2d(-CLIP, -CLIP); glVertex2d(0, -CLIP); glVertex2d(0, -.25); glEnd(); glBegin(GL_POLYGON); glVertex2d(0, -.25); glVertex2d(0, -CLIP); glVertex2d(CLIP, -CLIP); glVertex2d(CLIP, 0); glVertex2d(.25, 0); glEnd(); glBegin(GL_POLYGON); glVertex2d(.25, 0); glVertex2d(CLIP, 0); glVertex2d(CLIP, CLIP); glVertex2d(0, CLIP); glVertex2d(0, .25); glEnd(); if (fDouble) { auxSwapBuffers(); } else { glFinish(); } } void TestClip(void) { static GLboolean done = GL_FALSE; float eps, old; if (done) { return; } eps = .0001f; old = .0f; while (nIter-- > 0 && eps != old) { printf("TestClip %f\n", eps); clip_val = CLIP_CENTER+eps; Draw(); clip_val = CLIP_CENTER-eps; Draw(); old = eps; eps /= 10; } done = GL_TRUE; } void Nothing(void) { } void __cdecl main(int argc, char **argv) { GLenum mode; while (--argc > 0) { argv++; if (!strcmp(*argv, "-db")) { fDouble = TRUE; } else if (!strcmp(*argv, "-it")) { argv++; argc--; sscanf(*argv, "%d", &nIter); } } auxInitPosition(5, 5, WIDTH, HEIGHT); mode = AUX_RGB | AUX_DEPTH16; if (fDouble) { mode |= AUX_DOUBLE; } else { mode |= AUX_SINGLE; } auxInitDisplayMode(mode); auxInitWindow("OpenGL Line Clipping Test"); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glClear(GL_COLOR_BUFFER_BIT); auxIdleFunc(TestClip); auxMainLoop(Nothing); }