Merge pull request #1945 from Woazboat/CodeCleanup_refactored
Small code cleanup - clean version
This commit is contained in:
commit
9329c2c2cb
@ -103,7 +103,7 @@ void cSetChunkData::CalculateHeightMap(void)
|
|||||||
int index = cChunkDef::MakeIndexNoCheck(x, y, z);
|
int index = cChunkDef::MakeIndexNoCheck(x, y, z);
|
||||||
if (m_BlockTypes[index] != E_BLOCK_AIR)
|
if (m_BlockTypes[index] != E_BLOCK_AIR)
|
||||||
{
|
{
|
||||||
m_HeightMap[x + z * cChunkDef::Width] = (HEIGHTTYPE)y;
|
m_HeightMap[x + z * cChunkDef::Width] = static_cast<HEIGHTTYPE>(y);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} // for y
|
} // for y
|
||||||
|
@ -12,17 +12,32 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const float FLOAT_EPSILON = 0.0001f; // TODO: Stash this in some header where it can be reused
|
||||||
|
|
||||||
|
|
||||||
|
const std::array<const Vector3f, 6>& cTracer::m_NormalTable(void)
|
||||||
|
{
|
||||||
|
static std::array<const Vector3f, 6>* table =
|
||||||
|
new std::array<const Vector3f, 6>
|
||||||
|
{
|
||||||
|
{
|
||||||
|
Vector3f(-1, 0, 0), // 1: -x
|
||||||
|
Vector3f( 0, 0, -1), // 2: -z
|
||||||
|
Vector3f( 1, 0, 0), // 3: +x
|
||||||
|
Vector3f( 0, 0, 1), // 4: +z
|
||||||
|
Vector3f( 0, 1, 0), // 5: +y
|
||||||
|
Vector3f( 0, -1, 0) // 6: -y
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return *table;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cTracer::cTracer(cWorld * a_World):
|
cTracer::cTracer(cWorld * a_World):
|
||||||
m_World(a_World)
|
m_World(a_World)
|
||||||
{
|
{
|
||||||
m_NormalTable[0].Set(-1, 0, 0);
|
|
||||||
m_NormalTable[1].Set( 0, 0, -1);
|
|
||||||
m_NormalTable[2].Set( 1, 0, 0);
|
|
||||||
m_NormalTable[3].Set( 0, 0, 1);
|
|
||||||
m_NormalTable[4].Set( 0, 1, 0);
|
|
||||||
m_NormalTable[5].Set( 0, -1, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -37,7 +52,7 @@ cTracer::~cTracer()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
float cTracer::SigNum(float a_Num)
|
int cTracer::SigNum(float a_Num)
|
||||||
{
|
{
|
||||||
if (a_Num < 0.f)
|
if (a_Num < 0.f)
|
||||||
{
|
{
|
||||||
@ -56,26 +71,28 @@ float cTracer::SigNum(float a_Num)
|
|||||||
|
|
||||||
void cTracer::SetValues(const Vector3f & a_Start, const Vector3f & a_Direction)
|
void cTracer::SetValues(const Vector3f & a_Start, const Vector3f & a_Direction)
|
||||||
{
|
{
|
||||||
|
// Since this method should only be called by Trace, zero length vectors should already have been taken care of
|
||||||
|
ASSERT(a_Direction.HasNonZeroLength());
|
||||||
|
|
||||||
// calculate the direction of the ray (linear algebra)
|
// calculate the direction of the ray (linear algebra)
|
||||||
dir = a_Direction;
|
dir = a_Direction;
|
||||||
|
|
||||||
// decide which direction to start walking in
|
// decide which direction to start walking in
|
||||||
step.x = (int) SigNum(dir.x);
|
step.x = SigNum(dir.x);
|
||||||
step.y = (int) SigNum(dir.y);
|
step.y = SigNum(dir.y);
|
||||||
step.z = (int) SigNum(dir.z);
|
step.z = SigNum(dir.z);
|
||||||
|
|
||||||
|
|
||||||
// normalize the direction vector
|
// normalize the direction vector
|
||||||
if (dir.SqrLength() > 0.f)
|
dir.Normalize();
|
||||||
{
|
|
||||||
dir.Normalize();
|
|
||||||
}
|
|
||||||
|
|
||||||
// how far we must move in the ray direction before
|
// how far we must move in the ray direction before
|
||||||
// we encounter a new voxel in x-direction
|
// we encounter a new voxel in x-direction
|
||||||
// same but y-direction
|
// same but y-direction
|
||||||
if (dir.x != 0.f)
|
if (dir.x != 0.f)
|
||||||
{
|
{
|
||||||
tDelta.x = 1 / fabs(dir.x);
|
tDelta.x = 1 / std::abs(dir.x);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -83,7 +100,7 @@ void cTracer::SetValues(const Vector3f & a_Start, const Vector3f & a_Direction)
|
|||||||
}
|
}
|
||||||
if (dir.y != 0.f)
|
if (dir.y != 0.f)
|
||||||
{
|
{
|
||||||
tDelta.y = 1 / fabs(dir.y);
|
tDelta.y = 1 / std::abs(dir.y);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -91,44 +108,45 @@ void cTracer::SetValues(const Vector3f & a_Start, const Vector3f & a_Direction)
|
|||||||
}
|
}
|
||||||
if (dir.z != 0.f)
|
if (dir.z != 0.f)
|
||||||
{
|
{
|
||||||
tDelta.z = 1 / fabs(dir.z);
|
tDelta.z = 1 / std::abs(dir.z);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tDelta.z = 0;
|
tDelta.z = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// start voxel coordinates
|
// start voxel coordinates
|
||||||
pos.x = (int)floorf(a_Start.x);
|
pos.x = static_cast<int>(floorf(a_Start.x));
|
||||||
pos.y = (int)floorf(a_Start.y);
|
pos.y = static_cast<int>(floorf(a_Start.y));
|
||||||
pos.z = (int)floorf(a_Start.z);
|
pos.z = static_cast<int>(floorf(a_Start.z));
|
||||||
|
|
||||||
// calculate distance to first intersection in the voxel we start from
|
// calculate distance to first intersection in the voxel we start from
|
||||||
if (dir.x < 0)
|
if (dir.x < 0)
|
||||||
{
|
{
|
||||||
tMax.x = ((float)pos.x - a_Start.x) / dir.x;
|
tMax.x = (static_cast<float>(pos.x) - a_Start.x) / dir.x;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tMax.x = (((float)pos.x + 1) - a_Start.x) / dir.x;
|
tMax.x = (static_cast<float>(pos.x + 1) - a_Start.x) / dir.x; // TODO: Possible division by zero
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dir.y < 0)
|
if (dir.y < 0)
|
||||||
{
|
{
|
||||||
tMax.y = ((float)pos.y - a_Start.y) / dir.y;
|
tMax.y = (static_cast<float>(pos.y) - a_Start.y) / dir.y;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tMax.y = (((float)pos.y + 1) - a_Start.y) / dir.y;
|
tMax.y = (static_cast<float>(pos.y + 1) - a_Start.y) / dir.y; // TODO: Possible division by zero
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dir.z < 0)
|
if (dir.z < 0)
|
||||||
{
|
{
|
||||||
tMax.z = ((float)pos.z - a_Start.z) / dir.z;
|
tMax.z = (static_cast<float>(pos.z) - a_Start.z) / dir.z;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tMax.z = (((float)pos.z + 1) - a_Start.z) / dir.z;
|
tMax.z = (static_cast<float>(pos.z + 1) - a_Start.z) / dir.z; // TODO: Possible division by zero
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,6 +156,11 @@ void cTracer::SetValues(const Vector3f & a_Start, const Vector3f & a_Direction)
|
|||||||
|
|
||||||
bool cTracer::Trace(const Vector3f & a_Start, const Vector3f & a_Direction, int a_Distance, bool a_LineOfSight)
|
bool cTracer::Trace(const Vector3f & a_Start, const Vector3f & a_Direction, int a_Distance, bool a_LineOfSight)
|
||||||
{
|
{
|
||||||
|
if (!a_Direction.HasNonZeroLength())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if ((a_Start.y < 0) || (a_Start.y >= cChunkDef::Height))
|
if ((a_Start.y < 0) || (a_Start.y >= cChunkDef::Height))
|
||||||
{
|
{
|
||||||
LOGD("%s: Start Y is outside the world (%.2f), not tracing.", __FUNCTION__, a_Start.y);
|
LOGD("%s: Start Y is outside the world (%.2f), not tracing.", __FUNCTION__, a_Start.y);
|
||||||
@ -146,18 +169,18 @@ bool cTracer::Trace(const Vector3f & a_Start, const Vector3f & a_Direction, int
|
|||||||
|
|
||||||
SetValues(a_Start, a_Direction);
|
SetValues(a_Start, a_Direction);
|
||||||
|
|
||||||
Vector3f End = a_Start + (dir * (float)a_Distance);
|
Vector3f End = a_Start + (dir * static_cast<float>(a_Distance));
|
||||||
|
|
||||||
if (End.y < 0)
|
if (End.y < 0)
|
||||||
{
|
{
|
||||||
float dist = -a_Start.y / dir.y;
|
float dist = -a_Start.y / dir.y; // No division by 0 possible
|
||||||
End = a_Start + (dir * dist);
|
End = a_Start + (dir * dist);
|
||||||
}
|
}
|
||||||
|
|
||||||
// end voxel coordinates
|
// end voxel coordinates
|
||||||
end1.x = (int)floorf(End.x);
|
end1.x = static_cast<int>(floorf(End.x));
|
||||||
end1.y = (int)floorf(End.y);
|
end1.y = static_cast<int>(floorf(End.y));
|
||||||
end1.z = (int)floorf(End.z);
|
end1.z = static_cast<int>(floorf(End.z));
|
||||||
|
|
||||||
// check if first is occupied
|
// check if first is occupied
|
||||||
if (pos.Equals(end1))
|
if (pos.Equals(end1))
|
||||||
@ -241,7 +264,7 @@ bool cTracer::Trace(const Vector3f & a_Start, const Vector3f & a_Direction, int
|
|||||||
int Normal = GetHitNormal(a_Start, End, pos);
|
int Normal = GetHitNormal(a_Start, End, pos);
|
||||||
if (Normal > 0)
|
if (Normal > 0)
|
||||||
{
|
{
|
||||||
HitNormal = m_NormalTable[Normal-1];
|
HitNormal = m_NormalTable()[Normal - 1];
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -295,8 +318,7 @@ int cTracer::intersect3D_SegmentPlane(const Vector3f & a_Origin, const Vector3f
|
|||||||
float D = a_PlaneNormal.Dot(u); // dot(Pn.n, u);
|
float D = a_PlaneNormal.Dot(u); // dot(Pn.n, u);
|
||||||
float N = -(a_PlaneNormal.Dot(w)); // -dot(a_Plane.n, w);
|
float N = -(a_PlaneNormal.Dot(w)); // -dot(a_Plane.n, w);
|
||||||
|
|
||||||
const float EPSILON = 0.0001f;
|
if (std::abs(D) < FLOAT_EPSILON)
|
||||||
if (fabs(D) < EPSILON)
|
|
||||||
{
|
{
|
||||||
// segment is parallel to plane
|
// segment is parallel to plane
|
||||||
if (N == 0.0)
|
if (N == 0.0)
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
#include "Vector3.h"
|
#include "Vector3.h"
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -61,10 +63,11 @@ private:
|
|||||||
/// Return 1 through 6 for the following block faces, repectively: -x, -z, x, z, y, -y
|
/// Return 1 through 6 for the following block faces, repectively: -x, -z, x, z, y, -y
|
||||||
int GetHitNormal( const Vector3f & start, const Vector3f & end, const Vector3i & a_BlockPos);
|
int GetHitNormal( const Vector3f & start, const Vector3f & end, const Vector3i & a_BlockPos);
|
||||||
|
|
||||||
float SigNum( float a_Num);
|
/// Signum function
|
||||||
|
int SigNum( float a_Num);
|
||||||
cWorld* m_World;
|
cWorld* m_World;
|
||||||
|
|
||||||
Vector3f m_NormalTable[6];
|
static const std::array<const Vector3f, 6> & m_NormalTable(void);
|
||||||
|
|
||||||
Vector3f dir;
|
Vector3f dir;
|
||||||
Vector3f tDelta;
|
Vector3f tDelta;
|
||||||
|
@ -78,6 +78,20 @@ public:
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool HasNonZeroLength(void) const
|
||||||
|
{
|
||||||
|
#ifndef __GNUC__
|
||||||
|
#pragma clang diagnostics push
|
||||||
|
#pragma clang diagnostics ignored "-Wfloat-equal"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ((x != 0) || (y != 0) || (z != 0));
|
||||||
|
|
||||||
|
#ifndef __GNUC__
|
||||||
|
#pragma clang diagnostics pop
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
inline double Length(void) const
|
inline double Length(void) const
|
||||||
{
|
{
|
||||||
return sqrt(static_cast<double>(x * x + y * y + z * z));
|
return sqrt(static_cast<double>(x * x + y * y + z * z));
|
||||||
@ -119,13 +133,19 @@ public:
|
|||||||
|
|
||||||
inline bool Equals(const Vector3<T> & a_Rhs) const
|
inline bool Equals(const Vector3<T> & a_Rhs) const
|
||||||
{
|
{
|
||||||
// Perform a bitwise comparison of the contents - we want to know whether this object is exactly equal
|
// Perform a strict comparison of the contents - we want to know whether this object is exactly equal
|
||||||
// To perform EPS-based comparison, use the EqualsEps() function
|
// To perform EPS-based comparison, use the EqualsEps() function
|
||||||
return (
|
|
||||||
(memcmp(&x, &a_Rhs.x, sizeof(x)) == 0) &&
|
#ifndef __GNUC__
|
||||||
(memcmp(&y, &a_Rhs.y, sizeof(y)) == 0) &&
|
#pragma clang diagnostics push
|
||||||
(memcmp(&z, &a_Rhs.z, sizeof(z)) == 0)
|
#pragma clang diagnostics ignored "-Wfloat-equal"
|
||||||
);
|
#endif
|
||||||
|
|
||||||
|
return !((x != a_Rhs.x) || (y != a_Rhs.y) || (z != a_Rhs.z));
|
||||||
|
|
||||||
|
#ifndef __GNUC__
|
||||||
|
#pragma clang diagnostics pop
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool EqualsEps(const Vector3<T> & a_Rhs, T a_Eps) const
|
inline bool EqualsEps(const Vector3<T> & a_Rhs, T a_Eps) const
|
||||||
|
Loading…
Reference in New Issue
Block a user