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

Reply via email to