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
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits