* Image-loading and OpenGL texture loading.
*/
-#include <stdexcept>
-
#include <boost/shared_ptr.hpp>
-#include <Moof/Exception.hh>
+#include <Moof/Image.hh>
#include <Moof/OpenGL.hh>
-#include <Moof/Resource.hh>
namespace Mf {
-class Texture : public Resource
+class Texture;
+typedef boost::shared_ptr<Texture> TextureP;
+
+
+class Texture : public Image
{
public:
- Texture(const std::string& name);
+
+ /**
+ * 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;
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);
- static std::string getPath(const std::string& name);
- 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 "inappropriate image format";
- }
- return Mf::Exception::what();
- }
- };
+ /**
+ * 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:
+
class Impl;
- boost::shared_ptr<Impl> impl_;
+ boost::shared_ptr<Impl> mImpl;
};