r13874 by fschmid - Updates to the Model/Views Dialog for 3D-Annotations: mimic the display options of Adobe Reader.
scribus-commit
scribus-commit at lists.scribus.net
Wed Aug 26 05:43:25 CEST 2009
Revision: 13874
Author: fschmid
Date: 2009-08-17T12:32:51.428520Z
Commit message: Updates to the Model/Views Dialog for 3D-Annotations: mimic the display options of Adobe Reader.
Changeset:
M /trunk/Scribus/scribus/pdflib_core.cpp
M /trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.cpp
M /trunk/Scribus/scribus/scribusXml.cpp
M /trunk/Scribus/scribus/ui/osgeditor.cpp
M /trunk/Scribus/scribus/pageitem_osgframe.cpp
M /trunk/Scribus/scribus/prc/exportPRC.h
M /trunk/Scribus/scribus/ui/osgeditor.h
M /trunk/Scribus/scribus/pageitem_osgframe.h
M /trunk/Scribus/scribus/pageitem_desaxe.cpp
M /trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
M /trunk/Scribus/scribus/ui/osgeditor.ui
Diffs:
Index: scribus/pdflib_core.cpp
===================================================================
--- scribus/pdflib_core.cpp (revision 13873)
+++ scribus/pdflib_core.cpp (revision 13874)
@@ -5711,7 +5711,12 @@
PutDoc("/MS /M\n");
PutDoc("/C2W ["+osgframe->getPDFMatrix(itv.key())+" ]\n");
PutDoc("/LS << /Subtype /" + lightModes[itv.value().illumination] + " >>\n");
- PutDoc("/RM << /Subtype /" + renderModes[itv.value().rendermode] + " >>\n");
+ PutDoc("/RM\n<<\n");
+ PutDoc("/Subtype /" + renderModes[itv.value().rendermode] + "\n");
+ PutDoc("/AC [/DeviceRGB " + FToStr(itv.value().colorAC.redF()) + " " + FToStr(itv.value().colorAC.greenF()) + " " + FToStr(itv.value().colorAC.blueF()) + "]\n");
+ PutDoc("/FC [/DeviceRGB " + FToStr(itv.value().colorFC.redF()) + " " + FToStr(itv.value().colorFC.greenF()) + " " + FToStr(itv.value().colorFC.blueF()) + "]\n");
+ PutDoc("/O " + FToStr(1.0 - itv.value().addedTransparency) + "\n");
+ PutDoc(">>\n");
PutDoc("/P << /FOV "+FToStr(itv.value().angleFOV)+" /PS /Min /Subtype /P >>\n");
PutDoc("/CO "+FToStr(osgframe->distanceToObj)+"\n");
if (ite->fillColor() != CommonStrings::None)
Index: scribus/pageitem_osgframe.cpp
===================================================================
--- scribus/pageitem_osgframe.cpp (revision 13873)
+++ scribus/pageitem_osgframe.cpp (revision 13874)
@@ -52,6 +52,9 @@
defaultView.trackerSize = 0.0;
defaultView.illumination = Headlamp;
defaultView.rendermode = Solid;
+ defaultView.addedTransparency = 0.5;
+ defaultView.colorAC = QColor(Qt::black);
+ defaultView.colorFC = QColor(Qt::white);
viewMap.insert( tr("Default"), defaultView);
currentView = tr("Default");
loadedModel = NULL;
@@ -123,6 +126,9 @@
defaultView.trackerSize = 0.0;
defaultView.illumination = Headlamp;
defaultView.rendermode = Solid;
+ defaultView.addedTransparency = 0.5;
+ defaultView.colorAC = QColor(Qt::black);
+ defaultView.colorFC = QColor(Qt::white);
viewMap.insert( tr("Default"), defaultView);
currentView = tr("Default");
loadedModel = NULL;
Index: scribus/scribusXml.cpp
===================================================================
--- scribus/scribusXml.cpp (revision 13873)
+++ scribus/scribusXml.cpp (revision 13874)
@@ -1342,6 +1342,9 @@
currentView.trackerSize = attrAsDbl(attrs, "trackerSize", 0.0);
currentView.illumination = static_cast<PageItem_OSGFrame::LightType>(attrAsInt(attrs, "illumination", 1));
currentView.rendermode = static_cast<PageItem_OSGFrame::RenderType>(attrAsInt(attrs, "rendermode", 0));
+ currentView.addedTransparency = attrAsDbl(attrs, "trans", 0.5);
+ currentView.colorAC = QColor(attrAsString(attrs, "colorAC", ""));
+ currentView.colorFC = QColor(attrAsString(attrs, "colorFC", ""));
viewMap.insert(attrAsString(attrs, "viewName", ""), currentView);
}
#endif
@@ -2340,6 +2343,9 @@
writer.writeAttribute("trackerSize", itv.value().trackerSize);
writer.writeAttribute("illumination", itv.value().illumination);
writer.writeAttribute("rendermode", itv.value().rendermode);
+ writer.writeAttribute("trans", itv.value().addedTransparency);
+ writer.writeAttribute("colorAC", itv.value().colorAC.name());
+ writer.writeAttribute("colorFC", itv.value().colorFC.name());
writer.writeEndElement();
}
}
Index: scribus/ui/osgeditor.h
===================================================================
--- scribus/ui/osgeditor.h (revision 13873)
+++ scribus/ui/osgeditor.h (revision 13874)
@@ -33,6 +33,10 @@
#include "scribusdoc.h"
#include "scribus.h"
#include "pageitem_osgframe.h"
+#include <osg/StateSet>
+#include <osg/Group>
+#include <osg/Drawable>
+#include <osg/Geometry>
class SCRIBUS_API OSGEditorDialog : public QDialog, Ui::OSGEditor
{
@@ -50,17 +54,29 @@
void removeView();
void renameView(QString newName);
void changeRenderMode(int mode);
+ void changeACcolor();
+ void changeFCcolor();
+ void changeTransparency(int value);
void changeLightMode(int mode);
void reportCamera();
void openFile();
void accept();
+ private:
+ void analyse(osg::Node *nd, double transparency);
+ void analyseGeode(osg::Geode *geode, double transparency);
+
protected:
PageItem_OSGFrame *currItem;
QHash<QString, PageItem_OSGFrame::viewDefinition> viewMap;
PageItem_OSGFrame::viewDefinition currentView;
QString currentViewName;
+ osg::ref_ptr<osg::Group> rootnode;
+ osg::ref_ptr<osg::Group> decorator;
osg::ref_ptr<osg::Node> loadedModel;
+ osg::ref_ptr<osg::Node> usedModel;
+ osg::ref_ptr<osg::Node> usedModel2;
+ osg::ref_ptr<osg::StateSet> default_stateset;
QString modelFile;
};
Index: scribus/ui/osgeditor.ui
===================================================================
--- scribus/ui/osgeditor.ui (revision 13873)
+++ scribus/ui/osgeditor.ui (revision 13874)
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>552</width>
- <height>380</height>
+ <width>658</width>
+ <height>411</height>
</rect>
</property>
<property name="windowTitle">
@@ -107,6 +107,9 @@
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="spacing">
+ <number>5</number>
+ </property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
@@ -137,6 +140,9 @@
<string>Views</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>5</number>
+ </property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
@@ -163,7 +169,7 @@
<property name="title">
<string>Options</string>
</property>
- <layout class="QGridLayout" name="gridLayout_5">
+ <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_8">
<property name="sizePolicy">
@@ -256,7 +262,107 @@
</item>
</widget>
</item>
- <item row="1" column="0">
+ <item row="1" column="1">
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Line Color:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QPushButton" name="buttonACcolor">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>60</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>60</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Face Color:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QPushButton" name="buttonFCcolor">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>60</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>60</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Opacity:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QSpinBox" name="transpSpin">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="suffix">
+ <string> %</string>
+ </property>
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="singleStep">
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="0">
<widget class="QLabel" name="label_9">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
@@ -269,7 +375,7 @@
</property>
</widget>
</item>
- <item row="1" column="1">
+ <item row="2" column="1">
<widget class="QComboBox" name="lightStyleCombo">
<property name="currentIndex">
<number>1</number>
Index: scribus/ui/osgeditor.cpp
===================================================================
--- scribus/ui/osgeditor.cpp (revision 13873)
+++ scribus/ui/osgeditor.cpp (revision 13874)
@@ -28,6 +28,11 @@
#include <osgViewer/Viewer>
#include <osgGA/TrackballManipulator>
#include <osgUtil/Optimizer>
+#include <osg/PolygonMode>
+#include <osg/PolygonOffset>
+#include <osg/Point>
+#include <osg/Material>
+#include <osg/BlendFunc>
#include "osgeditor.h"
#include "commonstrings.h"
#include "sccolorengine.h"
@@ -38,6 +43,7 @@
#include "util.h"
#include <QFileDialog>
#include <QInputDialog>
+#include <QColorDialog>
OSGEditorDialog::OSGEditorDialog(QWidget* parent, PageItem_OSGFrame *frame) : QDialog(parent)
{
@@ -61,6 +67,16 @@
setCurrentComboItem(viewCombo, currentViewName);
fovAngle->setValue(30.0);
fovAngle->setNewUnit(SC_DEGREES);
+ QPixmap pm(54, 14);
+ pm.fill(currentView.colorAC);
+ buttonACcolor->setIcon(pm);
+ buttonACcolor->setText( QString::null );
+ pm.fill(currentView.colorFC);
+ buttonFCcolor->setIcon(pm);
+ buttonFCcolor->setText( QString::null );
+ transpSpin->setValue(qRound(currentView.addedTransparency * 100));
+ rootnode = new osg::Group;
+ decorator = new osg::Group;
if (currItem->fillColor() != CommonStrings::None)
{
const ScColor& col = currItem->doc()->PageColors[currItem->fillColor()];
@@ -70,12 +86,17 @@
if (currItem->loadedModel)
{
loadedModel = currItem->loadedModel;
+ default_stateset = loadedModel->getOrCreateStateSet();
+ usedModel = dynamic_cast<osg::Node*>(loadedModel->clone(osg::CopyOp::DEEP_COPY_ALL));
+ usedModel2 = dynamic_cast<osg::Node*>(loadedModel->clone(osg::CopyOp::DEEP_COPY_ALL));
modelFile = currItem->modelFile;
renderStyleCombo->setCurrentIndex(currentView.rendermode);
lightStyleCombo->setCurrentIndex(currentView.illumination);
fovAngle->setValue(currentView.angleFOV);
+ transpSpin->setValue(qRound(currentView.addedTransparency * 100));
drawingarea->setCameraManipulator ( new osgGA::TrackballManipulator );
- drawingarea->setSceneData(loadedModel.get());
+ rootnode->addChild(usedModel);
+ drawingarea->setSceneData(rootnode);
osgGA::TrackballManipulator *trb = dynamic_cast<osgGA::TrackballManipulator*>(drawingarea->getCameraManipulator());
trb->setByMatrix(currentView.trackerMatrix);
trb->setCenter(currentView.trackerCenter);
@@ -85,11 +106,15 @@
double fovy, aspectRatio, zNear, zFar;
drawingarea->getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar);
drawingarea->getCamera()->setProjectionMatrixAsPerspective(currentView.angleFOV, aspectRatio, zNear, zFar);
+ changeRenderMode(static_cast<int>(currentView.rendermode));
drawingarea->updateGL();
connect(drawingarea, SIGNAL(mouseMoved()), this, SLOT(reportCamera()));
connect(viewCombo, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(changeView(QString)));
connect(buttonAddView, SIGNAL(clicked()), this, SLOT(addView()));
connect(buttonRemoveView, SIGNAL(clicked()), this, SLOT(removeView()));
+ connect(buttonACcolor, SIGNAL(clicked()), this, SLOT(changeACcolor()));
+ connect(buttonFCcolor, SIGNAL(clicked()), this, SLOT(changeFCcolor()));
+ connect(transpSpin, SIGNAL(valueChanged(int)), this, SLOT(changeTransparency(int)));
groupBox_5->setEnabled(true);
buttonRemoveView->setEnabled(true);
buttonAddView->setEnabled(true);
@@ -121,8 +146,15 @@
currentView.trackerCenter = osg::Vec3d();
currentView.cameraPosition = osg::Vec3d();
currentView.trackerMatrix = osg::Matrixd();
+ rootnode->removeChild(usedModel);
+ if (rootnode->getNumChildren() > 1)
+ {
+ rootnode->removeChild(decorator);
+ decorator->removeChild(usedModel2);
+ }
drawingarea->setSceneData(0);
loadedModel = 0;
+ usedModel = 0;
currentView.angleFOV = 30.0;
fovAngle->setValue(currentView.angleFOV);
currentView.illumination = PageItem_OSGFrame::Headlamp;
@@ -158,12 +190,21 @@
disconnect(fovAngle, SIGNAL(valueChanged(double)), this, SLOT(setCameraValues()));
disconnect(renderStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeRenderMode(int)));
disconnect(lightStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLightMode(int)));
+ disconnect(transpSpin, SIGNAL(valueChanged(int)), this, SLOT(changeTransparency(int)));
viewMap[currentViewName] = currentView;
currentView = viewMap[viewName];
currentViewName = viewName;
renderStyleCombo->setCurrentIndex(currentView.rendermode);
lightStyleCombo->setCurrentIndex(currentView.illumination);
fovAngle->setValue(currentView.angleFOV);
+ transpSpin->setValue(qRound(currentView.addedTransparency * 100));
+ QPixmap pm(54, 14);
+ pm.fill(currentView.colorAC);
+ buttonACcolor->setIcon(pm);
+ buttonACcolor->setText( QString::null );
+ pm.fill(currentView.colorFC);
+ buttonFCcolor->setIcon(pm);
+ buttonFCcolor->setText( QString::null );
osgGA::TrackballManipulator *trb = dynamic_cast<osgGA::TrackballManipulator*>(drawingarea->getCameraManipulator());
trb->setByMatrix(currentView.trackerMatrix);
trb->setCenter(currentView.trackerCenter);
@@ -173,10 +214,12 @@
double fovy, aspectRatio, zNear, zFar;
drawingarea->getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar);
drawingarea->getCamera()->setProjectionMatrixAsPerspective(currentView.angleFOV, aspectRatio, zNear, zFar);
+ changeRenderMode(static_cast<int>(currentView.rendermode));
drawingarea->updateGL();
connect(fovAngle, SIGNAL(valueChanged(double)), this, SLOT(setCameraValues()));
connect(renderStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeRenderMode(int)));
connect(lightStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLightMode(int)));
+ connect(transpSpin, SIGNAL(valueChanged(int)), this, SLOT(changeTransparency(int)));
}
void OSGEditorDialog::addView()
@@ -223,11 +266,280 @@
viewMap.insert(currentViewName, currentView);
}
+void OSGEditorDialog::analyse(osg::Node *nd, double transparency)
+{
+ osg::Geode *geode = dynamic_cast<osg::Geode *> ( nd );
+ if ( geode )
+ {
+ analyseGeode ( geode, transparency );
+ }
+ else
+ {
+ osg::Group *gp = dynamic_cast<osg::Group *> ( nd );
+ if ( gp )
+ {
+ for ( unsigned int ic=0; ic<gp->getNumChildren(); ic++ )
+ {
+ analyse ( gp->getChild ( ic ), transparency );
+ }
+ }
+ }
+}
+
+void OSGEditorDialog::analyseGeode(osg::Geode *geode, double transparency)
+{
+ osg::StateAttribute* pRAP;
+ osg::StateSet* theState = geode->getStateSet();
+ if (theState)
+ {
+ pRAP = theState->getAttribute(osg::StateAttribute::MATERIAL);
+ if (pRAP != NULL)
+ {
+ osg::Material *material = dynamic_cast<osg::Material*>(pRAP);
+ if (material != NULL)
+ {
+ material->setColorMode(osg::Material::OFF);
+ material->setAlpha(osg::Material::FRONT_AND_BACK, transparency);
+ osg::ref_ptr<osg::BlendFunc> bf = new osg::BlendFunc(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA );
+ theState->setAttributeAndModes(bf);
+ theState->setMode(GL_BLEND,osg::StateAttribute::ON);
+ }
+ }
+ }
+ for ( unsigned int i=0; i<geode->getNumDrawables(); i++ )
+ {
+ osg::Drawable *drawable = geode->getDrawable ( i );
+ if (drawable)
+ {
+ osg::StateSet* theState = drawable->getStateSet();
+ if (theState)
+ {
+ pRAP = theState->getAttribute(osg::StateAttribute::MATERIAL);
+ if (pRAP != NULL)
+ {
+ osg::Material *material = dynamic_cast<osg::Material*>(pRAP);
+ if (material != NULL)
+ {
+ material->setColorMode(osg::Material::OFF);
+ material->setAlpha(osg::Material::FRONT_AND_BACK, transparency);
+ }
+ }
+ }
+ }
+ }
+}
+
void OSGEditorDialog::changeRenderMode(int mode)
{
+ osg::ref_ptr<osg::StateSet> stateset;
+ osg::ref_ptr<osg::StateSet> stateset2;
+ osg::ref_ptr<osg::Material> material;
+ osg::ref_ptr<osg::Material> material2;
+ osg::ref_ptr<osg::PolygonMode> polymode;
+ osg::ref_ptr<osg::PolygonOffset> polyoffset;
+ osg::ref_ptr<osg::Point> point;
+ osg::ref_ptr<osg::BlendFunc> bf;
+ osg::Vec4 colAC = osg::Vec4(currentView.colorAC.redF(), currentView.colorAC.greenF(), currentView.colorAC.blueF(), 1.0f);
+ osg::Vec4 colFC = osg::Vec4(currentView.colorFC.redF(), currentView.colorFC.greenF(), currentView.colorFC.blueF(), 1.0f);
currentView.rendermode = static_cast<PageItem_OSGFrame::RenderType>(mode);
+ stateset = new osg::StateSet;
+ rootnode->removeChild(usedModel);
+ usedModel->releaseGLObjects();
+ usedModel = dynamic_cast<osg::Node*>(loadedModel->clone(osg::CopyOp::DEEP_COPY_ALL));
+ if (rootnode->getNumChildren() > 0)
+ {
+ rootnode->removeChild(decorator);
+ decorator->removeChild(usedModel2);
+ decorator->setStateSet(default_stateset);
+ usedModel2->releaseGLObjects();
+ usedModel2 = dynamic_cast<osg::Node*>(loadedModel->clone(osg::CopyOp::DEEP_COPY_ALL));
+ }
+ rootnode->addChild(usedModel);
+ label->setEnabled(false);
+ buttonACcolor->setEnabled(false);
+ label_2->setEnabled(false);
+ buttonFCcolor->setEnabled(false);
+ label_3->setEnabled(false);
+ transpSpin->setEnabled(false);
+ switch (currentView.rendermode)
+ {
+ case PageItem_OSGFrame::Transparent:
+ analyse(usedModel.get(), currentView.addedTransparency);
+ stateset->setMode(GL_BLEND,osg::StateAttribute::ON);
+ bf = new osg::BlendFunc(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA );
+ stateset->setAttributeAndModes(bf);
+ usedModel.get()->setStateSet(stateset);
+ label_3->setEnabled(true);
+ transpSpin->setEnabled(true);
+ break;
+ case PageItem_OSGFrame::Wireframe:
+ label->setEnabled(true);
+ buttonACcolor->setEnabled(true);
+ polymode = new osg::PolygonMode;
+ material = new osg::Material;
+ polymode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE);
+ stateset->setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ stateset->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
+ material->setColorMode(osg::Material::OFF);
+ material->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
+ material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
+ material->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
+ material->setEmission(osg::Material::FRONT_AND_BACK, colAC);
+ stateset->setAttributeAndModes(material,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ stateset->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ usedModel.get()->setStateSet(stateset);
+ break;
+ case PageItem_OSGFrame::ShadedWireframe:
+ polymode = new osg::PolygonMode;
+ polymode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE);
+ stateset->setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ stateset->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
+ stateset->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
+ usedModel.get()->setStateSet(stateset);
+ break;
+ case PageItem_OSGFrame::Vertices:
+ label->setEnabled(true);
+ buttonACcolor->setEnabled(true);
+ polymode = new osg::PolygonMode;
+ material = new osg::Material;
+ polymode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::POINT);
+ stateset->setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ point = new osg::Point();
+ point->setSize(3);
+ stateset->setAttribute(point);
+ stateset->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
+ material->setColorMode(osg::Material::OFF);
+ material->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
+ material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
+ material->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
+ material->setEmission(osg::Material::FRONT_AND_BACK, colAC);
+ stateset->setAttributeAndModes(material,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ stateset->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ usedModel.get()->setStateSet(stateset);
+ break;
+ case PageItem_OSGFrame::ShadedVertices:
+ polymode = new osg::PolygonMode;
+ polymode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::POINT);
+ stateset->setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ point = new osg::Point();
+ point->setSize(3);
+ stateset->setAttribute(point);
+ stateset->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
+ stateset->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
+ usedModel.get()->setStateSet(stateset);
+ break;
+ case PageItem_OSGFrame::Illustration:
+ label->setEnabled(true);
+ buttonACcolor->setEnabled(true);
+ label_2->setEnabled(true);
+ buttonFCcolor->setEnabled(true);
+ polymode = new osg::PolygonMode;
+ polyoffset = new osg::PolygonOffset;
+ material = new osg::Material;
+ polyoffset->setFactor(-1.0f);
+ polyoffset->setUnits(-1.0f);
+ polymode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE);
+ stateset->setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ stateset->setAttributeAndModes(polyoffset,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ stateset->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
+ material->setColorMode(osg::Material::OFF);
+ material->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
+ material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
+ material->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
+ material->setEmission(osg::Material::FRONT_AND_BACK, colAC);
+ stateset->setAttributeAndModes(material,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ stateset->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ rootnode->insertChild(0, decorator);
+ stateset2 = new osg::StateSet;
+ material2 = new osg::Material;
+ material2->setColorMode(osg::Material::OFF);
+ material2->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
+ material2->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
+ material2->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
+ material2->setEmission(osg::Material::FRONT_AND_BACK, colFC);
+ stateset2->setAttributeAndModes(material2,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ stateset2->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ decorator->addChild(usedModel2);
+ decorator->setStateSet(stateset2);
+ usedModel.get()->setStateSet(stateset);
+ break;
+ case PageItem_OSGFrame::SolidWireframe:
+ case PageItem_OSGFrame::SolidOutline:
+ case PageItem_OSGFrame::TransparentWireframe:
+ label->setEnabled(true);
+ buttonACcolor->setEnabled(true);
+ if (currentView.rendermode == PageItem_OSGFrame::TransparentWireframe)
+ {
+ label_3->setEnabled(true);
+ transpSpin->setEnabled(true);
+ analyse(usedModel2.get(), currentView.addedTransparency);
+ stateset2 = new osg::StateSet;
+ stateset2->setMode(GL_BLEND,osg::StateAttribute::ON);
+ bf = new osg::BlendFunc(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA );
+ stateset2->setAttributeAndModes(bf);
+ usedModel2.get()->setStateSet(stateset2);
+ }
+ polymode = new osg::PolygonMode;
+ polyoffset = new osg::PolygonOffset;
+ material = new osg::Material;
+ polyoffset->setFactor(-1.0f);
+ polyoffset->setUnits(-1.0f);
+ polymode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE);
+ stateset->setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ stateset->setAttributeAndModes(polyoffset,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ stateset->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
+ material->setColorMode(osg::Material::OFF);
+ material->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
+ material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
+ material->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0,0.0f,0.0f,1.0f));
+ material->setEmission(osg::Material::FRONT_AND_BACK, colAC);
+ stateset->setAttributeAndModes(material,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ stateset->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
+ rootnode->insertChild(0, decorator);
+ decorator->addChild(usedModel2);
+ usedModel.get()->setStateSet(stateset);
+ break;
+ default:
+ stateset = default_stateset;
+ usedModel.get()->setStateSet(stateset);
+ break;
+ }
}
+void OSGEditorDialog::changeACcolor()
+{
+ QColor neu = QColor();
+ neu = QColorDialog::getColor(currentView.colorAC, this);
+ if (neu.isValid())
+ {
+ QPixmap pm(54, 14);
+ pm.fill(neu);
+ currentView.colorAC = neu;
+ buttonACcolor->setIcon(pm);
+ changeRenderMode(static_cast<int>(currentView.rendermode));
+ }
+}
+
+void OSGEditorDialog::changeFCcolor()
+{
+ QColor neu = QColor();
+ neu = QColorDialog::getColor(currentView.colorAC, this);
+ if (neu.isValid())
+ {
+ QPixmap pm(54, 14);
+ pm.fill(neu);
+ currentView.colorFC = neu;
+ buttonFCcolor->setIcon(pm);
+ changeRenderMode(static_cast<int>(currentView.rendermode));
+ }
+}
+
+void OSGEditorDialog::changeTransparency(int value)
+{
+ currentView.addedTransparency = static_cast<double>(value) / 100.0;
+ changeRenderMode(static_cast<int>(currentView.rendermode));
+}
+
void OSGEditorDialog::changeLightMode(int mode)
{
currentView.illumination = static_cast<PageItem_OSGFrame::LightType>(mode);
@@ -257,13 +569,32 @@
QString fileName;
PrefsContext* dirs = PrefsManager::instance()->prefsFile->getContext("dirs");
QString wdir = dirs->get("models", ".");
- QString docexts("*.ac");
+ QString docexts("*.ac *.osg");
QString filter = tr("All Supported Formats (%1);;All Files (*)").arg(docexts);
CustomFDialog dia(this, wdir, tr("Import 3-D Model"), filter, fdHidePreviewCheckBox);
if (dia.exec() == QDialog::Accepted)
fileName = dia.selectedFile();
else
return;
+ if (loadedModel)
+ {
+ if (rootnode->getNumChildren() > 1)
+ {
+ rootnode->removeChild(decorator);
+ decorator->removeChild(usedModel2);
+ }
+ rootnode->removeChild(usedModel);
+ drawingarea->setSceneData(0);
+ loadedModel = 0;
+ usedModel = 0;
+ disconnect(drawingarea, SIGNAL(mouseMoved()), this, SLOT(reportCamera()));
+ disconnect(viewCombo, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(changeView(QString)));
+ disconnect(buttonAddView, SIGNAL(clicked()), this, SLOT(addView()));
+ disconnect(buttonRemoveView, SIGNAL(clicked()), this, SLOT(removeView()));
+ disconnect(buttonACcolor, SIGNAL(clicked()), this, SLOT(changeACcolor()));
+ disconnect(buttonFCcolor, SIGNAL(clicked()), this, SLOT(changeFCcolor()));
+ disconnect(transpSpin, SIGNAL(valueChanged(int)), this, SLOT(changeTransparency(int)));
+ }
if (!fileName.isEmpty())
{
loadedModel = osgDB::readNodeFile ( fileName.toStdString() );
@@ -272,17 +603,26 @@
osgUtil::Optimizer optimzer;
optimzer.optimize(loadedModel);
modelFile = fileName;
+ default_stateset = loadedModel->getOrCreateStateSet();
+ usedModel = dynamic_cast<osg::Node*>(loadedModel->clone(osg::CopyOp::DEEP_COPY_ALL));
+ usedModel2 = dynamic_cast<osg::Node*>(loadedModel->clone(osg::CopyOp::DEEP_COPY_ALL));
drawingarea->setCameraManipulator ( new osgGA::TrackballManipulator );
- drawingarea->setSceneData(loadedModel.get());
+ rootnode->setStateSet(default_stateset);
+ rootnode->addChild(usedModel);
+ drawingarea->setSceneData(rootnode);
reportCamera();
groupBox_5->setEnabled(true);
buttonRemoveView->setEnabled(true);
buttonAddView->setEnabled(true);
clearButton->setEnabled(true);
+ changeRenderMode(static_cast<int>(currentView.rendermode));
connect(drawingarea, SIGNAL(mouseMoved()), this, SLOT(reportCamera()));
connect(viewCombo, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(changeView(QString)));
connect(buttonAddView, SIGNAL(clicked()), this, SLOT(addView()));
connect(buttonRemoveView, SIGNAL(clicked()), this, SLOT(removeView()));
+ connect(buttonACcolor, SIGNAL(clicked()), this, SLOT(changeACcolor()));
+ connect(buttonFCcolor, SIGNAL(clicked()), this, SLOT(changeFCcolor()));
+ connect(transpSpin, SIGNAL(valueChanged(int)), this, SLOT(changeTransparency(int)));
}
dirs->set("models", fileName.left(fileName.lastIndexOf("/")));
}
Index: scribus/prc/exportPRC.h
===================================================================
--- scribus/prc/exportPRC.h (revision 13873)
+++ scribus/prc/exportPRC.h (revision 13874)
@@ -13,7 +13,7 @@
* *
***************************************************************************/
#ifndef ADAPT_H
-#define ADAPTC_H
+#define ADAPT_H
#include <QtCore>
#include <osg/Vec3>
Index: scribus/pageitem_osgframe.h
===================================================================
--- scribus/pageitem_osgframe.h (revision 13873)
+++ scribus/pageitem_osgframe.h (revision 13874)
@@ -99,6 +99,9 @@
double trackerSize;
LightType illumination;
RenderType rendermode;
+ double addedTransparency;
+ QColor colorAC;
+ QColor colorFC;
};
QHash<QString, viewDefinition> viewMap;
QString currentView;
Index: scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
===================================================================
--- scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp (revision 13873)
+++ scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp (revision 13874)
@@ -1292,6 +1292,9 @@
docu.writeAttribute("trackerSize", itv.value().trackerSize);
docu.writeAttribute("illumination", itv.value().illumination);
docu.writeAttribute("rendermode", itv.value().rendermode);
+ docu.writeAttribute("trans", itv.value().addedTransparency);
+ docu.writeAttribute("colorAC", itv.value().colorAC.name());
+ docu.writeAttribute("colorFC", itv.value().colorFC.name());
docu.writeEndElement();
}
}
Index: scribus/plugins/fileloader/scribus150format/scribus150format.cpp
===================================================================
--- scribus/plugins/fileloader/scribus150format/scribus150format.cpp (revision 13873)
+++ scribus/plugins/fileloader/scribus150format/scribus150format.cpp (revision 13874)
@@ -1832,6 +1832,9 @@
currentView.trackerSize = tAtt.valueAsDouble("trackerSize");
currentView.illumination = static_cast<PageItem_OSGFrame::LightType>(tAtt.valueAsInt("illumination"));
currentView.rendermode = static_cast<PageItem_OSGFrame::RenderType>(tAtt.valueAsInt("rendermode"));
+ currentView.addedTransparency = tAtt.valueAsDouble("trans");
+ currentView.colorAC = QColor(tAtt.valueAsString("colorAC"));
+ currentView.colorFC = QColor(tAtt.valueAsString("colorFC"));
if (newItem->asOSGFrame())
newItem->asOSGFrame()->viewMap.insert(tAtt.valueAsString("viewName"), currentView);
}
Index: scribus/pageitem_desaxe.cpp
===================================================================
--- scribus/pageitem_desaxe.cpp (revision 13873)
+++ scribus/pageitem_desaxe.cpp (revision 13874)
@@ -365,6 +365,9 @@
osg.insert("trackerSize", toXMLString(itv.value().trackerSize));
osg.insert("illumination", toXMLString(itv.value().illumination));
osg.insert("rendermode", toXMLString(itv.value().rendermode));
+ osg.insert("trans", toXMLString(itv.value().addedTransparency));
+ osg.insert("colorAC", toXMLString(itv.value().colorAC.name()));
+ osg.insert("colorFC", toXMLString(itv.value().colorFC.name()));
handler.begin("OSGViews", osg);
handler.end("OSGViews");
}
@@ -416,6 +419,9 @@
defaultView.trackerSize = parseDouble(attr["trackerSize"]);
defaultView.illumination = static_cast<PageItem_OSGFrame::LightType>(parseInt(attr["illumination"]));
defaultView.rendermode = static_cast<PageItem_OSGFrame::RenderType>(parseInt(attr["rendermode"]));
+ defaultView.addedTransparency = parseDouble(attr["trans"]);
+ defaultView.colorAC = QColor(attr["colorAC"]);
+ defaultView.colorFC = QColor(attr["colorFC"]);
QString name = attr["viewName"];
osgframe->viewMap.insert(name, defaultView);
}
More information about the scribus-commit
mailing list