| [4744] | 1 | /* | 
|---|
| [3655] | 2 |    orxonox - the future of 3D-vertical-scrollers | 
|---|
 | 3 |  | 
|---|
 | 4 |    Copyright (C) 2004 orx | 
|---|
 | 5 |  | 
|---|
 | 6 |    This program is free software; you can redistribute it and/or modify | 
|---|
 | 7 |    it under the terms of the GNU General Public License as published by | 
|---|
 | 8 |    the Free Software Foundation; either version 2, or (at your option) | 
|---|
 | 9 |    any later version. | 
|---|
 | 10 |  | 
|---|
 | 11 |    ### File Specific: | 
|---|
| [6142] | 12 |    main-programmer: Benjamin Grauer | 
|---|
| [3655] | 13 |    co-programmer: ... | 
|---|
 | 14 | */ | 
|---|
 | 15 |  | 
|---|
 | 16 | //#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD_ENTITY | 
|---|
 | 17 |  | 
|---|
| [5629] | 18 | #include "object_manager.h" | 
|---|
| [5795] | 19 | #include "class_list.h" | 
|---|
| [3655] | 20 |  | 
|---|
| [5795] | 21 | #include "world_entity.h" | 
|---|
 | 22 |  | 
|---|
| [6142] | 23 | #include "shell_command.h" | 
|---|
 | 24 |  | 
|---|
| [8362] | 25 | #include <cassert> | 
|---|
 | 26 | #include "debug.h" | 
|---|
| [6142] | 27 |  | 
|---|
| [3655] | 28 | using namespace std; | 
|---|
| [6142] | 29 | SHELL_COMMAND(debug, ObjectManager, debug) | 
|---|
| [7198] | 30 |     ->defaultValues("", 0); | 
|---|
| [3655] | 31 |  | 
|---|
 | 32 | /** | 
|---|
| [6142] | 33 |  * @brief standard constructor | 
|---|
| [4838] | 34 |  */ | 
|---|
| [5629] | 35 | ObjectManager::ObjectManager () | 
|---|
| [3655] | 36 | { | 
|---|
| [5629] | 37 |    this->setClassID(CL_OBJECT_MANAGER, "ObjectManager"); | 
|---|
 | 38 |    this->setName("ObjectManager"); | 
|---|
| [5795] | 39 |  | 
|---|
 | 40 |    pNodeList = NULL; | 
|---|
| [3655] | 41 | } | 
|---|
 | 42 |  | 
|---|
| [6142] | 43 |  | 
|---|
| [3655] | 44 | /** | 
|---|
| [6142] | 45 |  * @brief standard deconstructor | 
|---|
 | 46 |  * | 
|---|
 | 47 |  * this also removes ALL entitites in existence. | 
|---|
| [4838] | 48 |  */ | 
|---|
| [6142] | 49 | ObjectManager::~ObjectManager () | 
|---|
 | 50 | { | 
|---|
 | 51 |   this->flush(); | 
|---|
 | 52 | } | 
|---|
| [3655] | 53 |  | 
|---|
 | 54 | /** | 
|---|
| [6142] | 55 |  * @brief flushes all entities | 
|---|
 | 56 |  * | 
|---|
 | 57 |  * this function deletes all entities that exist within the ObjectManager. | 
|---|
 | 58 |  * It does this by poping each list from the front, and delete the given object. | 
|---|
 | 59 |  * | 
|---|
 | 60 |  * automatically called by a destructor. | 
|---|
| [4838] | 61 |  */ | 
|---|
| [6142] | 62 | void ObjectManager::flush() | 
|---|
| [3655] | 63 | { | 
|---|
| [6142] | 64 |   for (unsigned int i = 0; i < OM_SIZE; ++i) | 
|---|
 | 65 |     while(!this->objectLists[i].empty()) | 
|---|
 | 66 |       delete this->objectLists[i].front(); | 
|---|
| [7785] | 67 |  | 
|---|
| [8037] | 68 |   // delete reflection list | 
|---|
 | 69 |   this->reflectionList.clear(); | 
|---|
| [3655] | 70 | } | 
|---|
| [5795] | 71 |  | 
|---|
| [6142] | 72 |  | 
|---|
| [5795] | 73 | /** | 
|---|
| [6142] | 74 |  * @brief moves an Entity from an old list to a new One | 
|---|
 | 75 |  * @param entity the entity to move. | 
|---|
 | 76 |  * @param omList the new List to move the entity to. | 
|---|
 | 77 |  * | 
|---|
 | 78 |  * this will erase the entity from the old list | 
|---|
 | 79 |  */ | 
|---|
 | 80 | void ObjectManager::toList (WorldEntity* entity, OM_LIST omList) | 
