From 9f27e691c14e2625597743c9a935d24e9d8ef542 Mon Sep 17 00:00:00 2001 From: Pierre Kraemer Date: Fri, 25 Jan 2013 17:40:15 +0100 Subject: [PATCH] SCHNApps: several updates about signals management --- SCHNApps/Debug/CMakeLists.txt | 1 + .../include/differentialProperties.h | 4 + .../src/computeCurvatureDialog.cpp | 5 + .../Plugins/importSurface/importSurface.h | 4 + .../Plugins/importVolume/importVolume.cpp | 47 +-- SCHNApps/Plugins/importVolume/importVolume.h | 10 +- SCHNApps/Plugins/render/render.cpp | 299 +++++++++++++----- SCHNApps/Plugins/render/render.h | 18 +- SCHNApps/Plugins/render/render.ui | 34 +- .../Plugins/renderVector/renderVector.cpp | 178 +++++++---- SCHNApps/Plugins/renderVector/renderVector.h | 16 +- SCHNApps/Plugins/renderVector/renderVector.ui | 16 - .../include/subdivideSurface.h | 4 + SCHNApps/Release/CMakeLists.txt | 1 + SCHNApps/include/mapHandler.h | 20 +- SCHNApps/include/plugin.h | 9 +- SCHNApps/include/window.h | 15 +- SCHNApps/src/mapHandler.cpp | 7 +- SCHNApps/src/window.cpp | 20 +- include/Algo/Geometry/curvature.hpp | 31 +- 20 files changed, 477 insertions(+), 262 deletions(-) diff --git a/SCHNApps/Debug/CMakeLists.txt b/SCHNApps/Debug/CMakeLists.txt index 82af1737..b8a2adca 100644 --- a/SCHNApps/Debug/CMakeLists.txt +++ b/SCHNApps/Debug/CMakeLists.txt @@ -37,6 +37,7 @@ file( SET(SCHNApps_H_OBJECT_FILES ${SCHNApps_ROOT_DIR}/include/view.h ${SCHNApps_ROOT_DIR}/include/window.h + ${SCHNApps_ROOT_DIR}/include/mapHandler.h ${SCHNApps_ROOT_DIR}/include/viewButtonArea.h ${SCHNApps_ROOT_DIR}/include/dialogs/camerasDialog.h ${SCHNApps_ROOT_DIR}/include/dialogs/pluginsDialog.h diff --git a/SCHNApps/Plugins/differentialProperties/include/differentialProperties.h b/SCHNApps/Plugins/differentialProperties/include/differentialProperties.h index 44f51eaa..db664a0d 100644 --- a/SCHNApps/Plugins/differentialProperties/include/differentialProperties.h +++ b/SCHNApps/Plugins/differentialProperties/include/differentialProperties.h @@ -37,6 +37,10 @@ public: virtual void mouseMove(View* view, int buttons, int x, int y) {} virtual void wheelEvent(View* view, int delta, int x, int y) {} + virtual void viewLinked(View* view) {} + virtual void viewUnlinked(View* view) {} + virtual void currentViewChanged(View* view) {} + public slots: void openComputeNormalDialog(); void openComputeCurvatureDialog(); diff --git a/SCHNApps/Plugins/differentialProperties/src/computeCurvatureDialog.cpp b/SCHNApps/Plugins/differentialProperties/src/computeCurvatureDialog.cpp index ac03f88d..4f4e7d64 100644 --- a/SCHNApps/Plugins/differentialProperties/src/computeCurvatureDialog.cpp +++ b/SCHNApps/Plugins/differentialProperties/src/computeCurvatureDialog.cpp @@ -37,6 +37,11 @@ void ComputeCurvatureDialog::selectedMapChanged() { combo_positionAttribute->clear(); combo_normalAttribute->clear(); + combo_KmaxAttribute->clear(); + combo_KminAttribute->clear(); + combo_KnormalAttribute->clear(); + combo_kmaxAttribute->clear(); + combo_kminAttribute->clear(); const QString& mapname = currentItems[0]->text(); MapHandlerGen* mh = m_window->getMap(mapname); GenericMap* map = mh->getGenericMap(); diff --git a/SCHNApps/Plugins/importSurface/importSurface.h b/SCHNApps/Plugins/importSurface/importSurface.h index 22508ab4..07bde6d4 100644 --- a/SCHNApps/Plugins/importSurface/importSurface.h +++ b/SCHNApps/Plugins/importSurface/importSurface.h @@ -34,6 +34,10 @@ public: virtual void mouseMove(View* view, int buttons, int x, int y) {} virtual void wheelEvent(View* view, int delta, int x, int y) {} + virtual void viewLinked(View* view) {} + virtual void viewUnlinked(View* view) {} + virtual void currentViewChanged(View* view) {} + public slots: void importFromFile(const QString& fileName); void importFromFileDialog(); diff --git a/SCHNApps/Plugins/importVolume/importVolume.cpp b/SCHNApps/Plugins/importVolume/importVolume.cpp index 1b6711f3..2fa19262 100644 --- a/SCHNApps/Plugins/importVolume/importVolume.cpp +++ b/SCHNApps/Plugins/importVolume/importVolume.cpp @@ -11,42 +11,47 @@ bool ImportVolumePlugin::enable() { importAction = new QAction("import", this); addMenuAction("Volume;Import", importAction); - connect(importAction, SIGNAL(triggered()), this, SLOT(cb_import())); + connect(importAction, SIGNAL(triggered()), this, SLOT(importFromFileDialog())); return true; } -void ImportVolumePlugin::cb_import() +void ImportVolumePlugin::importFromFile(const QString& fileName) { - QString fileName = QFileDialog::getOpenFileName(m_window, "Import file", m_window->getAppPath(), "Mesh Files (*.node *.ts *.off *.tet)"); QFileInfo fi(fileName); - if(fi.exists()) { - GenericMap* m = m_window->createMap(3); - PFP3::MAP* map = static_cast(m); - MapHandler* h = new MapHandler(fi.baseName(), m_window, map); + MapHandlerGen* mhg = m_window->addMap(fi.baseName(), 3); + if(mhg) + { + MapHandler* mh = static_cast*>(mhg); + PFP3::MAP* map = mh->getMap(); - std::vector attrNames ; - Algo::Volume::Import::importMesh(*map, fileName.toUtf8().constData(), attrNames); + std::vector attrNames ; + Algo::Volume::Import::importMesh(*map, fileName.toUtf8().constData(), attrNames); - // get vertex position attribute - VertexAttribute position = map->getAttribute(attrNames[0]); + // get vertex position attribute + VertexAttribute position = map->getAttribute(attrNames[0]); - // create VBO for vertex position attribute - h->createVBO(position); + // create VBO for vertex position attribute + mh->createVBO(position); - // compute map bounding box - h->updateBB(position); + // compute map bounding box + mh->updateBB(position); - // compute primitive connectivity VBOs - h->updatePrimitives(Algo::Render::GL2::POINTS); - h->updatePrimitives(Algo::Render::GL2::LINES); - h->updatePrimitives(Algo::Render::GL2::TRIANGLES); - - m_window->addMap(h); + // compute primitive connectivity VBOs + mh->updatePrimitives(Algo::Render::GL2::POINTS); + mh->updatePrimitives(Algo::Render::GL2::LINES); + mh->updatePrimitives(Algo::Render::GL2::TRIANGLES); + } } } +void ImportVolumePlugin::importFromFileDialog() +{ + QString fileName = QFileDialog::getOpenFileName(m_window, "Import file", m_window->getAppPath(), "Mesh Files (*.node *.ts *.off *.tet)"); + importFromFile(fileName); +} + #ifndef DEBUG Q_EXPORT_PLUGIN2(ImportVolumePlugin, ImportVolumePlugin) #else diff --git a/SCHNApps/Plugins/importVolume/importVolume.h b/SCHNApps/Plugins/importVolume/importVolume.h index c693343c..670a611d 100644 --- a/SCHNApps/Plugins/importVolume/importVolume.h +++ b/SCHNApps/Plugins/importVolume/importVolume.h @@ -1,5 +1,5 @@ -#ifndef _IMPORTSURFACE_PLUGIN_H_ -#define _IMPORTSURFACE_PLUGIN_H_ +#ifndef _IMPORTVOLUME_PLUGIN_H_ +#define _IMPORTVOLUME_PLUGIN_H_ #include "plugin.h" @@ -38,11 +38,9 @@ public: virtual void viewUnlinked(View* view) {} virtual void currentViewChanged(View* view) {} - virtual void mapLinked(View* view, MapHandlerGen* m) {} - virtual void mapUnlinked(View* view, MapHandlerGen* m) {} - public slots: - void cb_import(); + void importFromFile(const QString& fileName); + void importFromFileDialog(); private: QAction* importAction; diff --git a/SCHNApps/Plugins/render/render.cpp b/SCHNApps/Plugins/render/render.cpp index 0d7263d6..84edaceb 100644 --- a/SCHNApps/Plugins/render/render.cpp +++ b/SCHNApps/Plugins/render/render.cpp @@ -60,7 +60,6 @@ bool RenderPlugin::enable() connect(m_dockTab->mapList, SIGNAL(itemSelectionChanged()), this, SLOT(cb_selectedMapChanged())); connect(m_dockTab->combo_positionVBO, SIGNAL(currentIndexChanged(int)), this, SLOT(cb_positionVBOChanged(int))); connect(m_dockTab->combo_normalVBO, SIGNAL(currentIndexChanged(int)), this, SLOT(cb_normalVBOChanged(int))); - connect(m_dockTab->button_refreshVBOs, SIGNAL(clicked()), this, SLOT(cb_refreshVBOs())); connect(m_dockTab->check_renderVertices, SIGNAL(toggled(bool)), this, SLOT(cb_renderVerticesChanged(bool))); connect(m_dockTab->slider_verticesScaleFactor, SIGNAL(valueChanged(int)), this, SLOT(cb_verticesScaleFactorChanged(int))); connect(m_dockTab->check_renderEdges, SIGNAL(toggled(bool)), this, SLOT(cb_renderEdgesChanged(bool))); @@ -142,16 +141,19 @@ void RenderPlugin::viewLinked(View* view) if (!maps.empty()) params->selectedMap = maps[0]; - m_dockTab->refreshUI(params); + connect(view, SIGNAL(mapLinked(MapHandlerGen*)), this, SLOT(mapLinked(MapHandlerGen*))); + connect(view, SIGNAL(mapUnlinked(MapHandlerGen*)), this, SLOT(mapUnlinked(MapHandlerGen*))); + + if(view->isCurrentView()) + m_dockTab->refreshUI(params); } void RenderPlugin::viewUnlinked(View* view) { h_viewParams.remove(view); - View* current = m_window->getCurrentView(); - if(isLinkedToView(current)) - m_dockTab->refreshUI(h_viewParams[current]); + disconnect(view, SIGNAL(mapLinked(MapHandlerGen*)), this, SLOT(mapLinked(MapHandlerGen*))); + disconnect(view, SIGNAL(mapUnlinked(MapHandlerGen*)), this, SLOT(mapUnlinked(MapHandlerGen*))); } void RenderPlugin::currentViewChanged(View* view) @@ -160,31 +162,156 @@ void RenderPlugin::currentViewChanged(View* view) m_dockTab->refreshUI(h_viewParams[view]); } -void RenderPlugin::mapLinked(View* view, MapHandlerGen* m) +void RenderPlugin::mapLinked(MapHandlerGen* m) { + View* view = static_cast(QObject::sender()); assert(isLinkedToView(view)); + ParameterSet* params = h_viewParams[view]; PerMapParameterSet p(m); params->perMap.insert(m->getName(), p); - if(params->perMap.count() == 1) - params->selectedMap = m; - - m_dockTab->refreshUI(params); + if(params->selectedMap == NULL || params->perMap.count() == 1) + changeSelectedMap(view, m); + else + m_dockTab->refreshUI(params); } -void RenderPlugin::mapUnlinked(View* view, MapHandlerGen* m) +void RenderPlugin::mapUnlinked(MapHandlerGen* m) { + View* view = static_cast(QObject::sender()); assert(isLinkedToView(view)); + ParameterSet* params = h_viewParams[view]; params->perMap.remove(m->getName()); if(params->selectedMap == m) { if(!params->perMap.empty()) - params->selectedMap = m_window->getMap(params->perMap.begin().key()); + changeSelectedMap(view, m_window->getMap(params->perMap.begin().key())); else - params->selectedMap = NULL; + changeSelectedMap(view, NULL); + } + else + m_dockTab->refreshUI(params); +} + +void RenderPlugin::vboAdded(Utils::VBO* vbo) +{ + m_dockTab->refreshUI(h_viewParams[m_window->getCurrentView()]); +} + +void RenderPlugin::vboRemoved(Utils::VBO* vbo) +{ + MapHandlerGen* map = static_cast(QObject::sender()); + + View* view = m_window->getCurrentView(); + ParameterSet* params = h_viewParams[view]; + if(params->perMap[map->getName()].positionVBO == vbo) + changePositionVBO(view, map, NULL); + if(params->perMap[map->getName()].normalVBO == vbo) + changeNormalVBO(view, map, NULL); +} + +void RenderPlugin::changeSelectedMap(View* view, MapHandlerGen* map) +{ + ParameterSet* params = h_viewParams[view]; + + MapHandlerGen* prev = params->selectedMap; + params->selectedMap = map; + + if(view->isCurrentView()) + { + if(prev) + disconnect(map, SIGNAL(vboAdded(Utils::VBO*)), this, SLOT(vboAdded(Utils::VBO*))); + if(map) + connect(map, SIGNAL(vboAdded(Utils::VBO*)), this, SLOT(vboAdded(Utils::VBO*))); + + m_dockTab->refreshUI(params); + view->updateGL(); + } +} + +void RenderPlugin::changePositionVBO(View* view, MapHandlerGen* map, Utils::VBO* vbo) +{ + ParameterSet* params = h_viewParams[view]; + params->perMap[map->getName()].positionVBO = vbo; + + if(view->isCurrentView()) + { + m_dockTab->refreshUI(params); + view->updateGL(); + } +} + +void RenderPlugin::changeNormalVBO(View* view, MapHandlerGen* map, Utils::VBO* vbo) +{ + ParameterSet* params = h_viewParams[view]; + params->perMap[map->getName()].normalVBO = vbo; + + if(view->isCurrentView()) + { + m_dockTab->refreshUI(params); + view->updateGL(); + } +} + +void RenderPlugin::changeRenderVertices(View* view, MapHandlerGen* map, bool b) +{ + ParameterSet* params = h_viewParams[view]; + params->perMap[map->getName()].renderVertices = b; + + if(view->isCurrentView()) + { + m_dockTab->refreshUI(params); + view->updateGL(); + } +} + +void RenderPlugin::changeVerticesScaleFactor(View* view, MapHandlerGen* map, int i) +{ + ParameterSet* params = h_viewParams[view]; + params->perMap[map->getName()].verticesScaleFactor = i / 50.0; + + if(view->isCurrentView()) + { + m_dockTab->refreshUI(params); + view->updateGL(); + } +} + +void RenderPlugin::changeRenderEdges(View* view, MapHandlerGen* map, bool b) +{ + ParameterSet* params = h_viewParams[view]; + params->perMap[map->getName()].renderEdges = b; + + if(view->isCurrentView()) + { + m_dockTab->refreshUI(params); + view->updateGL(); + } +} + +void RenderPlugin::changeRenderFaces(View* view, MapHandlerGen* map, bool b) +{ + ParameterSet* params = h_viewParams[view]; + params->perMap[map->getName()].renderFaces = b; + + if(view->isCurrentView()) + { + m_dockTab->refreshUI(params); + view->updateGL(); + } +} + +void RenderPlugin::changeFacesStyle(View* view, MapHandlerGen* map, FaceShadingStyle style) +{ + ParameterSet* params = h_viewParams[view]; + params->perMap[map->getName()].faceStyle = style; + + if(view->isCurrentView()) + { m_dockTab->refreshUI(params); + view->updateGL(); } } @@ -192,16 +319,9 @@ void RenderPlugin::cb_selectedMapChanged() { if(!b_refreshingUI) { - View* view = m_window->getCurrentView(); - ParameterSet* params = h_viewParams[view]; QList currentItems = m_dockTab->mapList->selectedItems(); if(!currentItems.empty()) - { - const QString& mapname = currentItems[0]->text(); - params->selectedMap = m_window->getMap(mapname); - m_dockTab->refreshUI(params); - view->updateGL(); - } + changeSelectedMap(m_window->getCurrentView(), m_window->getMap(currentItems[0]->text())); } } @@ -209,11 +329,9 @@ void RenderPlugin::cb_positionVBOChanged(int index) { if(!b_refreshingUI) { - View* current = m_window->getCurrentView(); - ParameterSet* params = h_viewParams[current]; - MapHandlerGen* map = params->selectedMap; - params->perMap[map->getName()].positionVBO = map->getVBO(m_dockTab->combo_positionVBO->currentText()); - current->updateGL(); + View* view = m_window->getCurrentView(); + MapHandlerGen* map = h_viewParams[view]->selectedMap; + changePositionVBO(view, map, map->getVBO(m_dockTab->combo_positionVBO->currentText())); } } @@ -221,30 +339,19 @@ void RenderPlugin::cb_normalVBOChanged(int index) { if(!b_refreshingUI) { - View* current = m_window->getCurrentView(); - ParameterSet* params = h_viewParams[current]; - MapHandlerGen* map = params->selectedMap; - params->perMap[map->getName()].normalVBO = map->getVBO(m_dockTab->combo_normalVBO->currentText()); - current->updateGL(); + View* view = m_window->getCurrentView(); + MapHandlerGen* map = h_viewParams[view]->selectedMap; + changeNormalVBO(view, map, map->getVBO(m_dockTab->combo_normalVBO->currentText())); } } -void RenderPlugin::cb_refreshVBOs() -{ - View* current = m_window->getCurrentView(); - if(isLinkedToView(current)) - m_dockTab->refreshUI(h_viewParams[current]); -} - void RenderPlugin::cb_renderVerticesChanged(bool b) { if(!b_refreshingUI) { - View* current = m_window->getCurrentView(); - ParameterSet* params = h_viewParams[current]; - MapHandlerGen* m = params->selectedMap; - params->perMap[m->getName()].renderVertices = b; - current->updateGL(); + View* view = m_window->getCurrentView(); + MapHandlerGen* map = h_viewParams[view]->selectedMap; + changeRenderVertices(view, map, b); } } @@ -252,11 +359,9 @@ void RenderPlugin::cb_verticesScaleFactorChanged(int i) { if(!b_refreshingUI) { - View* current = m_window->getCurrentView(); - ParameterSet* params = h_viewParams[current]; - MapHandlerGen* m = params->selectedMap; - params->perMap[m->getName()].verticesScaleFactor = i / 50.0; - current->updateGL(); + View* view = m_window->getCurrentView(); + MapHandlerGen* map = h_viewParams[view]->selectedMap; + changeVerticesScaleFactor(view, map, i); } } @@ -264,11 +369,9 @@ void RenderPlugin::cb_renderEdgesChanged(bool b) { if(!b_refreshingUI) { - View* current = m_window->getCurrentView(); - ParameterSet* params = h_viewParams[current]; - MapHandlerGen* m = params->selectedMap; - params->perMap[m->getName()].renderEdges = b; - current->updateGL(); + View* view = m_window->getCurrentView(); + MapHandlerGen* map = h_viewParams[view]->selectedMap; + changeRenderEdges(view, map, b); } } @@ -276,11 +379,9 @@ void RenderPlugin::cb_renderFacesChanged(bool b) { if(!b_refreshingUI) { - View* current = m_window->getCurrentView(); - ParameterSet* params = h_viewParams[current]; - MapHandlerGen* m = params->selectedMap; - params->perMap[m->getName()].renderFaces = b; - current->updateGL(); + View* view = m_window->getCurrentView(); + MapHandlerGen* map = h_viewParams[view]->selectedMap; + changeRenderFaces(view, map, b); } } @@ -288,14 +389,12 @@ void RenderPlugin::cb_faceStyleChanged(QAbstractButton* b) { if(!b_refreshingUI) { - View* current = m_window->getCurrentView(); - ParameterSet* params = h_viewParams[current]; - MapHandlerGen* m = params->selectedMap; + View* view = m_window->getCurrentView(); + MapHandlerGen* map = h_viewParams[view]->selectedMap; if(m_dockTab->radio_flatShading->isChecked()) - params->perMap[m->getName()].faceStyle = FLAT; + changeFacesStyle(view, map, FLAT); else if(m_dockTab->radio_phongShading->isChecked()) - params->perMap[m->getName()].faceStyle = PHONG; - current->updateGL(); + changeFacesStyle(view, map, PHONG); } } @@ -323,42 +422,68 @@ void RenderDockTab::refreshUI(ParameterSet* params) PerMapParameterSet& p = params->perMap[map->getName()]; QList vbos = map->getVBOList(); + unsigned int j = 0; for(int i = 0; i < vbos.count(); ++i) { - combo_positionVBO->addItem(QString::fromStdString(vbos[i]->name())); - if(p.positionVBO == NULL) - { // if nothing is specified in the parameter set - if(vbos[i]->name() == "position") // try to select a VBO named "position" - { - p.positionVBO = vbos[i]; - combo_positionVBO->setCurrentIndex(i); + if(vbos[i]->dataSize() == 3) + { + combo_positionVBO->addItem(QString::fromStdString(vbos[i]->name())); + if(p.positionVBO == NULL) + { // if nothing is specified in the parameter set + if(vbos[i]->name() == "position") // try to select a VBO named "position" + { + p.positionVBO = vbos[i]; + combo_positionVBO->setCurrentIndex(j); + } } - } - else if(vbos[i] == p.positionVBO) - combo_positionVBO->setCurrentIndex(i); + else if(vbos[i] == p.positionVBO) + combo_positionVBO->setCurrentIndex(j); - combo_normalVBO->addItem(QString::fromStdString(vbos[i]->name())); - if(p.normalVBO == NULL) - { // if nothing is specified in the parameter set - if(vbos[i]->name() == "normal") // try to select a VBO named "normal" - { - p.normalVBO = vbos[i]; - combo_normalVBO->setCurrentIndex(i); + combo_normalVBO->addItem(QString::fromStdString(vbos[i]->name())); + if(p.normalVBO == NULL) + { // if nothing is specified in the parameter set + if(vbos[i]->name() == "normal") // try to select a VBO named "normal" + { + p.normalVBO = vbos[i]; + combo_normalVBO->setCurrentIndex(j); + } } + else if(vbos[i] == p.normalVBO) + combo_normalVBO->setCurrentIndex(j); + + ++j; } - else if(vbos[i] == p.normalVBO) - combo_normalVBO->setCurrentIndex(i); } if(p.positionVBO == NULL && vbos.count() > 0) { - p.positionVBO = vbos[0]; - combo_positionVBO->setCurrentIndex(0); + int i = 0; + bool found = false; + while(i < vbos.count() && !found) + { + if(vbos[i]->dataSize() == 3) + { + p.positionVBO = vbos[i]; + combo_positionVBO->setCurrentIndex(i); + found = true; + } + ++i; + } } if(p.normalVBO == NULL && vbos.count() > 0) { - p.normalVBO = vbos[0]; - combo_normalVBO->setCurrentIndex(0); + int i = 0; + bool found = false; + while(i < vbos.count() && !found) + { + if(vbos[i]->dataSize() == 3) + { + p.normalVBO = vbos[i]; + combo_normalVBO->setCurrentIndex(i); + found = true; + } + ++i; + } } check_renderVertices->setChecked(p.renderVertices); diff --git a/SCHNApps/Plugins/render/render.h b/SCHNApps/Plugins/render/render.h index 2a1adcc7..e8028495 100644 --- a/SCHNApps/Plugins/render/render.h +++ b/SCHNApps/Plugins/render/render.h @@ -100,9 +100,6 @@ public: virtual void viewUnlinked(View* view); virtual void currentViewChanged(View* view); - virtual void mapLinked(View* view, MapHandlerGen* m); - virtual void mapUnlinked(View* view, MapHandlerGen* m); - void setRefreshingUI(bool b) { b_refreshingUI = b; } protected: @@ -117,10 +114,23 @@ protected: bool b_refreshingUI; public slots: + void mapLinked(MapHandlerGen* m); + void mapUnlinked(MapHandlerGen* m); + void vboAdded(Utils::VBO* vbo); + void vboRemoved(Utils::VBO* vbo); + + void changeSelectedMap(View* view, MapHandlerGen* map); + void changePositionVBO(View* view, MapHandlerGen* map, Utils::VBO* vbo); + void changeNormalVBO(View* view, MapHandlerGen* map, Utils::VBO* vbo); + void changeRenderVertices(View* view, MapHandlerGen* map, bool b); + void changeVerticesScaleFactor(View* view, MapHandlerGen* map, int i); + void changeRenderEdges(View* view, MapHandlerGen* map, bool b); + void changeRenderFaces(View* view, MapHandlerGen* map, bool b); + void changeFacesStyle(View* view, MapHandlerGen* map, FaceShadingStyle style); + void cb_selectedMapChanged(); void cb_positionVBOChanged(int index); void cb_normalVBOChanged(int index); - void cb_refreshVBOs(); void cb_renderVerticesChanged(bool b); void cb_verticesScaleFactorChanged(int i); void cb_renderEdgesChanged(bool b); diff --git a/SCHNApps/Plugins/render/render.ui b/SCHNApps/Plugins/render/render.ui index 45ddda06..08f52fdd 100644 --- a/SCHNApps/Plugins/render/render.ui +++ b/SCHNApps/Plugins/render/render.ui @@ -22,17 +22,10 @@ QLayout::SetDefaultConstraint - - - - Normal : - - - - - + + - + 0 0 @@ -46,29 +39,20 @@ - - + + - + 0 0 - - - - - 0 - 0 - - - - Qt::RightToLeft - + + - Refresh + Normal : diff --git a/SCHNApps/Plugins/renderVector/renderVector.cpp b/SCHNApps/Plugins/renderVector/renderVector.cpp index e0498ee8..585e267a 100644 --- a/SCHNApps/Plugins/renderVector/renderVector.cpp +++ b/SCHNApps/Plugins/renderVector/renderVector.cpp @@ -33,8 +33,7 @@ bool RenderVectorPlugin::enable() connect(m_dockTab->mapList, SIGNAL(itemSelectionChanged()), this, SLOT(cb_selectedMapChanged())); connect(m_dockTab->combo_positionVBO, SIGNAL(currentIndexChanged(int)), this, SLOT(cb_positionVBOChanged(int))); - connect(m_dockTab->list_vectorVBO, SIGNAL(itemSelectionChanged()), this, SLOT(cb_selectedVectorVBOChanged())); - connect(m_dockTab->button_refreshVBOs, SIGNAL(clicked()), this, SLOT(cb_refreshVBOs())); + connect(m_dockTab->list_vectorVBO, SIGNAL(itemSelectionChanged()), this, SLOT(cb_selectedVectorsVBOChanged())); connect(m_dockTab->slider_vectorsScaleFactor, SIGNAL(valueChanged(int)), this, SLOT(cb_vectorsScaleFactorChanged(int))); return true; @@ -80,16 +79,19 @@ void RenderVectorPlugin::viewLinked(View* view) if (!maps.empty()) params->selectedMap = maps[0]; - m_dockTab->refreshUI(params); + connect(view, SIGNAL(mapLinked(MapHandlerGen*)), this, SLOT(mapLinked(MapHandlerGen*))); + connect(view, SIGNAL(mapUnlinked(MapHandlerGen*)), this, SLOT(mapUnlinked(MapHandlerGen*))); + + if(view->isCurrentView()) + m_dockTab->refreshUI(params); } void RenderVectorPlugin::viewUnlinked(View* view) { h_viewParams.remove(view); - View* current = m_window->getCurrentView(); - if(isLinkedToView(current)) - m_dockTab->refreshUI(h_viewParams[current]); + disconnect(view, SIGNAL(mapLinked(MapHandlerGen*)), this, SLOT(mapLinked(MapHandlerGen*))); + disconnect(view, SIGNAL(mapUnlinked(MapHandlerGen*)), this, SLOT(mapUnlinked(MapHandlerGen*))); } void RenderVectorPlugin::currentViewChanged(View* view) @@ -98,31 +100,106 @@ void RenderVectorPlugin::currentViewChanged(View* view) m_dockTab->refreshUI(h_viewParams[view]); } -void RenderVectorPlugin::mapLinked(View* view, MapHandlerGen* m) +void RenderVectorPlugin::mapLinked(MapHandlerGen* m) { + View* view = static_cast(QObject::sender()); assert(isLinkedToView(view)); + ParameterSet* params = h_viewParams[view]; PerMapParameterSet p(m); params->perMap.insert(m->getName(), p); - if(params->perMap.count() == 1) - params->selectedMap = m; - - m_dockTab->refreshUI(params); + if(params->selectedMap == NULL || params->perMap.count() == 1) + changeSelectedMap(view, m); + else + m_dockTab->refreshUI(params); } -void RenderVectorPlugin::mapUnlinked(View* view, MapHandlerGen* m) +void RenderVectorPlugin::mapUnlinked(MapHandlerGen* m) { + View* view = static_cast(QObject::sender()); assert(isLinkedToView(view)); + ParameterSet* params = h_viewParams[view]; params->perMap.remove(m->getName()); if(params->selectedMap == m) { if(!params->perMap.empty()) - params->selectedMap = m_window->getMap(params->perMap.begin().key()); + changeSelectedMap(view, m_window->getMap(params->perMap.begin().key())); else - params->selectedMap = NULL; + changeSelectedMap(view, NULL); + } + else m_dockTab->refreshUI(params); +} + +void RenderVectorPlugin::vboAdded(Utils::VBO* vbo) +{ + m_dockTab->refreshUI(h_viewParams[m_window->getCurrentView()]); +} + +void RenderVectorPlugin::vboRemoved(Utils::VBO* vbo) +{ + MapHandlerGen* map = static_cast(QObject::sender()); + + View* view = m_window->getCurrentView(); + ParameterSet* params = h_viewParams[view]; + if(params->perMap[map->getName()].positionVBO == vbo) + changePositionVBO(view, map, NULL); +} + +void RenderVectorPlugin::changeSelectedMap(View* view, MapHandlerGen* map) +{ + ParameterSet* params = h_viewParams[view]; + + MapHandlerGen* prev = params->selectedMap; + params->selectedMap = map; + + if(view->isCurrentView()) + { + if(prev) + disconnect(map, SIGNAL(vboAdded(Utils::VBO*)), this, SLOT(vboAdded(Utils::VBO*))); + if(map) + connect(map, SIGNAL(vboAdded(Utils::VBO*)), this, SLOT(vboAdded(Utils::VBO*))); + + m_dockTab->refreshUI(params); + view->updateGL(); + } +} + +void RenderVectorPlugin::changePositionVBO(View* view, MapHandlerGen* map, Utils::VBO* vbo) +{ + ParameterSet* params = h_viewParams[view]; + params->perMap[map->getName()].positionVBO = vbo; + + if(view->isCurrentView()) + { + m_dockTab->refreshUI(params); + view->updateGL(); + } +} + +void RenderVectorPlugin::changeSelectedVectorsVBO(View* view, MapHandlerGen* map, const std::vector& vbos) +{ + ParameterSet* params = h_viewParams[view]; + params->perMap[map->getName()].vectorVBO = vbos; + + if(view->isCurrentView()) + { + m_dockTab->refreshUI(params); + view->updateGL(); + } +} + +void RenderVectorPlugin::changeVectorsScaleFactor(View* view, MapHandlerGen* map, int i) +{ + ParameterSet* params = h_viewParams[view]; + params->perMap[map->getName()].vectorsScaleFactor = i / 50.0; + + if(view->isCurrentView()) + { + m_dockTab->refreshUI(params); + view->updateGL(); } } @@ -130,16 +207,9 @@ void RenderVectorPlugin::cb_selectedMapChanged() { if(!b_refreshingUI) { - View* view = m_window->getCurrentView(); - ParameterSet* params = h_viewParams[view]; QList currentItems = m_dockTab->mapList->selectedItems(); if(!currentItems.empty()) - { - const QString& mapname = currentItems[0]->text(); - params->selectedMap = m_window->getMap(mapname); - m_dockTab->refreshUI(params); - view->updateGL(); - } + changeSelectedMap(m_window->getCurrentView(), m_window->getMap(currentItems[0]->text())); } } @@ -147,48 +217,33 @@ void RenderVectorPlugin::cb_positionVBOChanged(int index) { if(!b_refreshingUI) { - View* current = m_window->getCurrentView(); - ParameterSet* params = h_viewParams[current]; - MapHandlerGen* map = params->selectedMap; - params->perMap[map->getName()].positionVBO = map->getVBO(m_dockTab->combo_positionVBO->currentText()); - current->updateGL(); + View* view = m_window->getCurrentView(); + MapHandlerGen* map = h_viewParams[view]->selectedMap; + changePositionVBO(view, map, map->getVBO(m_dockTab->combo_positionVBO->currentText())); } } -void RenderVectorPlugin::cb_selectedVectorVBOChanged() +void RenderVectorPlugin::cb_selectedVectorsVBOChanged() { if(!b_refreshingUI) { - View* current = m_window->getCurrentView(); - ParameterSet* params = h_viewParams[current]; - MapHandlerGen* map = params->selectedMap; - PerMapParameterSet& mapParam = params->perMap[map->getName()]; - - mapParam.vectorVBO.clear(); + View* view = m_window->getCurrentView(); + MapHandlerGen* map = h_viewParams[view]->selectedMap; QList currentItems = m_dockTab->list_vectorVBO->selectedItems(); + std::vector vbos; foreach(QListWidgetItem* item, currentItems) - mapParam.vectorVBO.push_back(map->getVBO(item->text())); - - current->updateGL(); + vbos.push_back(map->getVBO(item->text())); + changeSelectedVectorsVBO(view, map, vbos); } } -void RenderVectorPlugin::cb_refreshVBOs() -{ - View* current = m_window->getCurrentView(); - if(isLinkedToView(current)) - m_dockTab->refreshUI(h_viewParams[current]); -} - void RenderVectorPlugin::cb_vectorsScaleFactorChanged(int i) { if(!b_refreshingUI) { - View* current = m_window->getCurrentView(); - ParameterSet* params = h_viewParams[current]; - MapHandlerGen* m = params->selectedMap; - params->perMap[m->getName()].vectorsScaleFactor = i / 50.0; - current->updateGL(); + View* view = m_window->getCurrentView(); + MapHandlerGen* map = h_viewParams[view]->selectedMap; + changeVectorsScaleFactor(view, map, i); } } @@ -219,23 +274,24 @@ void RenderVectorDockTab::refreshUI(ParameterSet* params) unsigned int j = 0; for(int i = 0; i < vbos.count(); ++i) { - combo_positionVBO->addItem(QString::fromStdString(vbos[i]->name())); - if(p.positionVBO == NULL) - { // if nothing is specified in the parameter set - if(vbos[i]->name() == "position") // try to select a VBO named "position" - { - p.positionVBO = vbos[i]; - combo_positionVBO->setCurrentIndex(i); - } - } - else if(vbos[i] == p.positionVBO) - combo_positionVBO->setCurrentIndex(i); - if(vbos[i]->dataSize() == 3) { + combo_positionVBO->addItem(QString::fromStdString(vbos[i]->name())); + if(p.positionVBO == NULL) + { // if nothing is specified in the parameter set + if(vbos[i]->name() == "position") // try to select a VBO named "position" + { + p.positionVBO = vbos[i]; + combo_positionVBO->setCurrentIndex(j); + } + } + else if(vbos[i] == p.positionVBO) + combo_positionVBO->setCurrentIndex(j); + list_vectorVBO->addItem(QString::fromStdString(vbos[i]->name())); if(std::find(p.vectorVBO.begin(), p.vectorVBO.end(), vbos[i]) != p.vectorVBO.end()) list_vectorVBO->item(j)->setSelected(true); + ++j; } } diff --git a/SCHNApps/Plugins/renderVector/renderVector.h b/SCHNApps/Plugins/renderVector/renderVector.h index 2e60b7bd..b120439b 100644 --- a/SCHNApps/Plugins/renderVector/renderVector.h +++ b/SCHNApps/Plugins/renderVector/renderVector.h @@ -82,9 +82,6 @@ public: virtual void viewUnlinked(View* view); virtual void currentViewChanged(View* view); - virtual void mapLinked(View* view, MapHandlerGen* m); - virtual void mapUnlinked(View* view, MapHandlerGen* m); - void setRefreshingUI(bool b) { b_refreshingUI = b; } protected: @@ -96,10 +93,19 @@ protected: bool b_refreshingUI; public slots: + void mapLinked(MapHandlerGen* m); + void mapUnlinked(MapHandlerGen* m); + void vboAdded(Utils::VBO* vbo); + void vboRemoved(Utils::VBO* vbo); + + void changeSelectedMap(View* view, MapHandlerGen* map); + void changePositionVBO(View* view, MapHandlerGen* map, Utils::VBO* vbo); + void changeSelectedVectorsVBO(View* view, MapHandlerGen* map, const std::vector& vbos); + void changeVectorsScaleFactor(View* view, MapHandlerGen* map, int i); + void cb_selectedMapChanged(); void cb_positionVBOChanged(int index); - void cb_selectedVectorVBOChanged(); - void cb_refreshVBOs(); + void cb_selectedVectorsVBOChanged(); void cb_vectorsScaleFactorChanged(int i); }; diff --git a/SCHNApps/Plugins/renderVector/renderVector.ui b/SCHNApps/Plugins/renderVector/renderVector.ui index fe601021..3f833853 100644 --- a/SCHNApps/Plugins/renderVector/renderVector.ui +++ b/SCHNApps/Plugins/renderVector/renderVector.ui @@ -52,22 +52,6 @@ - - - - - 0 - 0 - - - - Qt::LeftToRight - - - Refresh - - - diff --git a/SCHNApps/Plugins/subdivideSurface/include/subdivideSurface.h b/SCHNApps/Plugins/subdivideSurface/include/subdivideSurface.h index c45dd6dd..7e6901c5 100644 --- a/SCHNApps/Plugins/subdivideSurface/include/subdivideSurface.h +++ b/SCHNApps/Plugins/subdivideSurface/include/subdivideSurface.h @@ -36,6 +36,10 @@ public: virtual void mouseMove(View* view, int buttons, int x, int y) {} virtual void wheelEvent(View* view, int delta, int x, int y) {} + virtual void viewLinked(View* view) {} + virtual void viewUnlinked(View* view) {} + virtual void currentViewChanged(View* view) {} + public slots: void openSubdivideSurfaceDialog(); void subdivideSurface(); diff --git a/SCHNApps/Release/CMakeLists.txt b/SCHNApps/Release/CMakeLists.txt index 7f4175eb..6dc10cfb 100644 --- a/SCHNApps/Release/CMakeLists.txt +++ b/SCHNApps/Release/CMakeLists.txt @@ -36,6 +36,7 @@ file( SET(SCHNApps_H_OBJECT_FILES ${SCHNApps_ROOT_DIR}/include/view.h + ${SCHNApps_ROOT_DIR}/include/mapHandler.h ${SCHNApps_ROOT_DIR}/include/window.h ${SCHNApps_ROOT_DIR}/include/viewButtonArea.h ${SCHNApps_ROOT_DIR}/include/dialogs/camerasDialog.h diff --git a/SCHNApps/include/mapHandler.h b/SCHNApps/include/mapHandler.h index 0fba013f..88add896 100644 --- a/SCHNApps/include/mapHandler.h +++ b/SCHNApps/include/mapHandler.h @@ -20,8 +20,10 @@ namespace CGoGN namespace SCHNApps { -class MapHandlerGen +class MapHandlerGen : public QObject { + Q_OBJECT + public: MapHandlerGen(const QString& name, Window* window, GenericMap* map); virtual ~MapHandlerGen(); @@ -49,8 +51,15 @@ public: template Utils::VBO* createVBO(const ATTR_HANDLER& attr) { - Utils::VBO* vbo = getVBO(QString::fromStdString(attr.name())); + QString name = QString::fromStdString(attr.name()); + Utils::VBO* vbo = getVBO(name); + if(!vbo) + { + vbo = new Utils::VBO(); + h_vbo.insert(name, vbo); + } vbo->updateData(attr); + emit(vboAdded(vbo)); return vbo; } @@ -58,7 +67,8 @@ public: void updateVBO(const ATTR_HANDLER& attr) { Utils::VBO* vbo = getVBO(QString::fromStdString(attr.name())); - vbo->updateData(attr); + if(vbo) + vbo->updateData(attr); } Utils::VBO* getVBO(const QString& name); @@ -89,6 +99,10 @@ protected: QList l_views; VBOHash h_vbo; + +signals: + void vboAdded(Utils::VBO* vbo); + void vboRemoved(Utils::VBO* vbo); }; template diff --git a/SCHNApps/include/plugin.h b/SCHNApps/include/plugin.h index 7b7cc667..2771a4b1 100644 --- a/SCHNApps/include/plugin.h +++ b/SCHNApps/include/plugin.h @@ -46,12 +46,9 @@ public: virtual void mouseMove(View* view, int buttons, int x, int y) = 0; virtual void wheelEvent(View* view, int delta, int x, int y) = 0; -// virtual void viewLinked(View* view) = 0; -// virtual void viewUnlinked(View* view) = 0; -// virtual void currentViewChanged(View* view) = 0; - -// virtual void mapLinked(View* view, MapHandlerGen* m) = 0; -// virtual void mapUnlinked(View* view, MapHandlerGen* m) = 0; + virtual void viewLinked(View* view) = 0; + virtual void viewUnlinked(View* view) = 0; + virtual void currentViewChanged(View* view) = 0; /********************************************************* * MANAGE LINKED VIEWS diff --git a/SCHNApps/include/window.h b/SCHNApps/include/window.h index ea14e72e..a02d6769 100644 --- a/SCHNApps/include/window.h +++ b/SCHNApps/include/window.h @@ -230,13 +230,13 @@ public: *********************************************************/ public slots: - void linkViewAndPlugin(View* v, Plugin* p); - void unlinkViewAndPlugin(View* v, Plugin* p); + void linkViewAndCamera(View* v, Camera* c); void linkViewAndMap(View* v, MapHandlerGen* m); void unlinkViewAndMap(View* v, MapHandlerGen* m); - void linkViewAndCamera(View* v, Camera* c); + void linkViewAndPlugin(View* v, Plugin* p); + void unlinkViewAndPlugin(View* v, Plugin* p); /********************************************************* * MANAGE TEXTURES @@ -300,6 +300,15 @@ signals: void pluginLoaded(Plugin* plugin); void pluginUnloaded(Plugin* plugin); + + void viewAndCameraLinked(View* view, Camera* camera); + void viewAndCameraUnlinked(View* view, Camera* camera); + + void viewAndMapLinked(View* view, MapHandlerGen* map); + void viewAndMapUnlinked(View* view, MapHandlerGen* map); + + void viewAndPluginLinked(View* view, Plugin* plugin); + void viewAndPluginUnlinked(View* view, Plugin* plugin); }; } // namespace SCHNApps diff --git a/SCHNApps/src/mapHandler.cpp b/SCHNApps/src/mapHandler.cpp index a35bba0d..cec932f1 100644 --- a/SCHNApps/src/mapHandler.cpp +++ b/SCHNApps/src/mapHandler.cpp @@ -29,11 +29,7 @@ Utils::VBO* MapHandlerGen::getVBO(const QString& name) if (h_vbo.contains(name)) return h_vbo[name]; else - { - Utils::VBO* vbo = new Utils::VBO(); - h_vbo.insert(name, vbo); - return vbo; - } + return NULL; } QList MapHandlerGen::getVBOList(const std::string& typeName) @@ -55,6 +51,7 @@ void MapHandlerGen::deleteVBO(const QString& name) { Utils::VBO* vbo = h_vbo[name]; h_vbo.remove(name); + emit(vboRemoved(vbo)); delete vbo; } } diff --git a/SCHNApps/src/window.cpp b/SCHNApps/src/window.cpp index b9250324..7d7740cc 100644 --- a/SCHNApps/src/window.cpp +++ b/SCHNApps/src/window.cpp @@ -382,7 +382,10 @@ void Window::setCurrentView(View* view) const QList& newPlugins = m_currentView->getLinkedPlugins(); foreach(Plugin* p, newPlugins) + { enablePluginTabWidgets(p); + p->currentViewChanged(m_currentView); + } connect(m_currentView, SIGNAL(pluginLinked(Plugin*)), this, SLOT(enablePluginTabWidgets(Plugin*))); @@ -587,31 +590,46 @@ void Window::linkViewAndPlugin(View* v, Plugin* p) { v->linkPlugin(p); p->linkView(v); + + emit(viewAndPluginLinked(v, p)); + + p->viewLinked(v); } void Window::unlinkViewAndPlugin(View* v, Plugin* p) { v->unlinkPlugin(p); p->unlinkView(v); + + emit(viewAndPluginUnlinked(v, p)); + + p->viewUnlinked(v); } void Window::linkViewAndMap(View* v, MapHandlerGen* m) { v->linkMap(m); m->linkView(v); + + emit(viewAndMapLinked(v, m)); } void Window::unlinkViewAndMap(View* v, MapHandlerGen* m) { v->unlinkMap(m); m->unlinkView(v); + + emit(viewAndMapUnlinked(v, m)); } void Window::linkViewAndCamera(View* v, Camera* c) { - v->getCurrentCamera()->unlinkView(v); + Camera* current = v->getCurrentCamera(); + current->unlinkView(v); + emit(viewAndCameraUnlinked(v, current)); v->setCurrentCamera(c); c->linkView(v); + emit(viewAndCameraLinked(v, c)); } /********************************************************* diff --git a/include/Algo/Geometry/curvature.hpp b/include/Algo/Geometry/curvature.hpp index 2c42b1b9..d65534f2 100644 --- a/include/Algo/Geometry/curvature.hpp +++ b/include/Algo/Geometry/curvature.hpp @@ -27,14 +27,6 @@ #include "Topology/generic/traversorCell.h" #include "Topology/generic/traversor2.h" -extern "C" -{ -#include "C_BLAS_LAPACK/INCLUDE/f2c.h" -#include "C_BLAS_LAPACK/INCLUDE/clapack.h" -} -#undef max -#undef min - namespace CGoGN { @@ -93,7 +85,7 @@ void computeCurvatureVertex_QuadraticFitting( // /*int res = */slaev2_(&a, &b, &c, &kmax_v, &kmin_v, &Kmax_x, &Kmax_y) ; Eigen::Matrix m; - m << a, b, b, c; + m << 2*a, b, b, 2*c; // solve eigen problem Eigen::SelfAdjointEigenSolver > solver(m); @@ -180,23 +172,23 @@ void quadraticFittingAddVertexNormal(typename PFP::VEC3& v, typename PFP::VEC3& typename PFP::VEC3 vec = v - p ; vec = localFrame * vec ; typename PFP::VEC3 norm = localFrame * n ; - solver.begin_row() ; - solver.add_coefficient(0, 2.0f * vec[0]) ; - solver.add_coefficient(1, vec[1]) ; + solver.begin_row() ; + solver.add_coefficient(0, 2.0f * vec[0] * norm[2]) ; + solver.add_coefficient(1, vec[1] * norm[2]) ; solver.add_coefficient(2, 0) ; - solver.add_coefficient(3, 1.0f) ; + solver.add_coefficient(3, 1.0f * norm[2]) ; solver.add_coefficient(4, 0) ; - solver.set_right_hand_side(-1.0f * norm[0] / norm[2]) ; + solver.set_right_hand_side(-1.0f * norm[0]) ; solver.end_row() ; solver.begin_row() ; solver.add_coefficient(0, 0) ; - solver.add_coefficient(1, vec[0]) ; - solver.add_coefficient(2, 2.0f * vec[1]) ; + solver.add_coefficient(1, vec[0] * norm[2]) ; + solver.add_coefficient(2, 2.0f * vec[1] * norm[2]) ; solver.add_coefficient(3, 0) ; - solver.add_coefficient(4, 1.0f) ; - solver.set_right_hand_side(-1.0f * norm[1] / norm[2]) ; + solver.add_coefficient(4, 1.0f * norm[2]) ; + solver.set_right_hand_side(-1.0f * norm[1]) ; solver.end_row() ; } /* @@ -221,6 +213,7 @@ void vertexCubicFitting(Dart dart, gmtl::Vec3f& normal, float& a, float& b, floa } solverC->end_system() ; solverC->solve() ; + a = solverC->variable(0).value() ; b = solverC->variable(1).value() ; c = solverC->variable(2).value() ; @@ -263,8 +256,8 @@ void cubicFittingAddVertexNormal(gmtl::Vec3f& v, gmtl::Vec3f& n, gmtl::Vec3f& p, gmtl::Vec3f vec = v - p ; vec = localFrame * vec ; gmtl::Vec3f norm = localFrame * n ; - solverC->begin_row() ; + solverC->begin_row() ; solverC->add_coefficient(0, 3.0f*vec[0]*vec[0]) ; solverC->add_coefficient(1, 2.0f*vec[0]*vec[1]) ; solverC->add_coefficient(2, vec[1]*vec[1]) ; -- GitLab