]> Pileus Git - aweather/blob - src/cube.c
Adding tab area at the bottom for configuration
[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 static GtkWidget *rotate_button;
9
10 float boxv[][3] = {
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         {  0.5,  0.5,  0.5 },
18         { -0.5,  0.5,  0.5 }
19 };
20 #define ALPHA 0.5
21
22 static float ang = 30.;
23
24 gboolean expose (GtkWidget *da, GdkEventExpose *event, gpointer user_data)
25 {
26         GdkGLContext *glcontext = gtk_widget_get_gl_context (da);
27         GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (da);
28
29         // g_print (" :: expose\n");
30
31         if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
32         {
33                 g_assert_not_reached ();
34         }
35
36         /* draw in here */
37         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
38         glPushMatrix();
39         
40         glRotatef (ang, 1, 0, 1);
41
42         glShadeModel(GL_FLAT);
43
44         glBegin (GL_LINES);
45         glColor3f (1., 0., 0.);
46         glVertex3f (0., 0., 0.);
47         glVertex3f (1., 0., 0.);
48         glEnd ();
49         
50         glBegin (GL_LINES);
51         glColor3f (0., 1., 0.);
52         glVertex3f (0., 0., 0.);
53         glVertex3f (0., 1., 0.);
54         glEnd ();
55         
56         glBegin (GL_LINES);
57         glColor3f (0., 0., 1.);
58         glVertex3f (0., 0., 0.);
59         glVertex3f (0., 0., 1.);
60         glEnd ();
61
62         glBegin(GL_LINES);
63         glColor3f (1., 1., 1.);
64         glVertex3fv(boxv[0]);
65         glVertex3fv(boxv[1]);
66         
67         glVertex3fv(boxv[1]);
68         glVertex3fv(boxv[2]);
69         
70         glVertex3fv(boxv[2]);
71         glVertex3fv(boxv[3]);
72         
73         glVertex3fv(boxv[3]);
74         glVertex3fv(boxv[0]);
75         
76         glVertex3fv(boxv[4]);
77         glVertex3fv(boxv[5]);
78         
79         glVertex3fv(boxv[5]);
80         glVertex3fv(boxv[6]);
81         
82         glVertex3fv(boxv[6]);
83         glVertex3fv(boxv[7]);
84         
85         glVertex3fv(boxv[7]);
86         glVertex3fv(boxv[4]);
87         
88         glVertex3fv(boxv[0]);
89         glVertex3fv(boxv[4]);
90         
91         glVertex3fv(boxv[1]);
92         glVertex3fv(boxv[5]);
93         
94         glVertex3fv(boxv[2]);
95         glVertex3fv(boxv[6]);
96         
97         glVertex3fv(boxv[3]);
98         glVertex3fv(boxv[7]);
99         glEnd();
100
101         glPopMatrix ();
102
103         if (gdk_gl_drawable_is_double_buffered (gldrawable))
104                 gdk_gl_drawable_swap_buffers (gldrawable);
105
106         else
107                 glFlush ();
108
109         gdk_gl_drawable_gl_end (gldrawable);
110
111         return TRUE;
112 }
113
114 gboolean configure(GtkWidget *da, GdkEventConfigure *event, gpointer user_data)
115 {
116         GdkGLContext *glcontext = gtk_widget_get_gl_context (da);
117         GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (da);
118
119         if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
120         {
121                 g_assert_not_reached ();
122         }
123
124         glLoadIdentity();
125         glViewport (0, 0, da->allocation.width, da->allocation.height);
126         glOrtho (-10,10,-10,10,-20050,10000);
127         glEnable (GL_BLEND);
128         glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
129
130         glScalef (10., 10., 10.);
131         
132         gdk_gl_drawable_gl_end (gldrawable);
133
134         return TRUE;
135 }
136
137 gboolean rotate (gpointer user_data)
138 {
139         if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rotate_button)))
140                 return TRUE;
141
142         GtkWidget *da = GTK_WIDGET (user_data);
143
144         ang++;
145
146         gdk_window_invalidate_rect (da->window, &da->allocation, FALSE);
147         gdk_window_process_updates (da->window, FALSE);
148
149         return TRUE;
150 }
151
152 gboolean cube_init(GtkDrawingArea *drawing, GtkNotebook *config)
153 {
154         /* Add configuration tab */
155         GtkWidget *label = gtk_label_new("Cube");
156         rotate_button = gtk_toggle_button_new_with_label("Rotate");
157         gtk_notebook_append_page(GTK_NOTEBOOK(config), rotate_button, label);
158
159         /* Set up OpenGL Stuff */
160         g_signal_connect(drawing, "configure-event", G_CALLBACK(configure), NULL);
161         g_signal_connect(drawing, "expose-event",    G_CALLBACK(expose),    NULL);
162         g_timeout_add(1000/60, rotate, drawing);
163 }