textureProperties.cc 16.6 KB
Newer Older
1
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
2
3
*                                                                            *
*                              OpenFlipper                                   *
Martin Schultz's avatar
Martin Schultz committed
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
32
33
34
35
36
37
38
 *           Copyright (c) 2001-2015, RWTH-Aachen University                 *
 *           Department of Computer Graphics and Multimedia                  *
 *                          All rights reserved.                             *
 *                            www.openflipper.org                            *
 *                                                                           *
 *---------------------------------------------------------------------------*
 * This file is part of OpenFlipper.                                         *
 *---------------------------------------------------------------------------*
 *                                                                           *
 * Redistribution and use in source and binary forms, with or without        *
 * modification, are permitted provided that the following conditions        *
 * are met:                                                                  *
 *                                                                           *
 * 1. Redistributions of source code must retain the above copyright notice, *
 *    this list of conditions and the following disclaimer.                  *
 *                                                                           *
 * 2. Redistributions in binary form must reproduce the above copyright      *
 *    notice, this list of conditions and the following disclaimer in the    *
 *    documentation and/or other materials provided with the distribution.   *
 *                                                                           *
 * 3. Neither the name of the copyright holder nor the names of its          *
 *    contributors may be used to endorse or promote products derived from   *
 *    this software without specific prior written permission.               *
 *                                                                           *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       *
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A           *
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  *
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,       *
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR        *
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    *
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING      *
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS        *
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.              *
Jan Möbius's avatar
Jan Möbius committed
39
*                                                                            *
40
41
\*===========================================================================*/

Jan Möbius's avatar
Jan Möbius committed
42

Jan Möbius's avatar
 
Jan Möbius committed
43
44
45
46
47




#include "textureProperties.hh"
48

49
#include <OpenFlipper/common/GlobalOptions.hh>
Jan Möbius's avatar
Jan Möbius committed
50
51
#include <OpenFlipper/common/Types.hh>
#include <ObjectTypes/PolyMesh/PolyMesh.hh>
52
#include "ImageStorage.hh"
Jan Möbius's avatar
Jan Möbius committed
53

Jan Möbius's avatar
Jan Möbius committed
54
55
#include <QMessageBox>

Jan Möbius's avatar
 
Jan Möbius committed
56
57
58
59
texturePropertiesWidget::texturePropertiesWidget(QWidget *parent)
    : QDialog(parent)
{
    setupUi(this);
Jan Möbius's avatar
Jan Möbius committed
60

61
    connect(buttonBox, SIGNAL( clicked(QAbstractButton*) ), this , SLOT ( slotButtonBoxClicked(QAbstractButton*) ) );
Jan Möbius's avatar
Jan Möbius committed
62
63
    connect(textureList, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(textureChanged(QTreeWidgetItem*,int)) );
    connect(textureList, SIGNAL(itemPressed(QTreeWidgetItem*,int)), this, SLOT(textureAboutToChange(QTreeWidgetItem*,int)) );
64
65
66
67
68
69
70
71
72
73
74
75

    //remember changes
    connect(repeatBox, SIGNAL( clicked() ), this , SLOT ( slotPropertiesChanged() ) );
    connect(clampBox, SIGNAL( clicked() ), this , SLOT ( slotPropertiesChanged() ) );
    connect(centerBox, SIGNAL( clicked() ), this , SLOT ( slotPropertiesChanged() ) );
    connect(absBox, SIGNAL( clicked() ), this , SLOT ( slotPropertiesChanged() ) );
    connect(scaleBox, SIGNAL( clicked() ), this , SLOT ( slotPropertiesChanged() ) );

    connect(max_val, SIGNAL( valueChanged(double) ), this , SLOT ( slotPropertiesChanged(double) ) );
    connect(clamp_min, SIGNAL( valueChanged(double) ), this , SLOT ( slotPropertiesChanged(double) ) );
    connect(clamp_max, SIGNAL( valueChanged(double) ), this , SLOT ( slotPropertiesChanged(double) ) );

76
77
    connect(changeImageButton, SIGNAL( clicked() ), this, SLOT( slotChangeImage() ) );

78
79
80

    texData_ = 0;

81
    #ifdef WITH_QWT
Dirk Wilden's avatar
Dirk Wilden committed
82
      QGridLayout* layout = new QGridLayout( originalData);
83

84
      functionPlot_ = new ACG::QwtFunctionPlot(0);
85

86
      layout->addWidget( functionPlot_ , 0,0  );
87

Dirk Wilden's avatar
Dirk Wilden committed
88
    #endif
89
90
91

}

