diff --git a/GUI/ba3d/ba3d/view/canvas.cpp b/GUI/ba3d/ba3d/view/canvas.cpp index 1e063931282659545167d1aedbbcf35525de739a..af51d2c98ec16b2e7d0cfa2a749494b5d4253c65 100644 --- a/GUI/ba3d/ba3d/view/canvas.cpp +++ b/GUI/ba3d/ba3d/view/canvas.cpp @@ -52,7 +52,7 @@ namespace RealSpace Canvas::Canvas() : aspectRatio(1), colorBgR(1), colorBgG(1), colorBgB(1), currentZoomLevel(0), camera(nullptr), - program(nullptr), model(nullptr) + program(nullptr), model(nullptr), m_isInitializedGL(false) { setCamera((camera = new Camera)); setProgram((program = new Program)); @@ -65,6 +65,7 @@ Canvas::~Canvas() releaseBuffers(); delete camera; delete program; + cleanup(); } void Canvas::setBgColor(QColor const& c) @@ -91,6 +92,7 @@ void Canvas::setProgram(Program* p) void Canvas::setModel(Model* m) { + qDebug() << "Canvas::setModel()"; releaseBuffers(); disconnect(modelUpdated); @@ -102,8 +104,9 @@ void Canvas::setModel(Model* m) update(); }); + Q_ASSERT(camera); setCamera(); - + //connect(camera, &RealSpace::Camera::updated, model, &Model::cameraUpdated); camera->set(); } @@ -125,9 +128,15 @@ void Canvas::setCamera(bool full) void Canvas::initializeGL() { + qDebug() << "Canvas::initializeGL()"; + Q_ASSERT(m_isInitializedGL == false); + + connect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &Canvas::cleanup); + initializeOpenGLFunctions(); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); + m_isInitializedGL = true; } void Canvas::resizeGL(int w, int h) @@ -286,10 +295,21 @@ void Canvas::draw(QColor const& color, QMatrix4x4 const& mat, Geometry const& ge buf->draw(); } +void Canvas::cleanup() +{ + qDebug() << "Canvas::cleanup()"; + m_isInitializedGL = false; +} + +bool Canvas::isInitialized() const +{ + return m_isInitializedGL && model != nullptr; +} + void Canvas::defaultView() { // Default view - if (model) { + if (isInitialized()) { RealSpace::Camera::Position defPos( RealSpace::Vector3D(0, cameraDefaultPosY, cameraDefaultPosZ), // eye RealSpace::Vector3D(0, 0, 0), // center @@ -308,7 +328,7 @@ void Canvas::defaultView() void Canvas::sideView() { // Side view at current zoom level - if (model) { + if (isInitialized()) { RealSpace::Vector3D eye(0, cameraDefaultPosY, 0); // Side view 3D axes is zoom scale independent @@ -334,7 +354,7 @@ void Canvas::sideView() void Canvas::topView() { // Top view at current zoom level - if (model) { + if (isInitialized()) { // Setting a tiny offset in y value of eye such that eye and up vectors are not parallel RealSpace::Vector3D eye(0, -0.5, -cameraDefaultPosY); @@ -360,7 +380,7 @@ void Canvas::topView() void Canvas::horizontalCameraTurn(float angle) { - if (model) { + if (isInitialized()) { float theta = angle * static_cast<float>(M_PI / 180.0); // in radians @@ -406,7 +426,7 @@ void Canvas::horizontalCameraTurn(float angle) void Canvas::verticalCameraTurn(float angle) { - if (model) { + if (isInitialized()) { float theta = angle * static_cast<float>(M_PI / 180.0); // in radians diff --git a/GUI/ba3d/ba3d/view/canvas.h b/GUI/ba3d/ba3d/view/canvas.h index 48c2f517b9e4d7614ca1c3fdefcb0d4545018074..2c433a3f1ebe38b636ecb5247e95cf8a978983fa 100644 --- a/GUI/ba3d/ba3d/view/canvas.h +++ b/GUI/ba3d/ba3d/view/canvas.h @@ -92,6 +92,11 @@ private: void releaseBuffers(); void draw(QColor const&, QMatrix4x4 const&, Geometry const&); + + void cleanup(); + bool isInitialized() const; + + bool m_isInitializedGL; }; } // namespace RealSpace