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