gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1,1, -1,1, 10,-10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0, 0, -5); glEnable(GL_COLOR_MATERIAL); glDisable(GL_TEXTURE_2D); glColor3f(1.0, 1.0, 1.0); /* Create vertexes */ double verts[20][3]; for (int i = 0; i < G_N_ELEMENTS(verts); i++) { float ang = 2*G_PI * i / G_N_ELEMENTS(verts); verts[i][0] = sin(ang) * (i%2+0.5) * 0.6; verts[i][1] = cos(ang) * (i%2+0.5) * 0.6; verts[i][2] = 0; } /* Draw raw polygon */ glColor4f(0.5, 0.0, 0.0, 1.0); GLUtesselator *tess = gluNewTess(); gluTessCallback(tess, GLU_TESS_BEGIN, glBegin); gluTessCallback(tess, GLU_TESS_VERTEX, glVertex3dv); gluTessCallback(tess, GLU_TESS_END, glEnd); gluTessBeginPolygon(tess, NULL); gluTessBeginContour(tess); for (int i = 0; i < G_N_ELEMENTS(verts); i++) gluTessVertex(tess, verts[i], verts[i]); gluTessEndContour(tess); gluTessEndPolygon(tess); gluDeleteTess(tess); /* Draw tesselated polygon */ //glColor4f(0.0, 0.0, 0.5, 1.0); //glBegin(GL_POLYGON); //for (int i = 0; i < G_N_ELEMENTS(verts); i++) // glVertex3dv(verts[i]); //glEnd(); /* Draw outline */ glColor4f(0.8, 0.8, 0.8, 1.0); glBegin(GL_LINE_LOOP); for (int i = 0; i < G_N_ELEMENTS(verts); i++) glVertex3dv(verts[i]); glEnd(); /* Flush */ GdkGLDrawable *gldrawable = gdk_gl_drawable_get_current(); if (gdk_gl_drawable_is_double_buffered(gldrawable)) gdk_gl_drawable_swap_buffers(gldrawable); else glFlush(); return FALSE; }
/************* * Callbacks * *************/ static gboolean on_expose(GritsTester *tester, GdkEventExpose *event, gpointer _) { g_debug("GritsTester: on_expose"); glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearDepth(1.0); glEnable(GL_BLEND); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //glDisable(GL_DEPTH_TEST); //glBlendFunc(GL_SRC_ALPHA, GL_ONE); /* Lighting */ glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); float light_ambient[] = {0.1f, 0.1f, 0.1f, 1.0f}; float light_diffuse[] = {0.6f, 0.6f, 0.8f, 1.0f}; float light_position[] = {-40.0f, 80.0f, 40.0f, 1.0f}; glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glPopMatrix(); glColor4f(1.0f, 1.0f, 1.0f, 0.5f); /* Draw */ gdk_gl_draw_cube(FALSE, 2); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); for (GList *cur = tester->objects; cur; cur = cur->next) grits_object_draw(cur->data, NULL); if (tester->wireframe) { glDisable(GL_LIGHTING); glEnable(GL_POLYGON_OFFSET_LINE); glPolygonOffset(-1,0); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); for (GList *cur = tester->objects; cur; cur = cur->next) grits_object_draw(cur->data, NULL); } /* Flush */ GdkGLDrawable *gldrawable = gdk_gl_drawable_get_current(); gdk_gl_drawable_swap_buffers(gldrawable); return FALSE; }
gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _) { glClearColor(0.5, 0.5, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1,1, -1,1, 10,-10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0, 0, -5); glEnable(GL_COLOR_MATERIAL); glDisable(GL_TEXTURE_2D); glColor3f(1.0, 1.0, 1.0); glBegin(GL_QUADS); glVertex3f(-0.25, -0.75, 0.0); glVertex3f(-0.25, 0.75, 0.0); glVertex3f( 0.25, 0.75, 0.0); glVertex3f( 0.25, -0.75, 0.0); glEnd(); /* Textures */ glDisable(GL_COLOR_MATERIAL); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); gdouble y = 0.875; /* Left */ glBlendFunc(GL_ONE, GL_ZERO); glBindTexture(GL_TEXTURE_2D, texl); glBegin(GL_QUADS); glTexCoord2f(0.0, y); glVertex3f(-0.75, 0.0, 0.0); glTexCoord2f(0.0, 1.0); glVertex3f(-0.75, 0.5, 0.0); glTexCoord2f(2.0, 1.0); glVertex3f( 0.75, 0.5, 0.0); glTexCoord2f(2.0, y); glVertex3f( 0.75, 0.0, 0.0); glEnd(); /* Right */ glBlendFunc(GL_ONE, GL_ONE); glBindTexture(GL_TEXTURE_2D, texr); glBegin(GL_QUADS); glTexCoord2f(-1.0, y); glVertex3f(-0.75, 0.0, 0.0); glTexCoord2f(-1.0, 1.0); glVertex3f(-0.75, 0.5, 0.0); glTexCoord2f( 1.0, 1.0); glVertex3f( 0.75, 0.5, 0.0); glTexCoord2f( 1.0, y); glVertex3f( 0.75, 0.0, 0.0); glEnd(); /* Bottom */ glBlendFunc(GL_ONE, GL_ZERO); glBindTexture(GL_TEXTURE_2D, tex); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3f(-0.75, -0.5, 0.0); glTexCoord2f(0.0, 1.0-y); glVertex3f(-0.75, -0.0, 0.0); glTexCoord2f(1.0, 1.0-y); glVertex3f( 0.75, -0.0, 0.0); glTexCoord2f(1.0, 0.0); glVertex3f( 0.75, -0.5, 0.0); glEnd(); /* Flush */ GdkGLDrawable *gldrawable = gdk_gl_drawable_get_current(); if (gdk_gl_drawable_is_double_buffered(gldrawable)) gdk_gl_drawable_swap_buffers(gldrawable); else glFlush(); return FALSE; }