]> Pileus Git - aweather/blob - src/cube.c
OpenGL Hello World
[aweather] / src / cube.c
1 #include <config.h>
2 #include <gtk/gtk.h>
3 #include <gtk/gtkgl.h>
4 #include <gdk/gdkkeysyms.h>
5 #include <GL/gl.h>
6 #include <math.h>
7
8 float boxv[][3] = {
9         { -0.5, -0.5, -0.5 },
10         {  0.5, -0.5, -0.5 },
11         {  0.5,  0.5, -0.5 },
12         { -0.5,  0.5, -0.5 },
13         { -0.5, -0.5,  0.5 },
14         {  0.5, -0.5,  0.5 },
15         {  0.5,  0.5,  0.5 },
16         { -0.5,  0.5,  0.5 }
17 };
18 #define ALPHA 0.5
19
20 static float ang = 30.;
21
22 gboolean expose (GtkWidget *da, GdkEventExpose *event, gpointer user_data)
23 {
24         GdkGLContext *glcontext = gtk_widget_get_gl_context (da);
25         GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (da);
26
27         // g_print (" :: expose\n");
28
29         if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
30         {
31                 g_assert_not_reached ();
32         }
33
34         /* draw in here */
35         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
36         glPushMatrix();
37         
38         glRotatef (ang, 1, 0, 1);
39
40         glShadeModel(GL_FLAT);
41
42         glBegin (GL_LINES);
43         glColor3f (1., 0., 0.);
44         glVertex3f (0., 0., 0.);
45         glVertex3f (1., 0., 0.);
46         glEnd ();
47         
48         glBegin (GL_LINES);
49         glColor3f (0., 1., 0.);
50         glVertex3f (0., 0., 0.);
51         glVertex3f (0., 1., 0.);
52         glEnd ();
53         
54         glBegin (GL_LINES);
55         glColor3f (0., 0., 1.);
56         glVertex3f (0., 0., 0.);
57         glVertex3f (0., 0., 1.);
58         glEnd ();
59
60         glBegin(GL_LINES);
61         glColor3f (1., 1., 1.);
62         glVertex3fv(boxv[0]);
63         glVertex3fv(boxv[1]);
64         
65         glVertex3fv(boxv[1]);
66         glVertex3fv(boxv[2]);
67         
68         glVertex3fv(boxv[2]);
69         glVertex3fv(boxv[3]);
70         
71         glVertex3fv(boxv[3]);
72         glVertex3fv(boxv[0]);
73         
74         glVertex3fv(boxv[4]);
75         glVertex3fv(boxv[5]);
76         
77         glVertex3fv(boxv[5]);
78         glVertex3fv(boxv[6]);
79         
80         glVertex3fv(boxv[6]);
81         glVertex3fv(boxv[7]);
82         
83         glVertex3fv(boxv[7]);
84         glVertex3fv(boxv[4]);
85         
86         glVertex3fv(boxv[0]);
87         glVertex3fv(boxv[4]);
88         
89         glVertex3fv(boxv[1]);
90         glVertex3fv(boxv[5]);
91         
92         glVertex3fv(boxv[2]);
93         glVertex3fv(boxv[6]);
94         
95         glVertex3fv(boxv[3]);
96         glVertex3fv(boxv[7]);
97         glEnd();
98
99         glPopMatrix ();
100
101         if (gdk_gl_drawable_is_double_buffered (gldrawable))
102                 gdk_gl_drawable_swap_buffers (gldrawable);
103
104         else
105                 glFlush ();
106
107         gdk_gl_drawable_gl_end (gldrawable);
108
109         return TRUE;
110 }
111
112 gboolean configure(GtkWidget *da, GdkEventConfigure *event, gpointer user_data)
113 {
114         GdkGLContext *glcontext = gtk_widget_get_gl_context (da);
115         GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (da);
116
117         if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
118         {
119                 g_assert_not_reached ();
120         }
121
122         glLoadIdentity();
123         glViewport (0, 0, da->allocation.width, da->allocation.height);
124         glOrtho (-10,10,-10,10,-20050,10000);
125         glEnable (GL_BLEND);
126         glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
127
128         glScalef (10., 10., 10.);
129         
130         gdk_gl_drawable_gl_end (gldrawable);
131
132         return TRUE;
133 }
134
135 gboolean rotate (gpointer user_data)
136 {
137         GtkWidget *da = GTK_WIDGET (user_data);
138
139         ang++;
140
141         gdk_window_invalidate_rect (da->window, &da->allocation, FALSE);
142         gdk_window_process_updates (da->window, FALSE);
143
144         return TRUE;
145 }