92
93
94
95
96
97
98
void texturePropertiesWidget::show(TextureData* _texData, int _id, QString _name){

  texData_ = _texData;
  id_ = _id;

  textureList->clear();

99
100
  QTreeWidgetItem* activeItem = 0;
  
Jan Möbius's avatar
Jan Möbius committed
101
  for (unsigned int i=0; i < texData_->textures().size(); i++) {
Jan Möbius's avatar
Bugfix    
Jan Möbius committed
102
    if ( ! texData_->textures()[i].hidden() ) {
Jan Möbius's avatar
Jan Möbius committed
103
      if (  texData_->textures()[i].type() != MULTITEXTURE ) {
104
105
106
107
108
109
110
111
112
113
114
115
116
        
        QTreeWidgetItem* item = 0;
        
        if ( !texData_->textures()[i].visibleName().isEmpty() )
          item = new QTreeWidgetItem((QTreeWidget*)0, QStringList( texData_->textures()[i].visibleName() ) );
        else
          item = new QTreeWidgetItem((QTreeWidget*)0, QStringList( texData_->textures()[i].name() ) );
        
        textureList->addTopLevelItem( item );
        
        if (texData_->textures()[i].enabled())
          activeItem = item;
         
Jan Möbius's avatar
Jan Möbius committed
117
      } else {
118
119
120
121
122
123
        QTreeWidgetItem* parent = 0;
        if ( !texData_->textures()[i].visibleName().isEmpty() )
          parent = new QTreeWidgetItem((QTreeWidget*)0, QStringList( texData_->textures()[i].visibleName() ) );
        else
          parent = new QTreeWidgetItem((QTreeWidget*)0, QStringList( texData_->textures()[i].name() ) );

Jan Möbius's avatar
Jan Möbius committed
124
125
126
        textureList->addTopLevelItem( parent ) ;
        for ( int j = 0 ; j < texData_->textures()[i].multiTextureList.size() ; ++j )
          textureList->addTopLevelItem( new QTreeWidgetItem(parent, QStringList(texData_->textures()[i].multiTextureList[j] )) );
127
128
129
        
        if (texData_->textures()[i].enabled())
          activeItem = parent;
Jan Möbius's avatar
Jan Möbius committed
130
131
      }
    }
Jan Möbius's avatar
Jan Möbius committed
132
133
134
135
136
137
138
139
  }

  if ( textureList->invisibleRootItem()->childCount() == 0 )  {
    QMessageBox msgBox(this);
    msgBox.setText("Cannot show Properties. No Textures available!");
    msgBox.exec();
    return;
  }
140
141
142
143
144
145

  if (id_ == -1)
    textureLabel->setText("<B>Global Textures</B>");
  else
    textureLabel->setText("<B>Textures for object '" + _name + "'</B>");

Dirk Wilden's avatar
Dirk Wilden committed
146
147
  propChanged_ = false;

148
149
150
151
152
153
154
155
156
157
  if (activeItem == 0){
    
    textureList->setCurrentItem( textureList->topLevelItem(0) );
    textureChanged( textureList->topLevelItem(0), 0 );
    
  } else {
    textureList->setCurrentItem( activeItem );
    textureChanged( activeItem, 0 );
  }
  
158
159
160
  QDialog::show();
}

