]> git.mxchange.org Git - flightgear.git/commitdiff
Added test-env-map.cxx - an environment map demo/test program.
authorcurt <curt>
Wed, 6 Mar 2002 05:05:17 +0000 (05:05 +0000)
committercurt <curt>
Wed, 6 Mar 2002 05:05:17 +0000 (05:05 +0000)
tests/Makefile.am
tests/test-env-map.cxx [new file with mode: 0644]

index 59584e0714e92c5bbf347cc514e7b54187b910e2..181176073ed4a18efa2507f8228a0cea5d3eb949 100644 (file)
@@ -1,6 +1,6 @@
 bin_PROGRAMS = est-epsilon gl-info
 
-noinst_PROGRAMS = test-gethostname test-mktime test-text test-up
+noinst_PROGRAMS = test-gethostname test-mktime test-text test-up test-env-map
 
 est_epsilon_SOURCES = est-epsilon.c
 est_epsilon_LDADD = $(base_LIBS)
@@ -8,6 +8,9 @@ est_epsilon_LDADD = $(base_LIBS)
 gl_info_SOURCES = gl-info.c
 gl_info_LDADD = $(opengl_LIBS)
 
+test_env_map_SOURCES = test-env-map.cxx
+test_env_map_LDADD = $(opengl_LIBS)
+
 test_gethostname_SOURCES = test-gethostname.cxx
 test_gethostname_LDADD = $(base_LIBS)
 
