TextureInterface.hh 22.4 KB
Newer Older
1
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
2 3
*                                                                            *
*                              OpenFlipper                                   *
Jan Möbius's avatar
Jan Möbius committed
4
*      Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen       *
Jan Möbius's avatar
Jan Möbius committed
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 32
*                           www.openflipper.org                              *
*                                                                            *
*--------------------------------------------------------------------------- *
*  This file is part of OpenFlipper.                                         *
*                                                                            *
*  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 with the               *
*  following exceptions:                                                     *
*                                                                            *
*  If other files instantiate templates or use macros                        *
*  or inline functions from this file, or you compile this file and          *
*  link it with other files to produce an executable, this file does         *
*  not by itself cause the resulting executable to be covered by the         *
*  GNU Lesser General Public License. This exception does not however        *
*  invalidate any other reasons why the executable file might be             *
*  covered by the GNU Lesser General Public License.                         *
*                                                                            *
*  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 LesserGeneral Public           *
*  License along with OpenFlipper. If not,                                   *
*  see <http://www.gnu.org/licenses/>.                                       *
*                                                                            *
33 34 35
\*===========================================================================*/

/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
36 37 38 39 40
*                                                                            *
*   $Revision$                                                       *
*   $LastChangedBy$                                                *
*   $Date$                     *
*                                                                            *
41
\*===========================================================================*/
42 43


44 45
#ifndef TEXTUREINTERFACE_HH
#define TEXTUREINTERFACE_HH
46 47 48 49

 #include <QtGui>
 #include <QMenuBar>
 #include <OpenFlipper/common/Types.hh>
50

51
 /**
Mike Kremer's avatar
Mike Kremer committed
52 53
  * \brief Provide texture support for a plugin.
  *
54 55
  * This Interface should be used by plugins which will provide a texture. The texture coordinates have
  * to be written into a mesh property. You do not need to write texture information into the texture
56
  * coordinates of the mesh. As other plugins may provide textures to, the visualization of the
57 58 59 60
  * textures is handled by the main application (or a texture control plugin).
 */
class TextureInterface {
   signals :
61

62
      /** \brief Emit this Signal if a texture has been added (Property Name,filename,Dimension)
Dirk Wilden's avatar
Dirk Wilden committed
63 64 65 66
       *
       *  Emit this signal if a texture for a specific object has been added
       *
       *  @param  _name Name of the property which contains the tex coords (double or vec2d)
67
       *  @param _filename Filename of the texture (either local in OpenFlippers texture dir or global ( "./Textures/<name>")
Dirk Wilden's avatar
Dirk Wilden committed
68 69 70 71 72 73 74 75
       *  @param _dimension 1D texture ( currenty only supports 1 )
       *  @param _id id of an object
       */
      virtual void addTexture( QString /*_name*/ , QString /*_filename*/ , uint /*_dimension*/ , int /*_id*/ ) {};

      /** \brief Emit this Signal if a texture has been added (Property Name,filename,Dimension)
       *
       *  Emit this signal if a global texture has been added
76
       *
77
       *  @param  _name Name of the property which contains the tex coords (double or vec2d)
78
       *  @param _filename Filename of the texture (either local in OpenFlippers texture dir or global ( "./Textures/<name>")
79 80
       *  @param _dimension 1D texture ( currenty only supports 1 )
       */
Dirk Wilden's avatar
Dirk Wilden committed
81
      virtual void addTexture( QString /*_name*/ , QString /*_filename*/ , uint /*_dimension*/ ) {};
82

83 84 85
      /** \brief Emit this Signal if you want to add a texture for a multitexturing mode
       *
       *  Emit this signal if a texture should be added to a multitexturing mode.
Jan Möbius's avatar
Jan Möbius committed
86
       *
87
       *  The first parameter defines a texturegroup which collects all textures
Jan Möbius's avatar
Jan Möbius committed
88 89 90 91
       *  that should be painted in the multitexturing mode. This group does not
       *  have to exist on the first call but will be created automatically.
       *
       *  The second parameter defines the single textures name used in the gui.
92 93 94 95 96
       *
       *  @param _textureGroup Multitexturing group using this texture
       *  @param _name         Name of the property which contains the tex coords (double or vec2d)
       *  @param _filename     Filename of the texture (either local in OpenFlippers texture dir or global ( "./Textures/<name>")
       *  @param _id           Id of the object which should use that texture
Jan Möbius's avatar
Jan Möbius committed
97
       *  @param _textureId    The new internal id of the texture( This id is object related!!). Use this id in your mesh as the texture index (Use mesh->set_texture_index on the face using this texture).
98 99 100
       */
      virtual void addMultiTexture( QString /*_textureGroup*/ , QString /*_name*/ , QString /*_filename*/ , int /*_id*/ , int& /*_textureId*/ ) {};

101 102
      /** \brief Tell Plugins to update the given texture for the given identifier
       */
Dirk Wilden's avatar
Dirk Wilden committed
103
      virtual void updateTexture( QString /*_textureName*/  , int /*_identifier*/) {};
104

105 106 107
      /** \brief Tell Plugins to update all textures
       */
      virtual void updateAllTextures( ) {};
108 109 110 111

