Renamed IF_DEBUG_IS to DEBUG_IF, slightly different behavior and added some safety checking for auto creating AABBs from models.

This commit is contained in:
William Moberg
2015-12-17 17:08:47 +01:00
parent 46ae2d39af
commit 0f59b863ee
5 changed files with 146 additions and 26 deletions
+1 -1
View File
@@ -11,7 +11,7 @@ public:
: m_Origin(origin) : m_Origin(origin)
, m_Direction(glm::normalize(dir)) , m_Direction(glm::normalize(dir))
{ {
IF_DEBUG_IS(true) { DEBUG_IF(true) {
if (glm::any(glm::isnan(m_Direction))) { if (glm::any(glm::isnan(m_Direction))) {
LOG_WARNING("Ray Direction was set to the zero-vector, expect unknown side effects and/or crashes."); LOG_WARNING("Ray Direction was set to the zero-vector, expect unknown side effects and/or crashes.");
} }
+8 -13
View File
@@ -1,17 +1,12 @@
//Example: // Example:
//IF_DEBUG_IS(true) { // DEBUG_IF(condition) {
// //Stuff done only in debug mode. // // This code is executed only in debug mode and if condition is true.
//} // }
// // NOTE: condition statement is not executed at all in release mode.
//IF_DEBUG_IS(false) { #ifndef DEBUG_IF
// //Stuff done only in release mode.
//} else {
// //Stuff only in debug.
//}
#ifndef IF_DEBUG_IS
#ifndef DEBUG #ifndef DEBUG
#define IF_DEBUG_IS(c) if(c) #define DEBUG_IF(c) if(c)
#else #else
#define IF_DEBUG_IS(c) if(!c) #define DEBUG_IF(c) if(false)
#endif #endif
#endif #endif
@@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8"?>
<Entity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd" xmlns:c="components">
<Components>
<c:Transform>
<Orientation X="0" Y="0" Z="0"/>
</c:Transform>
<c:Model>
<Resource>Models/DummyScene.obj</Resource>
</c:Model>
</Components>
<Children>
<Entity>
<Components>
<c:Transform>
<Position X="-1.5"/>
<Scale X="1" Y="1" Z="1"/>
</c:Transform>
<c:Model>
<Resource>Models/ScaleWidget.obj</Resource>
</c:Model>
</Components>
</Entity>
<Entity>
<Components>
<c:Transform>
<Position X="1.5"/>
<Scale X="2" Y="2" Z="2"/>
</c:Transform>
<c:Model>
<Resource>Models/RotationWidgetX.obj</Resource>
</c:Model>
<c:Trigger>
</c:Trigger>
</Components>
</Entity>
<Entity>
<Components>
<c:Player>
<Velocity X="0" Y="0" Z="0"/>
</c:Player>
<c:Transform>
<Position X="2.5"/>
</c:Transform>
<c:Model>
<Resource>Models/Core/UnitCube.obj</Resource>
</c:Model>
<c:AABB>
</c:AABB>
</Components>
</Entity>
<Entity>
<Components>
<c:Transform>
<Position X="0" Y="-0"/>
<Scale X="1" Y="1" Z="1"/>
</c:Transform>
<!--<c:Move>
<Speed>1</Speed>
<Direction X="-1"/>
<Rotation Y="3.14"/>
</c:Move>-->
</Components>
<Children>
<Entity>
<Components>
<c:Transform>
<Position X="0" Y="0"/>
<Orientation X="0.0" Y="0" Z="1.0"/>
</c:Transform>
<c:Model>
<Resource>Models/Core/UnitRaptor.obj</Resource>
<Color R="1" G="0.4" B="0.8"/>
</c:Model>
</Components>
<Children>
<Entity>
<Components>
<c:Transform>
<Position X="-0.01" Y="0.55"/>
<Orientation X="0" Y="0" Z="-1"/>
</c:Transform>
<c:RaptorCopter>
<Speed>20</Speed>
<Axis Y="1"/>
</c:RaptorCopter>
</Components>
<Children>
<Entity>
<Components>
<c:Transform>
<Position X="0" Y="0"/>
<Scale X="1.7" Y="0.03" Z="0.1"/>
<Orientation X="0" Y="0" Z="0"/>
</c:Transform>
<c:Model>
<Resource>Models/Core/UnitCube.obj</Resource>
<Color R="1" G="0.4" B="0.8"/>
</c:Model>
</Components>
</Entity>
<Entity>
<Components>
<c:Transform>
<Position X="0" Y="0"/>
<Scale X="1.7" Y="0.03" Z="0.1"/>
<Orientation X="0" Y="1.57" Z="0"/>
</c:Transform>
<c:Model>
<Resource>Models/Core/UnitCube.obj</Resource>
<Color R="1" G="0.4" B="0.8"/>
</c:Model>
</Components>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
+7 -2
View File
@@ -213,8 +213,11 @@ bool IsSameBoxProbably(const AABB& first, const AABB& second, const float epsilo
(std::abs(mi1.y - mi2.y) < epsilon); (std::abs(mi1.y - mi2.y) < epsilon);
} }
void attachAABBComponentFromModel(World* world, EntityID id) bool attachAABBComponentFromModel(World* world, EntityID id)
{ {
if (!world->HasComponent(id, "Model")) {
return false;
}
ComponentWrapper model = world->GetComponent(id, "Model"); ComponentWrapper model = world->GetComponent(id, "Model");
ComponentWrapper collision = world->AttachComponent(id, "AABB"); ComponentWrapper collision = world->AttachComponent(id, "AABB");
Model* modelRes = ResourceManager::Load<Model>(model["Resource"]); Model* modelRes = ResourceManager::Load<Model>(model["Resource"]);
@@ -234,6 +237,7 @@ void attachAABBComponentFromModel(World* world, EntityID id)
} }
collision["BoxCenter"] = 0.5f * (maxi + mini); collision["BoxCenter"] = 0.5f * (maxi + mini);
collision["BoxSize"] = maxi - mini; collision["BoxSize"] = maxi - mini;
return true;
} }
bool GetEntityBox(World* world, ComponentWrapper& AABBComponent, AABB& outBox) bool GetEntityBox(World* world, ComponentWrapper& AABBComponent, AABB& outBox)
@@ -258,7 +262,8 @@ bool GetEntityBox(World* world, EntityID entity, AABB& outBox, bool forceBoxFrom
{ {
if (!world->HasComponent(entity, "AABB")) { if (!world->HasComponent(entity, "AABB")) {
if (forceBoxFromModel) { if (forceBoxFromModel) {
attachAABBComponentFromModel(world, entity); if (!attachAABBComponentFromModel(world, entity))
return false;
} else { } else {
return false; return false;
} }
+8 -10
View File
@@ -7,16 +7,14 @@ AABB::AABB(const glm::vec3& minPos, const glm::vec3& maxPos)
, m_Center(0.5f * (maxPos + minPos)) , m_Center(0.5f * (maxPos + minPos))
, m_HalfSize(0.5f * (maxPos - minPos)) , m_HalfSize(0.5f * (maxPos - minPos))
{ {
IF_DEBUG_IS(true) { DEBUG_IF(glm::any(glm::lessThan(m_MaxCorner, m_MinCorner))) {
if (glm::any(glm::lessThan(m_MaxCorner, m_MinCorner))) { LOG_WARNING("AABB maxCorner coordinates are not greater than minCorner");
LOG_WARNING("AABB maxCorner coordinates are not greater than minCorner"); m_MaxCorner.x = glm::max(m_MaxCorner.x, m_MinCorner.x);
m_MaxCorner.x = glm::max(m_MaxCorner.x, m_MinCorner.x); m_MinCorner.x = glm::min(m_MaxCorner.x, m_MinCorner.x);
m_MinCorner.x = glm::min(m_MaxCorner.x, m_MinCorner.x); m_MaxCorner.y = glm::max(m_MaxCorner.y, m_MinCorner.y);
m_MaxCorner.y = glm::max(m_MaxCorner.y, m_MinCorner.y); m_MinCorner.y = glm::min(m_MaxCorner.y, m_MinCorner.y);
m_MinCorner.y = glm::min(m_MaxCorner.y, m_MinCorner.y); m_MaxCorner.z = glm::max(m_MaxCorner.z, m_MinCorner.z);
m_MaxCorner.z = glm::max(m_MaxCorner.z, m_MinCorner.z); m_MinCorner.z = glm::min(m_MaxCorner.z, m_MinCorner.z);
m_MinCorner.z = glm::min(m_MaxCorner.z, m_MinCorner.z);
}
} }
} }