Files
deighton-ar/mobile/ios/ViroKit.framework/Headers/VROPhysicsWorld.h
2018-03-27 17:46:15 -07:00

142 lines
4.7 KiB
C++

//
// VROPhysicsWorld.h
// ViroRenderer
//
// Copyright © 2017 Viro Media. All rights reserved.
//
#ifndef VROPhysicsWorld_h
#define VROPhysicsWorld_h
#include <memory>
#include "VROPhysicsBody.h"
class btBulletDynamicsCommon;
class btDiscreteDynamicsWorld;
class btBroadphaseInterface;
class btDefaultCollisionConfiguration;
class btCollisionDispatcher;
class btSequentialImpulseConstraintSolver;
class VROPhysicsDebugDraw;
class VRODriver;
class VRORenderContext;
/*
VROPhysicsWorld is a simulated physics environment that contains and processes
all acting forces and collisions on VROPhysicsBodies. It also contains both
the physics properties of the simulated world (like gravity) and collision
configuration parameters.
*/
class VROPhysicsWorld{
public:
VROPhysicsWorld();
virtual ~VROPhysicsWorld();
/*
Adds and removes a physics rigid body from the physics world.
Also guards against adding or removing the same physics
body from the world twice.
*/
void addPhysicsBody(std::shared_ptr<VROPhysicsBody> body);
void removePhysicsBody(std::shared_ptr<VROPhysicsBody> body);
/*
When called, performs a timeStep of simulation / calculations for this physics world.
*/
void computePhysics(const VRORenderContext &context);
/*
Iterate through the dynamic world, identify collided object pairs and notify their corresponding
physicsBodyDelegates regarding the collision event.
*/
void computeCollisions();
/*
Sets the x,y,z gravity on this physics world.
*/
void setGravity(VROVector3f gravity);
/*
Projects a ray into the scene from the given start to end location and returns
true if it has collided with any VROPhysics shape. If a collision occurred,
the collided body's physics delegate will be notified as well.
*/
bool findCollisionsWithRay(VROVector3f from, VROVector3f to, bool returnClosest,
std::string rayTag);
/*
Projects a shape into the scene from the given start to end location and returns
true if it has collided with any VROPhysics shape. If a collision occurred,
the collided body's physics delegate will be notified as well.
Note: If checking along a path, only the first collided object is notified. Else,
if checking at a point (where start and end VROVector3fs are the same), all collided
objects intersecting the shape are notified. This is currently a Bullet limitation.
*/
bool findCollisionsWithShape(VROVector3f fromPos, VROVector3f toPos,
std::shared_ptr<VROPhysicsShape> shape,
std::string rayTag);
/*
If true, renders a set of lines representing the collision mesh of all physicsBodies
within this world.
*/
void setDebugDrawVisible(bool isVisible);
private:
/*
Represents the physicsBodies that have been added to and processed by this physics world.
*/
std::map<std::string, std::shared_ptr<VROPhysicsBody>> _activePhysicsBodies;
/*
Bullet's representation of the physics world.
*/
btDiscreteDynamicsWorld* _dynamicsWorld;
/*
Bullet Broadphase represents the collision algorithm used for quick, rough computations
of collision pairs early on in the physics pipeline.
*/
btBroadphaseInterface* _broadphase;
/*
Configuration used for fine tuning collision algorithms.
*/
btDefaultCollisionConfiguration* _collisionConfiguration;
/*
Dispatcher is used for the notification of collisions.
*/
btCollisionDispatcher* _collisionDispatcher;
/*
Represents the constraints upon which the objects in this world will be resolved against.
This takes into account things like gravity, collisions, and hinges.
*/
btSequentialImpulseConstraintSolver* _constraintSolver;
/*
Performs a collision shape test at the given location, returns true if it has collided
with any VROPhysics shape, and notifies delegates along the way.
*/
bool collisionTestAtPoint(VROVector3f pos, std::shared_ptr<VROPhysicsShape> shape,
std::string rayTag);
/*
Projects a shape into the scene from the given start to end location, returns
true if it has collided with any VROPhysics shape. Only the closest VROPhysicsShape's
delegate is notified.
*/
bool collisionTestAlongPath(VROVector3f fromPos, VROVector3f toPos,
std::shared_ptr<VROPhysicsShape> shape,
std::string rayTag);
/*
Used by Bullet to render all debug elements within the physics world.
*/
VROPhysicsDebugDraw* _debugDraw;
bool _debugDrawVisible;
};
#endif