/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#ifndef TRINITY_AREA_BOUNDARY_H
#define TRINITY_AREA_BOUNDARY_H
#include "Position.h"
#include
class TC_GAME_API AreaBoundary
{
public:
bool IsWithinBoundary(Position const* pos) const { return pos && (IsWithinBoundaryArea(pos) != _isInvertedBoundary); }
bool IsWithinBoundary(Position const& pos) const { return IsWithinBoundary(&pos); }
AreaBoundary(AreaBoundary const&) = delete;
AreaBoundary(AreaBoundary&&) = delete;
AreaBoundary& operator=(AreaBoundary const&) = delete;
AreaBoundary& operator=(AreaBoundary&&) = delete;
virtual ~AreaBoundary() = default;
protected:
explicit AreaBoundary(bool isInverted) : _isInvertedBoundary(isInverted) { }
virtual bool IsWithinBoundaryArea(Position const* pos) const = 0;
private:
bool const _isInvertedBoundary;
};
class TC_GAME_API RectangleBoundary : public AreaBoundary
{
public:
// X axis is north/south, Y axis is east/west, larger values are northwest
RectangleBoundary(float southX, float northX, float eastY, float westY, bool isInverted = false);
protected:
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
float const _minX, _maxX, _minY, _maxY;
};
class TC_GAME_API CircleBoundary : public AreaBoundary
{
public:
CircleBoundary(Position const& center, float radius, bool isInverted = false);
CircleBoundary(Position const& center, Position const& pointOnCircle, bool isInverted = false);
protected:
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
Position const _center;
float const _radiusSq;
};
class TC_GAME_API EllipseBoundary : public AreaBoundary
{
public:
EllipseBoundary(Position const& center, float radiusX, float radiusY, bool isInverted = false);
protected:
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
Position const _center;
float const _radiusYSq, _scaleXSq;
};
class TC_GAME_API TriangleBoundary : public AreaBoundary
{
public:
TriangleBoundary(Position const& pointA, Position const& pointB, Position const& pointC, bool isInverted = false);
protected:
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
Position const _a, _b, _c;
float const _abx, _bcx, _cax, _aby, _bcy, _cay;
};
class TC_GAME_API ParallelogramBoundary : public AreaBoundary
{
public:
// Note: AB must be orthogonal to AD
ParallelogramBoundary(Position const& cornerA, Position const& cornerB, Position const& cornerD, bool isInverted = false);
protected:
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
Position const _a, _b, _d, _c;
float const _abx, _dax, _aby, _day;
};
class TC_GAME_API ZRangeBoundary : public AreaBoundary
{
public:
ZRangeBoundary(float minZ, float maxZ, bool isInverted = false);
protected:
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
float const _minZ, _maxZ;
};
class TC_GAME_API PolygonBoundary : public AreaBoundary
{
public:
PolygonBoundary(Position const& origin, std::vector&& vertices, bool isInverted = false);
protected:
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
Position _origin;
std::vector _vertices;
};
class TC_GAME_API BoundaryUnionBoundary : public AreaBoundary
{
public:
BoundaryUnionBoundary(AreaBoundary const* b1, AreaBoundary const* b2, bool isInverted = false);
BoundaryUnionBoundary(BoundaryUnionBoundary const&) = delete;
BoundaryUnionBoundary(BoundaryUnionBoundary&&) = delete;
BoundaryUnionBoundary& operator=(BoundaryUnionBoundary const&) = delete;
BoundaryUnionBoundary& operator=(BoundaryUnionBoundary&&) = delete;
protected:
virtual ~BoundaryUnionBoundary();
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
AreaBoundary const* const _b1;
AreaBoundary const* const _b2;
};
class TC_GAME_API BoundaryIntersectionBoundary : public AreaBoundary
{
public:
BoundaryIntersectionBoundary(AreaBoundary const* b1, AreaBoundary const* b2, bool isInverted = false);
BoundaryIntersectionBoundary(BoundaryIntersectionBoundary const&) = delete;
BoundaryIntersectionBoundary(BoundaryIntersectionBoundary&&) = delete;
BoundaryIntersectionBoundary& operator=(BoundaryIntersectionBoundary const&) = delete;
BoundaryIntersectionBoundary& operator=(BoundaryIntersectionBoundary&&) = delete;
protected:
virtual ~BoundaryIntersectionBoundary();
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
AreaBoundary const* const _b1;
AreaBoundary const* const _b2;
};
#endif //TRINITY_AREA_BOUNDARY_H