mojo_client/src/Client/GUI/DrawObjMgr.cpp
2007-10-28 17:32:45 +00:00

73 lines
1.7 KiB
C++

#include "common.h"
#include "log.h"
#include "DrawObject.h"
#include "DrawObjMgr.h"
DrawObjMgr::DrawObjMgr()
{
DEBUG( logdebug("DrawObjMgr created") );
}
DrawObjMgr::~DrawObjMgr()
{
DEBUG( logdebug("~DrawObjMgr(), deleting %u DrawObjects...", _storage.size() ) );
for(DrawObjStorage::iterator i = _storage.begin(); i != _storage.end(); i++)
{
DEBUG( logdebug("del for guid "I64FMT, i->first) );
delete i->second; // this can be done safely, since the object ptrs are not accessed
}
while(_add.size())
{
delete _add.next().second;
}
}
void DrawObjMgr::Add(uint64 objguid, DrawObject *o)
{
_add.add(std::pair<uint64,DrawObject*>(objguid,o));
}
void DrawObjMgr::Delete(uint64 guid)
{
_del.add(guid);
}
void DrawObjMgr::Update(void)
{
ZThread::FastMutex mut;
// now for the threadsafe part: lock every thread except this one
// to prevent obj ptr corruption caused by other running threads
// TODO: lock only main thread (that should be the only one to delete objects anyway!)
mut.acquire();
// add objects waiting on the add queue to the real storage
while(_add.size())
{
std::pair<uint64,DrawObject*> p = _add.next();
_storage[p.first] = p.second;
}
// same for objects that should be deleted
while(_del.size())
{
uint64 guid = _del.next();
if(_storage.find(guid) != _storage.end())
{
DrawObject *o = _storage[guid];
_storage.erase(guid);
delete o;
}
}
// now draw everything
for(DrawObjStorage::iterator i = _storage.begin(); i != _storage.end(); i++)
{
i->second->Draw();
}
mut.release();
}