X-Git-Url: http://pileus.org/git/?p=grits;a=blobdiff_plain;f=examples%2Ftex%2Ftex.c;h=b49cefa7b545bdcb9405c0e30cfc35252c3f1527;hp=b97386c2651633130d2deeb76e1d89f790115400;hb=bed3380cb43b0d9cfcb2da34fda9bb36258ae46d;hpb=c2e39b9d64035038a19d753129cc2124b4ed1382 diff --git a/examples/tex/tex.c b/examples/tex/tex.c index b97386c..b49cefa 100644 --- a/examples/tex/tex.c +++ b/examples/tex/tex.c @@ -21,27 +21,30 @@ #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 _) { - 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");