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