]> Pileus Git - aweather/blob - src/opengl.c
94d1cd18a840151469aef70efb31f02fec8407b7
[aweather] / src / opengl.c
1 #include <config.h>
2 #include <gtk/gtk.h>
3 #include <gtk/gtkgl.h>
4 #include <GL/gl.h>
5 #include <GL/glu.h>
6
7 static gboolean expose_start(GtkWidget *da, GdkEventExpose *event, gpointer user_data)
8 {
9         g_message("opengl:expose_start");
10         GdkGLContext *glcontext = gtk_widget_get_gl_context(da);
11         GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(da);
12
13         if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) {
14                 g_assert_not_reached();
15         }
16
17         /* draw in here */
18         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
19         return FALSE;
20 }
21 /* Plugins run stuff here */
22 static gboolean expose_end(GtkWidget *da, GdkEventExpose *event, gpointer user_data)
23 {
24         g_message("opengl:expose_end");
25
26         GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(da);
27
28         if (gdk_gl_drawable_is_double_buffered(gldrawable))
29                 gdk_gl_drawable_swap_buffers(gldrawable);
30         else
31                 glFlush();
32
33         gdk_gl_drawable_gl_end(gldrawable);
34
35         return FALSE;
36 }
37 static gboolean configure_start(GtkWidget *da, GdkEventConfigure *event, gpointer user_data)
38 {
39         GdkGLContext  *glcontext  = gtk_widget_get_gl_context(da);
40         GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(da);
41
42         if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext))
43                 g_assert_not_reached();
44
45         glViewport(0, 0, da->allocation.width, da->allocation.height);
46
47         glEnable(GL_BLEND);
48         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
49
50         glMatrixMode(GL_PROJECTION);
51         glLoadIdentity();
52         //glRotatef(0, 0, 2, 45);
53         gluPerspective(45.0f, 1, 0.1f, 10000000.0f);
54         //glFrustum(-1, 1, -1, 1, -1, 1);
55
56         glMatrixMode(GL_MODELVIEW);
57         glLoadIdentity();
58         double scale = 500*1000; // 500 km
59         //glOrtho(-scale,scale,-scale,scale,-10000,10000);
60         glTranslatef(0.0, 0.0, -2.5*scale);
61         glRotatef(-45, 1, 0, 0);
62
63         return FALSE;
64 }
65 static gboolean configure_end(GtkWidget *da, GdkEventConfigure *event, gpointer user_data)
66 {
67         GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(da);
68         gdk_gl_drawable_gl_end(gldrawable);
69         return FALSE;
70 }
71
72 gboolean opengl_init(GtkDrawingArea *drawing, GtkNotebook *config)
73 {
74         /* Set up OpenGL Stuff */
75         g_signal_connect      (drawing, "configure-event", G_CALLBACK(configure_start), NULL);
76         g_signal_connect_after(drawing, "configure-event", G_CALLBACK(configure_end),   NULL);
77         g_signal_connect      (drawing, "expose-event",    G_CALLBACK(expose_start),    NULL);
78         g_signal_connect_after(drawing, "expose-event",    G_CALLBACK(expose_end),      NULL);
79         return TRUE;
80 }