Skip to content

Commit

Permalink
Physics: Static colliders shouldn't use rigid bodies for collisions #493
Browse files Browse the repository at this point in the history
 (#494)

Physics: Static colliders shouldn't use rigid bodies to process collisions #493

- MeshCollider fixed
- CharacterController fixed
  • Loading branch information
eprikazchikov authored Dec 8, 2022
1 parent a9d22bb commit e4e2264
Show file tree
Hide file tree
Showing 16 changed files with 179 additions and 144 deletions.
1 change: 1 addition & 0 deletions modules/physics/bullet/includes/components/boxcollider.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,6 @@ class BULLET_EXPORT BoxCollider : public VolumeCollider {
Vector3 m_size;

};
typedef BoxCollider* BoxColliderPtr;

#endif // BOXCOLLIDER_H
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,6 @@ class BULLET_EXPORT CapsuleCollider : public SphereCollider {
float m_height;

};
typedef CapsuleCollider* CapsuleColliderPtr;

#endif // CAPSULECOLLIDER_H
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@ class BULLET_EXPORT CharacterController : public Collider {

float m_step;

bool m_dirty;

};
typedef CharacterController* CharacterControllerPtr;

#endif // CHARACTERCONTROLLER_H
13 changes: 11 additions & 2 deletions modules/physics/bullet/includes/components/collider.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ class btCollisionShape;
class btCollisionObject;
class btDynamicsWorld;

class RigidBody;

class BULLET_EXPORT Collider : public Component {
A_REGISTER(Collider, Component, General)

Expand All @@ -24,6 +26,10 @@ class BULLET_EXPORT Collider : public Component {

virtual void update();

RigidBody *attachedRigidBody() const;
void setAttachedRigidBody(RigidBody *body);

public: // Signals
void entered();
void stay();
void exited();
Expand All @@ -47,19 +53,22 @@ class BULLET_EXPORT Collider : public Component {
void destroyCollider();

protected:
friend class BulletSystem;
friend class RigidBody;
friend class BulletSystem;

typedef unordered_map<uint32_t, bool> CollisionMap;

CollisionMap m_Collisions;
CollisionMap m_collisions;

btCollisionShape *m_collisionShape;

btCollisionObject *m_collisionObject;

btDynamicsWorld *m_world;

RigidBody *m_rigidBody;

};
typedef Collider* ColliderPtr;

#endif // COLLIDER_H
3 changes: 1 addition & 2 deletions modules/physics/bullet/includes/components/meshcollider.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@ class BULLET_EXPORT MeshCollider : public Collider {
private:
btCollisionShape *shape() override;

void createCollider() override;

void setEnabled(bool enable) override;

protected:
Expand All @@ -37,5 +35,6 @@ class BULLET_EXPORT MeshCollider : public Collider {
PhysicMaterial *m_material;

};
typedef MeshCollider* MeshColliderPtr;

#endif // MESHCOLLIDER_H
15 changes: 13 additions & 2 deletions modules/physics/bullet/includes/components/rigidbody.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@

#include "collider.h"

class RigidBodyPrivate;
class VolumeCollider;
class PhysicMaterial;
class MotionState;

class BULLET_EXPORT RigidBody : public Collider {
A_REGISTER(RigidBody, Collider, Components/Physics)
Expand Down Expand Up @@ -51,8 +52,18 @@ class BULLET_EXPORT RigidBody : public Collider {
PhysicMaterial *material() const;

protected:
RigidBodyPrivate *p_ptr;
list<VolumeCollider *> m_colliders;

MotionState *m_state;

float m_mass;

int32_t m_lockPosition;
int32_t m_lockRotation;

bool m_kinematic;

};
typedef RigidBody* RigidBodyPtr;

#endif // RIGIDBODY_H
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,6 @@ class BULLET_EXPORT SphereCollider : public VolumeCollider {
float m_radius;

};
typedef SphereCollider* SphereColliderPtr;

#endif // SPHERECOLLIDER_H
Original file line number Diff line number Diff line change
Expand Up @@ -54,5 +54,6 @@ class BULLET_EXPORT VolumeCollider : public Collider {
bool m_trigger;

};
typedef VolumeCollider* VolumeColliderPtr;

#endif // VOLUMECOLLIDER_H
1 change: 1 addition & 0 deletions modules/physics/bullet/includes/resources/physicmaterial.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,6 @@ class PhysicMaterial : public Resource {
float m_Density;

};
typedef PhysicMaterial* PhysicMaterialPtr;

#endif // PHYSICMATERIAL_H
4 changes: 1 addition & 3 deletions modules/physics/bullet/src/components/capsulecollider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,7 @@ btCollisionShape *CapsuleCollider::shape() {
if(m_collisionShape == nullptr) {
m_collisionShape = new btCapsuleShape(m_radius, m_height);

Transform *t = actor()->transform();

Vector3 p = t->scale();
Vector3 p = actor()->transform()->scale();
m_collisionShape->setLocalScaling(btVector3(p.x, p.y, p.z));

m_dirty = false;
Expand Down
39 changes: 13 additions & 26 deletions modules/physics/bullet/src/components/charactercontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,16 @@ CharacterController::CharacterController() :
m_radius(0.5f),
m_skin(0.08f),
m_slope(45.0f),
m_step(0.3f) {
m_step(0.3f),
m_dirty(false) {

m_ghostObject->setCollisionFlags(btCollisionObject::CF_CHARACTER_OBJECT);
m_ghostObject->setUserPointer(this);
}

CharacterController::~CharacterController() {
destroyCharacter();
destroyShape();

if(m_world) {
m_world->removeCollisionObject(m_ghostObject);
Expand Down Expand Up @@ -49,11 +51,7 @@ float CharacterController::height() const {

void CharacterController::setHeight(float height) {
m_height = height;

destroyCharacter();
destroyShape();

createCollider();
m_dirty = true;
}

float CharacterController::radius() const {
Expand All @@ -62,11 +60,7 @@ float CharacterController::radius() const {

void CharacterController::setRadius(float radius) {
m_radius = radius;

destroyCharacter();
destroyShape();

createCollider();
m_dirty = true;
}

float CharacterController::slopeLimit() const {
Expand All @@ -75,7 +69,7 @@ float CharacterController::slopeLimit() const {

void CharacterController::setSlopeLimit(float limit) {
m_slope = limit;
if(m_character == nullptr) {
if(m_character) {
m_character->setMaxSlope(m_slope);
}
}
Expand All @@ -86,7 +80,7 @@ float CharacterController::stepOffset() const {

void CharacterController::setStepOffset(float step) {
m_step = step;
if(m_character == nullptr) {
if(m_character) {
m_character->setStepHeight(step);
}
}
Expand All @@ -97,9 +91,7 @@ float CharacterController::skinWidth() const {

void CharacterController::setSkinWidth(float width) {
m_skin = width;

destroyCharacter();
createCollider();
m_dirty = true;
}

Vector3 CharacterController::center() const {
Expand Down Expand Up @@ -133,14 +125,11 @@ void CharacterController::createCollider() {
m_character->setMaxSlope(m_slope);
m_character->setStepHeight(m_step);

Transform *t = actor()->transform();
if(t) {
Vector3 center = m_center;
center += actor()->transform()->position();
Vector3 center = m_center;
center += actor()->transform()->worldPosition();

btTransform &transform = m_ghostObject->getWorldTransform();
transform.setOrigin(btVector3(center.x, center.y, center.z));
}
btTransform &transform = m_ghostObject->getWorldTransform();
transform.setOrigin(btVector3(center.x, center.y, center.z));
}

if(m_character && m_world) {
Expand All @@ -154,9 +143,7 @@ btCollisionShape *CharacterController::shape() {
if(m_collisionShape == nullptr) {
m_collisionShape = new btCapsuleShape(m_radius, m_height);

Transform *t = actor()->transform();

Vector3 p = t->scale();
Vector3 p = actor()->transform()->scale();
m_collisionShape->setLocalScaling(btVector3(p.x, p.y, p.z));

m_ghostObject->setCollisionShape(m_collisionShape);
Expand Down
52 changes: 43 additions & 9 deletions modules/physics/bullet/src/components/collider.cpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
#include "components/collider.h"

#include <components/actor.h>
#include <components/transform.h>

#include <btBulletDynamicsCommon.h>

Collider::Collider() :
m_collisionShape(nullptr),
m_collisionObject(nullptr),
m_world(nullptr) {
m_world(nullptr),
m_rigidBody(nullptr) {

}

Expand All @@ -18,6 +22,17 @@ void Collider::update() {

}

RigidBody *Collider::attachedRigidBody() const {
return m_rigidBody;
}

void Collider::setAttachedRigidBody(RigidBody *body) {
m_rigidBody = body;
if(m_rigidBody) {
destroyCollider();
}
}

btDynamicsWorld *Collider::world() const {
return m_world;
}
Expand All @@ -30,7 +45,23 @@ void Collider::setWorld(btDynamicsWorld *world) {
}

void Collider::createCollider() {
destroyCollider();

if(m_rigidBody == nullptr) {
m_collisionObject = new btCollisionObject();
m_collisionObject->setCollisionShape(shape());
if(m_world) {
Transform *t = actor()->transform();

Quaternion q = t->worldQuaternion();
Vector3 p = t->worldPosition();

m_collisionObject->setWorldTransform(btTransform(btQuaternion(q.x, q.y, q.z, q.w),
btVector3(p.x, p.y, p.z)));

m_world->addCollisionObject(m_collisionObject);
}
}
}

btCollisionShape *Collider::shape() {
Expand All @@ -43,22 +74,25 @@ void Collider::destroyShape() {
}

void Collider::destroyCollider() {
delete m_collisionObject;
m_collisionObject = nullptr;
if(m_collisionObject && m_world) {
m_world->removeCollisionObject(m_collisionObject);
delete m_collisionObject;
m_collisionObject = nullptr;
}
}

void Collider::dirtyContacts() {
for(auto &it : m_Collisions) {
for(auto &it : m_collisions) {
it.second = true;
}
}

void Collider::cleanContacts() {
auto it = m_Collisions.begin();
while(it != m_Collisions.end()) {
auto it = m_collisions.begin();
while(it != m_collisions.end()) {
if(it->second == true) {
emitSignal(_SIGNAL(exited()));
it = m_Collisions.erase(it);
it = m_collisions.erase(it);
if(m_collisionObject) {
m_collisionObject->activate(true);
}
Expand All @@ -70,7 +104,7 @@ void Collider::cleanContacts() {

void Collider::setContact(Collider *other) {
bool result = true;
for(auto &it : m_Collisions) {
for(auto &it : m_collisions) {
if(it.first == other->uuid()) {
emitSignal(_SIGNAL(stay()));
it.second = false;
Expand All @@ -80,6 +114,6 @@ void Collider::setContact(Collider *other) {
}
if(result) {
emitSignal(_SIGNAL(entered()));
m_Collisions[other->uuid()] = false;
m_collisions[other->uuid()] = false;
}
}
Loading

0 comments on commit e4e2264

Please sign in to comment.