5#include "./triangulated-displacement.hpp"
7namespace BspParser::Internal {
8 struct VertexCoordinate {
9 enum class Axis : uint8_t { X, Y };
14 int32_t& operator[](
const Axis axis) {
15 return axis == Axis::X ? x : y;
18 const int32_t& operator[](
const Axis axis)
const {
19 return axis == Axis::X ? x : y;
23 class SubEdgeIterator {
26 const TriangulatedDisplacement& displacement,
27 const Structs::DispSubNeighbour& subNeighbour,
28 const TriangulatedDisplacement& neighbour,
30 int32_t subNeighbourIndex,
31 bool shouldTouchCorners =
false
36 [[nodiscard]]
const VertexCoordinate& getVertexCoordinate()
const;
37 [[nodiscard]] int32_t getVertexIndex()
const;
38 [[nodiscard]] int32_t getNeighbourVertexIndex()
const;
40 [[nodiscard]]
bool isLastVertex()
const;
42 [[nodiscard]] VertexCoordinate::Axis getFreeAxis()
const;
45 const TriangulatedDisplacement* displacement =
nullptr;
46 const TriangulatedDisplacement* neighbour =
nullptr;
48 uint8_t neighbourOrientation = 0;
51 uint8_t neighbourSpan = 0;
53 VertexCoordinate coordinate{};
54 VertexCoordinate increment{};
56 VertexCoordinate neighbourCoordinate{};
57 VertexCoordinate neighbourIncrement{};
60 VertexCoordinate::Axis freeAxis = VertexCoordinate::Axis::X;
61 VertexCoordinate::Axis neighbourFreeAxis = VertexCoordinate::Axis::X;
63 void setupEdgeIncrements(int32_t edgeIndex, int32_t subNeighbourIndex);
64 [[nodiscard]] VertexCoordinate transformIntoSubNeighbour(int32_t edgeIndex,
const VertexCoordinate& toTransform);