      /** \brief emit this signal if you updated a texture
       *
       *  Give the name of the texture and the id of the object or -1 if all objects were update
112 113
      */
      virtual void updatedTextures( QString , int ) {};
114

Dirk Wilden's avatar
Dirk Wilden committed
115 116 117 118 119 120 121
      /** \brief emit this signal if you want to switch the texture of a specific object
       */
      virtual void switchTexture( QString /*_textureName*/ , int /*_id*/  ) {};

      /** \brief emit this signal if you want to switch the global texture
       */
      virtual void switchTexture( QString /*_textureName*/ ) {};
122

123
      /** \brief emit this signal if you want to set a special mode for this texture (Clamping,...)
124
       *
125
       *  emit this signal if you want to set a special mode for this texture
126
       *
127 128 129 130 131 132 133 134
       *  Supported Mode Flags :\n
       *  Clamping : clamp=true/false \n
       *  Min Value for clamping  : clamp_min=value \n
       *  Max Value for clamping : clamp_max=value \n
       *  Use only absolute values : abs=true/false \n
       *  repeat texture : repeat=true/false \n
       *  Maximum value for repeat : max_val=value \n
       *  center texture : center=true/false \n
135 136 137 138
       *  Visible name in ui : visiblename=Name  \n
       *  type : the texture coordinate type ( vertexbased:    each vertex has only one texture coordinate ;
       *                                       halfedgebased:  each vertex has a texture coordinate per face;
       *                                       environmentmap: Texturecoords are generated by opengl (sphere map) )
139 140
       *
       *
141 142 143
       *  \n
       * The system works like this :\n
       * First the abolute value of the property is taken if requested. Then this value is clamped against the given values. if the texture
144
       * should be repeated, the values are translated such that the minimum is at zero and than scaled such that the maximum is at
145 146 147 148 149
       * max_val. If its not repeated, the decision is to center the values around 0.5 or not. If not centered, the values are mapped directly
       * to 0..1 .If centered, the negative values are mapped to 0..0.5 and the positive values to 0.5..1.
       *  @param _textureName Name of your Texture
       *  @param _mode colon seperated String describing your settings (e.g. clamp,abs )
      */
Dirk Wilden's avatar
Dirk Wilden committed
150
      virtual void setTextureMode(QString /*_textureName*/ ,QString /*_mode*/) {};
151

Dirk Wilden's avatar
Dirk Wilden committed
152 153 154 155 156 157 158 159 160 161
      /** \brief emit this signal if you want to set a special mode for this texture (Clamping,...)
       *
       * for info about the _mode parameter see setTextureMode(QString,QString)
       *
       *  @param _textureName Name of your Texture
       *  @param _mode colon seperated String describing your settings (e.g. clamp,abs )
       *  @param _id id of an object
       */
      virtual void setTextureMode(QString /*_textureName*/ ,QString /*_mode*/, int /*_id*/ ) {};

162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
      /** \brief Change the texture image of a given texture
       *
       *  @param _textureName The name of the texture which should be changed
       *  @param _image The new image for the texture
       *  @param _id Id of the object where the texture should be changed
       */
      virtual void textureChangeImage( QString /*_textureName*/ , QImage& /*_image*/ , int /*_id*/ ) {};

