Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/util/object_manager.cc @ 8562

Last change on this file since 8562 was 8362, checked in by bensch, 18 years ago

orxonox/trunk: removed stupid included in base_object.h
this should lead to faster compile-times

File size: 6.2 KB
RevLine 
[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]28using namespace std;
[6142]29SHELL_COMMAND(debug, ObjectManager, debug)
[7198]30    ->defaultValues("", 0);
[3655]31
32/**
[6142]33 * @brief standard constructor
[4838]34 */
[5629]35ObjectManager::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]49ObjectManager::~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]62void 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 */
80void 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]103void 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]113void 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 */
132void 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]156void 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 */
176const 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]192OM_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
206const 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};
Note: See TracBrowser for help on using the repository browser.