mirror of https://github.com/OpenRCT2/OpenRCT2.git
Make Map::map_large_scenery_get_origin() use CoordsXYZ*
This commit is contained in:
parent
00e1030d09
commit
6fb5524e1e
|
@ -224,18 +224,18 @@ static void track_design_save_add_scenery(CoordsXY loc, SmallSceneryElement* sce
|
|||
static void track_design_save_add_large_scenery(CoordsXY loc, LargeSceneryElement* tileElement)
|
||||
{
|
||||
rct_large_scenery_tile *sceneryTiles, *tile;
|
||||
int32_t x0, y0, z0, z;
|
||||
int32_t direction, sequence;
|
||||
|
||||
int32_t entryType = tileElement->GetEntryIndex();
|
||||
auto entry = object_entry_get_entry(OBJECT_TYPE_LARGE_SCENERY, entryType);
|
||||
sceneryTiles = get_large_scenery_entry(entryType)->large_scenery.tiles;
|
||||
|
||||
z = tileElement->base_height;
|
||||
int32_t z = tileElement->base_height;
|
||||
direction = tileElement->GetDirection();
|
||||
sequence = tileElement->GetSequenceIndex();
|
||||
|
||||
if (!map_large_scenery_get_origin(loc.x, loc.y, z, direction, sequence, &x0, &y0, &z0, nullptr))
|
||||
auto sceneryOrigin = map_large_scenery_get_origin({ loc.x, loc.y, z << 3, static_cast<Direction>(direction) }, sequence, nullptr);
|
||||
if (!sceneryOrigin)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -247,7 +247,8 @@ static void track_design_save_add_large_scenery(CoordsXY loc, LargeSceneryElemen
|
|||
CoordsXY offsetPos{ tile->x_offset, tile->y_offset };
|
||||
auto rotatedOffsetPos = offsetPos.Rotate(direction);
|
||||
|
||||
CoordsXYZ tileLoc = { x0 + rotatedOffsetPos.x, y0 + rotatedOffsetPos.y, (z0 + tile->z_offset) };
|
||||
CoordsXYZ tileLoc = { sceneryOrigin->x + rotatedOffsetPos.x, sceneryOrigin->y + rotatedOffsetPos.y,
|
||||
sceneryOrigin->z + tile->z_offset };
|
||||
auto largeElement = map_get_large_scenery_segment({ tileLoc, static_cast<Direction>(direction) }, sequence);
|
||||
if (largeElement != nullptr)
|
||||
{
|
||||
|
@ -398,18 +399,18 @@ static void track_design_save_remove_scenery(CoordsXY loc, SmallSceneryElement*
|
|||
static void track_design_save_remove_large_scenery(CoordsXY loc, LargeSceneryElement* tileElement)
|
||||
{
|
||||
rct_large_scenery_tile *sceneryTiles, *tile;
|
||||
int32_t x0, y0, z0, z;
|
||||
int32_t direction, sequence;
|
||||
|
||||
int32_t entryType = tileElement->GetEntryIndex();
|
||||
auto entry = object_entry_get_entry(OBJECT_TYPE_LARGE_SCENERY, entryType);
|
||||
sceneryTiles = get_large_scenery_entry(entryType)->large_scenery.tiles;
|
||||
|
||||
z = tileElement->base_height;
|
||||
int32_t z = tileElement->base_height;
|
||||
direction = tileElement->GetDirection();
|
||||
sequence = tileElement->GetSequenceIndex();
|
||||
|
||||
if (!map_large_scenery_get_origin(loc.x, loc.y, z, direction, sequence, &x0, &y0, &z0, nullptr))
|
||||
auto sceneryOrigin = map_large_scenery_get_origin({ loc.x, loc.y, z << 3, static_cast<Direction>(direction) }, sequence, nullptr);
|
||||
if (!sceneryOrigin)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -421,7 +422,8 @@ static void track_design_save_remove_large_scenery(CoordsXY loc, LargeSceneryEle
|
|||
CoordsXY offsetPos{ tile->x_offset, tile->y_offset };
|
||||
auto rotatedOffsetPos = offsetPos.Rotate(direction);
|
||||
|
||||
CoordsXYZ tileLoc = { x0 + rotatedOffsetPos.x, y0 + rotatedOffsetPos.y, z0 + tile->z_offset };
|
||||
CoordsXYZ tileLoc = { sceneryOrigin->x + rotatedOffsetPos.x, sceneryOrigin->y + rotatedOffsetPos.y,
|
||||
sceneryOrigin->z + tile->z_offset };
|
||||
auto largeElement = map_get_large_scenery_segment({ tileLoc, static_cast<Direction>(direction) }, sequence);
|
||||
if (largeElement != nullptr)
|
||||
{
|
||||
|
|
|
@ -1874,29 +1874,27 @@ SmallSceneryElement* map_get_small_scenery_element_at(CoordsXYZ sceneryCoords, i
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
bool map_large_scenery_get_origin(
|
||||
int32_t x, int32_t y, int32_t z, int32_t direction, int32_t sequence, int32_t* outX, int32_t* outY, int32_t* outZ,
|
||||
LargeSceneryElement** outElement)
|
||||
std::optional<CoordsXYZ> map_large_scenery_get_origin(
|
||||
const CoordsXYZD& sceneryPos, int32_t sequence, LargeSceneryElement** outElement)
|
||||
{
|
||||
rct_scenery_entry* sceneryEntry;
|
||||
rct_large_scenery_tile* tile;
|
||||
|
||||
auto tileElement = map_get_large_scenery_segment({ x, y, z << 3, static_cast<Direction>(direction) }, sequence);
|
||||
auto tileElement = map_get_large_scenery_segment(sceneryPos, sequence);
|
||||
if (tileElement == nullptr)
|
||||
return false;
|
||||
return std::nullopt;
|
||||
|
||||
sceneryEntry = tileElement->GetEntry();
|
||||
tile = &sceneryEntry->large_scenery.tiles[sequence];
|
||||
|
||||
CoordsXY offsetPos{ tile->x_offset, tile->y_offset };
|
||||
auto rotatedOffsetPos = offsetPos.Rotate(direction);
|
||||
auto rotatedOffsetPos = offsetPos.Rotate(sceneryPos.direction);
|
||||
|
||||
*outX = x - rotatedOffsetPos.x;
|
||||
*outY = y - rotatedOffsetPos.y;
|
||||
*outZ = (z * 8) - tile->z_offset;
|
||||
auto origin = CoordsXYZ{ sceneryPos.x - rotatedOffsetPos.x, sceneryPos.y - rotatedOffsetPos.y,
|
||||
sceneryPos.z - tile->z_offset };
|
||||
if (outElement != nullptr)
|
||||
*outElement = tileElement;
|
||||
return true;
|
||||
return origin;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1909,9 +1907,10 @@ bool sign_set_colour(
|
|||
LargeSceneryElement* tileElement;
|
||||
rct_scenery_entry* sceneryEntry;
|
||||
rct_large_scenery_tile *sceneryTiles, *tile;
|
||||
int32_t x0, y0, z0;
|
||||
|
||||
if (!map_large_scenery_get_origin(x, y, z, direction, sequence, &x0, &y0, &z0, &tileElement))
|
||||
auto sceneryOrigin = map_large_scenery_get_origin(
|
||||
{ x, y, z << 3, static_cast<Direction>(direction) }, sequence, &tileElement);
|
||||
if (!sceneryOrigin)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -1926,9 +1925,9 @@ bool sign_set_colour(
|
|||
CoordsXY offsetPos{ tile->x_offset, tile->y_offset };
|
||||
auto rotatedOffsetPos = offsetPos.Rotate(direction);
|
||||
|
||||
x = x0 + rotatedOffsetPos.x;
|
||||
y = y0 + rotatedOffsetPos.y;
|
||||
z = z0 + tile->z_offset;
|
||||
x = sceneryOrigin->x + rotatedOffsetPos.x;
|
||||
y = sceneryOrigin->y + rotatedOffsetPos.y;
|
||||
z = sceneryOrigin->z + tile->z_offset;
|
||||
tileElement = map_get_large_scenery_segment({ x, y, z, static_cast<Direction>(direction) }, sequence);
|
||||
if (tileElement != nullptr)
|
||||
{
|
||||
|
|
|
@ -223,9 +223,8 @@ int32_t tile_element_get_corner_height(const SurfaceElement* surfaceElement, int
|
|||
void map_clear_all_elements();
|
||||
|
||||
LargeSceneryElement* map_get_large_scenery_segment(const CoordsXYZD& sceneryPos, int32_t sequence);
|
||||
bool map_large_scenery_get_origin(
|
||||
int32_t x, int32_t y, int32_t z, int32_t direction, int32_t sequence, int32_t* outX, int32_t* outY, int32_t* outZ,
|
||||
LargeSceneryElement** outElement);
|
||||
std::optional<CoordsXYZ> map_large_scenery_get_origin(
|
||||
const CoordsXYZD& sceneryPos, int32_t sequence, LargeSceneryElement** outElement);
|
||||
|
||||
ScreenCoordsXY translate_3d_to_2d_with_z(int32_t rotation, const CoordsXYZ& pos);
|
||||
|
||||
|
|
Loading…
Reference in New Issue