TextureData.hh 5.37 KB
Newer Older
Jan Möbius's avatar
Jan Möbius committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
//=============================================================================
//
//                               OpenFlipper
//        Copyright (C) 2008 by Computer Graphics Group, RWTH Aachen
//                           www.openflipper.org
//
//-----------------------------------------------------------------------------
//
//                                License
//
//  OpenFlipper is free software: you can redistribute it and/or modify
//  it under the terms of the GNU Lesser General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  OpenFlipper is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public License
//  along with OpenFlipper.  If not, see <http://www.gnu.org/licenses/>.
//
//-----------------------------------------------------------------------------
//
//   $Revision: 5183 $
//   $Author: wilden $
//   $Date: 2009-03-03 12:51:24 +0100 (Tue, 03 Mar 2009) $
//
//=============================================================================

32 33 34
#ifndef TEXTUREDATA_HH
#define TEXTUREDATA_HH

Jan Möbius's avatar
Jan Möbius committed
35 36 37
#include <OpenFlipper/common/perObjectData.hh>

#include <QString>
38
#include <QStringList>
39
#include <QImage>
40
#include <ACG/GL/gl.hh>
Jan Möbius's avatar
Jan Möbius committed
41 42
#include <vector>
#include <map>
43 44
#include <float.h>
#include <iostream>
Jan Möbius's avatar
Jan Möbius committed
45

46 47 48 49
enum TextureType { UNSET         = 1 << 0,
                   VERTEXBASED   = 1 << 1,
                   HALFEDGEBASED = 1 << 2,
                   MULTITEXTURE  = 1 << 3 };
Jan Möbius's avatar
Jan Möbius committed
50

51 52 53 54 55 56 57 58 59 60 61
class TexParameters
{
  public:
    TexParameters() :
          scale ( true ),
          clamp_min ( FLT_MIN ),
          clamp_max ( FLT_MAX ),
          clamp ( false ),
          repeat ( false ),
          center ( false ),
          abs ( false ),
62
          max_val ( 1.0 ) {};
63 64 65 66 67

    bool scale;

    double clamp_min;
    double clamp_max;
Jan Möbius's avatar
Jan Möbius committed
68

69 70
    bool clamp;
    bool repeat;
Jan Möbius's avatar
Jan Möbius committed
71

72
    bool center;
Jan Möbius's avatar
Jan Möbius committed
73

74
    bool abs;
Jan Möbius's avatar
Jan Möbius committed
75

76
    double max_val;
Jan Möbius's avatar
Jan Möbius committed
77 78
};

79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
class Texture {
  public :
    Texture();

    void filename( QString _name ) { filename_ = _name; };
    QString filename() { return filename_; };

    void id( int _id ) { id_ = _id; };
    int id() { return id_; };

    void glName( GLuint _glName ) { glName_ = _glName; };
    GLuint glName() { return glName_; };

    void name( QString _name ) { name_ = _name; };
    QString name() { return name_; };

Jan Möbius's avatar
Jan Möbius committed
95 96 97 98 99 100 101 102 103 104
  // dimension
  uint dimension;
  // Status
  bool enabled;
  // does this texture need an update?
  bool dirty;
  // Texture Type
  uint type;
  // Parameters
  TexParameters parameters;
105 106

  QImage textureImage;
107 108 109 110

  /// If this is a multiTexture, the list will contain all textures for this multi Texture node.
  QStringList multiTextureList;

111 112 113 114 115 116 117 118 119 120 121 122 123
  private:
    // Filename of the texture
    QString filename_;

    // Texture id
    int id_;

    // glName
    GLuint glName_;

    // Texture Name
    QString name_;

Jan Möbius's avatar
Jan Möbius committed
124 125 126 127 128 129 130
};

class TextureData : public PerObjectData
{

  public :

131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
      /// Constructor
      TextureData();
      /// Destructor
      ~TextureData();


      /// Check if a texture exists
      bool textureExists(QString _textureName);


      /// Check if a texture is enabled
      bool isEnabled(QString _textureName);


      /// Enable a given texture
      bool enableTexture(QString _textureName, bool _exclusive = false);

      /// Disable a given texture
      void disableTexture(QString _textureName);

      /// Add a Texture
      int addTexture ( QString _textureName , QString _filename , uint _dimension, GLuint _glName );

      /// Add a Texture ( Based on an existing specification )
      int addTexture ( Texture _texture, GLuint _glName );

157 158 159
      /// Adds a new multiTexture ( This texture will only contain a list of enabled textures for multitexturing )
      bool addMultiTexture( QString _textureName );

160 161 162
      /// Stores the given image in the texture information
      bool setImage( QString _textureName , QImage& _image );

163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
      /*
      /// Delete a given texture
      void deleteTexture(QString _textureName);

      /// get parameters of a given texture
      TexParameters textureParameters(QString _textureName);

      /// Set Parameters for a given texture
      void setTextureParameters(QString _textureName, TexParameters _params);
      */

      /// Get the texture object
      Texture& texture(QString _textureName);

      /// Get reference to the texture vector
      std::vector< Texture >& textures();


181 182 183 184 185
      /** This map maps all available textures for the object which this
       *  class belongs to to their GLuint. The MeshNode will use this
       *  map to activate one texture for each face.
       *
       */
186 187
      std::map< int, GLuint >* textureMap();

188 189 190
    /** This map is used to store the available Textures and map them to their
     *  corresponding properties.
     */
191 192
      std::map< int, std::string >* propertyMap();

Jan Möbius's avatar
Jan Möbius committed
193 194 195 196 197
  private :

    std::map< int, GLuint> textureMap_;
    std::map< int, std::string> propertyMap_;

198
    /// internal id for the next texture
Jan Möbius's avatar
Jan Möbius committed
199 200
    int nextInternalID_;

201

202
    /// vector containing all textures of an object
Jan Möbius's avatar
Jan Möbius committed
203 204
    std::vector< Texture > textures_;

205

206
    /// Get the index of a given texture
Jan Möbius's avatar
Jan Möbius committed
207 208
    int getTextureIndex(QString _textureName);

209 210
    Texture noTexture;

Jan Möbius's avatar
Jan Möbius committed
211 212
};

213
#endif //TEXTUREDATA_HH