X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FTexture.hh;h=41add2bca92638f135dc1b58abea615cb32f3d72;hp=5aa38e1dc85e04ea70aa5f910c6c91992b688a0f;hb=e973a129b5b83b628ba3f09e8c95682fc74080cd;hpb=a31d65a998121df0651c57bfb68782e2a07d2e2f diff --git a/src/Moof/Texture.hh b/src/Moof/Texture.hh index 5aa38e1..41add2b 100644 --- a/src/Moof/Texture.hh +++ b/src/Moof/Texture.hh @@ -34,13 +34,10 @@ * Image-loading and OpenGL texture loading. */ -#include - #include -#include +#include #include -#include namespace Mf { @@ -50,61 +47,76 @@ class Texture; typedef boost::shared_ptr TextureP; -class Texture : public Resource +class Texture : public Image { - class Impl; - boost::shared_ptr mImpl; - public: + /** + * Possible orientations for texture coordinates. + */ + + typedef unsigned TileIndex; + static const TileIndex NO_TILE = -1; + + typedef enum + { + NORMAL = 0, ///< Normal orientation. + FLIP = 1, ///< Flip over a horizontal axis. + REVERSE = 2, ///< Flip over a vertical axis. + FLIP_AND_REVERSE = 3 ///< Flip over both. + } Orientation; + + static TextureP alloc(const std::string& name) { return TextureP(new Texture(name)); } - Texture(const std::string& name); + explicit Texture(const std::string& name); void bind() const; GLuint getObject() const; static void resetBind(); - unsigned getWidth() const; - unsigned getHeight() const; - void setMinFilter(GLuint filter); void setMagFilter(GLuint filter); void setWrapS(GLuint wrap); void setWrapT(GLuint wrap); + + /** + * Calculate texture coordinates for a tile at a certain index. Tiles are + * indexed start with zero as the to-left tile and moving across, then down. + * @param index The tile index. + * @param coords An array of scalars where the texture coordinates will be + * stored after this call. The first coordinate (u,v) will be in the first + * two places and so on until all four coordinates are stored, therefore + * requiring enough room for an array of eight scalars. The winding of the + * coordinates is always counter-clockwise (the GL default). + * @return True if index is valid, false otherwise. + */ + + bool getTileCoords(TileIndex index, Scalar coords[8]) const; + + + /** + * This version let's you specify an orientation that will be reflected in + * the texture coordinates. This allows you to easily map a texture + * backwards or upside-down. + * @param what The orientation; can be flip, reverse, or flip_and_reverse. + * @return True if index is valid, false otherwise. + */ + + bool getTileCoords(TileIndex index, Scalar coords[8], Orientation what) const; + + static std::string getPath(const std::string& name); +private: - struct Exception : public Mf::Exception - { - enum - { - BAD_IMAGE_FORMAT = 1024 - }; - - explicit Exception(unsigned error) : - Mf::Exception(error) {} - - void raise() - { - throw *this; - } - - const char* what() const throw() - { - switch (code) - { - case BAD_IMAGE_FORMAT: - return "unknown image format"; - } - return Mf::Exception::what(); - } - }; + class Impl; + boost::shared_ptr mImpl; };