Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/coll_rect/src/lib/collision_reaction/cr_engine.h @ 9889

Last change on this file since 9889 was 9889, checked in by patrick, 18 years ago

added namspacing to collision reaction. now comes the harder part :D

File size: 4.0 KB
Line 
1/*!
2 * @file cr_engine.h
3 * @brief The collision reaction engine, defining generic collision reactions to collision events
4 *
5 * some parts of this module are tuned for efficiency. They are probably not self-explenatory anymore :D
6 *  - Collision/ CollisionEvent objects recycling: This class contains a class of precached objects of these types
7 *      they are used for fast registration of collision events: These objects can be get by the interface functions and
8 *      are returned after one cycle automaticly by reseting the cached lists to its initial state. So do not wonder :D
9 */
10
11#ifndef _CR_ENGINE_
12#define _CR_ENGINE_
13
14#include "base_object.h"
15
16#include <vector>
17
18class WorldEntity;
19
20
21namespace CoRe
22{
23  class CollisionHandle;
24  class Collision;
25  class CollisionEvent;
26
27  //! A default singleton class.
28  class CREngine : public BaseObject
29  {
30    ObjectListDeclaration(CREngine);
31
32  public:
33    typedef enum CRType {
34      CR_PHYSICS_MOMENTUM   = 0,    //!< physical reaction: conservervation of momentum
35      CR_PHYSICS_STEP_BACK,         //!< physical reaction: just go to the last position without collisions
36      CR_PHYSICS_GROUND_WALK,       //!< physical reaction: stand on the ground, no movement: simulating simple normal force away from the gravity force
37      CR_PHYSICS_FULL_WALK,         //!< physical reaction: walking on the ground (inkl. hills etc)
38      CR_PHYSICS_DAMAGE,            //!< physical reaction: daling damage according to the object energy and their structural stability
39
40      CR_OBJECT_DAMAGE,             //!< object raction: deals damage according to the objects specific damage potential (like weapons, nukes, etc.)
41      CR_OBJECT_PICKUP,             //!< object rection: calling the objects pickup functions, let them handle the collision (once!)
42
43      CR_VERTEX_TRAFO,              //!< vertex trafo: transforming the vertex according to the damage
44
45      CR_SPECIAL_CALLBACK,          //!< special: call a callback function
46
47      CR_NUMBER
48    };
49
50    virtual ~CREngine(void);
51
52    /** @returns a Pointer to the only object of this Class */
53    inline static CREngine* getInstance() { if (!singletonRef) singletonRef = new CREngine();  return singletonRef; };
54
55    void reset();
56
57
58    CollisionHandle* subscribeReaction(WorldEntity* worldEntity, CRType type);
59
60    bool unsubscribeReaction(CollisionHandle* collisionHandle);
61
62    void handleCollisions();
63
64    /** @returns an instance to a collision object. instead of creating new object this ones can be resycled */
65    inline Collision* popCollisionObject()
66    {
67      if( !this->collisionsUnused.empty())
68      {
69        this->collisionsUsed.push_back(this->collisionsUnused.back()); this->collisionsUnused.pop_back(); return this->collisionsUsed.back();
70      }
71      else return NULL;
72    }
73
74
75    /** @return an instanco of a CollisionEvent object. instead of creating a new object this ones can be used and resycled */
76    inline CollisionEvent* popCollisionEventObject()
77    {
78      if( !this->collisionEventsUnused.empty())
79      {
80        this->collisionEventsUsed.push_back(this->collisionEventsUnused.back()); this->collisionEventsUnused.pop_back(); return this->collisionEventsUsed.back();
81      }
82      else return NULL;
83    }
84
85    void debug();
86
87
88  private:
89    CREngine();
90    void init();
91
92    void flushCollisions();
93
94
95  private:
96    std::vector<CollisionHandle*>       collisionHandles;         //!< list with the collision handles
97
98    std::vector<Collision*>             collisionsUsed;           //!< a list of used, cached collisions
99    std::vector<Collision*>             collisionsUnused;         //!< a list of unused, cached collisions
100
101    std::vector<CollisionEvent*>        collisionEventsUsed;      //!< a list of used, cached collision events
102    std::vector<CollisionEvent*>        collisionEventsUnused;    //!< a list of unused, cached collision events
103
104    static CREngine*                    singletonRef;             //!< the reference to the CREngine object (singleton)
105  };
106
107}
108#endif /* _CR_ENGINE_ */
Note: See TracBrowser for help on using the repository browser.