bate's blog

調べたこと実装したことなどを取りとめもなく書きます。

havokのquitに注意

quitで例外が出る面倒くさい。
原因は、保持すべきものを保持していなかったことが原因。

#ifndef __cHavokManager_h__
#define __cHavokManager_h__

#include "HavokHeader.h"

class cHavokManager
{
public:
	cHavokManager();
	~cHavokManager();

	void init();
	void exit();

	void addEntity(hkpEntity* entity);

private:
	hkMallocAllocator	m_MallocAllocator;
	hkMemoryRouter*		m_MemoryRouter;
	hkpWorld*			m_World;

};

#endif	// __cHavokManager_h__
#include "cHavokManager.h"

/*
	@brief	エラーコールバック
*/
static void HK_CALL errorReport(const char* msg, void* userContext)
{
	using namespace std;
	printf("%s", msg);
}

cHavokManager::cHavokManager()
: m_World(NULL)
, m_MemoryRouter(NULL)
{
}

cHavokManager::~cHavokManager()
{
}

void cHavokManager::init()
{
	m_MemoryRouter = hkMemoryInitUtil::initDefault(&m_MallocAllocator, hkMemorySystem::FrameInfo(1024*1024));
	hkBaseSystem::init(m_MemoryRouter, errorReport);

	m_World = new hkpWorld(hkpWorldCinfo());
	if(m_World) {
		hkpAgentRegisterUtil::registerAllAgents(m_World->getCollisionDispatcher());
	}
}

void cHavokManager::exit()
{
	if(m_World) {
		m_World->removeReference();
	}

	hkBaseSystem::quit();
	hkMemoryInitUtil::quit();
}

void cHavokManager::addEntity(hkpEntity* entity)
{
	if(entity) {
		if(m_World) {
			m_World->addEntity(entity);
		}
	}
}