Jan Möbius's avatar
Jan Möbius committed
161
void texturePropertiesWidget::textureAboutToChange(QTreeWidgetItem* _item, int _column){
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176

  if (propChanged_){
    QMessageBox msgBox(this);
    msgBox.setText("The properties of the current texture have been changed.");
    msgBox.setInformativeText("Do you want to apply these changes?");
    msgBox.setStandardButtons(QMessageBox::Apply | QMessageBox::Discard );
    msgBox.setDefaultButton(QMessageBox::Apply);
    int ret = msgBox.exec();

    if (ret == QMessageBox::Apply){
      //just hit the applyButton ;)
      for (int i=0; i < buttonBox->buttons().count(); i++)
        if ( buttonBox->standardButton( buttonBox->buttons()[i] ) == QDialogButtonBox::Apply )
          slotButtonBoxClicked( buttonBox->buttons()[i] );

Dirk Wilden's avatar
Dirk Wilden committed
177
      textureList->setCurrentItem( _item );
Jan Möbius's avatar
Jan Möbius committed
178
      textureChanged( _item,_column );
179
180
181
182

    } else {
      propChanged_ = false;

Dirk Wilden's avatar
Dirk Wilden committed
183
      textureList->setCurrentItem( _item );
Jan Möbius's avatar
Jan Möbius committed
184
      textureChanged( _item,_column );
185
186
187
188
    }
  }
}

