texture.h
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:5k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // texture.h
  2. //
  3. // Copyright (C) 2001-2003, Chris Laurel
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #ifndef _CELENGINE_TEXTURE_H_
  10. #define _CELENGINE_TEXTURE_H_
  11. #include <string>
  12. #include <celutil/basictypes.h>
  13. #include <celutil/color.h>
  14. #include <celengine/image.h>
  15. typedef void (*ProceduralTexEval)(float, float, float, unsigned char*);
  16. struct TextureTile
  17. {
  18.     TextureTile(unsigned int _texID) :
  19.         u(0.0f), v(0.0f), du(1.0f), dv(1.0f), texID(_texID) {};
  20.     TextureTile(unsigned int _texID, float _u, float _v) :
  21.         u(_u), v(_v), du(1.0f), dv(1.0f), texID(_texID) {};
  22.     TextureTile(unsigned int _texID, float _u, float _v, float _du, float _dv) :
  23.         u(_u), v(_v), du(_du), dv(_dv), texID(_texID) {};
  24.     float u, v;
  25.     float du, dv;
  26.     unsigned int texID;
  27. };
  28. class TexelFunctionObject
  29. {
  30.  public:
  31.     TexelFunctionObject() {};
  32.     virtual ~TexelFunctionObject() {};
  33.     virtual void operator()(float u, float v, float w,
  34.                             unsigned char* pixel) = 0;
  35. };
  36. class Texture
  37. {
  38.  public:
  39.     Texture(int w, int h, int d = 1);
  40.     virtual ~Texture();
  41.     virtual const TextureTile getTile(int lod, int u, int v) = 0;
  42.     virtual void bind() = 0;
  43.     virtual int getLODCount() const;
  44.     virtual int getUTileCount(int lod) const;
  45.     virtual int getVTileCount(int lod) const;
  46.     virtual int getWTileCount(int lod) const;
  47.     // Currently, these methods are only implemented by virtual textures; they
  48.     // may be useful later when a more sophisticated texture management scheme
  49.     // is implemented.
  50.     virtual void beginUsage() {};
  51.     virtual void endUsage() {};
  52.     virtual void setBorderColor(Color);
  53.     int getWidth() const;
  54.     int getHeight() const;
  55.     int getDepth() const;
  56.     bool hasAlpha() const { return alpha; }
  57.     bool isCompressed() const { return compressed; }
  58.     /*! Identical formats may need to be treated in slightly different
  59.      *  fashions. One (and currently the only) example is the DXT5 compressed
  60.      *  normal map format, which is an ordinary DXT5 texture but requires some
  61.      *  shader tricks to be used correctly.
  62.      */
  63.     unsigned int getFormatOptions() const;
  64.     
  65.     //! Set the format options.
  66.     void setFormatOptions(unsigned int opts);
  67.     enum AddressMode
  68.     {
  69.         Wrap        = 0,
  70.         BorderClamp = 1,
  71.         EdgeClamp   = 2,
  72.     };
  73.     enum MipMapMode
  74.     {
  75.         DefaultMipMaps = 0,
  76.         NoMipMaps      = 1,
  77.         AutoMipMaps    = 2,
  78.     };
  79.     // Format option flags
  80.     enum {
  81.         DXT5NormalMap = 1
  82.     };
  83.  protected:
  84.     bool alpha;
  85.     bool compressed;
  86.  private:
  87.     int width;
  88.     int height;
  89.     int depth;
  90.     unsigned int formatOptions;
  91. };
  92. class ImageTexture : public Texture
  93. {
  94.  public:
  95.     ImageTexture(Image& img, AddressMode, MipMapMode);
  96.     ~ImageTexture();
  97.     virtual const TextureTile getTile(int lod, int u, int v);
  98.     virtual void bind();
  99.     virtual void setBorderColor(Color);
  100.     unsigned int getName() const;
  101.  private:
  102.     unsigned int glName;
  103. };
  104. class TiledTexture : public Texture
  105. {
  106.  public:
  107.     TiledTexture(Image& img, int _uSplit, int _vSplit, MipMapMode);
  108.     ~TiledTexture();
  109.     virtual const TextureTile getTile(int lod, int u, int v);
  110.     virtual void bind();
  111.     virtual void setBorderColor(Color);
  112.     virtual int getUTileCount(int lod) const;
  113.     virtual int getVTileCount(int lod) const;
  114.  private:
  115.     int uSplit;
  116.     int vSplit;
  117.     unsigned int* glNames;
  118. };
  119. class CubeMap : public Texture
  120. {
  121.  public:
  122.     CubeMap(Image* faces[]);
  123.     ~CubeMap();
  124.     virtual const TextureTile getTile(int lod, int u, int v);
  125.     virtual void bind();
  126.     virtual void setBorderColor(Color);
  127.  private:
  128.     unsigned int glName;
  129. };
  130. extern Texture* CreateProceduralTexture(int width, int height,
  131.                                         int format,
  132.                                         ProceduralTexEval func,
  133.                                         Texture::AddressMode addressMode = Texture::EdgeClamp,
  134.                                         Texture::MipMapMode mipMode = Texture::DefaultMipMaps);
  135. extern Texture* CreateProceduralTexture(int width, int height,
  136.                                         int format,
  137.                                         TexelFunctionObject& func,
  138.                                         Texture::AddressMode addressMode = Texture::EdgeClamp,
  139.                                         Texture::MipMapMode mipMode = Texture::DefaultMipMaps);
  140. extern Texture* CreateProceduralCubeMap(int size, int format,
  141.                                         ProceduralTexEval func);
  142. extern Texture* LoadTextureFromFile(const std::string& filename,
  143.                                     Texture::AddressMode addressMode = Texture::EdgeClamp,
  144.                                     Texture::MipMapMode mipMode = Texture::DefaultMipMaps);
  145. extern Texture* LoadHeightMapFromFile(const std::string& filename,
  146.                                       float height,
  147.                                       Texture::AddressMode addressMode = Texture::EdgeClamp);
  148. #endif // _CELENGINE_TEXTURE_H_