#include "precompiled.h" #include "ObjectManager.h" #include #include "CLogger.h" #include "lib/res/res.h" #define LOG_CATEGORY "graphics" CObjectManager::CObjectManager() : m_SelectedObject(0) { m_ObjectTypes.reserve(32); } CObjectManager::~CObjectManager() { m_SelectedObject=0; for (size_t i=0;i& objects=m_ObjectTypes[k].m_Objects; for (uint i=0;im_Name)==0) { return objects[i]; } } } return 0; } void CObjectManager::AddObjectType(const char* name) { m_ObjectTypes.resize(m_ObjectTypes.size()+1); SObjectType& type=m_ObjectTypes.back(); type.m_Name=name; type.m_Index=(int)m_ObjectTypes.size()-1; } void CObjectManager::AddObject(CObjectEntry* object,int type) { assert((uint)type& objects=m_ObjectTypes[entry->m_Type].m_Objects; typedef std::vector::iterator Iter; Iter i=std::find(objects.begin(),objects.end(),entry); if (i!=objects.end()) { objects.erase(i); } delete entry; } void CObjectManager::LoadObjects() { // find all the object types by directory name BuildObjectTypes(); // now iterate through terrain types loading all textures of that type uint i; for (i=0;i& objects=m_ObjectTypes[i].m_Objects; for (uint j=0;jm_Model) { if (!objects[j]->BuildModel()) { DeleteObject(objects[j]); } } } } } void CObjectManager::BuildObjectTypes() { Handle dir=vfs_open_dir("art/actors/"); vfsDirEnt dent; if (dir > 0) { // Iterate subdirs while (vfs_next_dirent(dir, &dent, "/")==0) { AddObjectType(dent.name); } vfs_close_dir(dir); } else LOG(ERROR, LOG_CATEGORY, "CObjectManager::BuildObjectTypes(): Unable to open dir art/actors/"); } void CObjectManager::LoadObjects(int type) { CStr pathname("art/actors/"); pathname += m_ObjectTypes[type].m_Name; pathname += "/"; Handle dir=vfs_open_dir(pathname.c_str()); vfsDirEnt dent; if (dir > 0) { while (vfs_next_dirent(dir, &dent, ".xml")==0) { CObjectEntry* object=new CObjectEntry(type); CStr filename(pathname); filename+=dent.name; if (!object->Load((const char*) filename)) { LOG(ERROR, LOG_CATEGORY, "CObjectManager::LoadObjects(): %s: XML Load failed", filename.c_str()); delete object; } else { AddObject(object,type); LOG(NORMAL, LOG_CATEGORY, "CObjectManager::LoadObjects(): %s: XML Loaded", filename.c_str()); } } vfs_close_dir(dir); } else LOG(ERROR, LOG_CATEGORY, "CObjectManager::LoadObjects(): Unable to open dir %s.", pathname.c_str()); }