#include "surface_render.h" #include "mapHandler.h" namespace CGoGN { namespace SCHNApps { bool SurfaceRenderPlugin::enable() { m_dockTab = new SurfaceRender_DockTab(m_schnapps, this); m_schnapps->addPluginDockTab(this, m_dockTab, "SurfaceRender"); m_flatShader = new CGoGN::Utils::ShaderFlat(); m_flatShader->setAmbiant(CGoGN::Geom::Vec4f(0.2f, 0.2f, 0.2f, 0.1f)); m_flatShader->setDiffuse(CGoGN::Geom::Vec4f(0.8f, 0.9f, 0.7f, 1.0f)); m_flatShader->setExplode(1.0f); m_phongShader = new CGoGN::Utils::ShaderPhong() ; m_phongShader->setAmbiant(CGoGN::Geom::Vec4f(0.2f, 0.2f, 0.2f, 0.1f)) ; m_phongShader->setDiffuse(CGoGN::Geom::Vec4f(0.8f, 0.9f, 0.7f, 1.0f)) ; m_phongShader->setSpecular(CGoGN::Geom::Vec4f(0.9f, 0.9f, 0.9f, 1.0f)) ; m_phongShader->setShininess(80.0f) ; m_simpleColorShader = new CGoGN::Utils::ShaderSimpleColor(); CGoGN::Geom::Vec4f c(0.1f, 0.1f, 0.1f, 1.0f); m_simpleColorShader->setColor(c); m_pointSprite = new CGoGN::Utils::PointSprite(); registerShader(m_flatShader); registerShader(m_phongShader); registerShader(m_simpleColorShader); registerShader(m_pointSprite); connect(m_schnapps, SIGNAL(selectedViewChanged(View*, View*)), this, SLOT(selectedViewChanged(View*, View*))); connect(m_schnapps, SIGNAL(selectedMapChanged(MapHandlerGen*, MapHandlerGen*)), this, SLOT(selectedMapChanged(MapHandlerGen*, MapHandlerGen*))); connect(m_schnapps, SIGNAL(mapAdded(MapHandlerGen*)), this, SLOT(mapAdded(MapHandlerGen*))); connect(m_schnapps, SIGNAL(mapRemoved(MapHandlerGen*)), this, SLOT(mapRemoved(MapHandlerGen*))); foreach(MapHandlerGen* map, m_schnapps->getMapSet().values()) mapAdded(map); m_dockTab->updateMapParameters(); return true; } void SurfaceRenderPlugin::disable() { delete m_flatShader; delete m_phongShader; delete m_simpleColorShader; delete m_pointSprite; foreach(MapHandlerGen* map, m_schnapps->getMapSet().values()) mapRemoved(map); } void SurfaceRenderPlugin::drawMap(View* view, MapHandlerGen* map) { const MapParameters& p = h_viewParameterSet[view][map]; if(p.positionVBO) { if(p.renderVertices) { m_pointSprite->setSize(map->getBBdiagSize() / 200.0f * p.verticesScaleFactor); m_pointSprite->setAttributePosition(p.positionVBO); m_pointSprite->setColor(CGoGN::Geom::Vec4f(0.0f, 0.0f, 1.0f, 1.0f)); map->draw(m_pointSprite, CGoGN::Algo::Render::GL2::POINTS); } if(p.renderEdges) { glLineWidth(1.0f); m_simpleColorShader->setAttributePosition(p.positionVBO); map->draw(m_simpleColorShader, CGoGN::Algo::Render::GL2::LINES); } if(p.renderFaces) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glEnable(GL_LIGHTING); glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1.0f, 1.0f); switch(p.faceStyle) { case MapParameters::FLAT : m_flatShader->setAttributePosition(p.positionVBO); map->draw(m_flatShader, CGoGN::Algo::Render::GL2::TRIANGLES); break ; case MapParameters::PHONG : if(p.normalVBO != NULL) { m_phongShader->setAttributePosition(p.positionVBO) ; m_phongShader->setAttributeNormal(p.normalVBO) ; map->draw(m_phongShader, CGoGN::Algo::Render::GL2::TRIANGLES); } break ; } glDisable(GL_POLYGON_OFFSET_FILL); } } } void SurfaceRenderPlugin::selectedViewChanged(View *prev, View *cur) { m_dockTab->updateMapParameters(); } void SurfaceRenderPlugin::selectedMapChanged(MapHandlerGen *prev, MapHandlerGen *cur) { m_dockTab->updateMapParameters(); } void SurfaceRenderPlugin::mapAdded(MapHandlerGen *map) { connect(map, SIGNAL(vboAdded(Utils::VBO*)), this, SLOT(vboAdded(Utils::VBO*))); connect(map, SIGNAL(vboRemoved(Utils::VBO*)), this, SLOT(vboRemoved(Utils::VBO*))); } void SurfaceRenderPlugin::mapRemoved(MapHandlerGen *map) { disconnect(map, SIGNAL(vboAdded(Utils::VBO*)), this, SLOT(vboAdded(Utils::VBO*))); disconnect(map, SIGNAL(vboRemoved(Utils::VBO*)), this, SLOT(vboRemoved(Utils::VBO*))); } void SurfaceRenderPlugin::vboAdded(Utils::VBO *vbo) { MapHandlerGen* map = static_cast(QObject::sender()); if(map == m_schnapps->getSelectedMap()) { if(vbo->dataSize() == 3) { m_dockTab->addPositionVBO(QString::fromStdString(vbo->name())); m_dockTab->addNormalVBO(QString::fromStdString(vbo->name())); } } } void SurfaceRenderPlugin::vboRemoved(Utils::VBO *vbo) { MapHandlerGen* map = static_cast(QObject::sender()); if(map == m_schnapps->getSelectedMap()) { if(vbo->dataSize() == 3) { m_dockTab->removePositionVBO(QString::fromStdString(vbo->name())); m_dockTab->removeNormalVBO(QString::fromStdString(vbo->name())); } } QSet viewsToUpdate; QHash >::iterator i; for (i = h_viewParameterSet.begin(); i != h_viewParameterSet.end(); ++i) { View* view = i.key(); QHash& viewParamSet = i.value(); MapParameters& mapParam = viewParamSet[map]; if(mapParam.positionVBO == vbo) { mapParam.positionVBO = NULL; if(view->isLinkedToMap(map)) viewsToUpdate.insert(view); } if(mapParam.normalVBO == vbo) { mapParam.normalVBO = NULL; if(view->isLinkedToMap(map)) viewsToUpdate.insert(view); } } foreach(View* v, viewsToUpdate) v->updateGL(); } void SurfaceRenderPlugin::changePositionVBO(const QString& view, const QString& map, const QString& vbo) { View* v = m_schnapps->getView(view); MapHandlerGen* m = m_schnapps->getMap(map); if(v && m) { Utils::VBO* vbuf = m->getVBO(vbo); h_viewParameterSet[v][m].positionVBO = vbuf; if(v->isSelectedView()) { if(v->isLinkedToMap(m)) v->updateGL(); if(m->isSelectedMap()) m_dockTab->updateMapParameters(); } } } void SurfaceRenderPlugin::changeNormalVBO(const QString& view, const QString& map, const QString& vbo) { View* v = m_schnapps->getView(view); MapHandlerGen* m = m_schnapps->getMap(map); if(v && m) { Utils::VBO* vbuf = m->getVBO(vbo); h_viewParameterSet[v][m].normalVBO = vbuf; if(v->isSelectedView()) { if(v->isLinkedToMap(m)) v->updateGL(); if(m->isSelectedMap()) m_dockTab->updateMapParameters(); } } } void SurfaceRenderPlugin::changeRenderVertices(const QString& view, const QString& map, bool b) { View* v = m_schnapps->getView(view); MapHandlerGen* m = m_schnapps->getMap(map); if(v && m) { h_viewParameterSet[v][m].renderVertices = b; if(v->isSelectedView()) { if(v->isLinkedToMap(m)) v->updateGL(); if(m->isSelectedMap()) m_dockTab->updateMapParameters(); } } } void SurfaceRenderPlugin::changeVerticesScaleFactor(const QString& view, const QString& map, float f) { View* v = m_schnapps->getView(view); MapHandlerGen* m = m_schnapps->getMap(map); if(v && m) { h_viewParameterSet[v][m].verticesScaleFactor = f; if(v->isSelectedView()) { if(v->isLinkedToMap(m)) v->updateGL(); if(m->isSelectedMap()) m_dockTab->updateMapParameters(); } } } void SurfaceRenderPlugin::changeRenderEdges(const QString& view, const QString& map, bool b) { View* v = m_schnapps->getView(view); MapHandlerGen* m = m_schnapps->getMap(map); if(v && m) { h_viewParameterSet[v][m].renderEdges = b; if(v->isSelectedView()) { if(v->isLinkedToMap(m)) v->updateGL(); if(m->isSelectedMap()) m_dockTab->updateMapParameters(); } } } void SurfaceRenderPlugin::changeRenderFaces(const QString& view, const QString& map, bool b) { View* v = m_schnapps->getView(view); MapHandlerGen* m = m_schnapps->getMap(map); if(v && m) { h_viewParameterSet[v][m].renderFaces = b; if(v->isSelectedView()) { if(v->isLinkedToMap(m)) v->updateGL(); if(m->isSelectedMap()) m_dockTab->updateMapParameters(); } } } void SurfaceRenderPlugin::changeFacesStyle(const QString& view, const QString& map, MapParameters::FaceShadingStyle style) { View* v = m_schnapps->getView(view); MapHandlerGen* m = m_schnapps->getMap(map); if(v && m) { h_viewParameterSet[v][m].faceStyle = style; if(v->isSelectedView()) { if(v->isLinkedToMap(m)) v->updateGL(); if(m->isSelectedMap()) m_dockTab->updateMapParameters(); } } } #ifndef DEBUG Q_EXPORT_PLUGIN2(SurfaceRenderPlugin, SurfaceRenderPlugin) #else Q_EXPORT_PLUGIN2(SurfaceRenderPluginD, SurfaceRenderPlugin) #endif } // namespace SCHNApps } // namespace CGoGN