18#ifndef Trinity_game_Position_h__
19#define Trinity_game_Position_h__
29 constexpr Position(
float x = 0,
float y = 0,
float z = 0,
float o = 0)
30 : m_positionX(x), m_positionY(y), m_positionZ(z), m_orientation(NormalizeOrientationConstexprWrapper(o)) { }
63 constexpr void Relocate(
float x,
float y) { m_positionX = x; m_positionY = y; }
64 constexpr void Relocate(
float x,
float y,
float z) {
Relocate(x, y); m_positionZ = z; }
65 constexpr void Relocate(
float x,
float y,
float z,
float o) {
Relocate(x, y, z); SetOrientation(o); }
69 void RelocateOffset(
Position const& offset);
73 m_orientation = NormalizeOrientationConstexprWrapper(orientation);
81 constexpr void GetPosition(
float& x,
float& y)
const { x = m_positionX; y = m_positionY; }
83 constexpr void GetPosition(
float& x,
float& y,
float& z,
float& o)
const {
GetPosition(x, y, z); o = m_orientation; }
95 bool IsPositionValid()
const;
99 float dx = x - m_positionX;
100 float dy = y - m_positionY;
101 return dx*dx + dy*dy;
106 float GetExactDist2d(
const float x,
const float y)
const {
return std::sqrt(GetExactDist2dSq(x, y)); }
112 float dz = z - m_positionZ;
113 return GetExactDist2dSq(x, y) + dz*dz;
118 float GetExactDist(
float x,
float y,
float z)
const {
return std::sqrt(GetExactDistSq(x, y, z)); }
122 void GetPositionOffsetTo(
Position const & endPos,
Position & retOffset)
const;
127 float dx = x - m_positionX;
128 float dy = y - m_positionY;
129 return NormalizeOrientation(std::atan2(dy, dx));
133 float ToAbsoluteAngle(
float relAngle)
const {
return NormalizeOrientation(relAngle + m_orientation); }
135 float ToRelativeAngle(
float absAngle)
const {
return NormalizeOrientation(absAngle - m_orientation); }
136 float GetRelativeAngle(
float x,
float y)
const {
return ToRelativeAngle(GetAbsoluteAngle(x, y)); }
140 constexpr bool IsInDist2d(
float x,
float y,
float dist)
const {
return GetExactDist2dSq(x, y) < dist * dist; }
141 constexpr bool IsInDist2d(
Position const* pos,
float dist)
const {
return GetExactDist2dSq(pos) < dist * dist; }
143 constexpr bool IsInDist(
float x,
float y,
float z,
float dist)
const {
return GetExactDistSq(x, y, z) < dist * dist; }
144 constexpr bool IsInDist(
Position const& pos,
float dist)
const {
return GetExactDistSq(pos) < dist * dist; }
145 constexpr bool IsInDist(
Position const* pos,
float dist)
const {
return GetExactDistSq(pos) < dist * dist; }
147 bool IsWithinBox(
Position const& center,
float xradius,
float yradius,
float zradius)
const;
150 bool IsWithinDoubleVerticalCylinder(
Position const* center,
float radius,
float height)
const;
152 bool HasInArc(
float arcangle,
Position const* pos,
float border = 2.0f)
const;
153 bool HasInLine(
Position const* pos,
float objSize,
float width)
const;
157 static float NormalizeOrientation(
float o);
162 if (std::is_constant_evaluated())
164 if (o < 0.0f || o >= 2.0f *
static_cast<float>(
M_PI))
165 throw "Compile time Position initialization requires orientation to be in 0-2pi range";
171 return NormalizeOrientation(o);
176#define MAPID_INVALID 0xFFFFFFFF
182 :
Position(x, y, z, o), m_mapId(mapId) { }
185 :
Position(position), m_mapId(mapId) { }
193 Relocate(x, y, z, o);
219 constexpr TaggedPosition(
float x = 0.0f,
float y = 0.0f,
float z = 0.0f,
float o = 0.0f) :
Pos(x, y, z, o) { }
std::string GetDebugInfo()
TC_GAME_API ByteBuffer & operator<<(ByteBuffer &buf, Position::ConstStreamer< Position::XY > const &streamer)
TC_GAME_API ByteBuffer & operator>>(ByteBuffer &buf, Position::Streamer< Position::XY > const &streamer)
constexpr void WorldRelocate(WorldLocation const &loc)
constexpr void WorldRelocate(WorldLocation const *loc)
constexpr void WorldRelocate(uint32 mapId, Position const &pos)
constexpr uint32 GetMapId() const
constexpr WorldLocation(uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
constexpr WorldLocation GetWorldLocation() const
constexpr void WorldRelocate(uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
constexpr WorldLocation(uint32 mapId, Position const &position)
std::string ToString(Type &&val, Params &&... params)
bool operator==(unique_trackable_ptr< T1 > const &left, unique_trackable_ptr< T2 > const &right)
ConstStreamer(Position const &pos)
constexpr float GetExactDist2dSq(Position const &pos) const
Streamer< XYZO > PositionXYZOStream()
float GetRelativeAngle(Position const &pos) const
constexpr void SetOrientation(float orientation)
constexpr float GetPositionX() const
static constexpr float NormalizeOrientationConstexprWrapper(float o)
constexpr void Relocate(float x, float y, float z, float o)
constexpr float GetPositionY() const
ConstStreamer< XY > PositionXYStream() const
Streamer< XY > PositionXYStream()
float GetExactDist2d(const float x, const float y) const
float GetRelativeAngle(float x, float y) const
constexpr bool IsInDist2d(float x, float y, float dist) const
constexpr void GetPosition(float &x, float &y, float &z, float &o) const
float GetExactDist(float x, float y, float z) const
float GetExactDist(Position const &pos) const
constexpr float GetExactDistSq(Position const &pos) const
float ToAbsoluteAngle(float relAngle) const
constexpr float GetExactDist2dSq(Position const *pos) const
constexpr float GetExactDistSq(Position const *pos) const
constexpr Position(float x=0, float y=0, float z=0, float o=0)
float GetAbsoluteAngle(Position const &pos) const
constexpr bool IsInDist(Position const *pos, float dist) const
Streamer< PackedXYZ > PositionPackedXYZStream()
constexpr void Relocate(float x, float y, float z)
float GetExactDist(Position const *pos) const
float GetExactDist2d(Position const &pos) const
constexpr void Relocate(Position const *pos)
float GetAbsoluteAngle(float x, float y) const
Streamer< XYZ > PositionXYZStream()
constexpr bool IsInDist2d(Position const *pos, float dist) const
constexpr float GetExactDist2dSq(const float x, const float y) const
ConstStreamer< XYZ > PositionXYZStream() const
constexpr bool IsInDist(Position const &pos, float dist) const
constexpr void GetPosition(float &x, float &y) const
ConstStreamer< PackedXYZ > PositionPackedXYZStream() const
float GetRelativeAngle(Position const *pos) const
float GetExactDist2d(Position const *pos) const
ConstStreamer< XYZO > PositionXYZOStream() const
constexpr void Relocate(Position const &pos)
constexpr void Relocate(float x, float y)
float GetAbsoluteAngle(Position const *pos) const
constexpr float GetExactDistSq(float x, float y, float z) const
constexpr Position GetPosition() const
constexpr bool IsInDist(float x, float y, float z, float dist) const
float ToRelativeAngle(float absAngle) const
constexpr void GetPosition(float &x, float &y, float &z) const
constexpr float GetOrientation() const
constexpr float GetPositionZ() const
constexpr TaggedPosition(Position const &pos)
friend ByteBuffer & operator>>(ByteBuffer &buf, TaggedPosition &tagged)
friend ByteBuffer & operator<<(ByteBuffer &buf, TaggedPosition const &tagged)
constexpr TaggedPosition & operator=(Position const &pos)
friend constexpr bool operator!=(TaggedPosition const &left, TaggedPosition const &right)
friend constexpr bool operator==(TaggedPosition const &left, TaggedPosition const &right)
constexpr TaggedPosition(float x=0.0f, float y=0.0f, float z=0.0f, float o=0.0f)