TextureInterface.hh 22.1 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-2014 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 50 51 52 53
 
#if QT_VERSION >= 0x050000 
  #include <QtWidgets>
#else
  #include <QtGui>
#endif

54 55
 #include <QMenuBar>
 #include <OpenFlipper/common/Types.hh>
56

57
 /**
Mike Kremer's avatar
Mike Kremer committed
58 59
  * \brief Provide texture support for a plugin.
  *
60 61
  * 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
62
  * coordinates of the mesh. As other plugins may provide textures to, the visualization of the
63 64 65 66
  * textures is handled by the main application (or a texture control plugin).
 */
class TextureInterface {
   signals :
67

68
      /** \brief Emit this Signal if a texture has been added (Property Name,filename,Dimension)
Dirk Wilden's avatar
Dirk Wilden committed
69 70 71 72
       *
       *  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)
73
       *  @param _filename Filename of the texture (either local in OpenFlippers texture dir or global ( "./Textures/<name>")
Dirk Wilden's avatar
Dirk Wilden committed
74 75 76
       *  @param _dimension 1D texture ( currenty only supports 1 )
       *  @param _id id of an object
       */
77
      virtual void addTexture( QString _name , QString _filename , uint _dimension , int _id ) {};
Dirk Wilden's avatar
Dirk Wilden committed
78 79 80 81

      /** \brief Emit this Signal if a texture has been added (Property Name,filename,Dimension)
       *
       *  Emit this signal if a global texture has been added
82
       *
83
       *  @param  _name Name of the property which contains the tex coords (double or vec2d)
84
       *  @param _filename Filename of the texture (either local in OpenFlippers texture dir or global ( "./Textures/<name>")
85 86
       *  @param _dimension 1D texture ( currenty only supports 1 )
       */
87
      virtual void addTexture( QString _name , QString _filename , uint _dimension ) {};
88

89 90 91
      /** \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
92
       *
93
       *  The first parameter defines a texturegroup which collects all textures
Jan Möbius's avatar
Jan Möbius committed
94 95 96 97
       *  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.
98 99 100 101 102
       *
       *  @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
103
       *  @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).
104
       */
105
      virtual void addMultiTexture( QString _textureGroup , QString _name , QString _filename , int _id , int& _textureId ) {};
106

107 108
      /** \brief Tell Plugins to update the given texture for the given identifier
       */
109
      virtual void updateTexture( QString _textureName  , int _identifier) {};
110

111 112 113
      /** \brief Tell Plugins to update all textures
       */
      virtual void updateAllTextures( ) {};
114 115 116 117

      /** \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
118 119
      */
      virtual void updatedTextures( QString , int ) {};
120

Dirk Wilden's avatar
Dirk Wilden committed
121 122
      /** \brief emit this signal if you want to switch the texture of a specific object
       */
123
      virtual void switchTexture( QString _textureName , int _id  ) {};
Dirk Wilden's avatar
Dirk Wilden committed
124 125 126

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

129
      /** \brief emit this signal if you want to set a special mode for this texture (Clamping,...)
130
       *
131
       *  emit this signal if you want to set a special mode for this texture
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 157
       * The values are modified in the following way:\n
       *
       * First the absolute value of the property is taken if requested:\n
       * abs=true/false \n
       *
       * Then this value is clamped against the given values:\n
       * clamp=true/false \n
       * clamp_min=value \n
       * clamp_max=value \n
       *
       * If the texture should be repeated, the values are translated such that the minimum is at min_val(0.0 by default)
       * and than scaled such that the maximum is at max_val. This data is than passed to the rendering: \n
       * repeat=true/false \n
       * min_val=value \n
       * max_val=value \n
       *
       * If the texture should not be repeated you could choose to center the data around 0.5. The negative values are than mapped to 0..0.5
       * and the positive values to 0.5..1:\n
       * center=true/false\n
       *
       * Otherwise, the values are mapped directly to 0..1. You can also disable that final scaling with:\n
       * scale=true/false\n
       *
       * Examples:\n
       * Pass texture without modification: abs=false,clamp=false,repeat=false,center=false,scale=false\n
158
       *  @param _textureName Name of your Texture
159
       *  @param _mode colon separated String describing your settings (e.g. clamp,abs )
160
      */
161
      virtual void setTextureMode(QString _textureName ,QString _mode) {};
162

Dirk Wilden's avatar
Dirk Wilden committed
163 164 165 166 167
      /** \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
168
       *  @param _mode colon separated String describing your settings (e.g. clamp,abs )
Dirk Wilden's avatar
Dirk Wilden committed
169 170
       *  @param _id id of an object
       */
171
      virtual void setTextureMode(QString _textureName ,QString _mode, int _id ) {};
Dirk Wilden's avatar
Dirk Wilden committed
172

173 174 175 176 177 178
      /** \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
       */
179
      virtual void textureChangeImage( QString _textureName , QImage& _image , int _id ) {};
180 181 182 183 184 185

      /** \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
       */
186
      virtual void textureChangeImage( QString _textureName , QImage& _image ) {};
187

188 189 190 191 192 193
      /** \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
       */
194
      virtual void textureGetImage( QString _textureName , QImage& _image , int _id ) {};
195 196 197 198 199 200

      /** \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
       */
201
      virtual void textureGetImage( QString _textureName , QImage& _image ) {};
202 203 204 205 206 207 208

      /** \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)
       */
209
      virtual void textureIndex( QString _textureName, int _id, int& _index) {};
210
      
211 212 213 214 215 216 217
      /** \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
       */
218
      virtual void textureIndexPropertyName( int _id, QString& _propertyName) {};
219
      
220 221
       /** \brief get the name of the texture with given texture index
       *
222
       *  When using multiTexturing you can retrieve the texture index of a face with 'mesh.texture_index(Handle)'
223
       *  This function maps the texture index to the name of the actual texture that is used to texture
224 225
       *  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.
226 227 228 229 230
       *
       *  @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
       */
231
      virtual void textureName( int _id, int _textureIndex, QString& _textureName ) {};
232 233 234 235 236 237 238 239 240 241
      
