mojo_client/src/Client/GUI/DrawObjMgr.cpp
false_genesis 3b47963c5d * the camera is now located behind the character's back and follows his movement; zoom in/out works too. original patch by sbp, thx!
** note: press POS1 key to toggle movement/freefly mode
* fixed character movement without initial turn (before it went into a random direction if not turned - now its fine)
* fixed: really (un-)load maps when moving a longer distance
* improved graphical debugging: show all SceneNode bounding boxes & bones (if there are any) - press backspace to toggle debugging
* ISceneNodes can now be accessed via their owner's guids [use DrawObjMgr::Get(guid) and DrawObject::GetSceneNode()]
* added one more ByteBuffer output variant (combined hex/text), thx nitrogrlie!
2008-08-11 23:52:42 +00:00

108 lines
2.6 KiB
C++

#include "common.h"
#include "log.h"
#include "DrawObject.h"
#include "DrawObjMgr.h"
DrawObjMgr::DrawObjMgr()
{
DEBUG( logdebug("DrawObjMgr created") );
}
DrawObjMgr::~DrawObjMgr()
{
Clear();
}
void DrawObjMgr::Clear(void)
{
DEBUG( logdebug("DrawObjMgr::Clear(), 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
}
_storage.clear();
while(_add.size())
{
delete _add.next().second;
}
while(_del.size())
{
_del.next();
}
}
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::UnlinkAll(void)
{
DEBUG( logdebug("DrawObjMgr::UnlinkAll(), %u DrawObjects...", _storage.size() ) );
for(DrawObjStorage::iterator i = _storage.begin(); i != _storage.end(); i++)
{
i->second->Unlink();
}
}
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();
DEBUG(logdebug("DrawObjMgr: adding DrawObj 0x%X guid "I64FMT" to main storage",p.second,p.first));
_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];
DEBUG(logdebug("DrawObjMgr: removing DrawObj 0x%X guid "I64FMT" from main storage",o,guid));
_storage.erase(guid);
delete o;
}
else
{
DEBUG(logdebug("DrawObjMgr: ERROR: removable DrawObject "I64FMT" not exising",guid));
}
}
// now draw everything
for(DrawObjStorage::iterator i = _storage.begin(); i != _storage.end(); i++)
{
i->second->Draw();
}
//mut.release();
}
DrawObject *DrawObjMgr::Get(uint64 guid)
{
DrawObjStorage::iterator it = _storage.find(guid);
if(it != _storage.end())
return it->second;
return NULL;
}