Sion Tower (demo técnica) 0.1
|
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_