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