Entities/Object: Add some Position const& overloads to distance/angle methods for usability.

This commit is contained in:
treeston
2016-09-10 14:14:34 +02:00
parent 1f36b6957b
commit 0e8c2f9032
4 changed files with 35 additions and 13 deletions

View File

@@ -1363,24 +1363,21 @@ bool WorldObject::IsInRange3d(float x, float y, float z, float minRange, float m
return distsq < maxdist * maxdist;
}
bool WorldObject::IsInBetween(const WorldObject* obj1, const WorldObject* obj2, float size) const
bool WorldObject::IsInBetween(Position const& pos1, Position const& pos2, float size) const
{
if (!obj1 || !obj2)
return false;
float dist = GetExactDist2d(obj1->GetPositionX(), obj1->GetPositionY());
float dist = GetExactDist2d(pos1);
// not using sqrt() for performance
if ((dist * dist) >= obj1->GetExactDist2dSq(obj2->GetPositionX(), obj2->GetPositionY()))
if ((dist * dist) >= pos1.GetExactDist2dSq(pos2))
return false;
if (!size)
size = GetObjectSize() / 2;
float angle = obj1->GetAngle(obj2);
float angle = pos1.GetAngle(pos2);
// not using sqrt() for performance
return (size * size) >= GetExactDist2dSq(obj1->GetPositionX() + std::cos(angle) * dist, obj1->GetPositionY() + std::sin(angle) * dist);
return (size * size) >= GetExactDist2dSq(pos1.GetPositionX() + std::cos(angle) * dist, pos1.GetPositionY() + std::sin(angle) * dist);
}
bool WorldObject::isInFront(WorldObject const* target, float arc) const

View File

@@ -500,7 +500,8 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
bool isInFront(WorldObject const* target, float arc = float(M_PI)) const;
bool isInBack(WorldObject const* target, float arc = float(M_PI)) const;
bool IsInBetween(WorldObject const* obj1, WorldObject const* obj2, float size = 0) const;
bool IsInBetween(Position const& pos1, Position const& pos2, float size = 0) const;
bool IsInBetween(WorldObject const* obj1, WorldObject const* obj2, float size = 0) const { return obj1 && obj2 && IsInBetween(obj1->GetPosition(), obj2->GetPosition(), size); }
virtual void CleanupsBeforeDelete(bool finalCleanup = true); // used in destructor or explicitly before mass creature delete to remove cross-references to already deleted units

View File

@@ -71,12 +71,12 @@ Position Position::GetPositionWithOffset(Position const& offset) const
return ret;
}
float Position::GetAngle(const Position* obj) const
float Position::GetAngle(Position const* pos) const
{
if (!obj)
if (!pos)
return 0;
return GetAngle(obj->GetPositionX(), obj->GetPositionY());
return GetAngle(pos->GetPositionX(), pos->GetPositionY());
}
// Return angle in range 0..2*pi

View File

@@ -131,7 +131,7 @@ public:
bool IsPositionValid() const;
float GetExactDist2dSq(float x, float y) const
float GetExactDist2dSq(const float x, const float y) const
{
float dx = m_positionX - x; float dy = m_positionY - y; return dx*dx + dy*dy;
}
@@ -141,6 +141,16 @@ public:
return std::sqrt(GetExactDist2dSq(x, y));
}
float GetExactDist2dSq(Position const& pos) const
{
float dx = m_positionX - pos.m_positionX; float dy = m_positionY - pos.m_positionY; return dx*dx + dy*dy;
}
float GetExactDist2d(Position const& pos) const
{
return std::sqrt(GetExactDist2d(pos));
}
float GetExactDist2dSq(Position const* pos) const
{
float dx = m_positionX - pos->m_positionX; float dy = m_positionY - pos->m_positionY; return dx*dx + dy*dy;
@@ -161,6 +171,16 @@ public:
return std::sqrt(GetExactDistSq(x, y, z));
}
float GetExactDistSq(Position const& pos) const
{
float dx = m_positionX - pos.m_positionX; float dy = m_positionY - pos.m_positionY; float dz = m_positionZ - pos.m_positionZ; return dx*dx + dy*dy + dz*dz;
}
float GetExactDist(Position const& pos) const
{
return std::sqrt(GetExactDistSq(pos));
}
float GetExactDistSq(Position const* pos) const
{
float dx = m_positionX - pos->m_positionX; float dy = m_positionY - pos->m_positionY; float dz = m_positionZ - pos->m_positionZ; return dx*dx + dy*dy + dz*dz;
@@ -175,6 +195,10 @@ public:
Position GetPositionWithOffset(Position const& offset) const;
float GetAngle(Position const* pos) const;
float GetAngle(Position const& pos) const
{
return GetAngle(pos.m_positionX, pos.m_positionY);
}
float GetAngle(float x, float y) const;
float GetRelativeAngle(Position const* pos) const
{