#include #include #include #include #include #include float boxv[][3] = { { -0.5, -0.5, -0.5 }, { 0.5, -0.5, -0.5 }, { 0.5, 0.5, -0.5 }, { -0.5, 0.5, -0.5 }, { -0.5, -0.5, 0.5 }, { 0.5, -0.5, 0.5 }, { 0.5, 0.5, 0.5 }, { -0.5, 0.5, 0.5 } }; #define ALPHA 0.5 static float ang = 30.; gboolean expose (GtkWidget *da, GdkEventExpose *event, gpointer user_data) { GdkGLContext *glcontext = gtk_widget_get_gl_context (da); GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (da); // g_print (" :: expose\n"); if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext)) { g_assert_not_reached (); } /* draw in here */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef (ang, 1, 0, 1); glShadeModel(GL_FLAT); glBegin (GL_LINES); glColor3f (1., 0., 0.); glVertex3f (0., 0., 0.); glVertex3f (1., 0., 0.); glEnd (); glBegin (GL_LINES); glColor3f (0., 1., 0.); glVertex3f (0., 0., 0.); glVertex3f (0., 1., 0.); glEnd (); glBegin (GL_LINES); glColor3f (0., 0., 1.); glVertex3f (0., 0., 0.); glVertex3f (0., 0., 1.); glEnd (); glBegin(GL_LINES); glColor3f (1., 1., 1.); glVertex3fv(boxv[0]); glVertex3fv(boxv[1]); glVertex3fv(boxv[1]); glVertex3fv(boxv[2]); glVertex3fv(boxv[2]); glVertex3fv(boxv[3]); glVertex3fv(boxv[3]); glVertex3fv(boxv[0]); glVertex3fv(boxv[4]); glVertex3fv(boxv[5]); glVertex3fv(boxv[5]); glVertex3fv(boxv[6]); glVertex3fv(boxv[6]); glVertex3fv(boxv[7]); glVertex3fv(boxv[7]); glVertex3fv(boxv[4]); glVertex3fv(boxv[0]); glVertex3fv(boxv[4]); glVertex3fv(boxv[1]); glVertex3fv(boxv[5]); glVertex3fv(boxv[2]); glVertex3fv(boxv[6]); glVertex3fv(boxv[3]); glVertex3fv(boxv[7]); glEnd(); glPopMatrix (); if (gdk_gl_drawable_is_double_buffered (gldrawable)) gdk_gl_drawable_swap_buffers (gldrawable); else glFlush (); gdk_gl_drawable_gl_end (gldrawable); return TRUE; } gboolean configure(GtkWidget *da, GdkEventConfigure *event, gpointer user_data) { GdkGLContext *glcontext = gtk_widget_get_gl_context (da); GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (da); if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext)) { g_assert_not_reached (); } glLoadIdentity(); glViewport (0, 0, da->allocation.width, da->allocation.height); glOrtho (-10,10,-10,10,-20050,10000); glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glScalef (10., 10., 10.); gdk_gl_drawable_gl_end (gldrawable); return TRUE; } gboolean rotate (gpointer user_data) { GtkWidget *da = GTK_WIDGET (user_data); ang++; gdk_window_invalidate_rect (da->window, &da->allocation, FALSE); gdk_window_process_updates (da->window, FALSE); return TRUE; } gboolean cube_init(GtkDrawingArea *drawing) { g_signal_connect(drawing, "configure-event", G_CALLBACK(configure), NULL); g_signal_connect(drawing, "expose-event", G_CALLBACK(expose), NULL); g_timeout_add(1000/60, rotate, drawing); }