      /** \brief Change the texture image of a given global texture
       *
       *  @param _textureName The name of the texture which should be changed
       *  @param _image The new image for the texture
       */
      virtual void textureChangeImage( QString /*_textureName*/ , QImage& /*_image*/ ) {};

177 178 179 180 181 182 183 184 185 186 187 188 189 190
      /** \brief get the texture image of a given texture
       *
       *  @param _textureName The name of the texture which should be addressed
       *  @param _image reference to the image for the texture
       *  @param _id Id of the object where the texture should be fetched from
       */
      virtual void textureGetImage( QString /*_textureName*/ , QImage& /*_image*/ , int /*_id*/ ) {};

      /** \brief Get the texture image of a given global texture
       *
       *  @param _textureName The name of the texture which should be addressed
       *  @param _image reference to the image for the texture
       */
      virtual void textureGetImage( QString /*_textureName*/ , QImage& /*_image*/ ) {};
191 192 193 194 195 196 197 198

      /** \brief Get the texture index of a given texture
       *
       *  @param _textureName The name of the texture which should be addressed
       *  @param _id Id of the object where the texture is defined on
       *  @param _index the index of the texture (used for multiTexturing)
       */
      virtual void textureIndex( QString /*_textureName*/, int /*_id*/, int& /*_index*/) {};
199
      
200 201 202 203 204 205 206 207 208
      /** \brief Get the name of the texture index property
       *
       *  Get the name of the property that holds the texture index (face property).
       *
       *  @param _id The id of the mesh object
       *  @param _propertyName The name of the property that holds the texture indices
       */
      virtual void textureIndexPropertyName( int /*_id*/, QString& /*_propertyName*/) {};
      
209 210
       /** \brief get the name of the texture with given texture index
       *
211
       *  When using multiTexturing you can retrieve the texture index of a face with 'mesh.texture_index(Handle)'
212
       *  This function maps the texture index to the name of the actual texture that is used to texture
213 214
       *  the face. Note that some plugins may change the mesh's internal property name for the texture
       *  index such that mesh.texture_index(Handle) won't return a valid texture index.
215 216 217 218 219 220
       *
       *  @param _id Id of the object where the texture should be fetched from
       *  @param _textureIndex texture index of the wanted texture
       *  @param _textureName this returns the name of the texture
       */
      virtual void textureName( int /*_id*/, int /*_textureIndex*/, QString& /*_textureName*/ ) {};
221 222 223 224 225 226 227 228 229 230 231
      
      /** \brief get the filename of the texture with given texture index
       *
       *  Get the filename of a given texture with name _textureName. Retrieve the texture's
       *  name via signal textureName(int,int,QString&) first.
       *
       *  @param _id Id of the object where the texture should be fetched from
       *  @param _textureName The name of the texture whose filename will be fetched
       *  @param _textureFilename this returns the name of the texture
       */
      virtual void textureFilename( int /*_id*/, QString /*_textureName*/, QString& /*_textureFilename*/ ) {};
232

233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
       /** \brief get the name of the texture which is currently enabled
       *
       *  @param _id Id of the object where the current texture should be fetched from
       *  @param _textureName this returns the name of the texture
       */
      virtual void getCurrentTexture( int /*_id*/, QString& /*_textureName*/ ) {};
      
       /** \brief get the names of all sub-textures under the given multiTexture
       *
       *  @param _id Id of the object where the current texture should be fetched from
       *  @param _multiTextureName name of a multi texture
       *  @param _textureName this returns the names of all sub textures that are combined under the given multi texture
       */
      virtual void getSubTextures( int /*_id*/, QString /*_multiTextureName*/, QStringList& /*_subTextures*/ ) {};

248 249
   private slots :
      /** \brief update the texture with the given Name ( if this plugin provides this texture ) for all meshes
250 251 252 253
       *
       * This function is called if the texture of the object is about to be shown and the object has changed
       * since the last rendering of the texture.
       *
254 255 256
       * @param _textureName Name of the Texture to be updated
       * @param _identifier The id of the object to update
      */
Dirk Wilden's avatar
Dirk Wilden committed
257
      virtual void slotUpdateTexture( QString /*_textureName*/ , int /*_identifier*/) {};
258

259 260 261
      /** \brief update all textures provided by this plugin
       */
      virtual void slotUpdateAllTextures( ) {};
262

263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
      /** \brief A texture has been updated
       *
       *  A plugin has updated a Texture
       *  @param _textureName The name of the updated texture
       *  @param _identifier -1 if all objects updated, otherwise the identifier of the object
       */
      virtual void slotTextureUpdated( QString /*_textureName*/ , int /*_identifier*/ ) {};

