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>
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.0e-6);
96 QString s = QString::number(d,
'f',5);
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";
127 m_d->simplemode =
false;
129 m_d->theclass =
this;
131 m_d->preview_material = 0;
133 m_d->previewswitch = 0;
137 m_d->lastapplied_ambient = QColor::fromRgbF(0.2,0.2,0.2);
138 m_d->lastapplied_diffuse = QColor::fromRgbF(0.8,0.8,0.8);
139 m_d->lastapplied_specular = Qt::black;
140 m_d->lastapplied_emissive = Qt::black;
141 m_d->lastapplied_shininess = 20;
142 m_d->lastapplied_transparency = 0;
143 m_d->lastapplied_brightness = 0;
145 setAcceptDrops(
true);
153 setUpdatesEnabled(
false);
154 if (
m_d->renderarea) {
155 m_d->renderarea->setAutoRedraw(
false);
156 SoNode * root =
m_d->renderarea->getSceneGraph();
158 m_d->renderarea->setSceneGraph(0);
159 delete m_d->renderarea;
162 delete m_d->editwindow;
176 if (!
m_d->editwindow)
177 m_d->initEditWindow();
178 return *(
m_d->editwindow);
193 m_d->materialtext = ( t.isEmpty() ?
"Edit Material" :
"Edit Material "+t );
195 m_d->editwindow->setWindowTitle(
m_d->materialtext);
196 setToolTip(
m_d->materialtext);
205 theclass->messageVerbose(
"Copied values from material: "
217 theclass->messageVerbose(
" => and updating preview.");
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);
264 m_d->lastapplied_ambient =
m_d->sbcol2qcol(m->ambientColor[0]);
265 m_d->lastapplied_diffuse =
m_d->sbcol2qcol(m->diffuseColor[0]);
266 m_d->lastapplied_specular =
m_d->sbcol2qcol(m->specularColor[0]);
267 m_d->lastapplied_emissive =
m_d->sbcol2qcol(m->emissiveColor[0]);
268 m_d->lastapplied_shininess = new_shininess;
269 m_d->lastapplied_transparency = new_transparency;
270 m_d->lastapplied_brightness = std::max<int>(0,std::min<int>(100,
static_cast<int>(100*
m_d->brightnessEstimateFromDetailedParameters(
m_d->lastapplied_diffuse,
m_d->lastapplied_emissive)+0.5)));
274 m_d->adaptGuiAndMaterialsToLastApplied();
312 theclass->messageVerbose(
"Initialising material editor dialog");
314 editwindow =
new QWidget(0,Qt::WindowStaysOnTopHint);
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);
346 SoSeparator * linesep =
new SoSeparator;
347 SoDrawStyle * linedrawstyle =
new SoDrawStyle;
348 linedrawstyle->style = SoDrawStyleElement::LINES;
349 linedrawstyle->lineWidth = 2;
350 linesep->addChild(linedrawstyle);
351 linesep->addChild(
new SoCube);
356 viewer->setDecoration(
false);
363 renderarea->setBackgroundColor(SbColor(0.0f, 0.0f, 0.0f));
384 theclass->updatePreviewSceneAndBgd();
398 connect(
new QShortcut(QKeySequence(Qt::Key_Escape),
editwindow),
409 bool save = m->enableNotify(
false);
418 m->shininess.setValue(std::max(0.0f,std::min(1.0f,
guiShininess()/100.0f)));
419 m->transparency.setValue(std::max(0.0f,std::min(1.0f,
guiTransparency()/100.0f)));
430 m->enableNotify(
true);
438 if (!m||
m_d->handledmaterials.contains(m))
441 m_d->handledmaterials << m;
442 m_d->applyValuesToMaterial(m);
461 if (!m||!
m_d->handledmaterials.contains(m))
463 m_d->handledmaterials.removeAll(m);
471 for (SoMaterial * m :
m_d->handledmaterials)
473 m_d->handledmaterials.clear();
479 if (!
m_d->editwindow)
481 if (
m_d->preview_material)
482 m_d->applyValuesToMaterial(
m_d->preview_material,
true);
483 m_d->updateApplyResetButtons();
489 if (!
m_d->editwindow||!
m_d->renderarea||!
m_d->previewswitch)
492 if (
m_d->editwindow_ui.radioButton_box->isChecked())
493 m_d->previewswitch->whichChild = 0;
495 m_d->previewswitch->whichChild = (
m_d->editwindow_ui.radioButton_cone->isChecked() ? 1 : 2);
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;
530 return QColor::fromRgbF(std::min(1.0,std::max(0.0,brightness*simpleColour.redF())),
531 std::min(1.0,std::max(0.0,brightness*simpleColour.greenF())),
532 std::min(1.0,std::max(0.0,brightness*simpleColour.blueF())));
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));
599 emit
theclass->lastAppliedChanged();
634 m_d->setLastAppliedFromCurrent();
635 for (SoMaterial * m :
m_d->handledmaterials)
636 m_d->applyValuesToMaterial(m);
643 m_d->adaptGuiAndMaterialsToLastApplied();
649 return m_d->handledmaterials;
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);
686 if (sender()==
m_d->editwindow_ui.slider_simple_transparency) {
687 slider1 =
m_d->editwindow_ui.slider_simple_transparency;
688 slider2 =
m_d->editwindow_ui.slider_transparency;
690 slider1 =
m_d->editwindow_ui.slider_transparency;
691 slider2 =
m_d->editwindow_ui.slider_simple_transparency;
693 bool save = slider2->blockSignals(
true);
694 slider2->setValue(slider1->value());
695 slider2->blockSignals(save);
696 m_d->editwindow_ui.label_num_transparency->setNum(slider1->value());
697 m_d->editwindow_ui.label_num_simple_transparency->setNum(slider1->value());
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);
729 if (brightness<1.0e-4) {
731 }
else if (brightness>(1.0-1.0e-4)) {
747 if (!
m_d->editwindow)
750 const bool new_simplemode = !
m_d->simplemode;
754 m_d->blockGuiSignals(
true);
756 if (new_simplemode) {
760 double brightness =
m_d->brightnessEstimateFromDetailedParameters(
m_d->guiDiffuseColour(),
m_d->guiEmissiveColour());
761 int brightness_i = std::max<int>(0,std::min<int>(100,
static_cast<int>(brightness*100+0.5)));
762 QColor col =
m_d->guiDiffuseColour();
763 m_d->editwindow_ui.colbutton_simple_colour->setColor(col);
764 m_d->editwindow_ui.slider_simple_brightness->setValue(brightness_i);
765 m_d->editwindow_ui.label_num_simple_brightness->setNum(brightness_i);
770 m_d->editwindow_ui.colbutton_ambient->setColor(
m_d->guiAmbientColour());
771 m_d->editwindow_ui.colbutton_diffuse->setColor(
m_d->guiDiffuseColour());
772 m_d->editwindow_ui.colbutton_specular->setColor(
m_d->guiSpecularColour());
773 m_d->editwindow_ui.colbutton_emissive->setColor(
m_d->guiEmissiveColour());
774 m_d->editwindow_ui.slider_shininess->setValue(
m_d->guiShininess());
775 m_d->editwindow_ui.label_num_shininess->setNum(
m_d->guiShininess());
778 m_d->simplemode = new_simplemode;
779 m_d->adaptGuiForMode();
781 m_d->blockGuiSignals(
false);
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);
817 const double r(std::max(0.0,std::min(1.0,in_r)));
818 const double g(std::max(0.0,std::min(1.0,in_g)));
819 const double b(std::max(0.0,std::min(1.0,in_b)));
820 const double brightness(std::max(0.0,std::min(1.0,in_brightness)));
823 m->diffuseColor.setValue(SbColor(
r,g,b));
824 m->emissiveColor.setValue(SbColor(std::max(0.0f,std::min(1.0f,
float(brightness*
r))),
825 std::max(0.0f,std::min(1.0f,
float(brightness*g))),
826 std::max(0.0f,std::min(1.0f,
float(brightness*b)))));
827 m->transparency.setValue(std::max<float>(0.0f,std::min<float>(1.0f,in_transp)));
828 m->shininess.setValue(std::max<float>(0.0f,std::min<float>(1.0f,
Imp::simpleShininess()/100.0f)));
833 m->enableNotify(
true);
842 if (event->button() == Qt::LeftButton)
843 m_d->dragStartPosition =
event->pos();
844 QPushButton::mousePressEvent(event);
850 if (!(event->buttons() & Qt::LeftButton))
852 if ((event->pos() -
m_d->dragStartPosition).manhattanLength()
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);
866 QDataStream out(&buffer);
867 out <<
m_d->lastapplied_ambient;
868 out <<
m_d->lastapplied_diffuse;
869 out <<
m_d->lastapplied_specular;
870 out <<
m_d->lastapplied_emissive;
871 out <<
m_d->lastapplied_shininess;
872 out <<
m_d->lastapplied_transparency;
873 out <<
m_d->lastapplied_brightness;
875 mimeData->setData(
"vp1/material", byteArray);
882 QString s =
"SoMaterial * mat = new SoMaterial;\n";
883 QString str_ambient =
m_d->toSbColTxt(
m_d->lastapplied_ambient);
884 if (str_ambient!=
"SbColor(0.2,0.2,0.2)")
885 s +=
"mat->ambientColor.setValue("+str_ambient+
");\n";
886 QString str_diffuse =
m_d->toSbColTxt(
m_d->lastapplied_diffuse);
887 if (str_diffuse!=
"SbColor(0.8,0.8,0.8)")
888 s +=
"mat->diffuseColor.setValue("+str_diffuse+
");\n";
889 QString str_specular =
m_d->toSbColTxt(
m_d->lastapplied_specular);
890 if (str_specular!=
"SbColor(0,0,0)")
891 s +=
"mat->specularColor.setValue("+str_specular+
");\n";
892 QString str_emissive =
m_d->toSbColTxt(
m_d->lastapplied_emissive);
893 if (str_emissive!=
"SbColor(0,0,0)")
894 s +=
"mat->emissiveColor.setValue("+str_emissive+
");\n";
895 QString str_shininess =
m_d->printFloat(
m_d->lastapplied_shininess/100.0);
896 if (str_shininess!=
"0.2")
897 s +=
"mat->shininess.setValue("+str_shininess+
");\n";
898 QString str_transparency =
m_d->printFloat(
m_d->lastapplied_transparency/100.0);
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();
921 QBuffer buffer(&
data);
922 buffer.open(QIODevice::ReadOnly);
923 QDataStream state(&buffer);
924 state >>
m_d->lastapplied_ambient;
925 state >>
m_d->lastapplied_diffuse;
926 state >>
m_d->lastapplied_specular;
927 state >>
m_d->lastapplied_emissive;
928 state >>
m_d->lastapplied_shininess;
929 state >>
m_d->lastapplied_transparency;
930 state >>
m_d->lastapplied_brightness;
932 m_d->adaptGuiAndMaterialsToLastApplied();
937 serialise.save(
this);
938 return serialise.result();
char data[hepevt_bytes_allocation_ATLAS]
void restore(QCheckBox *sb)
virtual void removeDecorationMenuOption()
virtual void setTransparencyType(SoGLRenderAction::TransparencyType)
void messageVerbose(const QString &) const
void message(const QString &) const
IVP1System * systemBase() const
void messageDebug(const QString &) const
static bool environmentVariableIsOn(const QString &name)
static bool expertSettingIsOn(const QString &type, const QString &name)