|---|
 | 81 | { | 
|---|
 | 82 |   assert (omList != OM_SIZE); | 
|---|
 | 83 |  | 
|---|
 | 84 |   if (likely(entity->getOMListNumber() != OM_INIT)) | 
|---|
 | 85 |     this->objectLists[entity->getOMListNumber()].erase(entity->getEntityIterator()); | 
|---|
 | 86 |  | 
|---|
 | 87 |   if (likely(omList != OM_INIT)) | 
|---|
 | 88 |   { | 
|---|
 | 89 |     this->objectLists[omList].push_back(entity); | 
|---|
 | 90 |     entity->getEntityIterator() = --this->objectLists[omList].end(); | 
|---|
 | 91 |     entity->getOMListNumber() = omList; | 
|---|
 | 92 |   } | 
|---|
 | 93 | } | 
|---|
 | 94 |  | 
|---|
 | 95 |  | 
|---|
 | 96 | /** | 
|---|
 | 97 |  * @see ObjectManager::toList(WorldEntity* OM_LIST) | 
|---|
 | 98 |  * @param entity the entity to move. | 
|---|
 | 99 |  * @param omList the new List to move the entity to. | 
|---|
 | 100 |  * | 
|---|
 | 101 |  * this function also does a transformation from omList as char* to OM_LIST. | 
|---|
 | 102 |  */ | 
|---|
| [7221] | 103 | void ObjectManager::toList (WorldEntity* entity, const std::string& omList) | 
|---|
| [6142] | 104 | { | 
|---|
 | 105 |   this->toList(entity, ObjectManager::StringToOMList(omList)); | 
|---|
 | 106 | } | 
|---|
 | 107 |  | 
|---|
 | 108 |  | 
|---|
 | 109 |  | 
|---|
 | 110 | /** | 
|---|
| [7368] | 111 |  * @returns a new List with a list of WorldEntities of distance Radius from center | 
|---|
| [5795] | 112 |  */ | 
|---|
| [7368] | 113 | void ObjectManager::distanceFromObject(EntityList& entities, const PNode& center, float radius, ClassID classID) | 
|---|
| [5795] | 114 | { | 
|---|
 | 115 |   const std::list<BaseObject*>* objectList = ClassList::getList(classID); | 
|---|
 | 116 |   if (objectList != NULL) | 
|---|
 | 117 |   { | 
|---|
 | 118 |  | 
|---|
 | 119 |     list<BaseObject*>::const_iterator node; | 
|---|
 | 120 |     for (node = objectList->begin(); node != objectList->end(); node++) | 
|---|
 | 121 |       if ((dynamic_cast<PNode*>(*node)->getAbsCoor() - center.getAbsCoor()).len() < radius) | 
|---|
| [7368] | 122 |         entities.push_back(dynamic_cast<WorldEntity*>(*node)); | 
|---|
| [5795] | 123 |   } | 
|---|
 | 124 | } | 
|---|
| [6142] | 125 |  | 
|---|
 | 126 |  | 
|---|
 | 127 | /** | 
|---|
 | 128 |  * @brief print out nice debug information about Elements in the list OM_LIST | 
|---|
 | 129 |  * @param omList the List to debug. | 
|---|
 | 130 |  * @param level: level 0: only show list info; level 1: also show entities and their names. | 
|---|
 | 131 |  */ | 
|---|
 | 132 | void ObjectManager::debug(OM_LIST omList, unsigned int level) const | 
|---|
 | 133 | { | 
|---|
 | 134 |   if (omList != OM_INIT || omList == OM_SIZE) | 
|---|
 | 135 |   { | 
|---|
 | 136 |     PRINT(0)(" +ObjectManager-LIST: '%s'==size='%d'==---\n", ObjectManager::OMListToString((OM_LIST)omList), this->objectLists[omList].size()); | 
|---|
 | 137 |   //  if (level >= 1) | 
|---|
 | 138 |     { | 
|---|
| [7370] | 139 |       ObjectManager::EntityList::const_iterator entity; | 
|---|
| [6142] | 140 |       for (entity = this->objectLists[omList].begin(); entity != this->objectLists[omList].end(); entity++) | 
|---|
 | 141 |       { | 
|---|
 | 142 |         PRINT(0)(" | %s::%s\n",(*entity)->getClassName(), (*entity)->getName()); | 
|---|
 | 143 |       } | 
|---|
 | 144 |     } | 
|---|
 | 145 |   } | 
|---|
 | 146 |   else | 
|---|
 | 147 |     PRINTF(2)("Invalid query. for OM_INIT-LIST or OM_SIZE\n"); | 
|---|
 | 148 | } | 
|---|
 | 149 |  | 
|---|
 | 150 |  | 
|---|
 | 151 | /** | 
|---|
 | 152 |  * @brief prints out very nice debug information | 
|---|
 | 153 |  * @param listName the Name of the list to get Debug information from | 
|---|
 | 154 |  * @param level: level 0: only show list info; level 1: also show entities and their names. | 
|---|
 | 155 |  */ | 
