Sion Tower (demo técnica) 0.1

/home/david/programacion/iberogre-siontower/siontower/trunk/src/include/collisionManager.h

00001 /*
00002  * This file is part of SionTower.
00003  *
00004  * 
00005  * David Saltares Márquez (C) 2011
00006  * <david.saltares@gmail.com>
00007  *
00008  * 
00009  * SionTower examples are free software: you can redistribute it and/or
00010  * modify it under the terms of the GNU General Public License ad
00011  * published by the Free Software Foundation, either version 3 of the
00012  * License, or (at your option) ant later version.
00013  *
00014  * SionTower examples are distributed in the hope that it will be useful,
00015  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017  * GNU General Public License for more details.
00018  *
00019  * You should have received a copy of the GNU General Public License
00020  * along with SionTower examples.  If not, see <http://www.gnu.org/licenses/>.
00021  */
00022  
00023 #ifndef SIONTOWER_TRUNK_SRC_INCLUDE_COLLISIONMANAGER_H_
00024 #define SIONTOWER_TRUNK_SRC_INCLUDE_COLLISIONMANAGER_H_
00025 
00026 #include <OGRE/Ogre.h>
00027 #include <list>
00028 #include <set>
00029 #include <boost/unordered_map.hpp>
00030 #include <boost/function.hpp>
00031 
00032 #include "body.h"
00033 #include "shape.h"
00034 
00036 
00098 class CollisionManager: public Ogre::Singleton<CollisionManager> {
00099     public:
00104         typedef boost::function<void(Body*, Body*)> CollisionCallback;
00105 
00116         enum CallbackType {BEGINCOLLISION, COLLIDING, ENDCOLLISION, ALL};
00117        
00125         CollisionManager();
00126 
00135         ~CollisionManager();
00136 
00140         static CollisionManager& getSingleton();
00141 
00145         static CollisionManager* getSingletonPtr();
00146 
00154         void addBody(Body* body);
00155 
00164         bool removeBody(Body* body);
00165 
00171         void removeAllBodies();
00172 
00185         void addCollisionCallback(int typeA,
00186                                   int typeB,
00187                                   CollisionCallback callback,
00188                                   CallbackType callbackType = BEGINCOLLISION);
00189 
00199         bool removeCollisionCallback(int typeA, int typeB, CallbackType callbackType = ALL);
00200 
00207         void removeAllCollisionCallbacks(CallbackType type = ALL);
00208 
00213         void checkCollisions();
00214     private:
00215         typedef boost::unordered_map<int, boost::unordered_map<int, CollisionCallback> > CollisionCallbackTable;
00216         typedef boost::unordered_map<Body*, std::set<Body*> > CollidingBodies;
00217 
00218         CollisionCallbackTable _beginCallbackTable;
00219         CollisionCallbackTable _inCallbackTable;
00220         CollisionCallbackTable _endCallbackTable;
00221 
00222         CollidingBodies _collidingBodies;
00223         std::list<Body*> _bodies;
00224 
00225         Sphere* _sphereA;
00226         Sphere* _sphereB;
00227 
00228         bool existsCallback(int typeA, int typeB, CallbackType calbackType, CollisionCallback* collisionCallback);
00229         bool wereColliding(Body* bodyA, Body* bodyB);
00230 };
00231 
00232 #endif   // SIONTOWER_TRUNK_SRC_INCLUDE_COLLISIONMANAGER_H_
 Todo Clases Archivos Funciones 'typedefs' Enumeraciones