Jan Möbius's avatar
Jan Möbius committed
189
void texturePropertiesWidget::textureChanged(QTreeWidgetItem* _item, int _column){
190

Jan Möbius's avatar
Jan Möbius committed
191
192
193
  // ================================================================================
  // opened changes for the last texture so switch back
  // ================================================================================
194
  if ( propChanged_ ){
Dirk Wilden's avatar
Dirk Wilden committed
195
    textureList->setCurrentItem( curItem_ );
196
197
198
    return;
  }

Jan Möbius's avatar
Jan Möbius committed
199
200
201
  // ================================================================================
  // Unable to find the right texture
  // ================================================================================
Jan Möbius's avatar
Jan Möbius committed
202
  if ( !texData_->textureExists( _item->text(_column) ) )
Jan Möbius's avatar
Jan Möbius committed
203
    return;
204

Jan Möbius's avatar
Jan Möbius committed
205
206
207
  // ================================================================================
  // Set name of the texture
  // ================================================================================
Jan Möbius's avatar
Jan Möbius committed
208
  textureName_ = _item->text(_column);
209

Jan Möbius's avatar
Jan Möbius committed
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
  // ================================================================================
  // Get Object to parse Properties
  // ================================================================================
//   BaseObjectData* obj;
//   if ( PluginFunctions::getObject(  id_ , obj ) ) {
//     if( obj->dataType( DATA_TRIANGLE_MESH ) ){
//       TriMesh* mesh = PluginFunctions::triMeshObject(obj)->mesh();
//       std::string fprops;
//       mesh->fprop_stats(fprops);
//       QString facePropertyString(fprops.c_str());
//       QStringList faceProperties = facePropertyString.split(QRegExp("\n"));
//
//       std::cerr << "Got : \n" ;
//       for ( int i = 0 ; i < faceProperties.size(); ++i ) {
//         faceProperties[i] = faceProperties[i].trimmed();
//         if ( ( ! faceProperties[i].size() == 0 ) && faceProperties[i] != "<fprop>" )
//           std::cerr << faceProperties[i].toStdString() << std::endl;
//         else
//           continue;
//
//         OpenMesh::FPropHandleT< int > indexPropertyTest;
//         if ( mesh->get_property_handle(indexPropertyTest,faceProperties[i].toStdString()) ) {
//           std::cerr << "Got handle : " << faceProperties[i].toStdString() << std::endl;
//         } else {
//           std::cerr << "Unable to get Handle : " << faceProperties[i].toStdString() << std::endl;
//         }
//       }
//
//     } else if( obj->dataType( DATA_POLY_MESH ) ){
//       PolyMesh* mesh = PluginFunctions::polyMeshObject(obj)->mesh();
//     }
//   }

  // ================================================================================
  // Update the dialog
  // ================================================================================
246
247
248
249
250
251
252
  Texture& texture = texData_->texture(textureName_);

  repeatBox->setChecked(texture.parameters.repeat);
  clampBox->setChecked(texture.parameters.clamp);
  centerBox->setChecked(texture.parameters.center);
  absBox->setChecked(texture.parameters.abs);

253
254
255
  max_val->setValue( texture.parameters.repeatMax );
  clamp_min->setValue( texture.parameters.clampMin );
  clamp_max->setValue( texture.parameters.clampMax );
256

Jan Möbius's avatar
Jan Möbius committed
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
  switch (texture.type()) {
    case MULTITEXTURE:
      typeLabel->setText("Type:   MultiTexture");
      indexLabel->setEnabled(true);
      indexBox->setEnabled(true);
      indexBox->clear();
      indexBox->addItem("TODO");
      break;
    case HALFEDGEBASED:
      typeLabel->setText("Type:   HalfedgeBased");
      indexLabel->setEnabled(false);
      indexBox->setEnabled(false);
      indexBox->clear();
      break;
    case VERTEXBASED:
      typeLabel->setText("Type:   VertexBased");
      indexLabel->setEnabled(false);
      indexBox->setEnabled(false);
      indexBox->clear();
      break;
Jan Möbius's avatar
Jan Möbius committed
277
278
279
280
281
282
    case ENVIRONMENT:
      typeLabel->setText("Type:   Environment Map");
      indexLabel->setEnabled(false);
      indexBox->setEnabled(false);
      indexBox->clear();
      break;
Jan Möbius's avatar
Jan Möbius committed
283
284
285
286
287
288
289
290
    case UNSET:
      typeLabel->setText("Type:   Unset");
      indexLabel->setEnabled(false);
      indexBox->setEnabled(false);
      indexBox->clear();
      break;
  }

291
  // Show the texture Image
292
293
294
295
296
297
298
  bool ok = false;
  imageLabel->setPixmap(QPixmap::fromImage( imageStore().getImage(texture.textureImageId(),&ok) ));

  if ( !ok ) {
    std::cerr<< imageStore().error().toStdString();
  }

299
300
  imageLabel->setScaledContents(true);

301
  if ( texture.filename().startsWith("/") )
302
    fileLabel->setText( "File: " + texture.filename() );
303
  else
304
    fileLabel->setText( "File: " + OpenFlipper::Options::textureDirStr() + QDir::separator() + texture.filename() );
305

306
307
  currentImage_ = texture.filename();

308
  // update plot only when dimension is 1
309
  if ( texture.dimension() == 1 && id_ != -1) {
310

311
    #ifdef WITH_QWT
312

Dirk Wilden's avatar
Dirk Wilden committed
313
      std::vector< double > coords;
314

Dirk Wilden's avatar
Dirk Wilden committed
315
      emit getCoordinates1D(textureName_, id_, coords);
316

317
      if ( ! coords.empty() ){
318

Dirk Wilden's avatar
Dirk Wilden committed
319
        functionPlot_->setFunction( coords );
320

Dirk Wilden's avatar
Dirk Wilden committed
321
322
323
324
325
        functionPlot_->setParameters(repeatBox->isChecked(), max_val->value(),
                                     clampBox->isChecked(),  clamp_min->value(), clamp_max->value(),
                                     centerBox->isChecked(),
                                     absBox->isChecked(),
                                     scaleBox->isChecked());
326

327
328
329
330
331
332
        bool ok = false;
        image_ = imageStore().getImage(texture.textureImageId(),&ok);
        if ( !ok ) {
          std::cerr << imageStore().error().toStdString();
        }

333

Dirk Wilden's avatar
Dirk Wilden committed
334
335
336
        functionPlot_->setImage( &image_ );

        functionPlot_->replot();
337
      }
338

339
340
341
342
    #endif
  }

  propChanged_ = false;
Dirk Wilden's avatar
Dirk Wilden committed
343
  curItem_ = textureList->currentItem();
Jan Möbius's avatar
Jan Möbius committed
344

345
}
346

