]> Pileus Git - grits/blobdiff - examples/tex/tex.c
Switch to GDK_KEY_*
[grits] / examples / tex / tex.c
index b97386c2651633130d2deeb76e1d89f790115400..b49cefa7b545bdcb9405c0e30cfc35252c3f1527 100644 (file)
 #include <GL/gl.h>
 #include <GL/glu.h>
 
-guint tex, texl, texr;
+guint tex, texl, texr, mask;
 
 gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer _)
 {
-       if (event->keyval == GDK_q)
+       if (event->keyval == GDK_KEY_q)
                gtk_main_quit();
        return FALSE;
 }
 
 gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _)
 {
-       glClearColor(0.5, 0.5, 1.0, 1.0);
-       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+       gdouble y = 0;
 
+       /* Setup view */
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-1,1, -1,1, 10,-10);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(0, 0, -5);
+       glClearColor(0.5, 0.5, 1.0, 1.0);
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
+       /* Draw white background rectangle */
        glEnable(GL_COLOR_MATERIAL);
        glDisable(GL_TEXTURE_2D);
        glColor3f(1.0, 1.0, 1.0);
@@ -52,44 +55,53 @@ gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _)
        glVertex3f( 0.25, -0.75, 0.0);
        glEnd();
 
-       /* Textures */
-       glDisable(GL_COLOR_MATERIAL);
+       /* Setup for textures */
        glEnable(GL_TEXTURE_2D);
        glEnable(GL_BLEND);
+       glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+       glDisable(GL_COLOR_MATERIAL);
 
-       gdouble y = 0.875;
+       /* Setup mask */
+       glActiveTexture(GL_TEXTURE1);
+       glEnable(GL_TEXTURE_2D);
+       glBindTexture(GL_TEXTURE_2D, mask);
+       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+
+       glActiveTexture(GL_TEXTURE0);
+       glEnable(GL_TEXTURE_2D);
+       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
 
        /* Left */
-       glBlendFunc(GL_ONE, GL_ZERO);
        glBindTexture(GL_TEXTURE_2D, texl);
        glBegin(GL_QUADS);
-       glTexCoord2f(0.0, y); glVertex3f(-0.75,  0.0, 0.0);
-       glTexCoord2f(0.0, 1.0); glVertex3f(-0.75,  0.5, 0.0);
-       glTexCoord2f(2.0, 1.0); glVertex3f( 0.75,  0.5, 0.0);
-       glTexCoord2f(2.0, y); glVertex3f( 0.75,  0.0, 0.0);
+       glMultiTexCoord2f(GL_TEXTURE0,  0.0, y);     glMultiTexCoord2f(GL_TEXTURE1,  0.0, y);     glVertex3f(-0.75,  0.0, 0.0);
+       glMultiTexCoord2f(GL_TEXTURE0,  0.0, 1.0);   glMultiTexCoord2f(GL_TEXTURE1,  0.0, 1.0);   glVertex3f(-0.75,  0.5, 0.0);
+       glMultiTexCoord2f(GL_TEXTURE0,  2.0, 1.0);   glMultiTexCoord2f(GL_TEXTURE1,  2.0, 1.0);   glVertex3f( 0.75,  0.5, 0.0);
+       glMultiTexCoord2f(GL_TEXTURE0,  2.0, y);     glMultiTexCoord2f(GL_TEXTURE1,  2.0, y);     glVertex3f( 0.75,  0.0, 0.0);
        glEnd();
 
        /* Right */
-       glBlendFunc(GL_ONE, GL_ONE);
        glBindTexture(GL_TEXTURE_2D, texr);
        glBegin(GL_QUADS);