      /** \brief This slot is called when a plugin requests to switch an objects texture
       *
       * @param _textureName Name of the Texture
       * @param _id id of an object
       */
      virtual void slotSwitchTexture( QString /*_textureName*/, int /*_id*/ ) {};

      /** \brief This slot is called when a plugin requests to switch to a different texture mode
       *
       * @param _textureName Name of the Texture
      */
      virtual void slotSwitchTexture( QString /*_textureName*/ ) {};

   public :

      /// Destructor
      virtual ~TextureInterface() {};

   //===========================================================================
    /** @name Functions handled by textureControlPlugin
     *
     * Normally you dont have to do anything when these functions are called.
     * Texturecontrol handles visualization and updates of textures.
    * @{ */
   //===========================================================================

  private slots :

299 300
      /** \brief A texture has been added by a plugin.
       *
Dirk Wilden's avatar
Dirk Wilden committed
301 302 303 304 305 306 307 308 309 310 311 312 313
       * This slot is called when a texture for a specific object has been added by a plugin.
       *
       * @param _textureName Name of the Added texture (has to be equal to the property name)
       * @param _filename Filename of the Texture Image to be used
       * @param _dimension Dimension of the Texture (currently only 1D and 2D Textures are supported
       * @param _id id of an object
       */
      virtual void slotTextureAdded( QString /*_textureName*/ , QString /*_filename*/ , uint /*_dimension*/, int /*_id*/ ) {};

      /** \brief A texture has been added by a plugin.
       *
       * This slot is called when a global texture has been added by a plugin.
       *
314 315 316 317
       * @param _textureName Name of the Added texture (has to be equal to the property name)
       * @param _filename Filename of the Texture Image to be used
       * @param dimension Dimension of the Texture (currently only 1D and 2D Textures are supported
       */
Dirk Wilden's avatar
Dirk Wilden committed
318
      virtual void slotTextureAdded( QString /*_textureName*/ , QString /*_filename*/ , uint /*dimension*/ ) {};
319

320 321 322 323 324 325 326 327 328 329 330 331
      /** \brief A multiTexture has been added by a plugin.
       *
       * This slot is called when a Multi Texture has been added by a plugin.
       *
       * @param _name Name of the Added texture (has to be equal to the property name)
       * @param _filename Filename of the Texture Image to be used
       * @param _id Id of the object which should use the texture
       * @param _textureId    The new id of the texture( This id is object related!!)
       */
      virtual void slotMultiTextureAdded( QString /*_textureGroup*/ , QString /*_name*/ ,
                                          QString /*_filename*/ , int /*_id*/ , int& /*_textureId*/ ) {};

Dirk Wilden's avatar
Dirk Wilden committed
332 333 334 335 336 337 338 339 340
      /** \brief Texturemode for texture should be changed
       *
       *  A plugin has updated the Texture settings for a texture
       *  @param _textureName The name of the updated texture
       *  @param _mode New mode flags for the given texture
       *  @param _id id of an object
       */
      virtual void slotSetTextureMode(QString /*_textureName*/ ,QString /*_mode*/, int /*_id*/ ) {};

341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
      /** \brief Changes the texture image of a given texture
       *
       *  @param _textureName The name of the texture which should be changed
       *  @param _image The new image for the texture
       *  @param _id Id of the object where the texture should be changed
       */
      virtual void slotTextureChangeImage( QString /*_textureName*/ , QImage& /*_image*/ , int /*_id*/ ) {};

