18#ifndef Trinity_game_Position_h__
19#define Trinity_game_Position_h__
32 : m_positionX(0.0f), m_positionY(0.0f), m_positionZ(0.0f), m_orientation(0.0f) { }
35 : m_positionX(x), m_positionY(y), m_positionZ(0.0f), m_orientation(0.0f) { }
38 : m_positionX(x), m_positionY(y), m_positionZ(z), m_orientation(0.0f) { }
40 constexpr Position(
float x,
float y,
float z,
float o)
41 : m_positionX(x), m_positionY(y), m_positionZ(z), m_orientation(NormalizeOrientationConstexprWrapper(o)) { }
72 bool operator==(
Position const& a)
const;
74 constexpr void Relocate(
float x,
float y) { m_positionX = x; m_positionY = y; }
75 constexpr void Relocate(
float x,
float y,
float z) {
Relocate(x, y); m_positionZ = z; }
76 constexpr void Relocate(
float x,
float y,
float z,
float o) {
Relocate(x, y, z); SetOrientation(o); }
80 void RelocateOffset(
Position const& offset);
84 m_orientation = NormalizeOrientationConstexprWrapper(orientation);
92 constexpr void GetPosition(
float& x,
float& y)
const { x = m_positionX; y = m_positionY; }
94 constexpr void GetPosition(
float& x,
float& y,
float& z,
float& o)
const {
GetPosition(x, y, z); o = m_orientation; }
106 bool IsPositionValid()
const;
110 float dx = x - m_positionX;
111 float dy = y - m_positionY;
112 return dx*dx + dy*dy;
117 float GetExactDist2d(
const float x,
const float y)
const {
return std::sqrt(GetExactDist2dSq(x, y)); }
123 float dz = z - m_positionZ;
124 return GetExactDist2dSq(x, y) + dz*dz;
129 float GetExactDist(
float x,
float y,
float z)
const {
return std::sqrt(GetExactDistSq(x, y, z)); }
138 float dx = x - m_positionX;
139 float dy = y - m_positionY;
140 return NormalizeOrientation(std::atan2(dy, dx));
144 float ToAbsoluteAngle(
float relAngle)
const {
return NormalizeOrientation(relAngle + m_orientation); }
146 float ToRelativeAngle(
float absAngle)
const {
return NormalizeOrientation(absAngle - m_orientation); }
147 float GetRelativeAngle(
float x,
float y)
const {
return ToRelativeAngle(GetAbsoluteAngle(x, y)); }
151 constexpr bool IsInDist2d(
float x,
float y,
float dist)
const {
return GetExactDist2dSq(x, y) < dist * dist; }
152 constexpr bool IsInDist2d(
Position const& pos,
float dist)
const {
return GetExactDist2dSq(pos) < dist * dist; }
153 constexpr bool IsInDist2d(
Position const* pos,
float dist)
const {
return GetExactDist2dSq(pos) < dist * dist; }
155 constexpr bool IsInDist(
float x,
float y,
float z,
float dist)
const {
return GetExactDistSq(x, y, z) < dist * dist; }
156 constexpr bool IsInDist(
Position const& pos,
float dist)
const {
return GetExactDistSq(pos) < dist * dist; }
157 constexpr bool IsInDist(
Position const* pos,
float dist)
const {
return GetExactDistSq(pos) < dist * dist; }
159 bool IsWithinBox(
Position const& boxOrigin,
float length,
float width,
float height)
const;
161 bool IsWithinVerticalCylinder(
Position const& cylinderOrigin,
float radius,
float height,
bool isDoubleVertical =
false)
const;
163 bool IsInPolygon2D(
Position const& polygonOrigin, std::span<Position const> vertices)
const;
165 bool HasInArc(
float arcangle,
Position const* pos,
float border = 2.0f)
const;
166 bool HasInLine(
Position const* pos,
float objSize,
float width)
const;
167 std::string ToString()
const;
170 static float NormalizeOrientation(
float o);
175 if (std::is_constant_evaluated())
177 if (o < 0.0f || o >= 2.0f *
static_cast<float>(
M_PI))
178 throw "Compile time Position initialization requires orientation to be in 0-2pi range";
184 return NormalizeOrientation(o);
189#define MAPID_INVALID 0xFFFFFFFF
208 Relocate(x, y, z, o);
260 template <
typename FormatContext>
261 auto format(
Position const& position, FormatContext& ctx)
const ->
decltype(ctx.out());
267 template <
typename FormatContext>
274 template <
typename FormatContext>
281 template <
typename FormatContext>
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 WorldLocation()
constexpr void WorldRelocate(WorldLocation const *loc)
constexpr void WorldRelocate(uint32 mapId, Position const &pos)
constexpr uint32 GetMapId() const
constexpr void WorldRelocate(uint32 mapId, float x, float y, float z, float o)
constexpr WorldLocation(uint32 mapId, float x, float y, float z)
constexpr WorldLocation GetWorldLocation() const
constexpr WorldLocation(uint32 mapId, float x, float y)
constexpr WorldLocation(uint32 mapId, float x, float y, float z, float o)
constexpr WorldLocation(uint32 mapId, Position const &position)
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
constexpr Position(float x, float y, float z)
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
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
constexpr Position(float x, float y)
ConstStreamer< PackedXYZ > PositionPackedXYZStream() const
float GetRelativeAngle(Position const *pos) const
float GetExactDist2d(Position const *pos) const
ConstStreamer< XYZO > PositionXYZOStream() const
constexpr Position(float x, float y, float z, float o)
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 IsInDist2d(Position const &pos, float dist) 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(float x, float y, float z)
constexpr TaggedPosition(Position const &pos)
friend ByteBuffer & operator>>(ByteBuffer &buf, TaggedPosition &tagged)
friend ByteBuffer & operator<<(ByteBuffer &buf, TaggedPosition const &tagged)
friend bool operator==(TaggedPosition const &left, TaggedPosition const &right)=default
constexpr TaggedPosition(float x, float y)
constexpr TaggedPosition & operator=(Position const &pos)
constexpr TaggedPosition(float x, float y, float z, float o)
constexpr TaggedPosition()