4 #include <reactphysics3d/body/RigidBody.h>
5 #include <reactphysics3d/collision/narrowphase/CollisionDispatch.h>
6 #include <reactphysics3d/collision/narrowphase/NarrowPhaseAlgorithm.h>
7 #include <reactphysics3d/collision/shapes/CollisionShape.h>
8 #include <reactphysics3d/collision/Collider.h>
9 #include <reactphysics3d/collision/CollisionCallback.h>
10 #include <reactphysics3d/constraint/ContactPoint.h>
11 #include <reactphysics3d/engine/PhysicsWorld.h>
12 #include <reactphysics3d/mathematics/Quaternion.h>
13 #include <reactphysics3d/mathematics/Transform.h>
14 #include <reactphysics3d/mathematics/Vector3.h>
15 #include <reactphysics3d/memory/MemoryAllocator.h>
50 Body::Body(
World* world,
const string&
id,
BodyType type, uint16_t collisionTypeId,
bool enabled,
const Transform& transform,
float restitution,
float friction,
float mass,
const Vector3& inertiaTensor,
const vector<BoundingVolume*>& boundingVolumes)
66 rigidBody = this->world->
world->createRigidBody(reactphysics3d::Transform());
67 rigidBody->setType(reactphysics3d::BodyType::STATIC);
75 rigidBody = this->world->
world->createRigidBody(reactphysics3d::Transform());
76 rigidBody->setType(reactphysics3d::BodyType::DYNAMIC);
82 rigidBody = this->world->
world->createRigidBody(reactphysics3d::Transform());
83 rigidBody->setType(reactphysics3d::BodyType::KINEMATIC);
88 Console::println(
"Body::Body(): unsupported type: " + to_string(
type) +
": using collision body");
94 this->boundingVolumes.push_back(boundingVolume->clone());
97 for (
auto boundingVolume: this->boundingVolumes) {
98 boundingVolume->createCollisionShape(
world);
116 collider->setCollisionCategoryBits(typeId);
139 void Body::removeColliders(vector<reactphysics3d::Collider*>& colliders, vector<BoundingVolume*>& boundingVolumes) {
147 delete boundingVolume;
160 if (boundingVolume->getScale().equals(localTransform.
getScale()) ==
false) {
161 boundingVolume->destroyCollisionShape();
162 boundingVolume->setScale(localTransform.
getScale());
163 boundingVolume->createCollisionShape(
world);
184 if (boundingVolume->isAttachedToWorld() ==
false)
continue;
193 reactphysics3d::Transform localTransformRP3D(
199 auto collider =
rigidBody->addCollider(boundingVolume->collisionShape, localTransformRP3D * boundingVolume->collisionShapeLocalTransform);
200 collider->getMaterial().setBounciness(
restitution);
201 collider->getMaterial().setFrictionCoefficient(
friction);
213 rigidBody->setTransform(reactphysics3d::Transform());
222 for(
auto collider:
colliders) collider->getMaterial().setFrictionCoefficient(
friction);
245 listener->onCollision(
this, other, collisionResponse);
252 listener->onCollisionBegin(
this, other, collisionResponse);
259 listener->onCollisionEnd(
this, other);
vector< BoundingVolume * > boundingVolumes
void setTransform(const Transform &transform)
Set transform.
vector< CollisionListener * > collisionListener
reactphysics3d::RigidBody * rigidBody
void fireOnCollisionBegin(Body *other, CollisionResponse &collisionResponse)
Fire on collision begin.
void removeColliders(vector< reactphysics3d::Collider * > &colliders, vector< BoundingVolume * > &boundingVolumes)
Remove colliders.
void setEnabled(bool enabled)
Set up if rigid body is enabled.
void setFriction(float friction)
Set up friction.
void setRestitution(float restitution)
Set up restitution.
void setCollisionTypeId(uint16_t typeId)
Set collision type id.
void removeCollisionListener(CollisionListener *listener)
Remove a collision listener to this rigid body.
void fireOnCollisionEnd(Body *other)
Fire on collision end.
uint16_t collisionTypeIds
virtual ~Body()
Destructor.
virtual void resetColliders()
Reset body colliders.
void setCollisionTypeIds(uint16_t collisionTypeIds)
Set up collision type ids.
void addCollisionListener(CollisionListener *listener)
Add a collision listener to this rigid body.
vector< reactphysics3d::Collider * > colliders
void fireOnCollision(Body *other, CollisionResponse &collisionResponse)
Fire on collision.
@ BODYTYPE_COLLISION_DYNAMIC
@ BODYTYPE_COLLISION_STATIC
Dynamic physics world class.
reactphysics3d::PhysicsWorld * world
Axis aligned bounding box used for frustum, this is not directly connectable with physics engine.
Bounding volume interface.
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Quaternion class representing quaternion mathematical structure and operations with x,...
Vector3 class representing vector3 mathematical structure and operations with x, y,...