diff --git a/tests/Makefile.am b/tests/Makefile.am index 59584e071..181176073 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 000000000..ef56255c7 --- /dev/null +++ b/tests/test-env-map.cxx @@ -0,0 +1,239 @@ +#include +#include +#include +#include + +#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= 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; +}