00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef _CELENGINE_TEXTURE_H_
00011 #define _CELENGINE_TEXTURE_H_
00012
00013 #include <string>
00014 #include <celutil/basictypes.h>
00015 #include <celutil/color.h>
00016 #include <celengine/image.h>
00017
00018
00019 typedef void (*ProceduralTexEval)(float, float, float, unsigned char*);
00020
00021
00022 struct TextureTile
00023 {
00024 TextureTile(unsigned int _texID) :
00025 u(0.0f), v(0.0f), du(1.0f), dv(1.0f), texID(_texID) {};
00026 TextureTile(unsigned int _texID, float _u, float _v) :
00027 u(_u), v(_v), du(1.0f), dv(1.0f), texID(_texID) {};
00028 TextureTile(unsigned int _texID, float _u, float _v, float _du, float _dv) :
00029 u(_u), v(_v), du(_du), dv(_dv), texID(_texID) {};
00030
00031 float u, v;
00032 float du, dv;
00033 unsigned int texID;
00034 };
00035
00036
00037 class TexelFunctionObject
00038 {
00039 public:
00040 TexelFunctionObject() {};
00041 virtual ~TexelFunctionObject() {};
00042 virtual void operator()(float u, float v, float w,
00043 unsigned char* pixel) = 0;
00044 };
00045
00046
00047 class Texture
00048 {
00049 public:
00050 Texture(int w, int h, int d = 1);
00051 virtual ~Texture();
00052
00053 virtual const TextureTile getTile(int lod, int u, int v) = 0;
00054 virtual void bind() = 0;
00055
00056 virtual int getLODCount() const;
00057 virtual int getUTileCount(int lod) const;
00058 virtual int getVTileCount(int lod) const;
00059 virtual int getWTileCount(int lod) const;
00060
00061
00062
00063
00064 virtual void beginUsage() {};
00065 virtual void endUsage() {};
00066
00067 virtual void setBorderColor(Color);
00068
00069 int getWidth() const;
00070 int getHeight() const;
00071 int getDepth() const;
00072
00073 bool hasAlpha() const { return alpha; }
00074
00075 enum AddressMode
00076 {
00077 Wrap = 0,
00078 BorderClamp = 1,
00079 EdgeClamp = 2,
00080 };
00081
00082 enum MipMapMode
00083 {
00084 DefaultMipMaps = 0,
00085 NoMipMaps = 1,
00086 AutoMipMaps = 2,
00087 };
00088
00089 protected:
00090 bool alpha;
00091
00092 private:
00093 int width;
00094 int height;
00095 int depth;
00096 };
00097
00098
00099 class ImageTexture : public Texture
00100 {
00101 public:
00102 ImageTexture(Image& img, AddressMode, MipMapMode);
00103 ~ImageTexture();
00104
00105 virtual const TextureTile getTile(int lod, int u, int v);
00106 virtual void bind();
00107 virtual void setBorderColor(Color);
00108
00109 unsigned int getName() const;
00110
00111 private:
00112 unsigned int glName;
00113 };
00114
00115
00116 class TiledTexture : public Texture
00117 {
00118 public:
00119 TiledTexture(Image& img, int _uSplit, int _vSplit, MipMapMode);
00120 ~TiledTexture();
00121
00122 virtual const TextureTile getTile(int lod, int u, int v);
00123 virtual void bind();
00124 virtual void setBorderColor(Color);
00125
00126 virtual int getUTileCount(int lod) const;
00127 virtual int getVTileCount(int lod) const;
00128
00129 private:
00130 int uSplit;
00131 int vSplit;
00132 unsigned int* glNames;
00133 };
00134
00135
00136 class CubeMap : public Texture
00137 {
00138 public:
00139 CubeMap(Image* faces[]);
00140 ~CubeMap();
00141
00142 virtual const TextureTile getTile(int lod, int u, int v);
00143 virtual void bind();
00144 virtual void setBorderColor(Color);
00145
00146 private:
00147 unsigned int glName;
00148 };
00149
00150
00151 extern Texture* CreateProceduralTexture(int width, int height,
00152 int format,
00153 ProceduralTexEval func,
00154 Texture::AddressMode addressMode = Texture::EdgeClamp,
00155 Texture::MipMapMode mipMode = Texture::DefaultMipMaps);
00156 extern Texture* CreateProceduralTexture(int width, int height,
00157 int format,
00158 TexelFunctionObject& func,
00159 Texture::AddressMode addressMode = Texture::EdgeClamp,
00160 Texture::MipMapMode mipMode = Texture::DefaultMipMaps);
00161 extern Texture* CreateProceduralCubeMap(int size, int format,
00162 ProceduralTexEval func);
00163
00164 extern Texture* LoadTextureFromFile(const std::string& filename,
00165 Texture::AddressMode addressMode = Texture::EdgeClamp,
00166 Texture::MipMapMode mipMode = Texture::DefaultMipMaps);
00167
00168 extern Texture* LoadHeightMapFromFile(const std::string& filename,
00169 float height,
00170 Texture::AddressMode addressMode = Texture::EdgeClamp);
00171
00172
00173 #endif // _CELENGINE_TEXTURE_H_