-       glTexCoord2f(-1.0, y); glVertex3f(-0.75, 0.0, 0.0);
-       glTexCoord2f(-1.0, 1.0); glVertex3f(-0.75, 0.5, 0.0);
-       glTexCoord2f( 1.0, 1.0); glVertex3f( 0.75, 0.5, 0.0);
-       glTexCoord2f( 1.0, y); glVertex3f( 0.75, 0.0, 0.0);
+       glMultiTexCoord2f(GL_TEXTURE0, -1.0, y);     glMultiTexCoord2f(GL_TEXTURE1, -1.0, y);     glVertex3f(-0.75, 0.0, 0.0);
+       glMultiTexCoord2f(GL_TEXTURE0, -1.0, 1.0);   glMultiTexCoord2f(GL_TEXTURE1, -1.0, 1.0);   glVertex3f(-0.75, 0.5, 0.0);
+       glMultiTexCoord2f(GL_TEXTURE0,  1.0, 1.0);   glMultiTexCoord2f(GL_TEXTURE1,  1.0, 1.0);   glVertex3f( 0.75, 0.5, 0.0);
+       glMultiTexCoord2f(GL_TEXTURE0,  1.0, y);     glMultiTexCoord2f(GL_TEXTURE1,  1.0, y);     glVertex3f( 0.75, 0.0, 0.0);
        glEnd();
 
+       glActiveTexture(GL_TEXTURE1);
+       glDisable(GL_TEXTURE_2D);
+       glActiveTexture(GL_TEXTURE0);
+
        /* Bottom */
-       glBlendFunc(GL_ONE, GL_ZERO);
        glBindTexture(GL_TEXTURE_2D, tex);
        glBegin(GL_QUADS);
-       glTexCoord2f(0.0, 0.0); glVertex3f(-0.75, -0.5, 0.0);
-       glTexCoord2f(0.0, 1.0-y); glVertex3f(-0.75, -0.0, 0.0);
-       glTexCoord2f(1.0, 1.0-y); glVertex3f( 0.75, -0.0, 0.0);
-       glTexCoord2f(1.0, 0.0); glVertex3f( 0.75, -0.5, 0.0);
+       glTexCoord2f( 0.0, 0.0);   glVertex3f(-0.75, -0.5, 0.0);
+       glTexCoord2f( 0.0, 1.0-y); glVertex3f(-0.75, -0.0, 0.0);
+       glTexCoord2f( 1.0, 1.0-y); glVertex3f( 0.75, -0.0, 0.0);
+       glTexCoord2f( 1.0, 0.0);   glVertex3f( 0.75, -0.5, 0.0);
        glEnd();
 
-
        /* Flush */
        GdkGLDrawable *gldrawable = gdk_gl_drawable_get_current();
        if (gdk_gl_drawable_is_double_buffered(gldrawable))
@@ -106,6 +118,26 @@ gboolean on_configure(GtkWidget *drawing, GdkEventConfigure *event, gpointer _)
        return FALSE;
 }
 
+guint load_mask(void)
+{
+       guint  tex  = 0;
+       guint8 byte = 0xff;
+
+       glGenTextures(1, &tex);
+       glBindTexture(GL_TEXTURE_2D, tex);
+
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0,
+                       GL_ALPHA, GL_UNSIGNED_BYTE, &byte);
+
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
+
+       return tex;
+}
+
 guint load_tex(gchar *filename)
 {
        GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
@@ -114,15 +146,18 @@ guint load_tex(gchar *filename)
        int        height = gdk_pixbuf_get_height(pixbuf);
        int        alpha  = gdk_pixbuf_get_has_alpha(pixbuf);
        guint      tex;
+
        glGenTextures(1, &tex);
        glBindTexture(GL_TEXTURE_2D, tex);
-       glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0,
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
                        (alpha ? GL_RGBA : GL_RGB), GL_UNSIGNED_BYTE, pixels);
+
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 
-       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
-       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+
        g_object_unref(pixbuf);
        return tex;
 }
@@ -150,6 +185,7 @@ int main(int argc, char **argv)
        gdk_gl_drawable_gl_begin(gldrawable, glcontext);
 
        /* Load texture */
+       mask = load_mask();
        texl = load_tex("texls.png");
        texr = load_tex("texrs.png");
        tex  = load_tex("tex.png");