347
348
void texturePropertiesWidget::slotChangeImage()
{
349

350
351
  QString fileName = QFileDialog::getOpenFileName(this,
                                                  tr("Open Image"),
352
                                                  OpenFlipper::Options::currentTextureDirStr(),
353
                                                  tr("Images (*.png *.xpm *.jpg *.tga *.tif *.tiff *.bmp);;All Files (*.*)"));
354

355
  if (QFile(fileName).exists()) {
356
    QFileInfo fileInfo(fileName);
357
    OpenFlipper::Options::currentTextureDir(fileInfo.absolutePath());
358

359
    imageLabel->setPixmap(fileName);
360
    imageLabel->setScaledContents(true);
361

362
    fileLabel->setText("File: " + fileName);
363
364

    currentImage_ = fileName;
Dirk Wilden's avatar
Dirk Wilden committed
365
    image_ = imageLabel->pixmap()->toImage();
366

Jan Möbius's avatar
Jan Möbius committed
367
    #ifdef WITH_QWT
368
369
      functionPlot_->setImage(&image_);
      functionPlot_->replot();
370
    #endif
Dirk Wilden's avatar
Dirk Wilden committed
371

372
373
    propChanged_ = true;
  }
374
375
376

}

377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
void texturePropertiesWidget::slotButtonBoxClicked(QAbstractButton* _button){

  QDialogButtonBox::StandardButton btn = buttonBox->standardButton(_button);

  if ( btn == QDialogButtonBox::Apply || btn == QDialogButtonBox::Ok){

    //applySettings
    bool changed = false;

    Texture& texture = texData_->texture(textureName_);

    if ( texture.parameters.repeat != repeatBox->isChecked() ){
      texture.parameters.repeat=repeatBox->isChecked();
      changed = true;
    }
    if ( texture.parameters.clamp != clampBox->isChecked() ){
      texture.parameters.clamp=clampBox->isChecked();
      changed = true;
    }
    if ( texture.parameters.center != centerBox->isChecked() ){
      texture.parameters.center=centerBox->isChecked();
      changed = true;
    }
    if ( texture.parameters.abs != absBox->isChecked() ){
      texture.parameters.abs=absBox->isChecked();
      changed = true;
    }
    if ( texture.parameters.scale != scaleBox->isChecked() ){
      texture.parameters.scale=scaleBox->isChecked();
      changed = true;
    }

409
410
    if ( texture.parameters.repeatMax != max_val->value() ){
      texture.parameters.repeatMax = max_val->value();
411
412
413
      changed = true;
    }

414
415
    if ( texture.parameters.clampMin != clamp_min->value() ){
      texture.parameters.clampMin = clamp_min->value();
416
417
418
      changed = true;
    }

419
420
    if ( texture.parameters.clampMax != clamp_max->value() ){
      texture.parameters.clampMax = clamp_max->value();
421
422
423
      changed = true;
    }

424
    if ( texture.filename() != currentImage_ ){
425
      // Set the new filename of the image
426
      texture.filename( currentImage_ );
427
428
429
430

      // Add it to the imagestore and set the index in the texture description
      texture.textureImageId( imageStore().addImageFile(currentImage_) );

431
432
433
      changed = true;
    }

434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
    //inform the plugin about the update
    if (changed)
      emit applyProperties(texData_, textureName_, id_ );

    propChanged_ = false;
  }

  if ( btn == QDialogButtonBox::Apply )
    return;
  else
    hide();
}

void texturePropertiesWidget::slotPropertiesChanged(double /*_value*/){
  propChanged_ = true;
Dirk Wilden's avatar
Dirk Wilden committed
449

Jan Möbius's avatar
Jan Möbius committed
450
  #ifdef WITH_QWT
Dirk Wilden's avatar
Dirk Wilden committed
451
452
453
454
455
456
457
  functionPlot_->setParameters(repeatBox->isChecked(), max_val->value(),
                              clampBox->isChecked(),  clamp_min->value(), clamp_max->value(),
                              centerBox->isChecked(),
                              absBox->isChecked(),
                              scaleBox->isChecked());

  functionPlot_->replot();
458
  #endif
459
}