X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FTexture.hh;h=41add2bca92638f135dc1b58abea615cb32f3d72;hp=e858093e1a44afa06b44d50dcc5eac80503855e7;hb=e973a129b5b83b628ba3f09e8c95682fc74080cd;hpb=c2321281bf12a7efaedde930422c7ddbc92080d4 diff --git a/src/Moof/Texture.hh b/src/Moof/Texture.hh index e858093..41add2b 100644 --- a/src/Moof/Texture.hh +++ b/src/Moof/Texture.hh @@ -34,46 +34,89 @@ * Image-loading and OpenGL texture loading. */ -#include - #include -#include +#include #include namespace Mf { -class Texture : public Resource +class Texture; +typedef boost::shared_ptr TextureP; + + +class Texture : public Image { public: - Texture(const std::string& name); - void bind(); - GLuint getObject(); + /** + * 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)); + } + + explicit Texture(const std::string& name); + + void bind() const; + GLuint getObject() const; - unsigned getWidth(); - unsigned getHeight(); + static void resetBind(); void setMinFilter(GLuint filter); - void setMaxFilter(GLuint filter); - void setWrapU(GLuint wrap); - void setWrapV(GLuint wrap); + void setMagFilter(GLuint filter); + void setWrapS(GLuint wrap); + void setWrapT(GLuint wrap); - void applyChanges(); - static std::string getPathToResource(const std::string& name); + /** + * 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. + */ - struct Exception : std::runtime_error - { - explicit Exception(const std::string& what_arg) : - std::runtime_error(what_arg) {} - }; + 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: - class TextureImpl; - boost::shared_ptr impl_; + + class Impl; + boost::shared_ptr mImpl; };