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);