OpenMW
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
physicssystem.hpp
Go to the documentation of this file.
1 #ifndef OPENMW_MWPHYSICS_PHYSICSSYSTEM_H
2 #define OPENMW_MWPHYSICS_PHYSICSSYSTEM_H
3 
4 #include <memory>
5 #include <map>
6 #include <set>
7 
8 #include <osg/Quat>
9 #include <osg/ref_ptr>
10 
11 #include "../mwworld/ptr.hpp"
12 
13 #include "collisiontype.hpp"
14 
15 namespace osg
16 {
17  class Group;
18  class Object;
19 }
20 
21 namespace MWRender
22 {
23  class DebugDrawer;
24 }
25 
26 namespace Resource
27 {
28  class BulletShapeManager;
29  class ResourceSystem;
30 }
31 
32 namespace SceneUtil
33 {
34  class UnrefQueue;
35 }
36 
37 class btCollisionWorld;
38 class btBroadphaseInterface;
39 class btDefaultCollisionConfiguration;
40 class btCollisionDispatcher;
41 class btCollisionObject;
42 class btCollisionShape;
43 
44 namespace MWPhysics
45 {
46  typedef std::vector<std::pair<MWWorld::Ptr,osg::Vec3f> > PtrVelocityList;
47 
48  class HeightField;
49  class Object;
50  class Actor;
51 
53  {
54  public:
55  PhysicsSystem (Resource::ResourceSystem* resourceSystem, osg::ref_ptr<osg::Group> parentNode);
56  ~PhysicsSystem ();
57 
58  void setUnrefQueue(SceneUtil::UnrefQueue* unrefQueue);
59 
61 
62  void enableWater(float height);
63  void setWaterHeight(float height);
64  void disableWater();
65 
66  void addObject (const MWWorld::Ptr& ptr, const std::string& mesh, int collisionType = CollisionType_World);
67  void addActor (const MWWorld::Ptr& ptr, const std::string& mesh);
68 
69  void updatePtr (const MWWorld::Ptr& old, const MWWorld::Ptr& updated);
70 
71  Actor* getActor(const MWWorld::Ptr& ptr);
72  const Actor* getActor(const MWWorld::ConstPtr& ptr) const;
73 
74  const Object* getObject(const MWWorld::ConstPtr& ptr) const;
75 
76  // Object or Actor
77  void remove (const MWWorld::Ptr& ptr);
78 
79  void updateScale (const MWWorld::Ptr& ptr);
80  void updateRotation (const MWWorld::Ptr& ptr);
81  void updatePosition (const MWWorld::Ptr& ptr);
82 
83 
84  void addHeightField (const float* heights, int x, int y, float triSize, float sqrtVerts, float minH, float maxH, const osg::Object* holdObject);
85 
86  void removeHeightField (int x, int y);
87 
88  bool toggleCollisionMode();
89 
90  void stepSimulation(float dt);
91  void debugDraw();
92 
93  std::vector<MWWorld::Ptr> getCollisions(const MWWorld::ConstPtr &ptr, int collisionGroup, int collisionMask) const;
94  osg::Vec3f traceDown(const MWWorld::Ptr &ptr, const osg::Vec3f& position, float maxHeight);
95 
96  std::pair<MWWorld::Ptr, osg::Vec3f> getHitContact(const MWWorld::ConstPtr& actor,
97  const osg::Vec3f &origin,
98  const osg::Quat &orientation,
99  float queryDistance, std::vector<MWWorld::Ptr> targets = std::vector<MWWorld::Ptr>());
100 
101 
106  float getHitDistance(const osg::Vec3f& point, const MWWorld::ConstPtr& target) const;
107 
108  struct RayResult
109  {
110  bool mHit;
111  osg::Vec3f mHitPos;
112  osg::Vec3f mHitNormal;
114  };
115 
117  RayResult castRay(const osg::Vec3f &from, const osg::Vec3f &to, const MWWorld::ConstPtr& ignore = MWWorld::ConstPtr(),
118  std::vector<MWWorld::Ptr> targets = std::vector<MWWorld::Ptr>(),
120 
121  RayResult castSphere(const osg::Vec3f& from, const osg::Vec3f& to, float radius);
122 
124  bool getLineOfSight(const MWWorld::ConstPtr& actor1, const MWWorld::ConstPtr& actor2) const;
125 
126  bool isOnGround (const MWWorld::Ptr& actor);
127 
128  bool canMoveToWaterSurface (const MWWorld::ConstPtr &actor, const float waterlevel);
129 
131  osg::Vec3f getHalfExtents(const MWWorld::ConstPtr& actor) const;
132 
134  osg::Vec3f getRenderingHalfExtents(const MWWorld::ConstPtr& actor) const;
135 
138  osg::Vec3f getCollisionObjectPosition(const MWWorld::ConstPtr& actor) const;
139 
142  void queueObjectMovement(const MWWorld::Ptr &ptr, const osg::Vec3f &velocity);
143 
145  const PtrVelocityList& applyQueuedMovement(float dt);
146 
148  void clearQueuedMovement();
149 
153  bool isActorStandingOn(const MWWorld::Ptr& actor, const MWWorld::ConstPtr& object) const;
154 
156  void getActorsStandingOn(const MWWorld::ConstPtr& object, std::vector<MWWorld::Ptr>& out) const;
157 
160  bool isActorCollidingWith(const MWWorld::Ptr& actor, const MWWorld::ConstPtr& object) const;
161 
163  void getActorsCollidingWith(const MWWorld::ConstPtr& object, std::vector<MWWorld::Ptr>& out) const;
164 
165  bool toggleDebugRendering();
166 
169  void markAsNonSolid (const MWWorld::ConstPtr& ptr);
170 
171  bool isOnSolidGround (const MWWorld::Ptr& actor) const;
172 
173  private:
174 
175  void updateWater();
176 
177  osg::ref_ptr<SceneUtil::UnrefQueue> mUnrefQueue;
178 
179  btBroadphaseInterface* mBroadphase;
180  btDefaultCollisionConfiguration* mCollisionConfiguration;
181  btCollisionDispatcher* mDispatcher;
182  btCollisionWorld* mCollisionWorld;
183 
184  std::unique_ptr<Resource::BulletShapeManager> mShapeManager;
186 
187  typedef std::map<MWWorld::ConstPtr, Object*> ObjectMap;
189 
190  std::set<Object*> mAnimatedObjects; // stores pointers to elements in mObjects
191 
192  typedef std::map<MWWorld::ConstPtr, Actor*> ActorMap;
194 
195  typedef std::map<std::pair<int, int>, HeightField*> HeightFieldMap;
197 
199 
200  // Tracks standing collisions happening during a single frame. <actor handle, collided handle>
201  // This will detect standing on an object, but won't detect running e.g. against a wall.
202  typedef std::map<MWWorld::Ptr, MWWorld::Ptr> CollisionMap;
204 
205  // replaces all occurrences of 'old' in the map by 'updated', no matter if it's a key or value
206  void updateCollisionMapPtr(CollisionMap& map, const MWWorld::Ptr &old, const MWWorld::Ptr &updated);
207 
210 
211  float mTimeAccum;
212 
215 
216  std::unique_ptr<btCollisionObject> mWaterCollisionObject;
217  std::unique_ptr<btCollisionShape> mWaterCollisionShape;
218 
219  std::unique_ptr<MWRender::DebugDrawer> mDebugDrawer;
220 
221  osg::ref_ptr<osg::Group> mParentNode;
222 
223  float mPhysicsDt;
224 
225  PhysicsSystem (const PhysicsSystem&);
227  };
228 }
229 
230 #endif
RayResult castRay(const osg::Vec3f &from, const osg::Vec3f &to, const MWWorld::ConstPtr &ignore=MWWorld::ConstPtr(), std::vector< MWWorld::Ptr > targets=std::vector< MWWorld::Ptr >(), int mask=CollisionType_World|CollisionType_HeightMap|CollisionType_Actor|CollisionType_Door, int group=0xff) const
Definition: physicssystem.cpp:966
std::vector< std::pair< MWWorld::Ptr, osg::Vec3f > > PtrVelocityList
Definition: physicssystem.hpp:46
void disableWater()
Definition: physicssystem.cpp:1516
Resource::ResourceSystem * mResourceSystem
Definition: physicssystem.hpp:185
void updatePtr(const MWWorld::Ptr &old, const MWWorld::Ptr &updated)
Definition: physicssystem.cpp:1230
Wrapper class that constructs and provides access to the most commonly used resource subsystems...
Definition: resourcesystem.hpp:30
std::unique_ptr< MWRender::DebugDrawer > mDebugDrawer
Definition: physicssystem.hpp:219
std::set< Object * > mAnimatedObjects
Definition: physicssystem.hpp:190
osg::ref_ptr< osg::Group > mParentNode
Definition: physicssystem.hpp:221
HeightFieldMap mHeightFields
Definition: physicssystem.hpp:196
void addActor(const MWWorld::Ptr &ptr, const std::string &mesh)
Definition: physicssystem.cpp:1335
float mWaterHeight
Definition: physicssystem.hpp:213
bool mWaterEnabled
Definition: physicssystem.hpp:214
btCollisionDispatcher * mDispatcher
Definition: physicssystem.hpp:181
float mTimeAccum
Definition: physicssystem.hpp:211
void getActorsStandingOn(const MWWorld::ConstPtr &object, std::vector< MWWorld::Ptr > &out) const
Get the handle of all actors standing on object in this frame.
Definition: physicssystem.cpp:1495
std::pair< MWWorld::Ptr, osg::Vec3f > getHitContact(const MWWorld::ConstPtr &actor, const osg::Vec3f &origin, const osg::Quat &orientation, float queryDistance, std::vector< MWWorld::Ptr > targets=std::vector< MWWorld::Ptr >())
Definition: physicssystem.cpp:847
void enableWater(float height)
Definition: physicssystem.cpp:1525
void setUnrefQueue(SceneUtil::UnrefQueue *unrefQueue)
Definition: physicssystem.cpp:745
btCollisionWorld * mCollisionWorld
Definition: physicssystem.hpp:182
bool mDebugDrawEnabled
Definition: physicssystem.hpp:198
btDefaultCollisionConfiguration * mCollisionConfiguration
Definition: physicssystem.hpp:180
const Object * getObject(const MWWorld::ConstPtr &ptr) const
Definition: physicssystem.cpp:1269
ObjectMap mObjects
Definition: physicssystem.hpp:188
PtrVelocityList mMovementQueue
Definition: physicssystem.hpp:208
ActorMap mActors
Definition: physicssystem.hpp:193
Definition: collisiontype.hpp:8
osg::ref_ptr< SceneUtil::UnrefQueue > mUnrefQueue
Definition: physicssystem.hpp:177
bool mHit
Definition: physicssystem.hpp:110
std::map< std::pair< int, int >, HeightField * > HeightFieldMap
Definition: physicssystem.hpp:195
Definition: collisiontype.hpp:11
const PtrVelocityList & applyQueuedMovement(float dt)
Apply all queued movements, then clear the list.
Definition: physicssystem.cpp:1380
void markAsNonSolid(const MWWorld::ConstPtr &ptr)
Definition: physicssystem.cpp:770
Definition: physicssystem.hpp:52
Definition: collisiontype.hpp:9
bool toggleDebugRendering()
Definition: physicssystem.cpp:755
~PhysicsSystem()
Definition: physicssystem.cpp:715
std::map< MWWorld::Ptr, MWWorld::Ptr > CollisionMap
Definition: physicssystem.hpp:202
std::unique_ptr< Resource::BulletShapeManager > mShapeManager
Definition: physicssystem.hpp:184
osg::Vec3f getHalfExtents(const MWWorld::ConstPtr &actor) const
Get physical half extents (scaled) of the given actor.
Definition: physicssystem.cpp:1075
Definition: collisiontype.hpp:10
bool isOnGround(const MWWorld::Ptr &actor)
Definition: physicssystem.cpp:1055
void updateRotation(const MWWorld::Ptr &ptr)
Definition: physicssystem.cpp:1296
void getActorsCollidingWith(const MWWorld::ConstPtr &object, std::vector< MWWorld::Ptr > &out) const
Get the handle of all actors colliding with object in this frame.
Definition: physicssystem.cpp:1510
void updatePosition(const MWWorld::Ptr &ptr)
Definition: physicssystem.cpp:1317
void clearQueuedMovement()
Clear the queued movements list without applying.
Definition: physicssystem.cpp:1374
PtrVelocityList mMovementResults
Definition: physicssystem.hpp:209
bool toggleCollisionMode()
Definition: physicssystem.cpp:1344
Pointer to a const LiveCellRef.
Definition: ptr.hpp:90
std::unique_ptr< btCollisionObject > mWaterCollisionObject
Definition: physicssystem.hpp:216
void stepSimulation(float dt)
Definition: physicssystem.cpp:1468
bool isActorCollidingWith(const MWWorld::Ptr &actor, const MWWorld::ConstPtr &object) const
Definition: physicssystem.cpp:1504
osg::Vec3f getRenderingHalfExtents(const MWWorld::ConstPtr &actor) const
Definition: physicssystem.cpp:1084
std::vector< MWWorld::Ptr > getCollisions(const MWWorld::ConstPtr &ptr, int collisionGroup, int collisionMask) const
get handles this object collides with
Definition: physicssystem.cpp:1128
osg::Vec3f traceDown(const MWWorld::Ptr &ptr, const osg::Vec3f &position, float maxHeight)
Definition: physicssystem.cpp:1145
void updateCollisionMapPtr(CollisionMap &map, const MWWorld::Ptr &old, const MWWorld::Ptr &updated)
Definition: physicssystem.cpp:1214
std::unique_ptr< btCollisionShape > mWaterCollisionShape
Definition: physicssystem.hpp:217
Definition: physicssystem.cpp:555
osg::Vec3f mHitPos
Definition: physicssystem.hpp:111
btBroadphaseInterface * mBroadphase
Definition: physicssystem.hpp:179
void removeHeightField(int x, int y)
Definition: physicssystem.cpp:1163
Actor * getActor(const MWWorld::Ptr &ptr)
Definition: physicssystem.cpp:1253
void debugDraw()
Definition: physicssystem.cpp:1479
RayResult castSphere(const osg::Vec3f &from, const osg::Vec3f &to, float radius)
Definition: physicssystem.cpp:1015
void setWaterHeight(float height)
Definition: physicssystem.cpp:1535
float mPhysicsDt
Definition: physicssystem.hpp:223
bool isActorStandingOn(const MWWorld::Ptr &actor, const MWWorld::ConstPtr &object) const
Definition: physicssystem.cpp:1485
void updateScale(const MWWorld::Ptr &ptr)
Definition: physicssystem.cpp:1277
bool isOnSolidGround(const MWWorld::Ptr &actor) const
Definition: physicssystem.cpp:779
CollisionMap mStandingCollisions
Definition: physicssystem.hpp:203
void addHeightField(const float *heights, int x, int y, float triSize, float sqrtVerts, float minH, float maxH, const osg::Object *holdObject)
Definition: physicssystem.cpp:1154
osg::Vec3f getCollisionObjectPosition(const MWWorld::ConstPtr &actor) const
Definition: physicssystem.cpp:1093
std::map< MWWorld::ConstPtr, Object * > ObjectMap
Definition: physicssystem.hpp:187
Definition: physicssystem.hpp:108
PhysicsSystem & operator=(const PhysicsSystem &)
bool getLineOfSight(const MWWorld::ConstPtr &actor1, const MWWorld::ConstPtr &actor2) const
Return true if actor1 can see actor2.
Definition: physicssystem.cpp:1039
Handles unreferencing of objects through the WorkQueue. Typical use scenario would be the main thread...
Definition: unrefqueue.hpp:24
Pointer to a LiveCellRef.
Definition: ptr.hpp:19
PhysicsSystem(Resource::ResourceSystem *resourceSystem, osg::ref_ptr< osg::Group > parentNode)
Definition: physicssystem.cpp:680
osg::Vec3f mHitNormal
Definition: physicssystem.hpp:112
std::map< MWWorld::ConstPtr, Actor * > ActorMap
Definition: physicssystem.hpp:192
Resource::BulletShapeManager * getShapeManager()
Definition: physicssystem.cpp:750
void updateWater()
Definition: physicssystem.cpp:1544
bool canMoveToWaterSurface(const MWWorld::ConstPtr &actor, const float waterlevel)
Definition: physicssystem.cpp:1061
MWWorld::Ptr mHitObject
Definition: physicssystem.hpp:113
Definition: physicssystem.cpp:510
Definition: bulletshapemanager.hpp:25
void queueObjectMovement(const MWWorld::Ptr &ptr, const osg::Vec3f &velocity)
Definition: physicssystem.cpp:1359
Definition: actor.hpp:49
void addObject(const MWWorld::Ptr &ptr, const std::string &mesh, int collisionType=CollisionType_World)
Definition: physicssystem.cpp:1174
float getHitDistance(const osg::Vec3f &point, const MWWorld::ConstPtr &target) const
Definition: physicssystem.cpp:907