2 * Copyright (C) 2009-2010 Andy Spencer <andy753421@gmail.com>
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #define GL_GLEXT_PROTOTYPES
20 #include <gtk/gtkgl.h>
21 #include <gdk/gdkkeysyms.h>
25 gchar *gl_program_log(guint program, int *_len)
29 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);
32 glGetProgramInfoLog(program, len, &len, buf);
39 void on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
41 g_message("key-press");
42 if (event->keyval == GDK_q)
46 gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _)
48 glClearColor(0.5, 0.5, 1.0, 1.0);
49 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
51 glMatrixMode(GL_PROJECTION);
53 glOrtho(-1,1, -1,1, 10,-10);
54 glMatrixMode(GL_MODELVIEW);
56 glTranslatef(0, 0, -5);
58 glEnable(GL_COLOR_MATERIAL);
59 glDisable(GL_TEXTURE_2D);
60 glColor3f(1.0, 1.0, 1.0);
62 glVertex3f(-0.25, -0.75, 0.0);
63 glVertex3f(-0.25, 0.75, 0.0);
64 glVertex3f( 0.25, 0.75, 0.0);
65 glVertex3f( 0.25, -0.75, 0.0);
69 gdouble model[16], proj[16];
71 glGetDoublev (GL_MODELVIEW_MATRIX, model);
72 glGetDoublev (GL_PROJECTION_MATRIX, proj);
73 glGetIntegerv(GL_VIEWPORT, view);
74 gdouble x=0.25, y=-0.75, z=0.0;
76 gluProject(x, y, z, model, proj, view, &px, &py, &pz);
77 g_message("%f,%f,%f -> %f,%f,%f", x, y, z, px, py, pz);
80 glDisable(GL_COLOR_MATERIAL);
81 glEnable(GL_TEXTURE_2D);
85 GdkGLDrawable *gldrawable = gdk_gl_drawable_get_current();
86 if (gdk_gl_drawable_is_double_buffered(gldrawable))
87 gdk_gl_drawable_swap_buffers(gldrawable);
93 gboolean on_configure(GtkWidget *drawing, GdkEventConfigure *event, gpointer _)
96 drawing->allocation.width,
97 drawing->allocation.height);
101 int main(int argc, char **argv)
103 gtk_init(&argc, &argv);
105 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
106 GtkWidget *drawing = gtk_drawing_area_new();
107 GdkGLConfig *glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)(
108 GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH |
109 GDK_GL_MODE_DOUBLE | GDK_GL_MODE_ALPHA));
110 g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
111 g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);
112 g_signal_connect(drawing, "expose-event", G_CALLBACK(on_expose), NULL);
113 g_signal_connect(drawing, "configure-event", G_CALLBACK(on_configure), NULL);
114 gtk_widget_set_gl_capability(drawing, glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE);
115 gtk_container_add(GTK_CONTAINER(window), drawing);
116 gtk_widget_show_all(window);
119 GdkGLContext *glcontext = gtk_widget_get_gl_context(GTK_WIDGET(drawing));
120 GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(drawing));
123 gdk_gl_drawable_gl_begin(gldrawable, glcontext);
126 gboolean status = g_file_get_contents("shader.glsl", &source, NULL, NULL);
128 g_error("Failed to load shader");
130 guint program = glCreateProgram();
132 g_error("Error creating program");
134 guint shader = glCreateShader(GL_VERTEX_SHADER_ARB);
136 g_error("Error creating shader");
138 glShaderSource(shader, 1, (const gchar**)&source, NULL);
140 g_error("Error setting shader source");
142 glCompileShader(shader);
144 g_error("Error compiling shader");
146 glAttachShader(program, shader);
148 g_error("Error attaching shader");
150 glLinkProgram(program);
152 g_error("Error linking program");
154 glUseProgram(program);
156 g_error("Error using program:\n%s", gl_program_log(program, NULL));
162 glDetachShader(program, shader);
163 glDeleteShader(shader);
164 glDeleteProgram(program);
166 gdk_gl_drawable_gl_end(gldrawable);