Made CollisionSystem aware of entities

This commit is contained in:
2016-01-27 15:42:50 +01:00
parent 181017313d
commit 788407b709
7 changed files with 22 additions and 56 deletions
-1
View File
@@ -59,7 +59,6 @@ bool AABBVsAABB(const AABB& a, const AABB& b);
//Return true if the boxes are intersecting. //Return true if the boxes are intersecting.
//Also outputs the minimum translation that box [a] would need in order to resolve collision. //Also outputs the minimum translation that box [a] would need in order to resolve collision.
bool AABBVsAABB(const AABB& a, const AABB& b, glm::vec3& minimumTranslation); bool AABBVsAABB(const AABB& a, const AABB& b, glm::vec3& minimumTranslation);
bool IsSameBoxProbably(const AABB& first, const AABB& second, const float epsilon = 0.0001f);
// Calculates an absolute AABB from an entity AABB component // Calculates an absolute AABB from an entity AABB component
boost::optional<EntityAABB> EntityAbsoluteAABB(EntityWrapper& entity); boost::optional<EntityAABB> EntityAbsoluteAABB(EntityWrapper& entity);
+2 -10
View File
@@ -7,7 +7,6 @@
#include "../Common.h" #include "../Common.h"
#include "../Core/System.h" #include "../Core/System.h"
#include "../Core/EventBroker.h" #include "../Core/EventBroker.h"
#include "../Core/EKeyUp.h"
#include "../Core/Octree.h" #include "../Core/Octree.h"
#include "EntityAABB.h" #include "EntityAABB.h"
@@ -18,20 +17,13 @@ public:
: System(world, eventBroker) : System(world, eventBroker)
, PureSystem("Collidable") , PureSystem("Collidable")
, m_Octree(octree) , m_Octree(octree)
, zPress(false) { }
{
//TODO: Debug stuff, remove later.
EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &CollisionSystem::OnKeyUp);
}
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override; virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override;
private: private:
Octree<EntityAABB>* m_Octree; Octree<EntityAABB>* m_Octree;
bool zPress; std::vector<EntityAABB> m_OctreeResult;
EventRelay<CollisionSystem, Events::KeyUp> m_EKeyUp;
bool OnKeyUp(const Events::KeyUp &event);
}; };
#endif #endif
-14
View File
@@ -239,20 +239,6 @@ bool AABBvsTriangles(const AABB& box, const std::vector<RawModel::Vertex>& model
return hit; return hit;
} }
bool IsSameBoxProbably(const AABB& first, const AABB& second, const float epsilon)
{
const glm::vec3& ma1 = first.MaxCorner();
const glm::vec3& ma2 = second.MaxCorner();
const glm::vec3& mi1 = first.MinCorner();
const glm::vec3& mi2 = second.MinCorner();
return (std::abs(ma1.x - ma2.x) < epsilon) &&
(std::abs(mi1.x - mi2.x) < epsilon) &&
(std::abs(ma1.z - ma2.z) < epsilon) &&
(std::abs(mi1.z - mi2.z) < epsilon) &&
(std::abs(ma1.y - ma2.y) < epsilon) &&
(std::abs(mi1.y - mi2.y) < epsilon);
}
bool attachAABBComponentFromModel(World* world, EntityID id) bool attachAABBComponentFromModel(World* world, EntityID id)
{ {
if (!world->HasComponent(id, "Model")) { if (!world->HasComponent(id, "Model")) {
+10 -20
View File
@@ -16,22 +16,20 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
ComponentWrapper& cTransform = entity["Transform"]; ComponentWrapper& cTransform = entity["Transform"];
EntityAABB& boxA = *boundingBox; EntityAABB& boxA = *boundingBox;
//Press 'Z' to enable/disable collision. // Collide against octree items
if (zPress) { m_OctreeResult.clear();
return; m_Octree->ObjectsInSameRegion(*boundingBox, m_OctreeResult);
} for (auto& boxB : m_OctreeResult) {
// Collide against octree
std::vector<EntityAABB> octreeResult;
m_Octree->ObjectsInSameRegion(*boundingBox, octreeResult);
for (auto& boxB : octreeResult) {
glm::vec3 resolutionVector; glm::vec3 resolutionVector;
if (Collision::IsSameBoxProbably(boxA, boxB)) { if (boxA.Entity == boxB.Entity) {
continue; continue;
} }
if (Collision::AABBVsAABB(boxA, boxB, resolutionVector)) { if (Collision::AABBVsAABB(boxA, boxB, resolutionVector)) {
(glm::vec3&)cTransform["Position"] += resolutionVector; (glm::vec3&)cTransform["Position"] += resolutionVector;
((glm::vec3&)cPhysics["Velocity"]).y = 0.f; if (resolutionVector.y > 0) {
((glm::vec3&)cPhysics["Velocity"]).y = 0.f;
}
} }
} }
@@ -56,12 +54,4 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
// (glm::vec3&)cTransform["Position"] += resolutionVector; // (glm::vec3&)cTransform["Position"] += resolutionVector;
// } // }
//} //}
} }
bool CollisionSystem::OnKeyUp(const Events::KeyUp & event)
{
if (event.KeyCode == GLFW_KEY_Z) {
zPress = !zPress;
}
return false;
}
+1 -2
View File
@@ -105,8 +105,7 @@ bool Child::BoxCollides(const AABB& boxToTest, AABB& outBoxIntersected) const
for (int i : m_DynamicObjIndices) { for (int i : m_DynamicObjIndices) {
if (!m_DynamicObjectsRef[i].Checked) { if (!m_DynamicObjectsRef[i].Checked) {
const AABB& objBox = *m_DynamicObjectsRef[i].Box; const AABB& objBox = *m_DynamicObjectsRef[i].Box;
if (!Collision::IsSameBoxProbably(boxToTest, objBox) && if (Collision::AABBVsAABB(boxToTest, objBox)) {
Collision::AABBVsAABB(boxToTest, objBox)) {
outBoxIntersected = objBox; outBoxIntersected = objBox;
return true; return true;
} }
+1 -1
View File
@@ -89,6 +89,7 @@ Game::Game(int argc, char* argv[])
m_SystemPipeline->AddSystem<PlayerSpawnSystem>(updateOrderLevel); m_SystemPipeline->AddSystem<PlayerSpawnSystem>(updateOrderLevel);
m_SystemPipeline->AddSystem<WeaponSystem>(updateOrderLevel, m_Renderer); m_SystemPipeline->AddSystem<WeaponSystem>(updateOrderLevel, m_Renderer);
m_SystemPipeline->AddSystem<LifetimeSystem>(updateOrderLevel); m_SystemPipeline->AddSystem<LifetimeSystem>(updateOrderLevel);
m_SystemPipeline->AddSystem<CapturePointSystem>(updateOrderLevel);
// Populate Octree with collidables // Populate Octree with collidables
++updateOrderLevel; ++updateOrderLevel;
m_SystemPipeline->AddSystem<CollidableOctreeSystem>(updateOrderLevel, m_OctreeCollision); m_SystemPipeline->AddSystem<CollidableOctreeSystem>(updateOrderLevel, m_OctreeCollision);
@@ -100,7 +101,6 @@ Game::Game(int argc, char* argv[])
m_SystemPipeline->AddSystem<CollisionSystem>(updateOrderLevel, m_OctreeCollision); m_SystemPipeline->AddSystem<CollisionSystem>(updateOrderLevel, m_OctreeCollision);
m_SystemPipeline->AddSystem<TriggerSystem>(updateOrderLevel, m_OctreeCollision); m_SystemPipeline->AddSystem<TriggerSystem>(updateOrderLevel, m_OctreeCollision);
++updateOrderLevel; ++updateOrderLevel;
m_SystemPipeline->AddSystem<CapturePointSystem>(updateOrderLevel);
m_SystemPipeline->AddSystem<RenderSystem>(updateOrderLevel, m_Renderer, m_RenderFrame); m_SystemPipeline->AddSystem<RenderSystem>(updateOrderLevel, m_Renderer, m_RenderFrame);
++updateOrderLevel; ++updateOrderLevel;
m_SystemPipeline->AddSystem<EditorSystem>(updateOrderLevel, m_Renderer, m_RenderFrame); m_SystemPipeline->AddSystem<EditorSystem>(updateOrderLevel, m_Renderer, m_RenderFrame);
+8 -8
View File
@@ -80,14 +80,14 @@ void PlayerMovementSystem::Update(double dt)
velocity.y += 4.f; velocity.y += 4.f;
} }
//if (player.HasComponent("AABB")) { if (player.HasComponent("AABB")) {
// glm::vec3& size = player["AABB"]["Size"]; glm::vec3& size = player["AABB"]["Size"];
// if (controller->Crouching()) { if (controller->Crouching()) {
// size = glm::vec3(1.f, 1.f, 1.f); size = glm::vec3(1.f, 1.f, 1.f);
// } else { } else {
// size = glm::vec3(1.f, 1.6f, 1.f); size = glm::vec3(1.f, 1.6f, 1.f);
// } }
//} }
// Animations // Animations
EntityWrapper playerModel = player.FirstChildByName("PlayerModel"); EntityWrapper playerModel = player.FirstChildByName("PlayerModel");