diff --git a/tests/test-env-map.cxx b/tests/test-env-map.cxx
new file mode 100644 (file)
index 0000000..ef56255
--- /dev/null
@@ -0,0 +1,239 @@
+#include <GL/glut.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+#define TEXRES_X 256
+#define TEXRES_Y 256
+
+unsigned char env_map[TEXRES_X][TEXRES_Y][4];
+GLuint texName;
+float window_x = 640, window_y = 480;
+float alpha = 0.0, beta = 0.0;
+
+  /*****************************************************************/
+  /*****************************************************************/
+  /*****************************************************************/
+void setColor(float x, float y, float z, float angular_size, float r, float g, float b, float a)
+{
+  //normalize
+  float inv_length = 1.0 / sqrt(x*x + y*y + z*z);
+  x *= inv_length; y *= inv_length; z *= inv_length;
+  printf("x = %f, y = %f, z = %f\n", x, y, z);
+
+  float cos_angular_size = cos(angular_size*3.1415/180.0);
+  printf("cos_angular_size = %f\n", cos_angular_size);
+
+  for(float tz_sign = -1.0; tz_sign < 3.0; tz_sign += 2.0)
+  {
+    for(float tx = -1.0; tx <= 1.0; tx += 0.01)
+    {
+      for(float ty = -1.0; ty <= 1.0; ty += 0.01)
+      {
+        if ((1.0 - tx*tx - ty*ty)<0.0)
+          continue;
+
+        float tz = tz_sign * sqrt(1.0 - tx*tx - ty*ty);
+
+        float cos_phi = x*tx + y*ty + z*tz;
+       
+        if (cos_angular_size < cos_phi)
+        {
+          float rx = tx;  //mirroring on the z=0 plane
+          float ry = ty;
+          float rz = -tz;
+
+          float inv_m = 1.0 / (2.0 * sqrt(rx*rx + ry*ry + (rz + 1)*(rz + 1)));
+          int s = TEXRES_X * (rx * inv_m + 0.5);
+          int t = TEXRES_Y * (ry * inv_m + 0.5);
+
+          //seg_fault protection:
+          if (s<0) s=0; 
+          if (s>=TEXRES_X) s=TEXRES_X-1; 
+
+          if (t<0) t=0;
+          if (t>=TEXRES_Y) t=TEXRES_Y-1;
+
+          env_map[s][t][0] = r * 255;  
+          env_map[s][t][1] = g * 255;
+          env_map[s][t][2] = b * 255;
+          env_map[s][t][3] = a * 255;
+        }
+      }
+    }
+  }
+}
+  /*****************************************************************/
+  /*****************************************************************/
+  /*****************************************************************/
+
+void init(void)
+{
+  glClearColor(0.0, 0.0, 0.0, 0.0);
+  glShadeModel(GL_FLAT);
+  glEnable(GL_DEPTH_TEST);
+
+  for(int x=0; x<TEXRES_X; x++)
+  {
+    for(int y=0; y<TEXRES_Y; y++)
+    {
+      env_map[x][y][0] = x;  //a few colors
+      env_map[x][y][1] = y;
+      env_map[x][y][2] = 128;
+      env_map[x][y][3] = 128;
+    }
+  }
+
+  /*****************************************************************/
+  /*****************************************************************/
+  /*****************************************************************/
+  //       x          y    z           ang   r    g    b    a
+  setColor(0.0,       0.0, -1.0      , 23.0, 1.0, 1.0, 1.0, 1.0);
+  setColor(0.7071067, 0.0, -0.7071067, 23.0, 1.0, 0.0, 0.0, 1.0);
+  /*****************************************************************/
+  /*****************************************************************/
+  /*****************************************************************/
+
+  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+  glGenTextures(1, &texName);
+  glBindTexture(GL_TEXTURE_2D, texName);
+  
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEXRES_X, TEXRES_Y, 0, GL_RGBA, GL_UNSIGNED_BYTE, env_map);
+}
+
+void reshape(int w, int h)
+{
+  window_x = w; window_y = h;
+  glViewport(0, 0, (GLsizei) w, (GLsizei) h);
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective((GLdouble) 60.0, ((GLdouble)w)/((GLdouble)h), (GLdouble) 10.0, (GLdouble) 1000.0);
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  glTranslatef(0.0, 0.0, -20.0);
+}
+
+void display()
+{
+  glClear  ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ;
+
+  //show light
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective((GLdouble) 60.0, window_x/window_y, (GLdouble) 1.0, (GLdouble) 100.0);
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+
+  glTranslatef(0.0, 0.0, -10.0);
+
+  glRotatef(alpha, 1.0, 0.0, 0.0);
+  glRotatef(beta, 0.0, 1.0, 0.0);
+
+  glBegin(GL_LINES);
+  glColor3f(1.0, 1.0, 1.0);
+  glVertex3f(0.0, 0.0, 0.0);
+  glVertex3f(0.0, 0.0, 1.0);
+  glEnd();
+
+  /*****************************************************************/
+  /*****************************************************************/
+  /*****************************************************************/
+  glEnable(GL_TEXTURE_2D);
+  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+  glBindTexture(GL_TEXTURE_2D, texName);
+
+  glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+  glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+  glEnable(GL_TEXTURE_GEN_S);
+  glEnable(GL_TEXTURE_GEN_T);
+
+  glBegin(GL_QUADS);
+  glNormal3f(0.0, 0.0, 1.0);
+  glVertex3f(1.0, 1.0, 0.0);
+  glVertex3f(-1.0, 1.0, 0.0);
+  glVertex3f(-1.0, -1.0, 0.0);
+  glVertex3f(1.0, -1.0, 0.0);
+  glEnd();
+
+  glDisable(GL_TEXTURE_GEN_S);
+  glDisable(GL_TEXTURE_GEN_T);
+  glDisable(GL_TEXTURE_2D);
+  /*****************************************************************/
+  /*****************************************************************/
+  /*****************************************************************/
+
+  //show how the map looks like
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  //gluOrtho2D(0.0  -10.0, 1.0 +10.0, -window_x/window_y -10.0,0.0 +10.0);
+  //glOrtho(0.0, 5.0, -5.0, 0.0, -10.0, 10.0);
+  glOrtho(0.0, 5.0*(window_x/window_y), -5.0, 0.0, -10.0, 10.0);
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  glEnable(GL_TEXTURE_2D);
+  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+  glBindTexture(GL_TEXTURE_2D, texName);
+
+  glBegin(GL_QUADS);
+  glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0);
+  glTexCoord2f(0.0, 1.0); glVertex3f(0.0, -1.0, 0.0);
+  glTexCoord2f(1.0, 1.0); glVertex3f(1.0, -1.0, 0.0);
+  glTexCoord2f(1.0, 0.0); glVertex3f(1.0, 0.0, 0.0);
+  glEnd();
+  glFlush();
+  glDisable(GL_TEXTURE_2D);
+
+  glutPostRedisplay () ;
+  glutSwapBuffers () ;
+}
+
+void keyboard (unsigned char key, int x, int y)
+{
+  switch(key)
+  {
+  case 27:
+    exit(0);
+
+  case '8':
+    alpha += 1.0;
+    if (alpha >= 360.0) alpha -= 360.0;
+    break;
+
+  case '2':
+    alpha -= 1.0;
+    if (alpha < 0.0) alpha += 360.0;
+    break;
+
+  case '4':
+    beta -= 1.0;
+    if (beta <= -90.0) beta = -90.0;
+    break;
+
+  case '6':
+    beta += 1.0;
+    if (beta >= 90.0) beta = 90.0;
+    break;
+
+  case '5':
+    alpha = 0.0; beta = 0.0;
+    break;
+  }
+}
+
+int main(int argc, char** argv)
+{
+  glutInitWindowSize(window_x, window_y);
+  glutInit(&argc, argv);
+  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
+  glutCreateWindow(argv[0]);
+  init();
+  glutDisplayFunc(display);
+  glutReshapeFunc(reshape);
+  glutKeyboardFunc(keyboard);
+
+  glutMainLoop();
+
+  return 0;
+}