]> git.mxchange.org Git - flightgear.git/blob - tests/test-env-map.cxx
Updates from Fred to add a progress bar and fix visual glitches.
[flightgear.git] / tests / test-env-map.cxx
1 #ifdef HAVE_CONFIG_H
2 #  include <config.h>
3 #endif
4
5 #ifdef HAVE_WINDOWS_H
6 #  include <windows.h>
7 #endif
8
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <math.h>
12
13 #include FG_GLUT_H
14
15 #define TEXRES_X 256
16 #define TEXRES_Y 256
17
18
19 unsigned char env_map[TEXRES_X][TEXRES_Y][4];
20 GLuint texName;
21 int window_x = 640, window_y = 480;
22 float alpha = 0.0, beta = 0.0;
23
24   /*****************************************************************/
25   /*****************************************************************/
26   /*****************************************************************/
27 void setColor(float x, float y, float z, float angular_size, float r, float g, float b, float a)
28 {
29   //normalize
30   float inv_length = 1.0 / sqrt(x*x + y*y + z*z);
31   x *= inv_length; y *= inv_length; z *= inv_length;
32   printf("x = %f, y = %f, z = %f\n", x, y, z);
33
34   float cos_angular_size = cos(angular_size*3.1415/180.0);
35   printf("cos_angular_size = %f\n", cos_angular_size);
36
37   for(float tz_sign = -1.0; tz_sign < 3.0; tz_sign += 2.0)
38   {
39     for(float tx = -1.0; tx <= 1.0; tx += 0.01)
40     {
41       for(float ty = -1.0; ty <= 1.0; ty += 0.01)
42       {
43         if ((1.0 - tx*tx - ty*ty)<0.0)
44           continue;
45
46         float tz = tz_sign * sqrt(1.0 - tx*tx - ty*ty);
47
48         float cos_phi = x*tx + y*ty + z*tz;
49        
50         if (cos_angular_size < cos_phi)
51         {
52           float rx = tx;  //mirroring on the z=0 plane
53           float ry = ty;
54           float rz = -tz;
55
56           float inv_m = 1.0 / (2.0 * sqrt(rx*rx + ry*ry + (rz + 1)*(rz + 1)));
57           int s = (int)(TEXRES_X * (rx * inv_m + 0.5));
58           int t = (int)(TEXRES_Y * (ry * inv_m + 0.5));
59
60           //seg_fault protection:
61           if (s<0) s=0; 
62           if (s>=TEXRES_X) s=TEXRES_X-1; 
63
64           if (t<0) t=0;
65           if (t>=TEXRES_Y) t=TEXRES_Y-1;
66
67           env_map[s][t][0] = (unsigned char)(r * 255);
68           env_map[s][t][1] = (unsigned char)(g * 255);
69           env_map[s][t][2] = (unsigned char)(b * 255);
70           env_map[s][t][3] = (unsigned char)(a * 255);
71         }
72       }
73     }
74   }
75 }
76   /*****************************************************************/
77   /*****************************************************************/
78   /*****************************************************************/
79
80 void init(void)
81 {
82   glClearColor(0.0, 0.0, 0.0, 0.0);
83   glShadeModel(GL_FLAT);
84   glEnable(GL_DEPTH_TEST);
85
86   for(int x=0; x<TEXRES_X; x++)
87   {
88     for(int y=0; y<TEXRES_Y; y++)
89     {
90       env_map[x][y][0] = x;  //a few colors
91       env_map[x][y][1] = y;
92       env_map[x][y][2] = 128;
93       env_map[x][y][3] = 128;
94     }
95   }
96
97   /*****************************************************************/
98   /*****************************************************************/
99   /*****************************************************************/
100   //       x          y    z           ang   r    g    b    a
101   setColor(0.0,       0.0, -1.0      , 23.0, 1.0, 1.0, 1.0, 1.0);
102   setColor(0.7071067, 0.0, -0.7071067, 23.0, 1.0, 0.0, 0.0, 1.0);
103   /*****************************************************************/
104   /*****************************************************************/
105   /*****************************************************************/
106
107   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
108   glGenTextures(1, &texName);
109   glBindTexture(GL_TEXTURE_2D, texName);
110   
111   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
112   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
113   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
114   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
115   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEXRES_X, TEXRES_Y, 0, GL_RGBA, GL_UNSIGNED_BYTE, env_map);
116 }
117
118 void reshape(int w, int h)
119 {
120   window_x = w; window_y = h;
121   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
122   glMatrixMode(GL_PROJECTION);
123   glLoadIdentity();
124   gluPerspective((GLdouble) 60.0, ((GLdouble)w)/((GLdouble)h), (GLdouble) 10.0, (GLdouble) 1000.0);
125   glMatrixMode(GL_MODELVIEW);
126   glLoadIdentity();
127   glTranslatef(0.0, 0.0, -20.0);
128 }
129
130 void display()
131 {
132   glClear  ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ;
133
134   //show light
135   glMatrixMode(GL_PROJECTION);
136   glLoadIdentity();
137   gluPerspective((GLdouble) 60.0, (float)window_x/window_y, (GLdouble) 1.0, (GLdouble) 100.0);
138   glMatrixMode(GL_MODELVIEW);
139   glLoadIdentity();
140
141   glTranslatef(0.0, 0.0, -10.0);
142
143   glRotatef(alpha, 1.0, 0.0, 0.0);
144   glRotatef(beta, 0.0, 1.0, 0.0);
145
146   glBegin(GL_LINES);
147   glColor3f(1.0, 1.0, 1.0);
148   glVertex3f(0.0, 0.0, 0.0);
149   glVertex3f(0.0, 0.0, 1.0);
150   glEnd();
151
152   /*****************************************************************/
153   /*****************************************************************/
154   /*****************************************************************/
155   glEnable(GL_TEXTURE_2D);
156   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
157   glBindTexture(GL_TEXTURE_2D, texName);
158
159   glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
160   glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
161   glEnable(GL_TEXTURE_GEN_S);
162   glEnable(GL_TEXTURE_GEN_T);
163
164   glBegin(GL_QUADS);
165   glNormal3f(0.0, 0.0, 1.0);
166   glVertex3f(1.0, 1.0, 0.0);
167   glVertex3f(-1.0, 1.0, 0.0);
168   glVertex3f(-1.0, -1.0, 0.0);
169   glVertex3f(1.0, -1.0, 0.0);
170   glEnd();
171
172   /*
173   glPointSize(48.0);
174   glBegin(GL_POINTS);
175   glNormal3f(0.0, 0.0, 1.0);
176   glVertex3f(0.0, 0.0, 0.0);
177   glEnd();
178   */
179
180   glDisable(GL_TEXTURE_GEN_S);
181   glDisable(GL_TEXTURE_GEN_T);
182   glDisable(GL_TEXTURE_2D);
183   /*****************************************************************/
184   /*****************************************************************/
185   /*****************************************************************/
186
187   //show how the map looks like
188   glMatrixMode(GL_PROJECTION);
189   glLoadIdentity();
190   //gluOrtho2D(0.0  -10.0, 1.0 +10.0, -(float)window_x/window_y -10.0,0.0 +10.0);
191   //glOrtho(0.0, 5.0, -5.0, 0.0, -10.0, 10.0);
192   glOrtho(0.0, 5.0*((float)window_x/window_y), -5.0, 0.0, -10.0, 10.0);
193   glMatrixMode(GL_MODELVIEW);
194   glLoadIdentity();
195   glEnable(GL_TEXTURE_2D);
196   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
197   glBindTexture(GL_TEXTURE_2D, texName);
198
199   glBegin(GL_QUADS);
200   glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0);
201   glTexCoord2f(0.0, 1.0); glVertex3f(0.0, -1.0, 0.0);
202   glTexCoord2f(1.0, 1.0); glVertex3f(1.0, -1.0, 0.0);
203   glTexCoord2f(1.0, 0.0); glVertex3f(1.0, 0.0, 0.0);
204   glEnd();
205   glFlush();
206   glDisable(GL_TEXTURE_2D);
207
208   glutPostRedisplay () ;
209   glutSwapBuffers () ;
210 }
211
212 void keyboard (unsigned char key, int x, int y)
213 {
214   switch(key)
215   {
216   case 27:
217     exit(0);
218
219   case '8':
220     alpha += 1.0;
221     if (alpha >= 360.0) alpha -= 360.0;
222     break;
223
224   case '2':
225     alpha -= 1.0;
226     if (alpha < 0.0) alpha += 360.0;
227     break;
228
229   case '4':
230     beta -= 1.0;
231     if (beta <= -90.0) beta = -90.0;
232     break;
233
234   case '6':
235     beta += 1.0;
236     if (beta >= 90.0) beta = 90.0;
237     break;
238
239   case '5':
240     alpha = 0.0; beta = 0.0;
241     break;
242   }
243 }
244
245 int main(int argc, char** argv)
246 {
247   glutInitWindowSize(window_x, window_y);
248   glutInit(&argc, argv);
249   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
250   glutCreateWindow(argv[0]);
251   init();
252   glutDisplayFunc(display);
253   glutReshapeFunc(reshape);
254   glutKeyboardFunc(keyboard);
255
256   glutMainLoop();
257
258   return 0;
259 }