Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/coll_rect/src/lib/collision_reaction/collision_tube.h @ 9985

Last change on this file since 9985 was 9985, checked in by patrick, 17 years ago

giving the crengine the ability to check for collisions itself, collision tube only used as container

File size: 3.2 KB
Line 
1/*!
2 * @file collision_tube.h
3 *
4 * collision tube collects all collisions from all entities
5 *
6 *  The collision events are saved in the _collisionList vector in a fixed hirarchy: a collision is defined by the world entities
7 *  that collide. For each collision there is an entry in _collisionList. Each collision itself again contains collision events which are
8 *  defined as collisions between the boundibg volumes (BV) of the world entities. This could look like this:
9 *
10 *  - Collision (WorldEntity_i  <=> WorldEntity_j)
11 *     +- CollisionEvent( some BV <=> some other BV)
12 *     +- CollisionEvent( some BV <=> some other BV)
13 *  - Collision (WorldEntity_k <=> WorldEntity_l)
14 *     +- CollisionEvent( some BV <=> some other BV)
15 *     +- CollisionEvent( some BV <=> some other BV)
16 *     +- CollisionEvent( some BV <=> some other BV)
17 *     +- CollisionEvent( some BV <=> some other BV)
18 *  - ... etc ...
19 *
20 *
21 *  When the collisions are processed by the handleCollision() function each collision pair is checked for their reactions (since each
22 *  WorldEntity can define several reactions to a collision). After all the reactions are calculated and applied the collision object is
23 *  put back.
24 */
25
26#ifndef _COLLISION_TUBE_H
27#define _COLLISION_TUBE_H
28
29#include "base_object.h"
30#include "cr_engine.h"
31#include "world_entity.h"
32
33#include "vector.h"
34#include <vector>
35
36class Collision;
37class WorldEntity;
38class BoundingVolume;
39
40namespace CoRe
41{
42
43  class CollisionReaction;
44
45  //! A class containing all CollisionEvents (structured as defined in the file doxygen tags)
46  class CollisionTube : public BaseObject
47  {
48    ObjectListDeclaration(CollisionTube);
49
50    typedef std::vector<Collision*>::iterator     CollisionIterator;
51
52    /* Constructor/Deconstructor/Singleton Interface */
53  public:
54    inline static CollisionTube* getInstance() { if( CollisionTube::instance != NULL) CollisionTube::instance = new CollisionTube(); return CollisionTube::instance; }
55    virtual ~CollisionTube();
56
57  private:
58    CollisionTube();
59    CollisionTube(const CollisionTube& tube) {}
60
61    static CollisionTube*          instance;            //!< the singleton instance
62
63
64    /* Collision Handling */
65  public:
66    void registerCollisionEvent(WorldEntity* entityA, WorldEntity* entityB, BoundingVolume* bvA, BoundingVolume* bvB);
67    void registerCollisionEvent(CREngine::CollisionType type, WorldEntity* entity, WorldEntity* groundEntity,
68                                const Vector& normal, const Vector& position, bool bInWall = false);
69
70    /** @returns an iterator pointing to the beginning of the list */
71    CollisionIterator& begin() const { return this->_collisionList.begin(); }
72    /** @returns an iterator pointing to the end of the list */
73    CollisionIterator& end()   const { return this->_collisionList.end(); }
74
75
76  private:
77    std::vector<Collision*>         _collisionList;                      //!< the list of collisions since the last processing
78
79
80    /* Misc State Informations */
81  public:
82    /** @returns true if at least one of both WorldEntities are subscribed for a collision reaction */
83    inline bool isReactive(const WorldEntity& entityA, const WorldEntity& entityB) const
84      { return (entityA.isReactive(entityB) && entityB.isReactive(entityA)); }
85
86  };
87
88}
89
90#endif /* _COLLISION_TUBE_H */
Note: See TracBrowser for help on using the repository browser.