]> Pileus Git - grits/blob - examples/sorting/sort.c
Template for sorting example, currently broken
[grits] / examples / sorting / sort.c
1 #include <gtk/gtk.h>
2 #include <gtk/gtkgl.h>
3 #include <gdk/gdkkeysyms.h>
4 #include <GL/gl.h>
5 #include <GL/glu.h>
6
7 guint tex, texl, texr;
8
9 gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer _)
10 {
11         if (event->keyval == GDK_q)
12                 gtk_main_quit();
13         return FALSE;
14 }
15
16 gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _)
17 {
18         //glClearColor(0.5, 0.5, 1.0, 1.0);
19         glClearColor(0.0, 0.0, 0.0, 0.0);
20         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
21
22         glEnable(GL_BLEND);
23
24         /* Blend, but broken sorting */
25         //glEnable(GL_DEPTH_TEST);
26         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
27
28         /* No sorting, just add */
29         //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
30         //glBlendFunc(GL_ONE, GL_ONE);
31
32         /* Lighting */
33         float light_ambient[]  = {0.1f, 0.1f, 0.0f, 1.0f};
34         float light_diffuse[]  = {0.9f, 0.9f, 0.9f, 1.0f};
35         float light_position[] = {-30.0f, 50.0f, 40.0f, 1.0f};
36         glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
37         glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
38         glLightfv(GL_LIGHT0, GL_POSITION, light_position);
39         glEnable(GL_COLOR_MATERIAL);
40         glEnable(GL_LIGHTING);
41         glEnable(GL_LIGHT0);
42
43         /* Set up projection */
44         glMatrixMode(GL_PROJECTION);
45         glLoadIdentity();
46         glOrtho(1,-1, -1,1, -10,10);
47
48         /* Draw teapots */
49         glMatrixMode(GL_MODELVIEW);
50
51         glLoadIdentity();
52         glTranslatef(-0.2, -0.2, -2);
53         glRotatef(30, 1, -1, -0.2);
54         glColor4f(0.6, 0.6, 0.4, 0.5);
55         gdk_gl_draw_teapot(TRUE, 0.5);
56
57         glLoadIdentity();
58         glTranslatef(0.2, 0.2, -2);
59         glRotatef(30, 1, -1, -0.2);
60         glColor4f(0.6, 0.6, 0.4, 0.5);
61         gdk_gl_draw_teapot(TRUE, 0.5);
62
63         /* Flush */
64         GdkGLDrawable *gldrawable = gdk_gl_drawable_get_current();
65         if (gdk_gl_drawable_is_double_buffered(gldrawable))
66                 gdk_gl_drawable_swap_buffers(gldrawable);
67         else
68                 glFlush();
69         return FALSE;
70 }
71
72 gboolean on_configure(GtkWidget *drawing, GdkEventConfigure *event, gpointer _)
73 {
74         glViewport(0, 0,
75                 drawing->allocation.width,
76                 drawing->allocation.height);
77         return FALSE;
78 }
79
80 int main(int argc, char **argv)
81 {
82         gtk_init(&argc, &argv);
83
84         GtkWidget   *window   = gtk_window_new(GTK_WINDOW_TOPLEVEL);
85         GtkWidget   *drawing  = gtk_drawing_area_new();
86         GdkGLConfig *glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)(
87                         GDK_GL_MODE_RGBA   | GDK_GL_MODE_DEPTH |
88                         GDK_GL_MODE_DOUBLE | GDK_GL_MODE_ALPHA));
89         g_signal_connect(window,  "destroy",         G_CALLBACK(gtk_main_quit), NULL);
90         g_signal_connect(window,  "key-press-event", G_CALLBACK(on_key_press),  NULL);
91         g_signal_connect(drawing, "expose-event",    G_CALLBACK(on_expose),     NULL);
92         g_signal_connect(drawing, "configure-event", G_CALLBACK(on_configure),  NULL);
93         gtk_widget_set_gl_capability(drawing, glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE);
94         gtk_container_add(GTK_CONTAINER(window), drawing);
95         gtk_widget_show_all(window);
96
97         /* OpenGL setup */
98         GdkGLContext  *glcontext  = gtk_widget_get_gl_context(GTK_WIDGET(drawing));
99         GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(drawing));
100         gdk_gl_drawable_gl_begin(gldrawable, glcontext);
101
102         gtk_main();
103
104         gdk_gl_drawable_gl_end(gldrawable);
105 }