1 #define GL_GLEXT_PROTOTYPES
4 #include <gdk/gdkkeysyms.h>
8 gchar *gl_program_log(guint program, int *_len)
12 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);
15 glGetProgramInfoLog(program, len, &len, buf);
22 void on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
24 g_message("key-press");
25 if (event->keyval == GDK_q)
29 gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _)
31 glClearColor(0.5, 0.5, 1.0, 1.0);
32 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
34 glMatrixMode(GL_PROJECTION);
36 glOrtho(-1,1, -1,1, 10,-10);
37 glMatrixMode(GL_MODELVIEW);
39 glTranslatef(0, 0, -5);
41 glEnable(GL_COLOR_MATERIAL);
42 glDisable(GL_TEXTURE_2D);
43 glColor3f(1.0, 1.0, 1.0);
45 glVertex3f(-0.25, -0.75, 0.0);
46 glVertex3f(-0.25, 0.75, 0.0);
47 glVertex3f( 0.25, 0.75, 0.0);
48 glVertex3f( 0.25, -0.75, 0.0);
52 gdouble model[16], proj[16];
54 glGetDoublev (GL_MODELVIEW_MATRIX, model);
55 glGetDoublev (GL_PROJECTION_MATRIX, proj);
56 glGetIntegerv(GL_VIEWPORT, view);
57 gdouble x=0.25, y=-0.75, z=0.0;
59 gluProject(x, y, z, model, proj, view, &px, &py, &pz);
60 g_message("%f,%f,%f -> %f,%f,%f", x, y, z, px, py, pz);
63 glDisable(GL_COLOR_MATERIAL);
64 glEnable(GL_TEXTURE_2D);
68 GdkGLDrawable *gldrawable = gdk_gl_drawable_get_current();
69 if (gdk_gl_drawable_is_double_buffered(gldrawable))
70 gdk_gl_drawable_swap_buffers(gldrawable);
76 gboolean on_configure(GtkWidget *drawing, GdkEventConfigure *event, gpointer _)
79 drawing->allocation.width,
80 drawing->allocation.height);
84 int main(int argc, char **argv)
86 gtk_init(&argc, &argv);
88 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
89 GtkWidget *drawing = gtk_drawing_area_new();
90 GdkGLConfig *glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)(
91 GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH |
92 GDK_GL_MODE_DOUBLE | GDK_GL_MODE_ALPHA));
93 g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
94 g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);
95 g_signal_connect(drawing, "expose-event", G_CALLBACK(on_expose), NULL);
96 g_signal_connect(drawing, "configure-event", G_CALLBACK(on_configure), NULL);
97 gtk_widget_set_gl_capability(drawing, glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE);
98 gtk_container_add(GTK_CONTAINER(window), drawing);
99 gtk_widget_show_all(window);
102 GdkGLContext *glcontext = gtk_widget_get_gl_context(GTK_WIDGET(drawing));
103 GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(drawing));
106 gdk_gl_drawable_gl_begin(gldrawable, glcontext);
109 gboolean status = g_file_get_contents("shader.glsl", &source, NULL, NULL);
111 g_error("Failed to load shader");
113 guint program = glCreateProgram();
115 g_error("Error creating program");
117 guint shader = glCreateShader(GL_VERTEX_SHADER_ARB);
119 g_error("Error creating shader");
121 glShaderSource(shader, 1, (const gchar**)&source, NULL);
123 g_error("Error setting shader source");
125 glCompileShader(shader);
127 g_error("Error compiling shader");
129 glAttachShader(program, shader);
131 g_error("Error attaching shader");
133 glLinkProgram(program);
135 g_error("Error linking program");
137 glUseProgram(program);
139 g_error("Error using program:\n%s", gl_program_log(program, NULL));
145 glDetachShader(program, shader);
146 glDeleteShader(shader);
147 glDeleteProgram(program);
149 gdk_gl_drawable_gl_end(gldrawable);