// // env_map.cc // // Environmental mapping for sky // // Copyright (C) J. Belson 2003.5.3 // #include #include #include "env_map.h" /** * Constructor */ env_map::env_map(int env_map_size) : size(env_map_size) { // Allocate space for each of the cube faces for (int i=0; i<6; i++) { maps[i] = new uint32[size*size]; clear_map(i); } } /** * Destructor */ env_map::~env_map() { for (int i=0; i<6; i++) { delete [] maps[i]; } } /** * Clear map */ void env_map::clear_map(int map_num) { static const uint32 col[] = { 0x000000ff, 0x0000ff00, 0x00ff0000, 0x00ffff00, 0x00ff00ff, 0x0000ffff }; static const int CHECK = 40; for (int j=0; j=0 && map_num<=6); return maps[map_num]; } /** * Return colour from reflection map * @param x x coordinate * @param y y coordinate * @param map_num Which map to use */ fcolour env_map::read_map(int x, int y, int map_num) const { assert(map_num>=0 && map_num<=6); assert(x>0 && x0 && y abs_j) { if (abs_i > abs_k) { map_num = (view.i > 0) ? RIGHT : LEFT; u = view.k; v = -view.j; } else { map_num = (view.k > 0) ? BACK : FORWARD; u = view.i; v = -view.j; } } else { if (abs_j > abs_k) { map_num = (view.j > 0) ? UP : DOWN; u = view.i; v = view.k; } else { map_num = (view.k > 0) ? BACK : FORWARD; u = view.i; v = -view.j; } } // Transform from [-1,1] to [0,1] u /= 2.0; v /= 2.0; u += 0.5; v += 0.5; return read_map(u*size, v*size, map_num); }