      /** \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
       */
242
      virtual void textureFilename( int _id, QString _textureName, QString& _textureFilename ) {};
243

244 245 246 247 248
       /** \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
       */
249
      virtual void getCurrentTexture( int _id, QString& _textureName ) {};
250 251 252 253 254
      
       /** \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
255
       *  @param _subTextures this returns the names of all sub textures that are combined under the given multi texture
256
       */
257
      virtual void getSubTextures( int _id, QString _multiTextureName, QStringList& _subTextures ) {};
258

259 260
   private slots :
      /** \brief update the texture with the given Name ( if this plugin provides this texture ) for all meshes
261 262 263 264
       *
       * 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.
       *
265 266 267
       * @param _textureName Name of the Texture to be updated
       * @param _identifier The id of the object to update
      */
268
      virtual void slotUpdateTexture( QString _textureName , int _identifier) {};
269

270 271 272
      /** \brief update all textures provided by this plugin
       */
      virtual void slotUpdateAllTextures( ) {};
273

274 275 276 277 278 279
      /** \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
       */
280
      virtual void slotTextureUpdated( QString _textureName , int _identifier ) {};
281 282 283 284 285 286

      /** \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
       */
287
      virtual void slotSwitchTexture( QString _textureName, int _id ) {};
288 289 290 291 292

      /** \brief This slot is called when a plugin requests to switch to a different texture mode
       *
       * @param _textureName Name of the Texture
      */
293
      virtual void slotSwitchTexture( QString _textureName ) {};
294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309

   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 :

310 311
      /** \brief A texture has been added by a plugin.
       *
Dirk Wilden's avatar
Dirk Wilden committed
312 313 314 315 316 317 318
       * 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
       */
319
      virtual void slotTextureAdded( QString _textureName , QString _filename , uint _dimension, int _id ) {};
Dirk Wilden's avatar
Dirk Wilden committed
320 321 322 323 324

      /** \brief A texture has been added by a plugin.
       *
       * This slot is called when a global texture has been added by a plugin.
       *
325 326
       * @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
327
       * @param _dimension Dimension of the Texture (currently only 1D and 2D Textures are supported
328
       */
329
      virtual void slotTextureAdded( QString _textureName , QString _filename , uint _dimension ) {};
330

331 332
      /** \brief A multiTexture has been added by a plugin.
       *
333
       * This slot is called when a multi Texture has been added by a plugin.
334
       *
335 336 337 338 339
       * A multi texture has a global name which is defined as the texture group and consists of
       * mutliple sub textures which have their own names but are all used when the group is active.
       *
       * @param _textureGroup Name of the texture group that is associated with the texture.
       * @param _name      Name of the Added texture (has to be equal to the property name)
340 341 342 343
       * @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!!)
       */
344 345
      virtual void slotMultiTextureAdded( QString _textureGroup , QString _name ,
                                          QString _filename , int _id , int& _textureId ) {};
346

Dirk Wilden's avatar
Dirk Wilden committed
347 348 349 350 351 352 353
      /** \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
       */
354
      virtual void slotSetTextureMode(QString _textureName ,QString _mode, int _id ) {};
Dirk Wilden's avatar
Dirk Wilden committed
355

356 357 358 359 360 361
      /** \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
       */
362
      virtual void slotTextureChangeImage( QString _textureName , QImage& _image , int _id ) {};
363 364 365 366 367 368

      /** \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
       */
369
      virtual void slotTextureChangeImage( QString _textureName , QImage& _image ) {};
370

371
      /** \brief Texturemode for texture should be changed
372
       *
373 374 375 376
       *  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
       */
377
      virtual void slotSetTextureMode(QString _textureName ,QString _mode) {};
378 379 380 381 382 383 384
      
      /** \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
       */
385
      virtual void slotTextureGetImage( QString _textureName , QImage& _image , int _id ) {};
386 387 388 389 390 391

      /** \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
       */
392
      virtual void slotTextureGetImage( QString _textureName , QImage& _image ) {};
393
      
394 395 396 397 398 399
      /** \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)
       */
400
      virtual void slotTextureIndex( QString _textureName, int _id, int& _index) {};
401
      
402 403 404 405 406 407 408
      /** \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
       */
409
      virtual void slotTextureIndexPropertyName( int _id, QString& _propertyName) {};
410
      
411 412 413 414 415 416
       /** \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
       */
417
      virtual void slotTextureName( int _id, int _textureIndex, QString& _textureName ) {};
418 419 420 421 422 423 424 425 426 427 428
      
      /** \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
       */
429
      virtual void slotTextureFilename( int _id, QString _textureName, QString& _textureFilename ) {};
430 431 432 433 434 435
      
      /** \brief get the number of textures per object
       *
       *  @param _id Id of the object
       *  @param _numTextures returns the number of textures
       */
436
      virtual void slotNumberOfTextures( int _id, int& _numTextures ) {};
437

438 439 440 441 442
       /** \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
       */
443
      virtual void slotGetCurrentTexture( int _id, QString& _textureName ) {};
444 445 446 447 448
      
       /** \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
449
       *  @param _subTextures this returns the names of all sub textures that are combined under the given multi texture
450
       */
451
      virtual void slotGetSubTextures( int _id, QString _multiTextureName, QStringList& _subTextures ) {};
452

453
   /** @} */
454 455 456
};

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

458
#endif // TEXTUREINTERFACE_HH