#include #include #include #include #include #include "glaux.h" HGLRC ctx2; void Initialize(void) { ctx2 = wglCreateContext(auxGetHDC()); if (ctx2 == NULL) { printf("Unable to create ctx2\n"); exit(1); } } void TriangleAt(GLfloat x, GLfloat y, GLfloat z, BOOL colors) { glPushMatrix(); glTranslatef(x, y, z); glBegin (GL_TRIANGLES); if (colors) { glColor3f(1.0f, 0.0f, 0.0f); } glVertex2f (0.0f, 0.0f); if (colors) { glColor3f(0.0f, 1.0f, 0.0f); } glVertex2f (5.0f, 5.0f); if (colors) { glColor3f(0.0f, 0.0f, 1.0f); } glVertex2f (0.0f, 5.0f); glEnd (); glPopMatrix(); } void Test(void) { HGLRC old_ctx; old_ctx = wglGetCurrentContext(); glColor3f(1.0f, 0.0f, 0.0f); TriangleAt(1.0f, 1.0f, 0.0f, FALSE); if (!wglCopyContext(old_ctx, ctx2, GL_CURRENT_BIT)) { printf("Unable to copy context\n"); exit(1); } wglMakeCurrent(auxGetHDC(), ctx2); // Should be red instead of white because current color is copied TriangleAt(7.0f, 1.0f, 0.0f, FALSE); wglMakeCurrent(auxGetHDC(), old_ctx); glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); glDisable(GL_DITHER); // Should be culled TriangleAt(13.0f, 1.0f, 0.0f, TRUE); if (!wglCopyContext(old_ctx, ctx2, GL_COLOR_BUFFER_BIT)) { printf("Unable to copy context\n"); exit(1); } wglMakeCurrent(auxGetHDC(), ctx2); // Should be drawn but not dithered since we only copied the // color buffer state TriangleAt(19.0f, 1.0f, 0.0f, TRUE); wglMakeCurrent(auxGetHDC(), old_ctx); if (!wglCopyContext(old_ctx, ctx2, GL_POLYGON_BIT)) { printf("Unable to copy context\n"); exit(1); } wglMakeCurrent(auxGetHDC(), ctx2); // Should be culled now that the culling been copied TriangleAt(25.0f, 1.0f, 0.0f, TRUE); wglMakeCurrent(auxGetHDC(), old_ctx); } void display(void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); Test (); glFlush (); } void myReshape(GLsizei w, GLsizei h) { HGLRC old_ctx; old_ctx = wglGetCurrentContext(); glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) gluOrtho2D (0.0, 100.0, 0.0, 100.0 * (GLfloat) h/(GLfloat) w); else gluOrtho2D (0.0, 100.0 * (GLfloat) w/(GLfloat) h, 0.0, 100.0); glMatrixMode(GL_MODELVIEW); wglMakeCurrent(auxGetHDC(), ctx2); glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) gluOrtho2D (0.0, 100.0, 0.0, 100.0 * (GLfloat) h/(GLfloat) w); else gluOrtho2D (0.0, 100.0 * (GLfloat) w/(GLfloat) h, 0.0, 100.0); glMatrixMode(GL_MODELVIEW); wglMakeCurrent(auxGetHDC(), old_ctx); } /* Main Loop * Open window with initial window size, title bar, * RGBA display mode, and handle input events. */ int __cdecl main(int argc, char** argv) { auxInitDisplayMode (AUX_SINGLE | AUX_RGB | AUX_DEPTH16); auxInitPosition (0, 0, 500, 500); auxInitWindow ("CopyContext Test"); Initialize(); auxReshapeFunc (myReshape); auxMainLoop(display); return 0; }