Make Map::map_large_scenery_get_origin() use CoordsXYZ*

This commit is contained in:
Tulio Leao 2019-12-23 10:07:20 -03:00
parent 00e1030d09
commit 6fb5524e1e
3 changed files with 26 additions and 26 deletions

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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);