add 'no shading' and 'hidden line' styles

This commit is contained in:
wmayer
2017-03-03 16:41:38 +01:00
parent 81884f787a
commit adca327b34
3 changed files with 87 additions and 5 deletions

View File

@@ -125,6 +125,8 @@
#include <Inventor/draggers/SoCenterballDragger.h>
#include <Inventor/annex/Profiler/SoProfiler.h>
#include <Inventor/elements/SoOverrideElement.h>
#include <Inventor/elements/SoLightModelElement.h>
#include <QGesture>
#include "SoTouchEvents.h"
@@ -351,6 +353,7 @@ View3DInventorViewer::View3DInventorViewer(const QGLFormat& format, QWidget* par
void View3DInventorViewer::init()
{
shading = true;
fpsEnabled = false;
vboEnabled = false;
@@ -707,8 +710,26 @@ void View3DInventorViewer::setOverrideMode(const std::string& mode)
overrideMode = mode;
auto views = getDocument()->getViewProvidersOfType(Gui::ViewProvider::getClassTypeId());
for (auto view : views)
view->setOverrideMode(mode);
if (mode == "No Shading") {
this->shading = false;
std::string flatLines = "Flat Lines";
for (auto view : views)
view->setOverrideMode(flatLines);
this->getSoRenderManager()->setRenderMode(SoRenderManager::AS_IS);
}
else if (mode == "Hidden Line") {
this->shading = true;
std::string shaded = "Shaded";
for (auto view : views)
view->setOverrideMode(shaded);
this->getSoRenderManager()->setRenderMode(SoRenderManager::HIDDEN_LINE);
}
else {
this->shading = true;
for (auto view : views)
view->setOverrideMode(mode);
this->getSoRenderManager()->setRenderMode(SoRenderManager::AS_IS);
}
}
/// update override mode. doesn't affect providers
@@ -965,6 +986,12 @@ void View3DInventorViewer::savePicture(int w, int h, const QColor& bg, QImage& i
root->addChild(cb);
}
if (!this->shading) {
SoLightModel* lm = new SoLightModel;
lm->model = SoLightModel::BASE_COLOR;
root->addChild(lm);
}
root->addChild(getHeadlight());
root->addChild(camera);
SoCallback* gl = new SoCallback;
@@ -1327,6 +1354,10 @@ void View3DInventorViewer::renderToFramebuffer(QGLFramebufferObject* fbo)
uint32_t id = this->getSoRenderManager()->getGLRenderAction()->getCacheContext();
gl.setCacheContext(id);
gl.setTransparencyType(SoGLRenderAction::SORTED_OBJECT_SORTED_TRIANGLE_BLEND);
if (!this->shading) {
SoLightModelElement::set(gl.getState(), selectionRoot, SoLightModelElement::BASE_COLOR);
SoOverrideElement::setLightModelOverride(gl.getState(), selectionRoot, true);
}
gl.apply(this->backgroundroot);
gl.apply(this->getSoRenderManager()->getSceneGraph());
gl.apply(this->foregroundroot);
@@ -1451,13 +1482,20 @@ void View3DInventorViewer::renderScene(void)
// Render our scenegraph with the image.
SoGLRenderAction* glra = this->getSoRenderManager()->getGLRenderAction();
SoGLWidgetElement::set(glra->getState(), qobject_cast<QGLWidget*>(this->getGLWidget()));
SoGLRenderActionElement::set(glra->getState(), glra);
SoGLVBOActivatedElement::set(glra->getState(), this->vboEnabled);
SoState* state = glra->getState();
SoGLWidgetElement::set(state, qobject_cast<QGLWidget*>(this->getGLWidget()));
SoGLRenderActionElement::set(state, glra);
SoGLVBOActivatedElement::set(state, this->vboEnabled);
glra->apply(this->backgroundroot);
navigation->updateAnimation();
if (!this->shading) {
state->push();
SoLightModelElement::set(state, selectionRoot, SoLightModelElement::BASE_COLOR);
SoOverrideElement::setLightModelOverride(state, selectionRoot, true);
}
try {
// Render normal scenegraph.
inherited::actualRedraw();
@@ -1472,6 +1510,10 @@ void View3DInventorViewer::renderScene(void)
QObject::tr("Not enough memory available to display the data."));
}
if (!this->shading) {
state->pop();
}
#if defined (ENABLE_GL_DEPTH_RANGE)
// using 10% of the z-buffer for the foreground node
glDepthRange(0.0,0.1);