diff --git a/BasePlugin/RenderInterface.hh b/BasePlugin/RenderInterface.hh index b967112e390b43ee72d72e0b4b4d81953fba662d..6a342cdc8ceb1be22b6480c625aea6c563a97888 100644 --- a/BasePlugin/RenderInterface.hh +++ b/BasePlugin/RenderInterface.hh @@ -68,15 +68,7 @@ class RenderInterface { private slots: - /** \brief rendering function - * - * Implement this function to render the scene. You have to traverse the - * scenegraph in this function. The glContext is made current before this - * call. - * If you need to initialize something,you can do it within this function. - * gl and glew are already setUp here. - */ - virtual void render(/* Unknow options yet.. to be evaluated*/) {}; + /** \brief announce required draw modes * @@ -88,7 +80,7 @@ class RenderInterface { * * @param _mode Combined list of drawmodes */ - virtual void supportedDrawModes(ACG::SceneGraph::DrawModes::DrawMode& _mode) {}; + virtual void supportedDrawModes(ACG::SceneGraph::DrawModes::DrawMode& _mode) = 0; /** \brief announce name for the rendering function * @@ -97,17 +89,17 @@ class RenderInterface { */ virtual QString rendererName() = 0; - signals: + public slots: - /** \brief register a new rendering function to the core - * - * Emit this signal to register your plugin with a given drawmode. - * Whenever this drawmode is active OpenFlipper will not call its internal - * rendering but your plugins render function. + /** \brief rendering function * - * @param _mode The drawmode for the new rendering function + * Implement this function to render the scene. You have to traverse the + * scenegraph in this function. The glContext is made current before this + * call. + * If you need to initialize something,you can do it within this function. + * gl and glew are already setUp here. */ - virtual void registerRenderingFunction(ACG::SceneGraph::DrawModes::DrawMode _mode) {}; + virtual void render(ACG::GLState* _glState) {}; }; diff --git a/Core/PluginLoader.cc b/Core/PluginLoader.cc index 7e5a20fb015d1f643faf42739173c725c4136e0e..ad23e434df7b8113f71fac48c2c2acd221eec3bc 100644 --- a/Core/PluginLoader.cc +++ b/Core/PluginLoader.cc @@ -1888,8 +1888,6 @@ void Core::loadPlugin(QString filename, bool silent, QString& _licenseErrors, QO // Get the name of the renderer QMetaObject::invokeMethod(plugin,"rendererName", Qt::DirectConnection, Q_RETURN_ARG(QString,rendererNameString) ) ; - std::cerr << rendererNameString.toStdString() << std::endl; - // Check if it already exists and add it if not. RendererInfo* rendererInfo = 0; if ( ! renderManager().rendererExists(rendererNameString) ) { @@ -1900,8 +1898,7 @@ void Core::loadPlugin(QString filename, bool silent, QString& _licenseErrors, QO // Retrieve and store renderer information if ( rendererInfo != 0) { - std::cerr << "Rendererinfo ok" << std::endl; - rendererInfo->plugin = plugin; + rendererInfo->plugin = renderPlugin; ACG::SceneGraph::DrawModes::DrawMode supportedModes; @@ -1929,8 +1926,6 @@ void Core::loadPlugin(QString filename, bool silent, QString& _licenseErrors, QO // Get the name of the PostProcessor QMetaObject::invokeMethod(plugin,"postProcessorName", Qt::DirectConnection, Q_RETURN_ARG(QString,postProcessorNameString) ) ; - std::cerr << postProcessorNameString.toStdString() << std::endl; - // Check if it already exists and add it if not. PostProcessorInfo* postProcessorInfo = 0; if ( ! postProcessorManager().postProcessorExists(postProcessorNameString) ) { @@ -1941,7 +1936,6 @@ void Core::loadPlugin(QString filename, bool silent, QString& _licenseErrors, QO // Retrieve and store PostProcessor information if ( postProcessorInfo != 0) { - std::cerr << "PostProcessor ok" << std::endl; postProcessorInfo->plugin = postProcessorPlugin; } diff --git a/Core/RendererInfo.cc b/Core/RendererInfo.cc index 269e9065b78b4193b83535331e8295f66898241c..9eabab59fb322b818ff282a6bf92fbbb4fce78e5 100644 --- a/Core/RendererInfo.cc +++ b/Core/RendererInfo.cc @@ -61,7 +61,7 @@ RendererInfo::RendererInfo(): { } -RendererInfo::RendererInfo(QObject* _plugin,QString _name) : +RendererInfo::RendererInfo(RenderInterface* _plugin,QString _name) : plugin(_plugin), name(_name) { diff --git a/Core/RendererInfo.hh b/Core/RendererInfo.hh index be2f1bdab2b482786b8a8587bd7a5e7fabb90bc6..ab86bda7618be75ff02c12409e2ce4bc610f2fab 100644 --- a/Core/RendererInfo.hh +++ b/Core/RendererInfo.hh @@ -48,6 +48,7 @@ #include #include #include +#include #include @@ -58,10 +59,10 @@ class RendererInfo{ RendererInfo(); - RendererInfo(QObject* _plugin,QString _name); + RendererInfo(RenderInterface* _plugin,QString _name); /// Pointer to the loaded plugin (Already casted when loading it) - QObject* plugin; + RenderInterface* plugin; /// Name of the plugin ( requested from the plugin on load) QString name; diff --git a/widgets/coreWidget/ContextMenu.cc b/widgets/coreWidget/ContextMenu.cc index 6c4116bb9dbcffceb1ef29f2e2d41b7e5d06466c..8cbb44a4e4ecb1c5433f070523061de43dd79e4b 100644 --- a/widgets/coreWidget/ContextMenu.cc +++ b/widgets/coreWidget/ContextMenu.cc @@ -212,6 +212,42 @@ void CoreWidget::updatePopupMenuCoordsysNode(QMenu* _menu , const int /*_part*/ mipmapping->setChecked( PluginFunctions::viewerProperties().mipmapping() ); connect(mipmapping, SIGNAL(triggered(bool)), this , SLOT( slotLocalChangeMipmapping(bool) ) ); + //============================================================================================================ + // Renderer Menu + //============================================================================================================ + + if ( renderManager().available() > 1 ) { + QMenu* rendererMenu = new QMenu(tr("Renderers"),_menu); + + _menu->addMenu(rendererMenu); + + // Recreate actionGroup + QActionGroup* groupRenderer = new QActionGroup( this ); + groupRenderer->setExclusive( true ); + + for ( unsigned int i = 0 ; i < renderManager().available() ; ++i) { + + // Add a new Action with the renderer name + QAction * action = new QAction( renderManager()[i]->name, groupRenderer ); + action->setCheckable( true ); + + // Check if this processor is currently active + if ( renderManager().activeId(PluginFunctions::activeExaminer() ) == i ) + action->setChecked(true); + + // Remember the id for the processor + action->setData(QVariant(i)); + } + + // Add all new actions from the group to the menu + rendererMenu->addActions( groupRenderer->actions() ); + + // Connect signal of group to our managing slot + connect( groupRenderer , SIGNAL( triggered( QAction * ) ), + this , SLOT( slotRenderMenu( QAction * ) ) ); + + } + //============================================================================================================ // Post processor Menu //============================================================================================================ @@ -855,4 +891,9 @@ void CoreWidget::slotPostProcessorMenu( QAction * _action) { postProcessorManager().setActive(mode,PluginFunctions::activeExaminer()); } +void CoreWidget::slotRenderMenu( QAction * _action) { + unsigned int mode = _action->data().toUInt(); + renderManager().setActive(mode,PluginFunctions::activeExaminer()); +} + //============================================================================= diff --git a/widgets/coreWidget/CoreWidget.hh b/widgets/coreWidget/CoreWidget.hh index 8a4253eab2506071ee2c86e6f34c77bf7fd1b7c6..7eb0d763400f97ca49a475bdbc9ac93fefc7d0af 100644 --- a/widgets/coreWidget/CoreWidget.hh +++ b/widgets/coreWidget/CoreWidget.hh @@ -848,6 +848,9 @@ public: /// Called when a different post processor has been chosen void slotPostProcessorMenu( QAction * _action); + /// Called when a different renderer has been chosen + void slotRenderMenu( QAction * _action); + /// Creates a draw Menu for the currently active Viewer void slotUpdateViewerDrawMenu(); diff --git a/widgets/glWidget/QtBaseViewer.cc b/widgets/glWidget/QtBaseViewer.cc index 1b7840f729d4ebac691112a11efbb7eba315a0be..9c692a0028293fff7891a9f02b80cf601ab2b323 100644 --- a/widgets/glWidget/QtBaseViewer.cc +++ b/widgets/glWidget/QtBaseViewer.cc @@ -597,8 +597,14 @@ void glViewer::drawScene() std::cerr << "Active postprocessor: " << postProcessorManager().active()->name.toStdString() << std::endl; */ - if (stereo_) drawScene_stereo(); - else drawScene_mono(); + + // Check if we use build in default renderers + if ( renderManager().activeId( properties_.viewerId() ) == 0 ) { + if (stereo_) drawScene_stereo(); + else drawScene_mono(); + } else { + renderManager().active( properties_.viewerId() )->plugin->render(glstate_); + } if ( postProcessorManager().activeId( properties_.viewerId() ) != 0 ) {