Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

IdTable< T > Class Template Reference

Stores physical copies of each mesh and then different sorted orders of each. More...

#include <id_table.h>

Collaboration diagram for IdTable< T >:

Collaboration graph
[legend]
List of all members.

Public Methods

void eraseAll ()
int add (const T &s)
 Adds a T to the universe. More...

void kill (int id)
 Pushes a T onto the delete queue for future deletion. More...

T * getById (int id)
 Returns the ID of this T given the name. More...

void updateDeleteList ()
 Removes all units on the delete queue and kills them foreverer. More...

void draw ()
 Goes through the mesh-sorted draw list in order and renders the Ts to screen. More...

void update ()
 Gets the command from each AI and attempts to follow said command if possible (obstacles/other Ts willing). More...

template<class Coll> void collideWithOther (Coll *coll, int surface, double minRadius, double maxRadius)
 Goes through bolt list and checks them against each mesh. FIXME combine somehow with update. More...

void collideWithBolts ()
 Goes through bolt list and checks them against each mesh. FIXME combine somehow with update. More...

void fixCollideOrder ()
void collideWithSame ()
 Goes through all other T s ( Spectre or Bolt )s inside of this table and Collides them against each other. More...


Protected Methods

bool del (int id)
 Erases a T from the maps, freeing all memory do not do this during list traversal. More...


Private Types

typedef MutableSet< T, MeshIdLessMeshMapClass
 A map that will store each T in texture-sorted, mesh-sorted order. More...

typedef KeyMutableSet< typename
T::CollideKey, T, CollideKeyLess
CollideMapClass
typedef Hashtable< int, T *, 65535 > IdMap

Private Methods

void incrementAndCheck (typename CollideMapClass::iterator &iter)

Private Attributes

std::vector< int > deleteQueue
MeshMapClass meshMap
 This class has the physical copy of the memory itself, stored in mesh-sorted order. More...

IdMap idMap
 A pointer to the mesh that is stored previously hashed on the ID int. More...

CollideMapClass collideMap
 A pointer to the T sorted by surface then by radius. More...


Detailed Description

template<class T>
class IdTable< T >

Stores physical copies of each mesh and then different sorted orders of each.


Member Typedef Documentation

template<class T>
typedef KeyMutableSet<typename T::CollideKey, T, CollideKeyLess> IdTable< T >::CollideMapClass [private]
 

template<class T>
typedef Hashtable<int, T *, 65535 > IdTable< T >::IdMap [private]
 

template<class T>
typedef MutableSet<T, MeshIdLess> IdTable< T >::MeshMapClass [private]
 

A map that will store each T in texture-sorted, mesh-sorted order.


Member Function Documentation

template<class T>
int IdTable< T >::add const T &    s [inline]
 

Adds a T to the universe.

00076                          {
00077         static int numgen=0;
00078         typename MeshMapClass::iterator iter= meshMap.insert(s);
00079         T *collidableToInsert=&(*iter).get();
00080         collideMap.insert(collidableToInsert);
00081         collidableToInsert->setId(numgen++);
00082         idMap.Put(collidableToInsert->getId(),collidableToInsert);
00083         return collidableToInsert->getId();
00084     }

template<class T>
void IdTable< T >::collideWithBolts   [inline]
 

Goes through bolt list and checks them against each mesh. FIXME combine somehow with update.

00124                             {
00125         //lower_bound!!!
00126         IdTable<Bolt> *btable=&world->surfaces[0]->boltField;//Just in case.
00127         typename CollideMapClass::iterator thisiter=collideMap.begin();
00128         for (;
00129                 thisiter!=collideMap.end();
00130                 ++thisiter) {
00131             const typename T::CollideKey &collideKey = ((*thisiter)->getCollideKey());
00132             int surface=collideKey.surface;
00133             btable=&world->surfaces[surface]->boltField;
00134             T * c = (*thisiter);
00135             float cRadius=c->getRadius();
00136             btable->collideWithOther(c,surface,collideKey.radius-fudgeFactor-cRadius,collideKey.radius+fudgeFactor+cRadius);
00137         }
00138     }

template<class T>
template<class Coll>
void IdTable< T >::collideWithOther Coll *    coll,
int    surface,
double    minRadius,
double    maxRadius
[inline]
 

Goes through bolt list and checks them against each mesh. FIXME combine somehow with update.

00114                                                                                                              {
00115         typename CollideMapClass::iterator othiter;
00116         typename T::CollideKey collideKey (surface,minRadius);
00117         othiter=this->collideMap.lower_bound(collideKey);
00118         while (othiter!=this->collideMap.end()&&(*othiter)->getCollideKey().radius<=maxRadius) {
00119             (*othiter)->collide(coll);
00120             ++othiter;
00121         }
00122     }

template<class T>
void IdTable< T >::collideWithSame   [inline]
 

