1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7 /**************************************************************************
8 * Copyright (C) 2009 by Franz Schmid *
9 * franz.schmid@altmuehlnet.de *
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 * This program is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
19 * GNU General Public License for more details. *
20 * *
21 * You should have received a copy of the GNU General Public License *
22 * along with this program; if not, write to the *
23 * Free Software Foundation, Inc., *
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
25 ***************************************************************************/
26
27 #include <osgDB/ReadFile>
28 #include <osgDB/ReaderWriter>
29 #include <osgDB/PluginQuery>
30 #include <osgViewer/Viewer>
31 #include <osgGA/TrackballManipulator>
32 #include <osgUtil/Optimizer>
33 #include <osg/PolygonMode>
34 #include <osg/PolygonOffset>
35 #include <osg/Point>
36 #include <osg/Material>
37 #include <osg/BlendFunc>
38 #include "osgeditor.h"
39 #include "commonstrings.h"
40 #include "sccolorengine.h"
41 #include "ui/customfdialog.h"
42 #include "prefsfile.h"
43 #include "prefsmanager.h"
44 #include "units.h"
45 #include "util.h"
46 #include <QFileDialog>
47 #include <QInputDialog>
48 #include <QColorDialog>
49
OSGEditorDialog(QWidget * parent,PageItem_OSGFrame * frame,QString osgFilterString)50 OSGEditorDialog::OSGEditorDialog(QWidget* parent, PageItem_OSGFrame *frame, QString osgFilterString) : QDialog(parent)
51 {
52 setupUi(this);
53 setModal(true);
54 currItem = frame;
55 filterString = osgFilterString;
56 int wd = 300;
57 int hd = 300;
58 double asp = currItem->width() / currItem->height();
59 if (asp > 1.0)
60 hd = qRound(300 / asp);
61 else
62 wd = qRound(300 * asp);
63 drawingarea->setFixedSize(wd, hd);
64 drawingarea->resize(wd, hd);
65 updateGeometry();
66 viewMap = currItem->viewMap;
67 currentViewName = currItem->currentView;
68 currentView = viewMap[currentViewName];
69 viewCombo->addItems(viewMap.keys());
70 setCurrentComboItem(viewCombo, currentViewName);
71 fovAngle->setValue(30.0);
72 fovAngle->setNewUnit(SC_DEGREES);
73 QPixmap pm(54, 14);
74 pm.fill(currentView.colorAC);
75 buttonACcolor->setIcon(pm);
76 buttonACcolor->setText( QString() );
77 pm.fill(currentView.colorFC);
78 buttonFCcolor->setIcon(pm);
79 buttonFCcolor->setText( QString() );
80 transpSpin->setValue(qRound(currentView.addedTransparency * 100));
81 transpSpin->setDecimals(0);
82 rootnode = new osg::Group;
83 decorator = new osg::Group;
84 if (currItem->fillColor() != CommonStrings::None)
85 {
86 const ScColor& col = currItem->doc()->PageColors[currItem->fillColor()];
87 QColor fillColor = ScColorEngine::getShadeColorProof(col, currItem->doc(), currItem->fillShade());
88 drawingarea->getCamera()->setClearColor(osg::Vec4(fillColor.redF(), fillColor.greenF(), fillColor.blueF(), 0.0));
89 }
90 if (currItem->loadedModel)
91 {
92 loadedModel = currItem->loadedModel;
93 default_stateset = loadedModel->getOrCreateStateSet();
94 usedModel = dynamic_cast<osg::Node*>(loadedModel->clone(osg::CopyOp::DEEP_COPY_ALL));
95 usedModel2 = dynamic_cast<osg::Node*>(loadedModel->clone(osg::CopyOp::DEEP_COPY_ALL));
96 modelFile = currItem->modelFile;
97 renderStyleCombo->setCurrentIndex(currentView.rendermode);
98 lightStyleCombo->setCurrentIndex(currentView.illumination);
99 fovAngle->setValue(currentView.angleFOV);
100 transpSpin->setValue(qRound(currentView.addedTransparency * 100));
101 drawingarea->setCameraManipulator ( new osgGA::TrackballManipulator );
102 rootnode->addChild(usedModel);
103 drawingarea->setSceneData(rootnode);
104 osgGA::TrackballManipulator *trb = dynamic_cast<osgGA::TrackballManipulator*>(drawingarea->getCameraManipulator());
105 trb->setByMatrix(currentView.trackerMatrix);
106 trb->setCenter(currentView.trackerCenter);
107 trb->setDistance(currentView.trackerDist);
108 trb->setTrackballSize(currentView.trackerSize);
109 drawingarea->updateTraversal();
110 double fovy, aspectRatio, zNear, zFar;
111 drawingarea->getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar);
112 drawingarea->getCamera()->setProjectionMatrixAsPerspective(currentView.angleFOV, aspectRatio, zNear, zFar);
113 changeRenderMode(static_cast<int>(currentView.rendermode));
114 drawingarea->updateGL();
115 connect(drawingarea, SIGNAL(mouseMoved()), this, SLOT(reportCamera()));
116 connect(viewCombo, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(changeView(QString)));
117 connect(buttonAddView, SIGNAL(clicked()), this, SLOT(addView()));
118 connect(buttonRemoveView, SIGNAL(clicked()), this, SLOT(removeView()));
119 connect(buttonACcolor, SIGNAL(clicked()), this, SLOT(changeACcolor()));
120 connect(buttonFCcolor, SIGNAL(clicked()), this, SLOT(changeFCcolor()));
121 connect(transpSpin, SIGNAL(valueChanged(double)), this, SLOT(changeTransparency(double)));
122 groupBox_5->setEnabled(true);
123 buttonRemoveView->setEnabled(true);
124 buttonAddView->setEnabled(true);
125 clearButton->setEnabled(true);
126 }
127 else
128 {
129 groupBox_5->setEnabled(false);
130 buttonRemoveView->setEnabled(false);
131 buttonAddView->setEnabled(false);
132 clearButton->setEnabled(false);
133 }
134 connect(fovAngle, SIGNAL(valueChanged(double)), this, SLOT(setCameraValues()));
135 connect(loadButton, SIGNAL(clicked()), this, SLOT(openFile()));
136 connect(clearButton, SIGNAL(clicked()), this, SLOT(clearDisplay()));
137 connect(renderStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeRenderMode(int)));
138 connect(lightStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLightMode(int)));
139 }
140
clearDisplay()141 void OSGEditorDialog::clearDisplay()
142 {
143 disconnect(fovAngle, SIGNAL(valueChanged(double)), this, SLOT(setCameraValues()));
144 disconnect(renderStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeRenderMode(int)));
145 disconnect(lightStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLightMode(int)));
146 disconnect(drawingarea, SIGNAL(mouseMoved()), this, SLOT(reportCamera()));
147 disconnect(viewCombo, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(changeView(QString)));
148 disconnect(buttonAddView, SIGNAL(clicked()), this, SLOT(addView()));
149 disconnect(buttonRemoveView, SIGNAL(clicked()), this, SLOT(removeView()));
150 currentView.trackerCenter = osg::Vec3d();
151 currentView.cameraPosition = osg::Vec3d();
152 currentView.trackerMatrix = osg::Matrixd();
153 rootnode->removeChild(usedModel);
154 if (rootnode->getNumChildren() > 1)
155 {
156 rootnode->removeChild(decorator);
157 decorator->removeChild(usedModel2);
158 }
159 drawingarea->setSceneData(0);
160 loadedModel = 0;
161 usedModel = 0;
162 currentView.angleFOV = 30.0;
163 fovAngle->setValue(currentView.angleFOV);
164 currentView.illumination = PageItem_OSGFrame::Headlamp;
165 currentView.rendermode = PageItem_OSGFrame::Solid;
166 renderStyleCombo->setCurrentIndex(currentView.rendermode);
167 lightStyleCombo->setCurrentIndex(currentView.illumination);
168 modelFile = "";
169 viewMap.clear();
170 currentView.trackerDist = 0.0;
171 currentView.trackerSize = 0.0;
172 viewMap.insert( tr("Default"), currentView);
173 currentViewName = tr("Default");
174 viewCombo->addItems(viewMap.keys());
175 setCurrentComboItem(viewCombo, currentViewName);
176 groupBox_5->setEnabled(false);
177 buttonRemoveView->setEnabled(false);
178 buttonAddView->setEnabled(false);
179 clearButton->setEnabled(false);
180 connect(fovAngle, SIGNAL(valueChanged(double)), this, SLOT(setCameraValues()));
181 connect(renderStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeRenderMode(int)));
182 connect(lightStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLightMode(int)));
183 }
184
setCameraValues()185 void OSGEditorDialog::setCameraValues()
186 {
187 drawingarea->getCamera()->setProjectionMatrixAsPerspective(fovAngle->value(), static_cast<double>(drawingarea->width()) / static_cast<double>(drawingarea->height()), 1.0f, 10000.0f );
188 drawingarea->updateGL();
189 currentView.angleFOV = fovAngle->value();
190 }
191
changeView(QString viewName)192 void OSGEditorDialog::changeView(QString viewName)
193 {
194 disconnect(fovAngle, SIGNAL(valueChanged(double)), this, SLOT(setCameraValues()));
195 disconnect(renderStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeRenderMode(int)));
196 disconnect(lightStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLightMode(int)));
197 disconnect(transpSpin, SIGNAL(valueChanged(double)), this, SLOT(changeTransparency(double)));
198 viewMap[currentViewName] = currentView;
199 currentView = viewMap[viewName];
200 currentViewName = viewName;
201 renderStyleCombo->setCurrentIndex(currentView.rendermode);
202 lightStyleCombo->setCurrentIndex(currentView.illumination);
203 fovAngle->setValue(currentView.angleFOV);
204 transpSpin->setValue(qRound(currentView.addedTransparency * 100));
205 QPixmap pm(54, 14);
206 pm.fill(currentView.colorAC);
207 buttonACcolor->setIcon(pm);
208 buttonACcolor->setText( QString() );
209 pm.fill(currentView.colorFC);
210 buttonFCcolor->setIcon(pm);
211 buttonFCcolor->setText( QString() );
212 osgGA::TrackballManipulator *trb = dynamic_cast<osgGA::TrackballManipulator*>(drawingarea->getCameraManipulator());
213 trb->setByMatrix(currentView.trackerMatrix);
214 trb->setCenter(currentView.trackerCenter);
215 trb->setDistance(currentView.trackerDist);
216 trb->setTrackballSize(currentView.trackerSize);
217 drawingarea->updateTraversal();
218 double fovy, aspectRatio, zNear, zFar;
219 drawingarea->getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar);
220 drawingarea->getCamera()->setProjectionMatrixAsPerspective(currentView.angleFOV, aspectRatio, zNear, zFar);
221 changeRenderMode(static_cast<int>(currentView.rendermode));
222 drawingarea->updateGL();
223 connect(fovAngle, SIGNAL(valueChanged(double)), this, SLOT(setCameraValues()));
224 connect(renderStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeRenderMode(int)));
225 connect(lightStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLightMode(int)));
226 connect(transpSpin, SIGNAL(valueChanged(double)), this, SLOT(changeTransparency(double)));
227 }
228
addView()229 void OSGEditorDialog::addView()
230 {
231 disconnect(viewCombo, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(changeView(QString)));
232 viewMap[currentViewName] = currentView;
233 bool ok;
234 QString newName = currentViewName;
235 while (viewMap.contains(newName))
236 {
237 newName = QInputDialog::getText( this, tr("Add a new View"), tr("Name:"), QLineEdit::Normal, tr("New View"), &ok);
238 }
239 if (ok && !newName.isEmpty())
240 {
241 currentViewName = newName;
242 viewMap.insert(currentViewName, currentView);
243 viewCombo->addItem(currentViewName);
244 setCurrentComboItem(viewCombo, currentViewName);
245 }
246 connect(viewCombo, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(changeView(QString)));
247 }
248
removeView()249 void OSGEditorDialog::removeView()
250 {
251 disconnect(viewCombo, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(changeView(QString)));
252 if (viewMap.size() > 1)
253 {
254 viewMap.remove(currentViewName);
255 viewCombo->clear();
256 QStringList vKey = viewMap.keys();
257 viewCombo->addItems(vKey);
258 currentViewName = vKey[0];
259 setCurrentComboItem(viewCombo, currentViewName);
260 currentView = viewMap[currentViewName];
261 changeView(currentViewName);
262 }
263 connect(viewCombo, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(changeView(QString)));
264 }
265
renameView(QString newName)266 void OSGEditorDialog::renameView(QString newName)
267 {
268 viewMap.remove(currentViewName);
269 currentViewName = newName;
270 viewMap.insert(currentViewName, currentView);
271 }
272
analyse(osg::Node * nd,double transparency)273 void OSGEditorDialog::analyse(osg::Node *nd, double transparency)
274 {
275 osg::Geode *geode = dynamic_cast<osg::Geode *> ( nd );
276 if ( geode )
277 {
278 analyseGeode ( geode, transparency );
279 }
280 else
281 {
282 osg::Group *gp = dynamic_cast<osg::Group *> ( nd );
283 if ( gp )
284 {
285 for ( unsigned int ic=0; ic<gp->getNumChildren(); ic++ )
286 {
287 analyse ( gp->getChild ( ic ), transparency );
288 }
289 }
290 }
291 }
292
analyseGeode(osg::Geode * geode,double transparency)293 void OSGEditorDialog::analyseGeode(osg::Geode *geode, double transparency)
294 {
295 osg::StateAttribute* pRAP;
296 osg::StateSet* theState = geode->getStateSet();
297 if (theState)
298 {
299 pRAP = theState->getAttribute(osg::StateAttribute::MATERIAL);
300 if (pRAP != nullptr)
301 {
302 osg::Material *material = dynamic_cast<osg::Material*>(pRAP);
303 if (material != nullptr)
304 {
305 material->setColorMode(osg::Material::OFF);
306 material->setAlpha(osg::Material::FRONT_AND_BACK, transparency);
307 osg::ref_ptr<osg::BlendFunc> bf = new osg::BlendFunc(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA );
308 theState->setAttributeAndModes(bf);
309 theState->setMode(GL_BLEND,osg::StateAttribute::ON);
310 }
311 }
312 }
313 for ( unsigned int i=0; i<geode->getNumDrawables(); i++ )
314 {
315 osg::Drawable *drawable = geode->getDrawable ( i );
316 if (drawable)
317 {
318 osg::StateSet* theState = drawable->getStateSet();
319 if (theState)
320 {
321 pRAP = theState->getAttribute(osg::StateAttribute::MATERIAL);
322 if (pRAP != nullptr)
323 {
324 osg::Material *material = dynamic_cast<osg::Material*>(pRAP);
325 if (material != nullptr)
326 {
327 material->setColorMode(osg::Material::OFF);
328 material->setAlpha(osg::Material::FRONT_AND_BACK, transparency);
329 }
330 }
331 }
332 }
333 }
334 }
335
changeRenderMode(int mode)336 void OSGEditorDialog::changeRenderMode(int mode)
337 {
338 osg::ref_ptr<osg::StateSet> stateset;
339 osg::ref_ptr<osg::StateSet> stateset2;
340 osg::ref_ptr<osg::Material> material;
341 osg::ref_ptr<osg::Material> material2;
342 osg::ref_ptr<osg::PolygonMode> polymode;
343 osg::ref_ptr<osg::PolygonOffset> polyoffset;
344 osg::ref_ptr<osg::Point> point;
345 osg::ref_ptr<osg::BlendFunc> bf;
346 osg::Vec4 colAC = osg::Vec4(currentView.colorAC.redF(), currentView.colorAC.greenF(), currentView.colorAC.blueF(), 1.0f);
347 osg::Vec4 colFC = osg::Vec4(currentView.colorFC.redF(), currentView.colorFC.greenF(), currentView.colorFC.blueF(), 1.0f);
348 currentView.rendermode = static_cast<PageItem_OSGFrame::RenderType>(mode);
349 stateset = new osg::StateSet;
350 rootnode->removeChild(usedModel);
351 usedModel->releaseGLObjects();
352 usedModel = dynamic_cast<osg::Node*>(loadedModel->clone(osg::CopyOp::DEEP_COPY_ALL));
353 if (rootnode->getNumChildren() > 0)
354 {
355 rootnode->removeChild(decorator);
356 decorator->removeChild(usedModel2);
357 decorator->setStateSet(default_stateset);
358 usedModel2->releaseGLObjects();
359 usedModel2 = dynamic_cast<osg::Node*>(loadedModel->clone(osg::CopyOp::DEEP_COPY_ALL));
360 }
361 rootnode->addChild(usedModel);
362 label->setEnabled(false);
363 buttonACcolor->setEnabled(false);
364 label_2->setEnabled(false);
365 buttonFCcolor->setEnabled(false);
366 label_3->setEnabled(false);
367 transpSpin->setEnabled(false);
368 switch (currentView.rendermode)
369 {
370 case PageItem_OSGFrame::Transparent:
371 analyse(usedModel.get(), currentView.addedTransparency);
372 stateset->setMode(GL_BLEND,osg::StateAttribute::ON);
373 bf = new osg::BlendFunc(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA );
374 stateset->setAttributeAndModes(bf);
375 usedModel.get()->setStateSet(stateset);
376 label_3->setEnabled(true);
377 transpSpin->setEnabled(true);
378 break;
379 case PageItem_OSGFrame::Wireframe:
380 label->setEnabled(true);
381 buttonACcolor->setEnabled(true);
382 polymode = new osg::PolygonMode;
383 material = new osg::Material;
384 polymode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE);
385 stateset->setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
386 stateset->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
387 material->setColorMode(osg::Material::OFF);
388 material->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
389 material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
390 material->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
391 material->setEmission(osg::Material::FRONT_AND_BACK, colAC);
392 stateset->setAttributeAndModes(material,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
393 stateset->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
394 usedModel.get()->setStateSet(stateset);
395 break;
396 case PageItem_OSGFrame::ShadedWireframe:
397 polymode = new osg::PolygonMode;
398 polymode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE);
399 stateset->setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
400 stateset->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
401 stateset->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
402 usedModel.get()->setStateSet(stateset);
403 break;
404 case PageItem_OSGFrame::Vertices:
405 label->setEnabled(true);
406 buttonACcolor->setEnabled(true);
407 polymode = new osg::PolygonMode;
408 material = new osg::Material;
409 polymode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::POINT);
410 stateset->setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
411 point = new osg::Point();
412 point->setSize(3);
413 stateset->setAttribute(point);
414 stateset->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
415 material->setColorMode(osg::Material::OFF);
416 material->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
417 material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
418 material->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
419 material->setEmission(osg::Material::FRONT_AND_BACK, colAC);
420 stateset->setAttributeAndModes(material,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
421 stateset->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
422 usedModel.get()->setStateSet(stateset);
423 break;
424 case PageItem_OSGFrame::ShadedVertices:
425 polymode = new osg::PolygonMode;
426 polymode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::POINT);
427 stateset->setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
428 point = new osg::Point();
429 point->setSize(3);
430 stateset->setAttribute(point);
431 stateset->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
432 stateset->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
433 usedModel.get()->setStateSet(stateset);
434 break;
435 case PageItem_OSGFrame::Illustration:
436 label->setEnabled(true);
437 buttonACcolor->setEnabled(true);
438 label_2->setEnabled(true);
439 buttonFCcolor->setEnabled(true);
440 polymode = new osg::PolygonMode;
441 polyoffset = new osg::PolygonOffset;
442 material = new osg::Material;
443 polyoffset->setFactor(-1.0f);
444 polyoffset->setUnits(-1.0f);
445 polymode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE);
446 stateset->setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
447 stateset->setAttributeAndModes(polyoffset,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
448 stateset->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
449 material->setColorMode(osg::Material::OFF);
450 material->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
451 material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
452 material->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
453 material->setEmission(osg::Material::FRONT_AND_BACK, colAC);
454 stateset->setAttributeAndModes(material,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
455 stateset->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
456 rootnode->insertChild(0, decorator);
457 stateset2 = new osg::StateSet;
458 material2 = new osg::Material;
459 material2->setColorMode(osg::Material::OFF);
460 material2->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
461 material2->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
462 material2->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
463 material2->setEmission(osg::Material::FRONT_AND_BACK, colFC);
464 stateset2->setAttributeAndModes(material2,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
465 stateset2->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
466 decorator->addChild(usedModel2);
467 decorator->setStateSet(stateset2);
468 usedModel.get()->setStateSet(stateset);
469 break;
470 case PageItem_OSGFrame::SolidWireframe:
471 case PageItem_OSGFrame::SolidOutline:
472 case PageItem_OSGFrame::TransparentWireframe:
473 label->setEnabled(true);
474 buttonACcolor->setEnabled(true);
475 if (currentView.rendermode == PageItem_OSGFrame::TransparentWireframe)
476 {
477 label_3->setEnabled(true);
478 transpSpin->setEnabled(true);
479 analyse(usedModel2.get(), currentView.addedTransparency);
480 stateset2 = new osg::StateSet;
481 stateset2->setMode(GL_BLEND,osg::StateAttribute::ON);
482 bf = new osg::BlendFunc(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA );
483 stateset2->setAttributeAndModes(bf);
484 usedModel2.get()->setStateSet(stateset2);
485 }
486 polymode = new osg::PolygonMode;
487 polyoffset = new osg::PolygonOffset;
488 material = new osg::Material;
489 polyoffset->setFactor(-1.0f);
490 polyoffset->setUnits(-1.0f);
491 polymode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE);
492 stateset->setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
493 stateset->setAttributeAndModes(polyoffset,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
494 stateset->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
495 material->setColorMode(osg::Material::OFF);
496 material->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
497 material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
498 material->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
499 material->setEmission(osg::Material::FRONT_AND_BACK, colAC);
500 stateset->setAttributeAndModes(material,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
501 stateset->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
502 rootnode->insertChild(0, decorator);
503 decorator->addChild(usedModel2);
504 usedModel.get()->setStateSet(stateset);
505 break;
506 default:
507 stateset = default_stateset;
508 usedModel.get()->setStateSet(stateset);
509 break;
510 }
511 }
512
changeACcolor()513 void OSGEditorDialog::changeACcolor()
514 {
515 QColor neu = QColor();
516 neu = QColorDialog::getColor(currentView.colorAC, this);
517 if (neu.isValid())
518 {
519 QPixmap pm(54, 14);
520 pm.fill(neu);
521 currentView.colorAC = neu;
522 buttonACcolor->setIcon(pm);
523 changeRenderMode(static_cast<int>(currentView.rendermode));
524 }
525 }
526
changeFCcolor()527 void OSGEditorDialog::changeFCcolor()
528 {
529 QColor neu = QColor();
530 neu = QColorDialog::getColor(currentView.colorAC, this);
531 if (neu.isValid())
532 {
533 QPixmap pm(54, 14);
534 pm.fill(neu);
535 currentView.colorFC = neu;
536 buttonFCcolor->setIcon(pm);
537 changeRenderMode(static_cast<int>(currentView.rendermode));
538 }
539 }
540
changeTransparency(double value)541 void OSGEditorDialog::changeTransparency(double value)
542 {
543 currentView.addedTransparency = value / 100.0;
544 changeRenderMode(static_cast<int>(currentView.rendermode));
545 }
546
changeLightMode(int mode)547 void OSGEditorDialog::changeLightMode(int mode)
548 {
549 currentView.illumination = static_cast<PageItem_OSGFrame::LightType>(mode);
550 }
551
reportCamera()552 void OSGEditorDialog::reportCamera()
553 {
554 disconnect(fovAngle, SIGNAL(valueChanged(double)), this, SLOT(setCameraValues()));
555 osg::Vec3d vecEye, vecCenter, vecUp;
556 drawingarea->getCamera()->getViewMatrixAsLookAt(vecEye, vecCenter, vecUp);
557 currentView.cameraPosition = vecEye;
558 currentView.cameraUp = vecUp;
559 osgGA::TrackballManipulator *trb = dynamic_cast<osgGA::TrackballManipulator*>(drawingarea->getCameraManipulator());
560 currentView.trackerCenter = trb->getCenter();
561 currentView.trackerMatrix = trb->getMatrix();
562 currentView.trackerDist = trb->getDistance();
563 currentView.trackerSize = trb->getTrackballSize();
564 double fovy, aspectRatio, zNear, zFar;
565 drawingarea->getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar);
566 currentView.angleFOV = fovy;
567 fovAngle->setValue(currentView.angleFOV);
568 connect(fovAngle, SIGNAL(valueChanged(double)), this, SLOT(setCameraValues()));
569 }
570
openFile()571 void OSGEditorDialog::openFile()
572 {
573 QString fileName;
574 PrefsContext* dirs = PrefsManager::instance().prefsFile->getContext("dirs");
575 QString wdir = dirs->get("models", ".");
576 CustomFDialog dia(this, wdir, tr("Import 3-D Model"), filterString, fdHidePreviewCheckBox);
577 if (dia.exec() != QDialog::Accepted)
578 return;
579 fileName = dia.selectedFile();
580 if (loadedModel)
581 {
582 if (rootnode->getNumChildren() > 1)
583 {
584 rootnode->removeChild(decorator);
585 decorator->removeChild(usedModel2);
586 }
587 rootnode->removeChild(usedModel);
588 drawingarea->setSceneData(0);
589 loadedModel = 0;
590 usedModel = 0;
591 disconnect(drawingarea, SIGNAL(mouseMoved()), this, SLOT(reportCamera()));
592 disconnect(viewCombo, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(changeView(QString)));
593 disconnect(buttonAddView, SIGNAL(clicked()), this, SLOT(addView()));
594 disconnect(buttonRemoveView, SIGNAL(clicked()), this, SLOT(removeView()));
595 disconnect(buttonACcolor, SIGNAL(clicked()), this, SLOT(changeACcolor()));
596 disconnect(buttonFCcolor, SIGNAL(clicked()), this, SLOT(changeFCcolor()));
597 disconnect(transpSpin, SIGNAL(valueChanged(double)), this, SLOT(changeTransparency(double)));
598 }
599 if (!fileName.isEmpty())
600 {
601 loadedModel = osgDB::readNodeFile ( fileName.toStdString() );
602 if (loadedModel)
603 {
604 osgUtil::Optimizer optimzer;
605 optimzer.optimize(loadedModel);
606 modelFile = fileName;
607 default_stateset = loadedModel->getOrCreateStateSet();
608 usedModel = dynamic_cast<osg::Node*>(loadedModel->clone(osg::CopyOp::DEEP_COPY_ALL));
609 usedModel2 = dynamic_cast<osg::Node*>(loadedModel->clone(osg::CopyOp::DEEP_COPY_ALL));
610 drawingarea->setCameraManipulator ( new osgGA::TrackballManipulator );
611 rootnode->setStateSet(default_stateset);
612 rootnode->addChild(usedModel);
613 drawingarea->setSceneData(rootnode);
614 reportCamera();
615 groupBox_5->setEnabled(true);
616 buttonRemoveView->setEnabled(true);
617 buttonAddView->setEnabled(true);
618 clearButton->setEnabled(true);
619 changeRenderMode(static_cast<int>(currentView.rendermode));
620 connect(drawingarea, SIGNAL(mouseMoved()), this, SLOT(reportCamera()));
621 connect(viewCombo, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(changeView(QString)));
622 connect(buttonAddView, SIGNAL(clicked()), this, SLOT(addView()));
623 connect(buttonRemoveView, SIGNAL(clicked()), this, SLOT(removeView()));
624 connect(buttonACcolor, SIGNAL(clicked()), this, SLOT(changeACcolor()));
625 connect(buttonFCcolor, SIGNAL(clicked()), this, SLOT(changeFCcolor()));
626 connect(transpSpin, SIGNAL(valueChanged(double)), this, SLOT(changeTransparency(double)));
627 }
628 dirs->set("models", fileName.left(fileName.lastIndexOf("/")));
629 }
630 }
631
accept()632 void OSGEditorDialog::accept()
633 {
634 if (loadedModel)
635 {
636 currItem->loadedModel = loadedModel;
637 osg::Vec3d vecEye, vecCenter, vecUp;
638 drawingarea->getCamera()->getViewMatrixAsLookAt(vecEye, vecCenter, vecUp);
639 currentView.cameraPosition = vecEye;
640 currentView.cameraUp = vecUp;
641 osgGA::TrackballManipulator *trb = dynamic_cast<osgGA::TrackballManipulator*>(drawingarea->getCameraManipulator());
642 currentView.trackerCenter = trb->getCenter();
643 currentView.trackerMatrix = trb->getMatrix();
644 currentView.trackerDist = trb->getDistance();
645 currentView.trackerSize = trb->getTrackballSize();
646 double fovy, aspectRatio, zNear, zFar;
647 drawingarea->getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar);
648 currentView.angleFOV = fovy;
649 currentView.illumination = static_cast<PageItem_OSGFrame::LightType>(lightStyleCombo->currentIndex());
650 currentView.rendermode = static_cast<PageItem_OSGFrame::RenderType>(renderStyleCombo->currentIndex());
651 currItem->modelFile = modelFile;
652 QImage image = drawingarea->grabFrameBuffer();
653 currItem->setImage(image);
654 viewMap[currentViewName] = currentView;
655 currItem->viewMap = viewMap;
656 currItem->currentView = currentViewName;
657 }
658 else
659 {
660 currItem->clearContents();
661 }
662 QDialog::accept();
663 }
664