]> Pileus Git - grits/blob - examples/cube/cube.c
Add cube GtkGL example
[grits] / examples / cube / cube.c
1 #include <gtk/gtk.h>
2 #include <GL/glut.h>
3 #include "gtkgl.h"
4
5 static gdouble rotate = 0;
6
7 gboolean on_spin(GtkWidget *spin)
8 {
9         /* Spin the cube when the toggle button is pressed */
10         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(spin)))
11                 rotate++;
12         gtk_widget_queue_draw(gtk_widget_get_toplevel(spin));
13         return TRUE;
14 }
15
16 gboolean on_draw(GtkWidget *draw)
17 {
18         GtkAllocation alloc;
19         gtk_widget_get_allocation(draw, &alloc);
20
21         /* Start OpenGL Commands */
22         gtk_gl_begin(draw);
23
24         /* Setup View */
25         glViewport(0, 0, alloc.width, alloc.height);
26
27         glMatrixMode(GL_PROJECTION);
28         glLoadIdentity();
29         gluPerspective(45, (gdouble)alloc.width/alloc.height, 0.01, 10);
30
31         glMatrixMode(GL_MODELVIEW);
32         glLoadIdentity();
33         glTranslated(0, 0, -3);
34         glRotated(rotate+20, 1, 0, 0);
35         glRotated(rotate+30, 0, 1, 0);
36
37         /* Draw a Cube */
38         glClearColor(0, 0, 0.15, 0);
39         glClear(GL_COLOR_BUFFER_BIT);
40         glLineWidth(4);
41
42         glColor3f(1, 0, 0);
43         glutSolidCube(1);
44
45         glColor3f(1, 1, 1);
46         glutWireCube(1);
47
48         /* Done with OpenGL */
49         gtk_gl_end(draw);
50
51         return TRUE;
52 }
53
54 int main(int argc, char **argv)
55 {
56         /* Library initialization */
57         gtk_init(&argc, &argv);
58         glutInit(&argc, argv);
59
60         /* Create widgets */
61         GtkWidget *win  = gtk_window_new(GTK_WINDOW_TOPLEVEL);
62         GtkWidget *box  = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
63         GtkWidget *draw = gtk_drawing_area_new();
64         GtkWidget *spin = gtk_toggle_button_new_with_label("Spin");
65
66         /* Pack everything together */
67         gtk_container_add(GTK_CONTAINER(win), box);
68         gtk_box_pack_start(GTK_BOX(box), draw, TRUE, TRUE, 0);
69         gtk_box_pack_start(GTK_BOX(box), spin, FALSE, FALSE, 0);
70
71         /* Connect signals */
72         g_signal_connect(win, "destroy", gtk_main_quit, NULL);
73         g_signal_connect(draw, "draw", G_CALLBACK(on_draw), NULL);
74         g_timeout_add(1000/60, (GSourceFunc)on_spin, spin);
75
76         /* Enable OpenGL on drawing frame */
77         gtk_gl_enable(draw);
78
79         /* Show and run main loop */
80         gtk_widget_show_all(win);
81         gtk_main();
82
83         return 0;
84 }