//================================================================================================= void eve::app::App::release(void) { // Unregister from application events. eve::evt::unregister_events_application(this); // View container. eve::sys::View * view = nullptr; while (!m_pVecViews->empty()) { view = m_pVecViews->back(); m_pVecViews->pop_back(); EVE_RELEASE_PTR(view); } EVE_RELEASE_PTR_CPP(m_pVecViews); // Fence. EVE_RELEASE_PTR(m_pFence); // Release Win32 COM. #if defined(EVE_OS_WIN) ::CoUninitialize(); #endif // OpenGL master context. eve::ogl::Context::release_instance(); // Messaging server (log). eve::mess::Server::release_instance(); }
//================================================================================================= void eve::ogl::Context::release_instance(void) { EVE_ASSERT(m_p_instance); EVE_RELEASE_PTR(m_p_instance); EVE_ASSERT(m_p_fence); EVE_RELEASE_PTR(m_p_fence); }
//================================================================================================= void eve::app::App::release_instance(void) { EVE_ASSERT(m_p_instance); EVE_RELEASE_PTR_CPP(m_p_instance); EVE_ASSERT(m_p_timer); EVE_RELEASE_PTR(m_p_timer); }
//================================================================================================= void eve::ogl::Renderer::release(void) { // Force queues process. m_pContext->makeCurrent(); this->processQueues(); m_pContext->swapBuffers(); m_pContext->doneCurrent(); // Empty and release queues m_pQueueInit->clear(); EVE_RELEASE_PTR_CPP(m_pQueueInit); m_pQueueUpdate->clear(); EVE_RELEASE_PTR_CPP(m_pQueueUpdate); m_pQueueRelease->clear(); EVE_RELEASE_PTR_CPP(m_pQueueRelease); // Release fence. EVE_RELEASE_PTR(m_pQueueFence); // Release context. EVE_RELEASE_PTR(m_pContext); }
//================================================================================================= bool eve::ui::Widget::releaseChild(eve::ui::Widget * p_pWidget) { std::vector<eve::ui::Widget*>::iterator itr = std::find(m_pChildren->begin(), m_pChildren->end(), p_pWidget); bool breturn = (itr != m_pChildren->end()); if (breturn) { eve::ui::Widget * child = (*itr); m_pChildren->erase(itr); EVE_RELEASE_PTR(child); this->childUpdate(); } return breturn; }
//================================================================================================= void eve::ui::Widget::release(void) { eve::ui::Widget * child = nullptr; while (!m_pChildren->empty()) { child = m_pChildren->back(); m_pChildren->pop_back(); EVE_RELEASE_PTR(child); } EVE_RELEASE_PTR_CPP(m_pChildren); // Do not delete -> shared pointer. m_pParent = nullptr; }
//================================================================================================= bool eve::app::App::releaseView(eve::sys::View * p_pView) { m_pFence->lock(); std::vector<eve::sys::View*>::iterator itr = std::find(m_pVecViews->begin(), m_pVecViews->end(), p_pView); bool breturn = (itr != m_pVecViews->end()); if (breturn) { eve::sys::View * view = (*itr); m_pVecViews->erase(itr); EVE_RELEASE_PTR(view); } m_pFence->unlock(); return breturn; }
//================================================================================================= void eve::ogl::Renderer::processQueues(void) { m_pQueueFence->lock(); while (!m_pQueueInit->empty()) { m_pQueueInit->front()->oglInit(); m_pQueueInit->pop_front(); } while (!m_pQueueUpdate->empty()) { m_pQueueUpdate->front()->oglUpdate(); m_pQueueUpdate->pop_front(); } while (!m_pQueueRelease->empty()) { eve::ogl::Object * obj = m_pQueueRelease->front(); m_pQueueRelease->pop_front(); obj->oglRelease(); EVE_RELEASE_PTR(obj); } m_pQueueFence->unlock(); }
//================================================================================================= void eve::ogl::Context::init(void) { m_pixelFormat = eve::ogl::PixelFormat::default_format(); // Create dummy window. eve::sys::Window * win = eve::sys::Window::create_ptr(0, 0, 1, 1); // Initialize OpenGL drawing device. m_hDC = ::GetDC(win->getHandle()); if (m_hDC == 0) { EVE_LOG_ERROR("Paint device cannot be null. GetDC() failed: %s", eve::mess::get_error_msg().c_str()); EVE_ASSERT_FAILURE; } // Initialize and choose best fitting Pixel Format. m_pixelFormatId = this->choosePixelFormat(); if (m_pixelFormatId == 0) { EVE_LOG_ERROR("Unable to get pixel format for device."); EVE_ASSERT_FAILURE; } // Apply pixel format to DC. if (::SetPixelFormat(m_hDC, m_pixelFormatId, &m_pixelFormatDecriptor) == FALSE) { EVE_LOG_ERROR("Unable to link pixel format to DC, SetPixelFormat() failed %s", eve::mess::get_error_msg().c_str()); EVE_ASSERT_FAILURE; } // Create context (GLRC). m_hGLRC = ::wglCreateContext(m_hDC); if (m_hGLRC == 0) { EVE_LOG_ERROR("Unable to create rendering context, wglCreateContext() failed %s", eve::mess::get_error_msg().c_str()); EVE_ASSERT_FAILURE; } // Make context current (has to be activated here to enforce DC bound). if (::wglMakeCurrent(m_hDC, m_hGLRC) == 0) { EVE_LOG_ERROR("Unable to attach context, wglMakeCurrent() failed %s.", eve::mess::get_error_msg().c_str()); EVE_ASSERT_FAILURE; } // Init OpenGL extension for this context eve::ogl::Context::init_OpenGL(); // Stock DC auto updated format. this->updateFormatVersion(); // Release context. if (::wglMakeCurrent(0, 0) == 0) { EVE_LOG_ERROR("Unable to detach context, wglMakeCurrent(0, 0) failed %s", eve::mess::get_error_msg().c_str()); EVE_ASSERT_FAILURE; } // Release dummy window. EVE_RELEASE_PTR(win); }