From 6fb5524e1e9f0484e4e3412576f0068a6411862a Mon Sep 17 00:00:00 2001 From: Tulio Leao Date: Mon, 23 Dec 2019 10:07:20 -0300 Subject: [PATCH] Make Map::map_large_scenery_get_origin() use CoordsXYZ* --- src/openrct2/ride/TrackDesignSave.cpp | 18 +++++++++-------- src/openrct2/world/Map.cpp | 29 +++++++++++++-------------- src/openrct2/world/Map.h | 5 ++--- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/openrct2/ride/TrackDesignSave.cpp b/src/openrct2/ride/TrackDesignSave.cpp index 7dbe123504..b538ab0443 100644 --- a/src/openrct2/ride/TrackDesignSave.cpp +++ b/src/openrct2/ride/TrackDesignSave.cpp @@ -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) }, 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) }, 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) }, 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) }, sequence); if (largeElement != nullptr) { diff --git a/src/openrct2/world/Map.cpp b/src/openrct2/world/Map.cpp index 8e32449948..981f4ca05e 100644 --- a/src/openrct2/world/Map.cpp +++ b/src/openrct2/world/Map.cpp @@ -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 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) }, 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) }, 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) }, sequence); if (tileElement != nullptr) { diff --git a/src/openrct2/world/Map.h b/src/openrct2/world/Map.h index 07fd06d3aa..d4f40f38d3 100644 --- a/src/openrct2/world/Map.h +++ b/src/openrct2/world/Map.h @@ -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 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);