示例#1
0
文件: App.cpp 项目: mrvux/Eve
//=================================================================================================
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();
}
示例#2
0
文件: Context.cpp 项目: mrvux/Eve
//=================================================================================================
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);
}
示例#3
0
文件: App.cpp 项目: mrvux/Eve
//=================================================================================================
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);
}
示例#4
0
文件: Renderer.cpp 项目: mrvux/Eve
//=================================================================================================
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);
}
示例#5
0
文件: Widget.cpp 项目: d-phaz/Eve
//=================================================================================================
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;
}
示例#6
0
文件: Widget.cpp 项目: d-phaz/Eve
//=================================================================================================
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;
}
示例#7
0
文件: App.cpp 项目: mrvux/Eve
//=================================================================================================
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;
}
示例#8
0
文件: Renderer.cpp 项目: mrvux/Eve
//=================================================================================================
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();
}
示例#9
0
文件: Context.cpp 项目: mrvux/Eve
//=================================================================================================
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);
}