24 #include "ui_vp1materialbuttonform.h"
28 #include "Inventor/nodes/SoSwitch.h"
29 #include "Inventor/nodes/SoCube.h"
30 #include "Inventor/nodes/SoCone.h"
31 #include "Inventor/nodes/SoComplexity.h"
32 #include "Inventor/nodes/SoDrawStyle.h"
33 #include "Inventor/nodes/SoMaterial.h"
34 #include <Inventor/nodes/SoSeparator.h>
39 #include <QDataStream>
40 #include <QMouseEvent>
41 #include <QDragEnterEvent>
72 static double distSq(
const QColor&
a,
const QColor&
b);
73 static bool equal(
const QColor&
a,
const QColor&
b,
const double& tol = 1.0
e-6);
97 while (
s.right(1)==
"0"&&
s.contains(
"."))
98 s =
s.left(
s.count()-1);
99 if (
s==
"0.")
return "0";
100 if (
s==
"1.")
return "1";
145 setAcceptDrops(
true);
153 setUpdatesEnabled(
false);
246 message(
"VP1MaterialButton::copyValuesFromMaterial Error: Passed material is null!!");
250 if (
m->ambientColor.getNum()!=1
251 ||
m->diffuseColor.getNum()!=1
252 ||
m->specularColor.getNum()!=1
253 ||
m->emissiveColor.getNum()!=1
254 ||
m->transparency.getNum()!=1
255 ||
m->shininess.getNum()!=1) {
256 message(
"VP1MaterialButton::copyValuesFromMaterial Error: Passed material must have exactly one value in each of the 6 fields!!");
261 int new_shininess =
std::min(
std::max(0,
static_cast<int>(
m->shininess[0]*100.0f+0.5f)),100);
262 int new_transparency =
std::min(
std::max(0,
static_cast<int>(
m->transparency[0]*100.0f+0.5f)),100);
286 if ( (
b&&blockcount==1) || (!
b&&blockcount==0) ) {
287 editwindow_ui.colbutton_ambient->blockSignals(
b);
288 editwindow_ui.colbutton_diffuse->blockSignals(
b);
289 editwindow_ui.colbutton_specular->blockSignals(
b);
290 editwindow_ui.colbutton_emissive->blockSignals(
b);
291 editwindow_ui.slider_shininess->blockSignals(
b);
292 editwindow_ui.colbutton_simple_colour->blockSignals(
b);
293 editwindow_ui.slider_simple_brightness->blockSignals(
b);
294 editwindow_ui.slider_simple_transparency->blockSignals(
b);
295 editwindow_ui.slider_transparency->blockSignals(
b);
296 editwindow_ui.radioButton_cone->blockSignals(
b);
297 editwindow_ui.radioButton_lines->blockSignals(
b);
298 editwindow_ui.radioButton_box->blockSignals(
b);
299 editwindow_ui.pushButton_apply->blockSignals(
b);
300 editwindow_ui.pushButton_reset->blockSignals(
b);
301 editwindow_ui.pushButton_switch_mode->blockSignals(
b);
312 theclass->messageVerbose(
"Initialising material editor dialog");
314 editwindow =
new QWidget(0,Qt::WindowStaysOnTopHint);
315 editwindow_ui.setupUi(editwindow);
316 editwindow_ui.colbutton_ambient->setColor(lastapplied_ambient);
317 editwindow_ui.colbutton_diffuse->setColor(lastapplied_diffuse);
318 editwindow_ui.colbutton_specular->setColor(lastapplied_specular);
319 editwindow_ui.colbutton_emissive->setColor(lastapplied_emissive);
320 editwindow_ui.slider_shininess->setValue(lastapplied_shininess);
321 editwindow_ui.label_num_shininess->setNum(lastapplied_shininess);
322 editwindow_ui.slider_transparency->setValue(lastapplied_transparency);
323 editwindow_ui.slider_simple_transparency->setValue(lastapplied_transparency);
324 editwindow_ui.label_num_transparency->setNum(lastapplied_transparency);
325 editwindow_ui.label_num_simple_transparency->setNum(lastapplied_transparency);
326 editwindow_ui.slider_simple_brightness->setValue(lastapplied_brightness);
327 editwindow_ui.label_num_simple_brightness->setNum(lastapplied_brightness);
328 editwindow_ui.colbutton_simple_colour->setColor(lastapplied_diffuse);
330 #if defined BUILDVP1LIGHT
336 if (!checkDisallowMultipleChannels) {
337 SoSeparator * userroot =
new SoSeparator;
338 SoComplexity * complexity =
new SoComplexity;
339 complexity->value = 1.0;
340 userroot->addChild(complexity);
341 preview_material =
new SoMaterial;
342 userroot->addChild(preview_material);
343 previewswitch =
new SoSwitch;
344 previewswitch->addChild(
new SoCube);
345 previewswitch->addChild(
new SoCone);
346 SoSeparator * linesep =
new SoSeparator;
347 SoDrawStyle * linedrawstyle =
new SoDrawStyle;
349 linedrawstyle->lineWidth = 2;
350 linesep->addChild(linedrawstyle);
351 linesep->addChild(
new SoCube);
352 previewswitch->addChild(linesep);
353 previewswitch->whichChild = 0;
354 userroot->addChild(previewswitch);
356 viewer->setDecoration(
false);
362 renderarea->setSceneGraph(userroot);
363 renderarea->setBackgroundColor(SbColor(0.0
f, 0.0
f, 0.0
f));
369 connect(editwindow_ui.colbutton_ambient,SIGNAL(colorChanged(
const QColor&)),theclass,SLOT(
updatePreview()));
370 connect(editwindow_ui.colbutton_diffuse,SIGNAL(colorChanged(
const QColor&)),theclass,SLOT(
updatePreview()));
371 connect(editwindow_ui.colbutton_specular,SIGNAL(colorChanged(
const QColor&)),theclass,SLOT(
updatePreview()));
372 connect(editwindow_ui.colbutton_emissive,SIGNAL(colorChanged(
const QColor&)),theclass,SLOT(
updatePreview()));
373 connect(editwindow_ui.slider_shininess,SIGNAL(valueChanged(
int)),theclass,SLOT(
updatePreview()));
374 connect(editwindow_ui.colbutton_simple_colour,SIGNAL(colorChanged(
const QColor&)),theclass,SLOT(
updatePreview()));
375 connect(editwindow_ui.slider_simple_brightness,SIGNAL(valueChanged(
int)),theclass,SLOT(
updatePreview()));
380 editwindow_ui.radioButton_cone->setChecked(
true);
382 switchModeBasedOnLastApplied();
384 theclass->updatePreviewSceneAndBgd();
389 theclass->updatePreview();
390 setLastAppliedFromCurrent();
392 connect(editwindow_ui.pushButton_apply,SIGNAL(clicked()),theclass,SLOT(
apply()));
393 connect(editwindow_ui.pushButton_reset,SIGNAL(clicked()),theclass,SLOT(
reset()));
394 connect(editwindow_ui.pushButton_switch_mode,SIGNAL(clicked()),theclass,SLOT(
switchMode()));
398 connect(
new QShortcut(QKeySequence(Qt::Key_Escape), editwindow),
399 SIGNAL(activated()),editwindow,SLOT(hide()));
409 bool save =
m->enableNotify(
false);
414 m->ambientColor.setValue(qcol2sbcol(guiAmbientColour()));
415 m->diffuseColor.setValue(qcol2sbcol(guiDiffuseColour()));
416 m->specularColor.setValue(qcol2sbcol(guiSpecularColour()));
417 m->emissiveColor.setValue(qcol2sbcol(guiEmissiveColour()));
422 m->ambientColor.setValue(qcol2sbcol(lastapplied_ambient));
423 m->diffuseColor.setValue(qcol2sbcol(lastapplied_diffuse));
424 m->specularColor.setValue(qcol2sbcol(lastapplied_specular));
425 m->emissiveColor.setValue(qcol2sbcol(lastapplied_emissive));
430 m->enableNotify(
true);
501 return SbColor(
col.red()/255.0,
col.green()/255.0,
col.blue()/255.0 );
509 return QColor::fromRgbF(
r,
g,
b );
515 const double dRed(
a.redF()-
b.redF());
516 const double dGreen(
a.greenF()-
b.greenF());
517 const double dBlue(
a.blueF()-
b.blueF());
518 return dRed*dRed+dGreen*dGreen+dBlue*dBlue;
524 return a ==
b || distSq(
a,
b) < tol;
530 return QColor::fromRgbF(
std::min(1.0,
std::max(0.0,brightness*simpleColour.redF())),
538 double df_r(diffuseColour.redF()),df_g(diffuseColour.greenF()),df_b(diffuseColour.blueF());
539 double em_r(emissiveColour.redF()),em_g(emissiveColour.greenF()),em_b(emissiveColour.blueF());
540 const double dotp = em_r*df_r + em_g*df_g + em_b*df_b;
541 const double df_mag2 = df_r*df_r + df_g*df_g + df_b*df_b;
542 return std::max<double>(0.0,std::min<double>(100.0,dotp/df_mag2));
548 return simplemode ? simpleAmbient() : editwindow_ui.colbutton_ambient->color();
554 return simplemode ? editwindow_ui.colbutton_simple_colour->color() : editwindow_ui.colbutton_diffuse->color();
560 return simplemode ? simpleSpecular() : editwindow_ui.colbutton_specular->color();
567 return emissiveColourFromSimpleParameters(editwindow_ui.colbutton_simple_colour->color(),editwindow_ui.slider_simple_brightness->value()/100.0);
569 return editwindow_ui.colbutton_emissive->color();
575 return simplemode ? editwindow_ui.slider_transparency->value() : editwindow_ui.slider_simple_transparency->value();
582 return simplemode ? simpleShininess() : editwindow_ui.slider_shininess->value();
590 lastapplied_ambient = guiAmbientColour();
591 lastapplied_diffuse = guiDiffuseColour();
592 lastapplied_specular = guiSpecularColour();
593 lastapplied_emissive = guiEmissiveColour();
594 lastapplied_shininess = guiShininess();
595 lastapplied_transparency = guiTransparency();
596 lastapplied_brightness = std::max<int>(0,std::min<int>(100,
static_cast<int>(100*brightnessEstimateFromDetailedParameters(lastapplied_diffuse,lastapplied_emissive)+0.5)));
597 updateApplyResetButtons();
599 emit theclass->lastAppliedChanged();
608 return (
equal(lastapplied_ambient,guiAmbientColour())
609 &&
equal(lastapplied_diffuse,guiDiffuseColour())
610 &&
equal(lastapplied_specular,guiSpecularColour())
611 &&
equal(lastapplied_emissive,guiEmissiveColour())
612 &&lastapplied_shininess==guiShininess()
613 &&lastapplied_transparency==guiTransparency());
621 if (previewEqualToLastApplied()) {
622 editwindow_ui.pushButton_apply->setEnabled(
false);
623 editwindow_ui.pushButton_reset->setEnabled(
false);
625 editwindow_ui.pushButton_apply->setEnabled(
true);
626 editwindow_ui.pushButton_reset->setEnabled(
true);
656 messageDebug(
"VP1MaterialButton::setText() called (with '"+
s+
"'), but not allowed");
663 if (objectName().isEmpty()){
664 setObjectName(
"VP1MaterialButton");
684 QSlider * slider1(0);
685 QSlider * slider2(0);
693 bool save = slider2->blockSignals(
true);
694 slider2->setValue(slider1->value());
695 slider2->blockSignals(
save);
707 editwindow_ui.stackedWidget->setCurrentWidget(simplemode?editwindow_ui.page_simple:editwindow_ui.page_detailed);
708 editwindow_ui.pushButton_switch_mode->setText(
"&Switch to "+QString(simplemode?
"detailed":
"simple")+
" mode");
710 editwindow_ui.pushButton_switch_mode->setToolTip(
"Switch to detailed material editing for more options.");
712 editwindow_ui.pushButton_switch_mode->setToolTip(
"Switch to a simpler material editing. This might discard some information.");
721 bool lastappliedaresimple(
false);
723 if (lastapplied_shininess==simpleShininess()
724 &&
equal(lastapplied_specular,simpleSpecular())
725 &&
equal(lastapplied_ambient,simpleAmbient())) {
728 double brightness = brightnessEstimateFromDetailedParameters(lastapplied_diffuse,lastapplied_emissive);
729 if (brightness<1.0
e-4) {
730 lastappliedaresimple =
equal(lastapplied_emissive,Qt::black);
731 }
else if (brightness>(1.0-1.0
e-4)) {
732 lastappliedaresimple =
equal(lastapplied_emissive,lastapplied_diffuse);
734 lastappliedaresimple =
equal(lastapplied_emissive,
735 emissiveColourFromSimpleParameters(lastapplied_diffuse, brightness));
739 if (lastappliedaresimple!=simplemode)
740 theclass->switchMode();
756 if (new_simplemode) {
761 int brightness_i = std::max<int>(0,std::min<int>(100,
static_cast<int>(brightness*100+0.5)));
788 SoMaterial *
m =
new SoMaterial;
796 SoMaterial *
m =
new SoMaterial;
809 const double& in_brightness,
const double& in_transp )
815 bool save =
m->enableNotify(
false);
823 m->diffuseColor.setValue(SbColor(
r,
g,
b));
827 m->transparency.setValue(std::max<float>(0.0
f,std::min<float>(1.0
f,in_transp)));
833 m->enableNotify(
true);
842 if (
event->button() == Qt::LeftButton)
844 QPushButton::mousePressEvent(
event);
850 if (!(
event->buttons() & Qt::LeftButton))
853 < QApplication::startDragDistance())
856 QDrag *drag =
new QDrag(
this);
857 QMimeData *mimeData =
new QMimeData;
863 QByteArray byteArray;
864 QBuffer
buffer(&byteArray);
865 buffer.open(QIODevice::WriteOnly);
875 mimeData->setData(
"vp1/material", byteArray);
882 QString
s =
"SoMaterial * mat = new SoMaterial;\n";
884 if (str_ambient!=
"SbColor(0.2,0.2,0.2)")
885 s +=
"mat->ambientColor.setValue("+str_ambient+
");\n";
887 if (str_diffuse!=
"SbColor(0.8,0.8,0.8)")
888 s +=
"mat->diffuseColor.setValue("+str_diffuse+
");\n";
890 if (str_specular!=
"SbColor(0,0,0)")
891 s +=
"mat->specularColor.setValue("+str_specular+
");\n";
893 if (str_emissive!=
"SbColor(0,0,0)")
894 s +=
"mat->emissiveColor.setValue("+str_emissive+
");\n";
896 if (str_shininess!=
"0.2")
897 s +=
"mat->shininess.setValue("+str_shininess+
");\n";
899 if (str_transparency!=
"0")
900 s +=
"mat->transparency.setValue("+str_transparency+
");\n";
901 mimeData->setText(
s);
904 drag->setMimeData(mimeData);
905 drag->exec(Qt::CopyAction | Qt::MoveAction);
911 if (
event->source()!=
this &&
event->mimeData()->hasFormat(
"vp1/material"))
912 event->acceptProposedAction();
918 QByteArray
data =
event->mimeData()->data(
"vp1/material");
919 event->acceptProposedAction();
922 buffer.open(QIODevice::ReadOnly);
923 QDataStream state(&
buffer);