|---|
| [7221] | 156 | void ObjectManager::debug(const std::string& listName, unsigned int level) | 
|---|
| [6142] | 157 | { | 
|---|
 | 158 |   PRINT(0)("=================================\n"); | 
|---|
 | 159 |   PRINT(0)("=ObjectManager-DEBUG=============\n"); | 
|---|
 | 160 |   PRINT(0)("=================================\n"); | 
|---|
| [7221] | 161 |   if (listName.empty()) | 
|---|
| [6142] | 162 |     for (unsigned int i = 0; i < OM_SIZE; ++i) | 
|---|
 | 163 |       debug((OM_LIST) i, level); | 
|---|
 | 164 |   else | 
|---|
 | 165 |     debug(ObjectManager::StringToOMList(listName)); | 
|---|
 | 166 |   PRINT(0)("=========================== OM ==\n"); | 
|---|
 | 167 | } | 
|---|
 | 168 |  | 
|---|
 | 169 |  | 
|---|
 | 170 |  | 
|---|
 | 171 | /** | 
|---|
 | 172 |  * @brief transforms an omList into a String (usefull for debugging). | 
|---|
 | 173 |  * @param omList the OM_LIST to be transformed into a String. | 
|---|
 | 174 |  * @returns the String transformed from omList. | 
|---|
 | 175 |  */ | 
|---|
 | 176 | const char* ObjectManager::OMListToString(OM_LIST omList) | 
|---|
 | 177 | { | 
|---|
 | 178 |   if (omList == OM_INIT || omList == OM_SIZE) | 
|---|
 | 179 |     return "===invalid==="; | 
|---|
 | 180 |  | 
|---|
 | 181 |   printf("%d\n", omList); | 
|---|
 | 182 |   return ObjectManager::objectManagerListNames[omList]; | 
|---|
 | 183 | } | 
|---|
 | 184 |  | 
|---|
 | 185 |  | 
|---|
 | 186 |  | 
|---|
 | 187 | /** | 
|---|
 | 188 |  * @brief transforms a String into an OM_LIST (usefull for debugging/Loading). | 
|---|
 | 189 |  * @param listName the OM_LIST-name to be transformed into an OM_LIST. | 
|---|
 | 190 |  * @returns the OM_LIST transformed from listName. or the default, if not found or NULL. | 
|---|
 | 191 |  */ | 
|---|
| [7221] | 192 | OM_LIST ObjectManager::StringToOMList(const std::string& listName) | 
|---|
| [6142] | 193 | { | 
|---|
| [7221] | 194 |   if (unlikely(listName.empty())) return OM_DEFAULT_LIST; | 
|---|
| [6142] | 195 |  | 
|---|
 | 196 |   for(unsigned int i = 0; i < OM_SIZE; ++i) { | 
|---|
| [7221] | 197 |     if(listName == ObjectManager::objectManagerListNames[i]) { | 
|---|
| [6142] | 198 |       return (OM_LIST)i; | 
|---|
 | 199 |     } | 
|---|
 | 200 |   } | 
|---|
 | 201 |   return OM_DEFAULT_LIST; | 
|---|
 | 202 | } | 
|---|
 | 203 |  | 
|---|
 | 204 |  | 
|---|
 | 205 |  | 
|---|
 | 206 | const char* ObjectManager::objectManagerListNames[] = { | 
|---|
 | 207 |     "null", | 
|---|
 | 208 |     "dead", | 
|---|
 | 209 |     "dead-tick", | 
|---|
 | 210 |     "environ-notick", | 
|---|
 | 211 |     "environ", | 
|---|
| [7836] | 212 |     "background", | 
|---|
| [6142] | 213 |     "common", | 
|---|
 | 214 |  | 
|---|
 | 215 |     "group00", | 
|---|
 | 216 |     "group00-proj", | 
|---|
 | 217 |     "group01", | 
|---|
 | 218 |     "group01-proj", | 
|---|
 | 219 |     "group02", | 
|---|
 | 220 |     "group02-proj", | 
|---|
 | 221 |     "group03", | 
|---|
 | 222 |     "group03-proj", | 
|---|
 | 223 |     "group04", | 
|---|
 | 224 |     "group04-proj", | 
|---|
 | 225 |     "group05", | 
|---|
 | 226 |     "group05-proj", | 
|---|
 | 227 |     "group06", | 
|---|
 | 228 |     "group06-proj", | 
|---|
 | 229 |     "group07", | 
|---|
 | 230 |     "group07-proj", | 
|---|
 | 231 |     "group08", | 
|---|
 | 232 |     "group08-proj", | 
|---|
 | 233 |     "group09", | 
|---|
 | 234 |     "group09-proj", | 
|---|
 | 235 |     "group10", | 
|---|
 | 236 |     "group10-proj", | 
|---|
 | 237 |     "group11", | 
|---|
 | 238 |     "group11-proj", | 
|---|
 | 239 |     "group12", | 
|---|
 | 240 |     "group12-proj", | 
|---|
 | 241 |     "group13", | 
|---|
 | 242 |     "group13-proj", | 
|---|
 | 243 |     "group14", | 
|---|
 | 244 |     "group14-proj", | 
|---|
 | 245 |     "group15", | 
|---|
 | 246 |     "group15-proj" | 
|---|
 | 247 | }; | 
|---|