Revision: 76242 http://sourceforge.net/p/brlcad/code/76242 Author: starseeker Date: 2020-06-30 20:58:11 +0000 (Tue, 30 Jun 2020) Log Message: ----------- Fix by Sadeep Darshana for the detachment of a display window losing the display of the solid wireframe.
Modified Paths: -------------- brlcad/trunk/src/qged/display/Display.cpp brlcad/trunk/src/qged/display/Display.h brlcad/trunk/src/qged/display/DisplayManager.cpp brlcad/trunk/src/qged/display/DisplayManager.h brlcad/trunk/src/qged/display/GeometryRenderer.cpp brlcad/trunk/src/qged/display/GeometryRenderer.h brlcad/trunk/src/qged/main_window.cpp Modified: brlcad/trunk/src/qged/display/Display.cpp =================================================================== --- brlcad/trunk/src/qged/display/Display.cpp 2020-06-30 18:01:05 UTC (rev 76241) +++ brlcad/trunk/src/qged/display/Display.cpp 2020-06-30 20:58:11 UTC (rev 76242) @@ -18,10 +18,8 @@ * information. */ /** @file Display.cpp */ -// -// Created by Sadeep on 07-Jun. -// + #include "Display.h" #include <glm/gtc/type_ptr.hpp> #include <QtWidgets/QApplication> @@ -47,11 +45,10 @@ using namespace std; -Display::Display(rt_wdb *database) { - this->database = database; +Display::Display() { camera = new OrthographicCamera(); displayManager = new DisplayManager(this); - geometryRenderer = new GeometryRenderer(database,displayManager); + geometryRenderer = new GeometryRenderer(displayManager); axesRenderer = new AxesRenderer(); renderers.push_back(geometryRenderer); Modified: brlcad/trunk/src/qged/display/Display.h =================================================================== --- brlcad/trunk/src/qged/display/Display.h 2020-06-30 18:01:05 UTC (rev 76241) +++ brlcad/trunk/src/qged/display/Display.h 2020-06-30 20:58:11 UTC (rev 76242) @@ -18,10 +18,8 @@ * information. */ /** @file Display.h */ -// -// Created by Sadeep on 07-Jun. -// + #ifndef RT3_DISPLAY_H #define RT3_DISPLAY_H @@ -39,7 +37,7 @@ Q_OBJECT public: - Display(rt_wdb *_database); + Display(); Camera *camera; void onDatabaseUpdated(); @@ -70,9 +68,8 @@ Qt::MouseButton moveCameraMouseButton = Qt::RightButton; Qt::KeyboardModifier rotateAroundThirdAxisModifier = Qt::ShiftModifier; - DisplayManager *displayManager; - rt_wdb *database; + rt_wdb *database = nullptr; GeometryRenderer * geometryRenderer; AxesRenderer * axesRenderer; std::vector<Renderable*> renderers; Modified: brlcad/trunk/src/qged/display/DisplayManager.cpp =================================================================== --- brlcad/trunk/src/qged/display/DisplayManager.cpp 2020-06-30 18:01:05 UTC (rev 76241) +++ brlcad/trunk/src/qged/display/DisplayManager.cpp 2020-06-30 20:58:11 UTC (rev 76242) @@ -18,9 +18,7 @@ * information. */ /** @file DisplayManager.cpp */ -// -// Created by Sadeep on 12-Jun. -// + #include <rt/db_internal.h> #include <rt/functab.h> #include <rt/db_io.h> @@ -331,17 +329,18 @@ glEndList(); } +/* + * End of the display list initiated by beginDList. + */ +GLboolean DisplayManager::isDListValid(unsigned int list) +{ + return glIsList(list); +} + void DisplayManager::freeDLists(unsigned int list, int range) { glDeleteLists((GLuint)list, (GLsizei)range); } -void DisplayManager::saveState(){ - glPushAttrib(GL_ALL_ATTRIB_BITS); -} -void DisplayManager::restoreState(){ - glPopAttrib(); -} - void DisplayManager::drawBegin() { glClearColor(bgColor[0],bgColor[1],bgColor[2],1); @@ -353,6 +352,13 @@ } +void DisplayManager::saveState(){ + glPushAttrib(GL_ALL_ATTRIB_BITS); +} +void DisplayManager::restoreState(){ + glPopAttrib(); +} + void DisplayManager::loadMatrix(const GLfloat *m) { glMatrixMode(GL_MODELVIEW); Modified: brlcad/trunk/src/qged/display/DisplayManager.h =================================================================== --- brlcad/trunk/src/qged/display/DisplayManager.h 2020-06-30 18:01:05 UTC (rev 76241) +++ brlcad/trunk/src/qged/display/DisplayManager.h 2020-06-30 20:58:11 UTC (rev 76242) @@ -18,10 +18,8 @@ * information. */ /** @file DisplayManager.h */ -// -// Created by Sadeep on 12-Jun. -// + #ifndef RT3_DisplayManager_H #define RT3_DisplayManager_H #ifdef _WIN32 @@ -51,6 +49,7 @@ void endDList(); void drawDList(unsigned int list); void freeDLists(unsigned int list, int range); + GLboolean isDListValid(unsigned int list); void saveState(); void restoreState(); void drawBegin(); Modified: brlcad/trunk/src/qged/display/GeometryRenderer.cpp =================================================================== --- brlcad/trunk/src/qged/display/GeometryRenderer.cpp 2020-06-30 18:01:05 UTC (rev 76241) +++ brlcad/trunk/src/qged/display/GeometryRenderer.cpp 2020-06-30 20:58:11 UTC (rev 76242) @@ -36,16 +36,18 @@ #endif -GeometryRenderer::GeometryRenderer(rt_wdb *database, DisplayManager *displayManager) : database(database), - displayManager(displayManager) {} +GeometryRenderer::GeometryRenderer(DisplayManager *displayManager) : displayManager(displayManager) {} void GeometryRenderer::render() { - if (database == NULL) return; + if (database == nullptr) return; displayManager->saveState(); glEnable(GL_LIGHTING); if(!immediateMode) { - if (databaseUpdated) { + // If database has been updated we need to redraw. + // Also QOpenGLWidget sometimes looses saved display list after UI changes (dock / undock etc). + // Therefore we need to draw again if the dlists are not available + if (databaseUpdated || (!solids.empty() && !displayManager->isDListValid(solids[0]))) { drawDatabase(); databaseUpdated = false; } @@ -59,9 +61,6 @@ displayManager->restoreState(); } -/* - * Clears existing display lists, iterate through each solid and generates display lists by calling drawSolid on each - */ void GeometryRenderer::onDatabaseUpdated() { r_database = rt_new_rti(database->dbip); if (!immediateMode) { @@ -71,6 +70,10 @@ } } + +/* + * Clears existing display lists, iterate through each solid and generates display lists by calling drawSolid on each + */ void GeometryRenderer::drawDatabase() { db_tree_state initState; db_init_db_tree_state(&initState, r_database->rti_dbip, database->wdb_resp); Modified: brlcad/trunk/src/qged/display/GeometryRenderer.h =================================================================== --- brlcad/trunk/src/qged/display/GeometryRenderer.h 2020-06-30 18:01:05 UTC (rev 76241) +++ brlcad/trunk/src/qged/display/GeometryRenderer.h 2020-06-30 20:58:11 UTC (rev 76242) @@ -43,22 +43,22 @@ class GeometryRenderer:public Renderable { public: - GeometryRenderer(rt_wdb *database, DisplayManager *displayManager); + explicit GeometryRenderer(DisplayManager *displayManager); rt_wdb * getDatabase(); void setDatabase(rt_wdb *database); void onDatabaseUpdated(); - void render(); + void render() override; private: - rt_wdb *database; - rt_i * r_database; + rt_wdb *database = nullptr; + rt_i * r_database = nullptr; DisplayManager *displayManager; float defaultWireColor[3] = {1,.1,.4}; - std::vector<int> solids; // contains the display list of each solid bool immediateMode = false; bool databaseUpdated = false; static tree *drawSolid(db_tree_state *tsp, const db_full_path *pathp, rt_db_internal *ip, void *clientData); void drawDatabase(); + std::vector<int> solids; // contains the display list of each solid }; Modified: brlcad/trunk/src/qged/main_window.cpp =================================================================== --- brlcad/trunk/src/qged/main_window.cpp 2020-06-30 18:01:05 UTC (rev 76241) +++ brlcad/trunk/src/qged/main_window.cpp 2020-06-30 20:58:11 UTC (rev 76242) @@ -68,7 +68,7 @@ view_dock = new ads::CDockWidget("Scene"); view_menu->addAction(view_dock->toggleViewAction()); // canvas = new QGLWidget(); //TODO - will need to subclass this so libdm/libfb updates are done correctly - canvas = new Display(0); //TODO - will need to subclass this so libdm/libfb updates are done correctly + canvas = new Display(); //TODO - will need to subclass this so libdm/libfb updates are done correctly canvas->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); canvas->setMinimumSize(512,512); view_dock->setWidget(canvas, ads::CDockWidget::eInsertMode::ForceNoScrollArea); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ BRL-CAD Source Commits mailing list brlcad-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/brlcad-commits