Goes through all other T s ( Spectre or Bolt )s inside of this table and Collides them against each other.

00145                            {
00146         for (typename CollideMapClass::iterator thisiter=collideMap.begin();
00147                 thisiter!=collideMap.end();
00148                 ++thisiter) {
00149             const typename T::CollideKey &collideKey = ((*thisiter)->getCollideKey());
00150             for (typename CollideMapClass::iterator backward=thisiter;;) {
00151                 if (backward==collideMap.begin())
00152                     break;
00153                 --backward;
00154                 const typename T::CollideKey &backCollideKey = ((*backward)->getCollideKey());
00155                 if ((backCollideKey.radius<(collideKey.radius-fudgeFactor-(2 * (*thisiter)->getRadius())))||(backCollideKey.surface!=collideKey.surface)) {
00156                     break;
00157                 }
00158                 (*thisiter)->collide(*backward);
00159             }
00160             bool reachedthisiter=false;
00161             typename CollideMapClass::iterator otheriter=thisiter;
00162             ++otheriter;
00163             for (;otheriter!=collideMap.end();++otheriter) {
00164                 const typename T::CollideKey &forwardCollideKey = ((*otheriter)->getCollideKey());
00165                 if (forwardCollideKey.radius>(collideKey.radius+fudgeFactor+(2 * (*thisiter )->getRadius()))||forwardCollideKey.surface!=collideKey.surface) {
00166                     break;
00167                 }
00168                 (*thisiter)->collide(*otheriter);
00169             }
00170         }
00171     }

template<class T>
bool IdTable< T >::del int    id [inline, protected]
 

Erases a T from the maps, freeing all memory do not do this during list traversal.

00045                       {
00046         using std::vector;
00047         T *spec=idMap.Get(id);
00048         if (!spec) {
00049             return false;
00050         }
00051         idMap.Delete(id);
00052         {
00053             typename CollideMapClass::iterator iter=collidemap.find(spec->getCollideKey());
00054             while (iter!=collidemap.end()) {
00055                 if (spec==(*iter).second) {
00056                     collidemap.erase(iter);
00057                 }
00058                 iter++;
00059             }
00060         }
00061         typename MeshMapClass::iterator iter=meshmap.find(spec);
00062         if (&(*iter)==spec) {
00063             meshmap.erase(iter);
00064             break;
00065         }
00066         return true;
00067     }   

template<class T>
void IdTable< T >::draw  
 

Goes through the mesh-sorted draw list in order and renders the Ts to screen.

template<class T>
void IdTable< T >::eraseAll   [inline]
 

00069                      {
00070         meshMap.clear();
00071 //      idMap=IdMap(); //Does not work :-(
00072         collideMap.clear();
00073         deleteQueue.clear();
00074     }

template<class T>
void IdTable< T >::fixCollideOrder   [inline]
 

00139                            {
00140         for (typename CollideMapClass::iterator thisiter=collideMap.begin();
00141                 thisiter!=collideMap.end();
00142                 incrementAndCheck(thisiter)) {}
00143     }

template<class T>
T* IdTable< T >::getById int    id [inline]
 

Returns the ID of this T given the name.

00090                          {
00091         typename IdMap::iterator iter = idMap.find(id);
00092         if (iter!=iter.end()) {
00093             return (*iter).second;
00094         } else {
00095             return NULL;
00096         }
00097     }

template<class T>
void IdTable< T >::incrementAndCheck typename CollideMapClass::iterator &    iter [inline, private]
 

00040                                                                            {
00041         iter=collideMap.changeKey(iter,(*iter)->recalculateCollideKey());
00042     }

template<class T>
void IdTable< T >::kill int    id [inline]
 

Pushes a T onto the delete queue for future deletion.

00086                       {
00087         deleteQueue.push_back (id);
00088     }

template<class T>
void IdTable< T >::update  
 

Gets the command from each AI and attempts to follow said command if possible (obstacles/other Ts willing).

template<class T>
void IdTable< T >::updateDeleteList   [inline]
 

Removes all units on the delete queue and kills them foreverer.

00103                             {
00104         while (!deleteQueue.empty()){
00105             Del (deleteQueue.back());
00106             deleteQueue.pop_back();
00107         }
00108     }


Member Data Documentation

template<class T>
CollideMapClass IdTable< T >::collideMap [private]
 

A pointer to the T sorted by surface then by radius.

template<class T>
std::vector<int> IdTable< T >::deleteQueue [private]
 

template<class T>
IdMap IdTable< T >::idMap [private]
 

A pointer to the mesh that is stored previously hashed on the ID int.

template<class T>
MeshMapClass IdTable< T >::meshMap [private]
 

This class has the physical copy of the memory itself, stored in mesh-sorted order.


The documentation for this class was generated from the following file:
Generated on Mon Jul 7 21:13:52 2003 for Ethereal by doxygen1.2.15