collision system is now updating only movable entities

This commit is contained in:
Clément Le Bihan
2021-06-11 11:29:33 +02:00
parent 74072064ea
commit 5d478d8aab
3 changed files with 34 additions and 16 deletions
+26 -14
View File
@@ -23,7 +23,7 @@ namespace BBM
return (overlapX && overlapY && overlapZ);
}
void CollisionSystem::onFixedUpdate(WAL::ViewEntity<PositionComponent, CollisionComponent> &entity)
void CollisionSystem::onFixedUpdate(WAL::ViewEntity<PositionComponent, CollisionComponent, MovableComponent> &entity)
{
unsigned int entityUid = entity->getUid();
auto &posA = entity.get<PositionComponent>();
@@ -33,8 +33,10 @@ namespace BBM
Vector3f pointAy = pointA;
Vector3f pointAz = pointA;
if (auto *movable = entity->tryGetComponent<MovableComponent>()) {
auto vel = movable->getVelocity();
auto &movable = entity.get<MovableComponent>();
const auto &vel = movable.getVelocity();
if (!vel.isNull()) {
pointAx.x += vel.x;
pointAy.y += vel.y;
pointAz.z += vel.z;
@@ -43,13 +45,21 @@ namespace BBM
Vector3f minAx = Vector3f::min(pointAx, pointAx + colA.bound);
Vector3f maxAx = Vector3f::max(pointAx, pointAx + colA.bound);
Vector3f minAy = Vector3f::min(pointAy, pointAy + colA.bound);
Vector3f maxAy = Vector3f::max(pointAy, pointAy + colA.bound);
Vector3f minAy;
Vector3f maxAy;
Vector3f minAz = Vector3f::min(pointAz, pointAz + colA.bound);
Vector3f maxAz = Vector3f::max(pointAz, pointAz + colA.bound);
Vector3f minAz;
Vector3f maxAz;
for (auto &[other, posB, colB] : this->getView()) {
if (!vel.isNull()) {
minAy = Vector3f::min(pointAy, pointAy + colA.bound);
maxAy = Vector3f::max(pointAy, pointAy + colA.bound);
minAz = Vector3f::min(pointAz, pointAz + colA.bound);
maxAz = Vector3f::max(pointAz, pointAz + colA.bound);
}
for (auto &[other, posB, colB] : this->_wal.getScene()->view<PositionComponent, CollisionComponent>()) {
if (other.getUid() == entityUid)
continue;
@@ -60,13 +70,15 @@ namespace BBM
Vector3f maxB = Vector3f::max(pointB, pointB + colB.bound);
if (boxesCollide(minAx, maxAx, minB, maxB)) {
collidedAxis += CollisionComponent::CollidedAxis::X;
collidedAxis += vel.isNull() ? 7 : CollisionComponent::CollidedAxis::X;
}
if (boxesCollide(minAy, maxAy, minB, maxB)) {
collidedAxis += CollisionComponent::CollidedAxis::Y;
}
if (boxesCollide(minAz, maxAz, minB, maxB)) {
collidedAxis += CollisionComponent::CollidedAxis::Z;
if (!vel.isNull()) {
if (boxesCollide(minAy, maxAy, minB, maxB)) {
collidedAxis += CollisionComponent::CollidedAxis::Y;
}
if (boxesCollide(minAz, maxAz, minB, maxB)) {
collidedAxis += CollisionComponent::CollidedAxis::Z;
}
}
if (collidedAxis) {
colA.onCollide(entity, other, static_cast<CollisionComponent::CollidedAxis>(collidedAxis));