namespace Msp {
namespace GL {
+TextureCubeFace TextureCube::face_order[6] =
+{
+ POSITIVE_X,
+ NEGATIVE_X,
+ POSITIVE_Y,
+ NEGATIVE_Y,
+ POSITIVE_Z,
+ NEGATIVE_Z
+};
+
Vector3 TextureCube::directions[6] =
{
Vector3(1, 0, 0),
Vector3(0, 0, -1)
};
+unsigned TextureCube::orientations[12] =
+{
+ 5, 3,
+ 4, 3,
+ 0, 4,
+ 0, 5,
+ 0, 3,
+ 1, 3
+};
+
TextureCube::TextureCube():
Texture(GL_TEXTURE_CUBE_MAP),
ifmt(RGB),
TextureCubeFace TextureCube::enumerate_faces(unsigned i)
{
- switch(i)
- {
- case 0: return POSITIVE_X;
- case 1: return NEGATIVE_X;
- case 2: return POSITIVE_Y;
- case 3: return NEGATIVE_Y;
- case 4: return POSITIVE_Z;
- case 5: return NEGATIVE_Z;
- default: throw out_of_range("TextureCube::enumerate_faces");
- }
+ if(i>=6)
+ throw out_of_range("TextureCube::enumerate_faces");
+ return face_order[i];
}
-const Vector3 &TextureCube::get_face_direction(TextureCubeFace face)
+unsigned TextureCube::get_face_index(TextureCubeFace face)
{
switch(face)
{
- case POSITIVE_X: return directions[0];
- case NEGATIVE_X: return directions[1];
- case POSITIVE_Y: return directions[2];
- case NEGATIVE_Y: return directions[3];
- case POSITIVE_Z: return directions[4];
- case NEGATIVE_Z: return directions[5];
- default: throw invalid_argument("TextureCube::get_face_direction");
+ case POSITIVE_X: return 0;
+ case NEGATIVE_X: return 1;
+ case POSITIVE_Y: return 2;
+ case NEGATIVE_Y: return 3;
+ case POSITIVE_Z: return 4;
+ case NEGATIVE_Z: return 5;
+ default: throw invalid_argument("TextureCube::get_face_index");
}
}
+const Vector3 &TextureCube::get_face_direction(TextureCubeFace face)
+{
+ return directions[get_face_index(face)];
+}
+
const Vector3 &TextureCube::get_s_direction(TextureCubeFace face)
{
- switch(face)
- {
- case POSITIVE_X: return directions[5];
- case NEGATIVE_X: return directions[4];
- case POSITIVE_Y: return directions[0];
- case NEGATIVE_Y: return directions[0];
- case POSITIVE_Z: return directions[0];
- case NEGATIVE_Z: return directions[1];
- default: throw invalid_argument("TextureCube::get_s_direction");
- }
+ return directions[orientations[get_face_index(face)*2]];
}
const Vector3 &TextureCube::get_t_direction(TextureCubeFace face)
{
- switch(face)
- {
- case POSITIVE_X: return directions[3];
- case NEGATIVE_X: return directions[3];
- case POSITIVE_Y: return directions[4];
- case NEGATIVE_Y: return directions[5];
- case POSITIVE_Z: return directions[3];
- case NEGATIVE_Z: return directions[3];
- default: throw invalid_argument("TextureCube::get_t_direction");
- }
+ return directions[orientations[get_face_index(face)*2+1]];
}
Vector3 TextureCube::get_texel_direction(TextureCubeFace face, unsigned u, unsigned v)