X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftexturecube.cpp;h=bbe6a6b679fe259915e6710036ed75336634816e;hb=6afbace895a7bbcf216ab8e48280ea0303ab5892;hp=4a613a37fc948ffa61789a65d912e8b46685001a;hpb=70153a4e27eeebc7e0a91de122f45eff6296cb71;p=libs%2Fgl.git diff --git a/source/texturecube.cpp b/source/texturecube.cpp index 4a613a37..bbe6a6b6 100644 --- a/source/texturecube.cpp +++ b/source/texturecube.cpp @@ -1,35 +1,29 @@ +#include "arb_texture_cube_map.h" #include "bindable.h" #include "error.h" -#include "extension.h" #include "texturecube.h" using namespace std; -namespace { +namespace Msp { +namespace GL { -// An array to facilitate looping through the cube faces -Msp::GL::TextureCubeFace faces[6] = +Vector3 TextureCube::directions[6] = { - Msp::GL::POSITIVE_X, - Msp::GL::NEGATIVE_X, - Msp::GL::POSITIVE_Y, - Msp::GL::NEGATIVE_Y, - Msp::GL::POSITIVE_Z, - Msp::GL::NEGATIVE_Z + Vector3(1, 0, 0), + Vector3(-1, 0, 0), + Vector3(0, 1, 0), + Vector3(0, -1, 0), + Vector3(0, 0, 1), + Vector3(0, 0, -1) }; -} - - -namespace Msp { -namespace GL { - TextureCube::TextureCube(): Texture(GL_TEXTURE_CUBE_MAP), size(0), allocated(0) { - static RequireVersion _ver(1, 3); + static Require _req(ARB_texture_cube_map); } void TextureCube::storage(PixelFormat fmt, unsigned sz) @@ -49,7 +43,7 @@ void TextureCube::allocate(unsigned level) return; for(unsigned i=0; i<6; ++i) - image(faces[i], level, get_base_pixelformat(ifmt), UNSIGNED_BYTE, 0); + image(enumerate_faces(i), level, get_base_pixelformat(ifmt), UNSIGNED_BYTE, 0); } void TextureCube::image(TextureCubeFace face, unsigned level, PixelFormat fmt, DataType type, const void *data) @@ -78,5 +72,71 @@ unsigned TextureCube::get_level_size(unsigned level) return size>>level; } +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"); + } +} + +const Vector3 &TextureCube::get_face_direction(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"); + } +} + +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"); + } +} + +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"); + } +} + +Vector3 TextureCube::get_texel_direction(TextureCubeFace face, unsigned u, unsigned v) +{ + float s = (u+0.5f)*2.0f/size-1.0f; + float t = (v+0.5f)*2.0f/size-1.0f; + const Vector3 &fv = get_face_direction(face); + const Vector3 &sv = get_s_direction(face); + const Vector3 &tv = get_t_direction(face); + return Vector3(fv.x+s*sv.x, fv.y+t*tv.y, fv.z+s*sv.z+t*tv.z); +} + } // namespace GL } // namespace Msp