]> Pileus Git - grits/blob - src/examples/tex.c
267c1c10e71af5117ecd70dbd18ce2de84bdf619
[grits] / src / examples / tex.c
1 #include <gtk/gtk.h>
2 #include <gtk/gtkgl.h>
3 #include <gdk/gdkkeysyms.h>
4 #include <GL/gl.h>
5 #include <GL/glu.h>
6
7 guint tex, texl, texr;
8
9 gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer _)
10 {
11         if (event->keyval == GDK_q)
12                 gtk_main_quit();
13         return FALSE;
14 }
15
16 gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _)
17 {
18         glClearColor(0.5, 0.5, 1.0, 1.0);
19         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
20
21         glMatrixMode(GL_PROJECTION);
22         glLoadIdentity();
23         glOrtho(-1,1, -1,1, 10,-10);
24         glMatrixMode(GL_MODELVIEW);
25         glLoadIdentity();
26         glTranslatef(0, 0, -5);
27
28         glEnable(GL_COLOR_MATERIAL);
29         glDisable(GL_TEXTURE_2D);
30         glColor3f(1.0, 1.0, 1.0);
31         glBegin(GL_QUADS);
32         glVertex3f(-0.25, -0.75, 0.0);
33         glVertex3f(-0.25,  0.75, 0.0);
34         glVertex3f( 0.25,  0.75, 0.0);
35         glVertex3f( 0.25, -0.75, 0.0);
36         glEnd();
37
38         /* Textures */
39         glDisable(GL_COLOR_MATERIAL);
40         glEnable(GL_TEXTURE_2D);
41         glEnable(GL_BLEND);
42
43         gdouble y = 0.875;
44
45         /* Left */
46         glBlendFunc(GL_ONE, GL_ZERO);
47         glBindTexture(GL_TEXTURE_2D, texl);
48         glBegin(GL_QUADS);
49         glTexCoord2f(0.0, y); glVertex3f(-0.75,  0.0, 0.0);
50         glTexCoord2f(0.0, 1.0); glVertex3f(-0.75,  0.5, 0.0);
51         glTexCoord2f(2.0, 1.0); glVertex3f( 0.75,  0.5, 0.0);
52         glTexCoord2f(2.0, y); glVertex3f( 0.75,  0.0, 0.0);
53         glEnd();
54
55         /* Right */
56         glBlendFunc(GL_ONE, GL_ONE);
57         glBindTexture(GL_TEXTURE_2D, texr);
58         glBegin(GL_QUADS);
59         glTexCoord2f(-1.0, y); glVertex3f(-0.75, 0.0, 0.0);
60         glTexCoord2f(-1.0, 1.0); glVertex3f(-0.75, 0.5, 0.0);
61         glTexCoord2f( 1.0, 1.0); glVertex3f( 0.75, 0.5, 0.0);
62         glTexCoord2f( 1.0, y); glVertex3f( 0.75, 0.0, 0.0);
63         glEnd();
64
65         /* Bottom */
66         glBlendFunc(GL_ONE, GL_ZERO);
67         glBindTexture(GL_TEXTURE_2D, tex);
68         glBegin(GL_QUADS);
69         glTexCoord2f(0.0, 0.0); glVertex3f(-0.75, -0.5, 0.0);
70         glTexCoord2f(0.0, 1.0-y); glVertex3f(-0.75, -0.0, 0.0);
71         glTexCoord2f(1.0, 1.0-y); glVertex3f( 0.75, -0.0, 0.0);
72         glTexCoord2f(1.0, 0.0); glVertex3f( 0.75, -0.5, 0.0);
73         glEnd();
74
75
76         /* Flush */
77         GdkGLDrawable *gldrawable = gdk_gl_drawable_get_current();
78         if (gdk_gl_drawable_is_double_buffered(gldrawable))
79                 gdk_gl_drawable_swap_buffers(gldrawable);
80         else
81                 glFlush();
82         return FALSE;
83 }
84 gboolean on_configure(GtkWidget *drawing, GdkEventConfigure *event, gpointer _)
85 {
86         glViewport(0, 0,
87                 drawing->allocation.width,
88                 drawing->allocation.height);
89         return FALSE;
90 }
91
92 guint load_tex(gchar *filename)
93 {
94         GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
95         guchar    *pixels = gdk_pixbuf_get_pixels(pixbuf);
96         int        width  = gdk_pixbuf_get_width(pixbuf);
97         int        height = gdk_pixbuf_get_height(pixbuf);
98         int        alpha  = gdk_pixbuf_get_has_alpha(pixbuf);
99         guint      tex;
100         glGenTextures(1, &tex);
101         glBindTexture(GL_TEXTURE_2D, tex);
102         glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0,
103                         (alpha ? GL_RGBA : GL_RGB), GL_UNSIGNED_BYTE, pixels);
104         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
105         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
106
107         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
108         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
109         g_object_unref(pixbuf);
110         return tex;
111 }
112
113 int main(int argc, char **argv)
114 {
115         gtk_init(&argc, &argv);
116
117         GtkWidget   *window   = gtk_window_new(GTK_WINDOW_TOPLEVEL);
118         GtkWidget   *drawing  = gtk_drawing_area_new();
119         GdkGLConfig *glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)(
120                         GDK_GL_MODE_RGBA   | GDK_GL_MODE_DEPTH |
121                         GDK_GL_MODE_DOUBLE | GDK_GL_MODE_ALPHA));
122         g_signal_connect(window,  "destroy",         G_CALLBACK(gtk_main_quit), NULL);
123         g_signal_connect(window,  "key-press-event", G_CALLBACK(on_key_press),  NULL);
124         g_signal_connect(drawing, "expose-event",    G_CALLBACK(on_expose),     NULL);
125         g_signal_connect(drawing, "configure-event", G_CALLBACK(on_configure),  NULL);
126         gtk_widget_set_gl_capability(drawing, glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE);
127         gtk_container_add(GTK_CONTAINER(window), drawing);
128         gtk_widget_show_all(window);
129
130         /* OpenGL setup */
131         GdkGLContext  *glcontext  = gtk_widget_get_gl_context(GTK_WIDGET(drawing));
132         GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(drawing));
133         gdk_gl_drawable_gl_begin(gldrawable, glcontext);
134
135         /* Load texture */
136         texl = load_tex("tex_png/texls.png");
137         texr = load_tex("tex_png/texrs.png");
138         tex  = load_tex("tex_png/tex.png");
139
140         gtk_main();
141
142         gdk_gl_drawable_gl_end(gldrawable);
143 }