0,0 → 1,193 |
/* |
* Example of using the 1.1 texture object functions. |
* Also, this demo utilizes Mesa's fast texture map path. |
* |
* Brian Paul June 1996 |
*/ |
|
#include <math.h> |
#include <stdlib.h> |
#include <stdio.h> |
#include <string.h> |
|
#include <GL/glx.h> |
#include <GL/gl.h> |
#include "ui.h" |
|
static GLuint TexObj[2]; |
static GLfloat Angle = 0.0f; |
|
static int cnt=0,v=0; |
|
void |
draw(void) |
{ |
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); |
|
glColor3f(1.0, 1.0, 1.0); |
|
/* draw first polygon */ |
glPushMatrix(); |
glTranslatef(-1.0, 0.0, 0.0); |
glRotatef(Angle, 0.0, 0.0, 1.0); |
glBindTexture(GL_TEXTURE_2D, TexObj[v]); |
|
glEnable(GL_TEXTURE_2D); |
glBegin(GL_QUADS); |
glTexCoord2f(0.0, 0.0); |
glVertex2f(-1.0, -1.0); |
glTexCoord2f(1.0, 0.0); |
glVertex2f(1.0, -1.0); |
glTexCoord2f(1.0, 1.0); |
glVertex2f(1.0, 1.0); |
glTexCoord2f(0.0, 1.0); |
glVertex2f(-1.0, 1.0); |
glEnd(); |
glDisable(GL_TEXTURE_2D); |
glPopMatrix(); |
|
/* draw second polygon */ |
glPushMatrix(); |
glTranslatef(1.0, 0.0, 0.0); |
glRotatef(Angle - 90.0, 0.0, 1.0, 0.0); |
|
glBindTexture(GL_TEXTURE_2D, TexObj[1-v]); |
|
glEnable(GL_TEXTURE_2D); |
glBegin(GL_QUADS); |
glTexCoord2f(0.0, 0.0); |
glVertex2f(-1.0, -1.0); |
glTexCoord2f(1.0, 0.0); |
glVertex2f(1.0, -1.0); |
glTexCoord2f(1.0, 1.0); |
glVertex2f(1.0, 1.0); |
glTexCoord2f(0.0, 1.0); |
glVertex2f(-1.0, 1.0); |
glEnd(); |
glDisable(GL_TEXTURE_2D); |
|
glPopMatrix(); |
|
tkSwapBuffers(); |
} |
|
|
/* new window size or exposure */ |
void |
reshape(int width, int height) |
{ |
glViewport(0, 0, (GLint) width, (GLint) height); |
glMatrixMode(GL_PROJECTION); |
glLoadIdentity(); |
/* glOrtho( -3.0, 3.0, -3.0, 3.0, -10.0, 10.0 ); */ |
glFrustum(-2.0, 2.0, -2.0, 2.0, 6.0, 20.0); |
glMatrixMode(GL_MODELVIEW); |
glLoadIdentity(); |
glTranslatef(0.0, 0.0, -8.0); |
} |
|
|
void bind_texture(int texobj,int image) |
{ |
static int width = 8, height = 8; |
static int color[2][3]={ |
{255,0,0}, |
{0,255,0}, |
}; |
GLubyte tex[64][3]; |
static GLubyte texchar[2][8*8] = { |
{ |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 1, 0, 0, 0, |
0, 0, 0, 1, 1, 0, 0, 0, |
0, 0, 0, 0, 1, 0, 0, 0, |
0, 0, 0, 0, 1, 0, 0, 0, |
0, 0, 0, 0, 1, 0, 0, 0, |
0, 0, 0, 1, 1, 1, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0}, |
{ |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 2, 2, 0, 0, 0, |
0, 0, 2, 0, 0, 2, 0, 0, |
0, 0, 0, 0, 0, 2, 0, 0, |
0, 0, 0, 0, 2, 0, 0, 0, |
0, 0, 0, 2, 0, 0, 0, 0, |
0, 0, 2, 2, 2, 2, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0}}; |
|
int i,j; |
|
glBindTexture(GL_TEXTURE_2D, texobj); |
|
/* red on white */ |
for (i = 0; i < height; i++) { |
for (j = 0; j < width; j++) { |
int p = i * width + j; |
if (texchar[image][(height - i - 1) * width + j]) { |
tex[p][0] = color[image][0]; |
tex[p][1] = color[image][1]; |
tex[p][2] = color[image][2]; |
} else { |
tex[p][0] = 255; |
tex[p][1] = 255; |
tex[p][2] = 255; |
} |
} |
} |
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, |
GL_RGB, GL_UNSIGNED_BYTE, tex); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); |
/* end of texture object */ |
} |
|
|
|
void |
init(void) |
{ |
glEnable(GL_DEPTH_TEST); |
|
/* Setup texturing */ |
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); |
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); |
|
/* generate texture object IDs */ |
glGenTextures(2, TexObj); |
bind_texture(TexObj[0],0); |
bind_texture(TexObj[1],1); |
|
} |
|
void |
idle(void) |
{ |
|
Angle += 2.0; |
|
if (++cnt==5) { |
cnt=0; |
v=!v; |
} |
draw(); |
} |
|
/* change view angle, exit upon ESC */ |
GLenum key(int k, GLenum mask) |
{ |
switch (k) { |
case 'q': |
case KEY_ESCAPE: |
exit(0); |
} |
return GL_FALSE; |
} |
|
int main(int argc, char **argv) |
{ |
return ui_loop(argc, argv, "texobj"); |
} |
|
|