/* * Copyright (C) 2009-2011 Andy Spencer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include static gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _) { //glClearColor(0.5, 0.5, 1.0, 1.0); glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* No sorting, just add */ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //glBlendFunc(GL_ONE, GL_ONE); /* Lighting */ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); float light_ambient[] = {0.3f, 0.3f, 0.1f, 1.0f}; float light_diffuse[] = {0.9f, 0.9f, 0.9f, 1.0f}; float light_position[] = {-30.0f, 50.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); /* Projection */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-1,1, -1,1, 2,10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,2,-3, 0,0,0, 0,1,0); /* Draw polys */ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glColor4f(1, 0, 0, 0.5); glBegin(GL_TRIANGLE_STRIP); glVertex3i(-1, 1, 1); glVertex3i(-1, -1, 1); glVertex3i( 1, 1, -1); glVertex3i( 1, -1, -1); glEnd(); glColor4f(0, 1, 0, 0.5); glBegin(GL_TRIANGLE_STRIP); glVertex3i( 1, 1, 1); glVertex3i( 1, -1, 1); glVertex3i(-1, 1, -1); glVertex3i(-1, -1, -1); 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; } static gboolean on_configure(GtkWidget *drawing, GdkEventConfigure *event, gpointer _) { glViewport(0, 0, drawing->allocation.width, drawing->allocation.height); return FALSE; } static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer _) { if (event->keyval == GDK_q) gtk_main_quit(); return FALSE; } int main(int argc, char **argv) { gtk_init(&argc, &argv); GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); GtkWidget *drawing = gtk_drawing_area_new(); GdkGLConfig *glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)( GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE | GDK_GL_MODE_ALPHA)); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL); g_signal_connect(drawing, "expose-event", G_CALLBACK(on_expose), NULL); g_signal_connect(drawing, "configure-event", G_CALLBACK(on_configure), NULL); gtk_widget_set_gl_capability(drawing, glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE); gtk_container_add(GTK_CONTAINER(window), drawing); gtk_widget_show_all(window); /* OpenGL setup */ GdkGLContext *glcontext = gtk_widget_get_gl_context(GTK_WIDGET(drawing)); GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(drawing)); gdk_gl_drawable_gl_begin(gldrawable, glcontext); gtk_main(); gdk_gl_drawable_gl_end(gldrawable); }