      /** \brief Changes the texture image of a given global texture
       *
       *  @param _textureName The name of the texture which should be changed
       *  @param _image The new image for the texture
       */
      virtual void slotTextureChangeImage( QString /*_textureName*/ , QImage& /*_image*/ ) {};

356
      /** \brief Texturemode for texture should be changed
357
       *
358 359 360 361
       *  A plugin has updated the Texture settings for a texture
       *  @param _textureName The name of the updated texture
       *  @param _mode New mode flags for the given texture
       */
Dirk Wilden's avatar
Dirk Wilden committed
362
      virtual void slotSetTextureMode(QString /*_textureName*/ ,QString /*_mode*/) {};
363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378
      
      /** \brief fetches the texture image of a given texture
       *
       *  @param _textureName The name of the texture which should be addressed
       *  @param _image reference to the image for the texture
       *  @param _id Id of the object where the texture should be fetched from
       */
      virtual void slotTextureGetImage( QString /*_textureName*/ , QImage& /*_image*/ , int /*_id*/ ) {};

      /** \brief fetches the texture image of a given global texture
       *
       *  @param _textureName The name of the texture which should be addressed
       *  @param _image reference to the image for the texture
       */
      virtual void slotTextureGetImage( QString /*_textureName*/ , QImage& /*_image*/ ) {};
      
379 380 381 382 383 384 385 386
      /** \brief Get the texture index of a given texture
       *
       *  @param _textureName The name of the texture which should be addressed
       *  @param _id Id of the object where the texture is defined on
       *  @param _index the index of the texture (used for multiTexturing)
       */
      virtual void slotTextureIndex( QString /*_textureName*/, int /*_id*/, int& /*_index*/) {};
      
387 388 389 390 391 392 393 394 395
      /** \brief Get the name of the texture index property
       *
       *  Get the name of the property that holds the texture index (face property).
       *
       *  @param _id The id of the mesh object
       *  @param _propertyName The name of the property that holds the texture indices
       */
      virtual void slotTextureIndexPropertyName( int /*_id*/, QString& /*_propertyName*/) {};
      
396 397 398 399 400 401 402
       /** \brief get the name of the texture with given texture index
       *
       *  @param _id Id of the object where the texture should be fetched from
       *  @param _textureIndex texture index of the wanted texture
       *  @param _textureName this returns the name of the texture
       */
      virtual void slotTextureName( int /*_id*/, int /*_textureIndex*/, QString& /*_textureName*/ ) {};
403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421
      
      /** \brief get the filename of the texture with given texture name
       *
       *  Get the filename to texture with name _textureName. Retrieve texture names
       *  via signal textureName(int,int,QString&) using the object's id and
       *  the texture index.
       *
       *  @param _id Id of the object where the texture should be fetched from
       *  @param _textureName texture name of the wanted texture
       *  @param _textureFilename this returns the filename of the texture
       */
      virtual void slotTextureFilename( int /*_id*/, QString /*_textureName*/, QString& /*_textureFilename*/ ) {};
      
      /** \brief get the number of textures per object
       *
       *  @param _id Id of the object
       *  @param _numTextures returns the number of textures
       */
      virtual void slotNumberOfTextures( int /*_id*/, int& /*_numTextures*/ ) {};
422

423 424 425 426 427 428 429 430 431 432 433 434 435 436
       /** \brief fetches the name of the texture which is currently enabled
       *
       *  @param _id Id of the object where the current texture should be fetched from
       *  @param _textureName this returns the name of the texture
       */
      virtual void slotGetCurrentTexture( int /*_id*/, QString& /*_textureName*/ ) {};
      
       /** \brief fetches the names of all sub-textures under the given multiTexture
       *
       *  @param _id Id of the object where the current texture should be fetched from
       *  @param _multiTextureName name of a multi texture
       *  @param _textureName this returns the names of all sub textures that are combined under the given multi texture
       */
      virtual void slotGetSubTextures( int /*_id*/, QString /*_multiTextureName*/, QStringList& /*_subTextures*/ ) {};
437

438
   /** @} */
439 440 441
};

Q_DECLARE_INTERFACE(TextureInterface,"OpenFlipper.TextureInterface/1.0")
442

443
#endif // TEXTUREINTERFACE_HH