#include #include namespace RNR { static Ogre::Vector3 normalIdVectors[] = { Ogre::Vector3(1, 0, 0), Ogre::Vector3(0, 1, 0), Ogre::Vector3(0, 0, 1), Ogre::Vector3(-1, 0, 0), Ogre::Vector3(0, -1, 0), Ogre::Vector3(0, 0, -1), }; bool validNormalId(NormalId normalId) { return ((normalId >= 0) && (normalId < 6)); } NormalId intToNormalId(int i) { return static_cast(i); } NormalId normalIdOpposite(NormalId normalId) { return (NormalId)((normalId + 3) % 6); } NormalId normalIdToU(NormalId normalId) { switch (normalId) { case NORM_X: return NORM_Z; case NORM_Y: return NORM_X; case NORM_Z: return NORM_Y; case NORM_X_NEG: return NORM_Z_NEG; case NORM_Y_NEG: return NORM_X_NEG; case NORM_Z_NEG: return NORM_Y_NEG; default: return NORM_Y; } } NormalId normalIdToV(NormalId normalId) { switch (normalId) { case NORM_X: return NORM_Y; case NORM_Y: return NORM_Z; case NORM_Z: return NORM_X; case NORM_X_NEG: return NORM_Y_NEG; case NORM_Y_NEG: return NORM_Z_NEG; case NORM_Z_NEG: return NORM_X_NEG; default: return NORM_Y; } } // UVW to Object template<> Ogre::Vector3 uvwToObject(const Ogre::Vector3& vector) { return Ogre::Vector3(vector.z, vector.y, -vector.x); } template<> Ogre::Vector3 uvwToObject(const Ogre::Vector3& vector) { return Ogre::Vector3(-vector.x, vector.z, vector.y); } template<> Ogre::Vector3 uvwToObject(const Ogre::Vector3& vector) { return Ogre::Vector3(vector.x, vector.y, vector.z); } template<> Ogre::Vector3 uvwToObject(const Ogre::Vector3& vector) { return Ogre::Vector3(-vector.z, vector.y, vector.x); } template<> Ogre::Vector3 uvwToObject(const Ogre::Vector3& vector) { return Ogre::Vector3(vector.x, -vector.z, vector.y); } template<> Ogre::Vector3 uvwToObject(const Ogre::Vector3& vector) { return Ogre::Vector3(-vector.x, vector.y, -vector.z); } // Object to UVW template<> Ogre::Vector3 objectToUvw(const Ogre::Vector3& vector) { return Ogre::Vector3(-vector.z, vector.y, vector.x); } template<> Ogre::Vector3 objectToUvw(const Ogre::Vector3& vector) { return Ogre::Vector3(-vector.x, vector.z, vector.y); } template<> Ogre::Vector3 objectToUvw(const Ogre::Vector3& vector) { return Ogre::Vector3(vector.x, vector.y, vector.z); } template<> Ogre::Vector3 objectToUvw(const Ogre::Vector3& vector) { return Ogre::Vector3(vector.z, vector.y, -vector.x); } template<> Ogre::Vector3 objectToUvw(const Ogre::Vector3& vector) { return Ogre::Vector3(vector.x, vector.z, -vector.y); } template<> Ogre::Vector3 objectToUvw(const Ogre::Vector3& vector) { return Ogre::Vector3(-vector.x, vector.y, -vector.z); } Ogre::Vector3 uvwToObject(const Ogre::Vector3& uvw, NormalId faceId) { switch (faceId) { case NORM_X: return uvwToObject(uvw); case NORM_Y: return uvwToObject(uvw); case NORM_Z: return uvwToObject(uvw); case NORM_X_NEG: return uvwToObject(uvw); case NORM_Y_NEG: return uvwToObject(uvw); case NORM_Z_NEG: return uvwToObject(uvw); default: return Ogre::Vector3::UNIT_X; } } Ogre::Vector3 objectToUvw(const Ogre::Vector3& object, NormalId faceId) { switch (faceId) { case NORM_X: return objectToUvw(object); case NORM_Y: return objectToUvw(object); case NORM_Z: return objectToUvw(object); case NORM_X_NEG: return objectToUvw(object); case NORM_Y_NEG: return objectToUvw(object); case NORM_Z_NEG: return objectToUvw(object); default: return Ogre::Vector3::UNIT_X; } } };