X-Git-Url: http://pileus.org/git/?p=grits;a=blobdiff_plain;f=examples%2Ftex%2Ftex.c;h=b49cefa7b545bdcb9405c0e30cfc35252c3f1527;hp=bef3a340c309b29124f0606fa2cd1920680446dc;hb=bed3380cb43b0d9cfcb2da34fda9bb36258ae46d;hpb=fb5bebeaac12935e2202f34b4719fcfcef84a4c6 diff --git a/examples/tex/tex.c b/examples/tex/tex.c index bef3a34..b49cefa 100644 --- a/examples/tex/tex.c +++ b/examples/tex/tex.c @@ -21,18 +21,18 @@ #include #include -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 _) { - gdouble y = 0.875; + gdouble y = 0; /* Setup view */ glMatrixMode(GL_PROJECTION); @@ -55,44 +55,45 @@ gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _) glVertex3f( 0.25, -0.75, 0.0); glEnd(); - /* Clear background for GL_ONE */ - glEnable(GL_COLOR_MATERIAL); - glDisable(GL_TEXTURE_2D); - glColor4f(0.0, 0.0, 0.0, 0.0); - glBegin(GL_QUADS); - glVertex3f(-0.75, 0.0, 0.0); - glVertex3f(-0.75, 0.5, 0.0); - glVertex3f( 0.75, 0.5, 0.0); - glVertex3f( 0.75, 0.0, 0.0); - glEnd(); - /* Setup for textures */ glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); - glColor4f(1.0, 1.0, 1.0, 1.0); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_COLOR_MATERIAL); - glBlendFunc(GL_ONE, GL_ONE); + + /* 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 */ 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 */ 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); @@ -117,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); @@ -125,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; } @@ -161,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");