Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enum PaintStruct Quadrant Flags #1818

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 8 additions & 8 deletions src/OpenLoco/src/Paint/Paint.cpp
Expand Up @@ -514,7 +514,7 @@ namespace OpenLoco::Paint
ps->bounds.x = rotBoundBoxOffset.x + getSpritePosition().x;
ps->bounds.y = rotBoundBoxOffset.y + getSpritePosition().y;
ps->bounds.z = rotBoundBoxOffset.z;
ps->flags = 0;
ps->flags = PaintStructFlags::none;
ps->attachedPS = nullptr;
ps->children = nullptr;
ps->type = _itemType;
Expand Down Expand Up @@ -599,7 +599,7 @@ namespace OpenLoco::Paint
}

template<uint8_t _TRotation>
static PaintStruct* arrangeStructsHelperRotation(PaintStruct* psNext, const uint16_t quadrantIndex, const uint8_t flag)
static PaintStruct* arrangeStructsHelperRotation(PaintStruct* psNext, const uint16_t quadrantIndex, const QuadrantFlags flag)
{
PaintStruct* ps = nullptr;

Expand Down Expand Up @@ -656,12 +656,12 @@ namespace OpenLoco::Paint
// End of the current list.
return psQuadrantEntry;
}
if (psNext->quadrantFlags & QuadrantFlags::outsideQuadrant)
if (psNext->hasQuadrantFlags(QuadrantFlags::outsideQuadrant))
{
// Reached point outside of specified quadrant.
return psQuadrantEntry;
}
if (psNext->quadrantFlags & QuadrantFlags::pendingVisit)
if (psNext->hasQuadrantFlags(QuadrantFlags::pendingVisit))
{
// Found node to check on.
break;
Expand All @@ -681,9 +681,9 @@ namespace OpenLoco::Paint
psNext = psNext->nextQuadrantPS;
if (psNext == nullptr)
break;
if (psNext->quadrantFlags & QuadrantFlags::outsideQuadrant)
if (psNext->hasQuadrantFlags(QuadrantFlags::outsideQuadrant))
break;
if (!(psNext->quadrantFlags & QuadrantFlags::neighbour))
if (!psNext->hasQuadrantFlags(QuadrantFlags::neighbour))
continue;

const PaintStructBoundBox& currentBBox = psNext->bounds;
Expand All @@ -705,7 +705,7 @@ namespace OpenLoco::Paint
}
}

static PaintStruct* arrangeStructsHelper(PaintStruct* psNext, uint16_t quadrantIndex, uint8_t flag, uint8_t rotation)
static PaintStruct* arrangeStructsHelper(PaintStruct* psNext, uint16_t quadrantIndex, QuadrantFlags flag, uint8_t rotation)
{
switch (rotation)
{
Expand Down Expand Up @@ -757,7 +757,7 @@ namespace OpenLoco::Paint
quadrantIndex = _quadrantBackIndex;
while (++quadrantIndex < _quadrantFrontIndex)
{
psCache = arrangeStructsHelper(psCache, quadrantIndex & 0xFFFF, 0, currentRotation);
psCache = arrangeStructsHelper(psCache, quadrantIndex & 0xFFFF, QuadrantFlags::none, currentRotation);
}
}

Expand Down
35 changes: 22 additions & 13 deletions src/OpenLoco/src/Paint/Paint.h
Expand Up @@ -3,6 +3,7 @@
#include "Map/Map.hpp"
#include "Types.hpp"
#include "Ui/UiTypes.hpp"
#include <OpenLoco/Core/EnumFlags.hpp>
#include <OpenLoco/Interop/Interop.hpp>

namespace OpenLoco::Map
Expand Down Expand Up @@ -44,19 +45,21 @@ namespace OpenLoco::Paint
}

// Used by both AttachedPaintStruct and PaintStruct
namespace PaintStructFlags
enum class PaintStructFlags : uint8_t
{
constexpr uint8_t hasMaskedImage = (1 << 0);
}
none = 0U,
hasMaskedImage = 1 << 0,
};
OPENLOCO_ENABLE_ENUM_OPERATORS(PaintStructFlags);

#pragma pack(push, 1)
/* size 0x12 */
struct AttachedPaintStruct
{
ImageId imageId; // 0x00
ImageId maskedImageId; // 0x04
Ui::Point vpPos; // 0x08
uint8_t flags; // 0x0C
ImageId imageId; // 0x00
ImageId maskedImageId; // 0x04
Ui::Point vpPos; // 0x08
PaintStructFlags flags; // 0x0C
uint8_t pad_0D;
AttachedPaintStruct* next; // 0x0E
};
Expand All @@ -83,12 +86,14 @@ namespace OpenLoco::Paint
int16_t yEnd; // 0x12
};

namespace QuadrantFlags
enum class QuadrantFlags : uint8_t
{
constexpr uint8_t pendingVisit = (1 << 0);
constexpr uint8_t outsideQuadrant = (1 << 7);
constexpr uint8_t neighbour = (1 << 1);
none = 0U,
pendingVisit = 1U << 0,
outsideQuadrant = 1U << 7,
neighbour = 1U << 1,
};
OPENLOCO_ENABLE_ENUM_OPERATORS(QuadrantFlags);

struct PaintStruct
{
Expand All @@ -97,8 +102,8 @@ namespace OpenLoco::Paint
PaintStructBoundBox bounds; // 0x08
Ui::Point vpPos; // 0x14
uint16_t quadrantIndex; // 0x18
uint8_t flags; // 0x1A
uint8_t quadrantFlags; // 0x1B
PaintStructFlags flags; // 0x1A
QuadrantFlags quadrantFlags; // 0x1B
AttachedPaintStruct* attachedPS; // 0x1C
PaintStruct* children; // 0x20
PaintStruct* nextQuadrantPS; // 0x24
Expand All @@ -111,6 +116,10 @@ namespace OpenLoco::Paint
Map::TileElement* tileElement; // 0x30 (or entity pointer)
EntityBase* entity; // 0x30
};
constexpr bool hasQuadrantFlags(QuadrantFlags flagsToTest) const
{
return (quadrantFlags & flagsToTest) != QuadrantFlags::none;
}
};
assert_struct_size(PaintStruct, 0x34);

Expand Down