version 2.8
texobj.c
1 /*
2  * Example of using the 1.1 texture object functions.
3  * Also, this demo utilizes Mesa's fast texture map path.
4  *
5  * Brian Paul June 1996
6  */
7 
8 #include <math.h>
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <string.h>
12 
13 #include <GL/glx.h>
14 #include <GL/gl.h>
15 #include "ui.h"
16 
17 static GLuint TexObj[2];
18 static GLfloat Angle = 0.0f;
19 
20 static int cnt=0,v=0;
21 
22 void
23 draw(void)
24 {
25  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
26 
27  glColor3f(1.0, 1.0, 1.0);
28 
29  /* draw first polygon */
30  glPushMatrix();
31  glTranslatef(-1.0, 0.0, 0.0);
32  glRotatef(Angle, 0.0, 0.0, 1.0);
33  glBindTexture(GL_TEXTURE_2D, TexObj[v]);
34 
35  glEnable(GL_TEXTURE_2D);
36  glBegin(GL_QUADS);
37  glTexCoord2f(0.0, 0.0);
38  glVertex2f(-1.0, -1.0);
39  glTexCoord2f(1.0, 0.0);
40  glVertex2f(1.0, -1.0);
41  glTexCoord2f(1.0, 1.0);
42  glVertex2f(1.0, 1.0);
43  glTexCoord2f(0.0, 1.0);
44  glVertex2f(-1.0, 1.0);
45  glEnd();
46  glDisable(GL_TEXTURE_2D);
47  glPopMatrix();
48 
49  /* draw second polygon */
50  glPushMatrix();
51  glTranslatef(1.0, 0.0, 0.0);
52  glRotatef(Angle - 90.0, 0.0, 1.0, 0.0);
53 
54  glBindTexture(GL_TEXTURE_2D, TexObj[1-v]);
55 
56  glEnable(GL_TEXTURE_2D);
57  glBegin(GL_QUADS);
58  glTexCoord2f(0.0, 0.0);
59  glVertex2f(-1.0, -1.0);
60  glTexCoord2f(1.0, 0.0);
61  glVertex2f(1.0, -1.0);
62  glTexCoord2f(1.0, 1.0);
63  glVertex2f(1.0, 1.0);
64  glTexCoord2f(0.0, 1.0);
65  glVertex2f(-1.0, 1.0);
66  glEnd();
67  glDisable(GL_TEXTURE_2D);
68 
69  glPopMatrix();
70 
71  tkSwapBuffers();
72 }
73 
74 
75 /* new window size or exposure */
76 void
77 reshape(int width, int height)
78 {
79  glViewport(0, 0, (GLint) width, (GLint) height);
80  glMatrixMode(GL_PROJECTION);
81  glLoadIdentity();
82  /* glOrtho( -3.0, 3.0, -3.0, 3.0, -10.0, 10.0 ); */
83  glFrustum(-2.0, 2.0, -2.0, 2.0, 6.0, 20.0);
84  glMatrixMode(GL_MODELVIEW);
85  glLoadIdentity();
86  glTranslatef(0.0, 0.0, -8.0);
87 }
88 
89 
90 void bind_texture(int texobj,int image)
91 {
92  static int width = 8, height = 8;
93  static int color[2][3]={
94  {255,0,0},
95  {0,255,0},
96  };
97  GLubyte tex[64][3];
98  static GLubyte texchar[2][8*8] = {
99  {
100  0, 0, 0, 0, 0, 0, 0, 0,
101  0, 0, 0, 0, 1, 0, 0, 0,
102  0, 0, 0, 1, 1, 0, 0, 0,
103  0, 0, 0, 0, 1, 0, 0, 0,
104  0, 0, 0, 0, 1, 0, 0, 0,
105  0, 0, 0, 0, 1, 0, 0, 0,
106  0, 0, 0, 1, 1, 1, 0, 0,
107  0, 0, 0, 0, 0, 0, 0, 0},
108  {
109  0, 0, 0, 0, 0, 0, 0, 0,
110  0, 0, 0, 2, 2, 0, 0, 0,
111  0, 0, 2, 0, 0, 2, 0, 0,
112  0, 0, 0, 0, 0, 2, 0, 0,
113  0, 0, 0, 0, 2, 0, 0, 0,
114  0, 0, 0, 2, 0, 0, 0, 0,
115  0, 0, 2, 2, 2, 2, 0, 0,
116  0, 0, 0, 0, 0, 0, 0, 0}};
117 
118  int i,j;
119 
120  glBindTexture(GL_TEXTURE_2D, texobj);
121 
122  /* red on white */
123  for (i = 0; i < height; i++) {
124  for (j = 0; j < width; j++) {
125  int p = i * width + j;
126  if (texchar[image][(height - i - 1) * width + j]) {
127  tex[p][0] = color[image][0];
128  tex[p][1] = color[image][1];
129  tex[p][2] = color[image][2];
130  } else {
131  tex[p][0] = 255;
132  tex[p][1] = 255;
133  tex[p][2] = 255;
134  }
135  }
136  }
137  glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0,
138  GL_RGB, GL_UNSIGNED_BYTE, tex);
139  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
140  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
141  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
142  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
143  /* end of texture object */
144 }
145 
146 
147 
148 void
149 init(void)
150 {
151  glEnable(GL_DEPTH_TEST);
152 
153  /* Setup texturing */
154  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
155  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
156 
157  /* generate texture object IDs */
158  glGenTextures(2, TexObj);
159  bind_texture(TexObj[0],0);
160  bind_texture(TexObj[1],1);
161 
162 }
163 
164 void
165 idle(void)
166 {
167 
168  Angle += 2.0;
169 
170  if (++cnt==5) {
171  cnt=0;
172  v=!v;
173  }
174  draw();
175 }
176 
177 /* change view angle, exit upon ESC */
178 GLenum key(int k, GLenum mask)
179 {
180  switch (k) {
181  case 'q':
182  case KEY_ESCAPE:
183  exit(0);
184  }
185  return GL_FALSE;
186 }
187 
188 int main(int argc, char **argv)
189 {
190  return ui_loop(argc, argv, "texobj");
191 }
192 
193