mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-18 04:23:20 +01:00
Improve performance of S4 loading
This commit is contained in:
@@ -122,6 +122,8 @@ private:
|
||||
EntryList _pathAdditionEntries;
|
||||
EntryList _sceneryGroupEntries;
|
||||
EntryList _waterEntry;
|
||||
EntryList _terrainSurfaceEntries;
|
||||
EntryList _terrainEdgeEntries;
|
||||
EntryList _footpathSurfaceEntries;
|
||||
EntryList _footpathRailingsEntries;
|
||||
|
||||
@@ -134,6 +136,8 @@ private:
|
||||
ObjectEntryIndex _pathTypeToEntryMap[24]{};
|
||||
ObjectEntryIndex _pathAdditionTypeToEntryMap[16]{};
|
||||
ObjectEntryIndex _sceneryThemeTypeToEntryMap[24]{};
|
||||
ObjectEntryIndex _terrainSurfaceTypeToEntryMap[16]{};
|
||||
ObjectEntryIndex _terrainEdgeTypeToEntryMap[16]{};
|
||||
ObjectEntryIndex _footpathSurfaceTypeToEntryMap[32]{};
|
||||
ObjectEntryIndex _footpathRailingsTypeToEntryMap[4]{};
|
||||
|
||||
@@ -377,6 +381,8 @@ private:
|
||||
std::fill(std::begin(_pathTypeToEntryMap), std::end(_pathTypeToEntryMap), OBJECT_ENTRY_INDEX_NULL);
|
||||
std::fill(std::begin(_pathAdditionTypeToEntryMap), std::end(_pathAdditionTypeToEntryMap), OBJECT_ENTRY_INDEX_NULL);
|
||||
std::fill(std::begin(_sceneryThemeTypeToEntryMap), std::end(_sceneryThemeTypeToEntryMap), OBJECT_ENTRY_INDEX_NULL);
|
||||
std::fill(std::begin(_terrainSurfaceTypeToEntryMap), std::end(_terrainSurfaceTypeToEntryMap), OBJECT_ENTRY_INDEX_NULL);
|
||||
std::fill(std::begin(_terrainEdgeTypeToEntryMap), std::end(_terrainEdgeTypeToEntryMap), OBJECT_ENTRY_INDEX_NULL);
|
||||
std::fill(
|
||||
std::begin(_footpathSurfaceTypeToEntryMap), std::end(_footpathSurfaceTypeToEntryMap), OBJECT_ENTRY_INDEX_NULL);
|
||||
std::fill(
|
||||
@@ -419,6 +425,21 @@ private:
|
||||
|
||||
_footpathRailingsEntries.AddRange(
|
||||
{ "rct2.railings.wood", "rct1.ll.railings.space", "rct1.ll.railings.bamboo", "rct2.railings.concrete" });
|
||||
|
||||
// Add default surfaces
|
||||
_terrainSurfaceEntries.AddRange({ "rct2.surface.grass", "rct2.surface.sand", "rct2.surface.dirt", "rct2.surface.rock",
|
||||
"rct2.surface.martian", "rct2.surface.chequerboard", "rct2.surface.grassclumps",
|
||||
"rct2.surface.ice", "rct2.surface.gridred", "rct2.surface.gridyellow",
|
||||
"rct2.surface.gridpurple", "rct2.surface.gridgreen", "rct2.surface.sandred",
|
||||
"rct2.surface.sandbrown", "rct1.aa.surface.roofred", "rct1.ll.surface.roofgrey",
|
||||
"rct1.ll.surface.rust", "rct1.ll.surface.wood" });
|
||||
|
||||
// Add default edges
|
||||
_terrainEdgeEntries.AddRange({ "rct2.edge.rock", "rct2.edge.woodred", "rct2.edge.woodblack", "rct2.edge.ice",
|
||||
"rct1.edge.brick", "rct1.edge.iron", "rct1.aa.edge.grey", "rct1.aa.edge.yellow",
|
||||
"rct1.aa.edge.red", "rct1.ll.edge.purple", "rct1.ll.edge.green",
|
||||
"rct1.ll.edge.stonebrown", "rct1.ll.edge.stonegrey", "rct1.ll.edge.skyscrapera",
|
||||
"rct1.ll.edge.skyscraperb" });
|
||||
}
|
||||
|
||||
void AddAvailableEntriesFromResearchList()
|
||||
@@ -473,6 +494,15 @@ private:
|
||||
{
|
||||
switch (tileElement->GetType())
|
||||
{
|
||||
case TILE_ELEMENT_TYPE_SURFACE:
|
||||
{
|
||||
auto surfaceEl = tileElement->AsSurface();
|
||||
auto surfaceStyle = surfaceEl->GetSurfaceStyle();
|
||||
auto edgeStyle = surfaceEl->GetEdgeStyle();
|
||||
AddEntryForTerrainSurface(surfaceStyle);
|
||||
AddEntryForTerrainEdge(edgeStyle);
|
||||
break;
|
||||
}
|
||||
case TILE_ELEMENT_TYPE_PATH:
|
||||
{
|
||||
uint8_t pathType = tileElement->AsPath()->GetRCT1PathType();
|
||||
@@ -711,6 +741,34 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
void AddEntryForTerrainSurface(ObjectEntryIndex terrainSurfaceType)
|
||||
{
|
||||
assert(terrainSurfaceType < std::size(_terrainSurfaceTypeToEntryMap));
|
||||
if (_terrainSurfaceTypeToEntryMap[terrainSurfaceType] == OBJECT_ENTRY_INDEX_NULL)
|
||||
{
|
||||
auto identifier = RCT1::GetTerrainSurfaceObject(terrainSurfaceType);
|
||||
if (!identifier.empty())
|
||||
{
|
||||
auto entryIndex = _terrainSurfaceEntries.GetOrAddEntry(identifier);
|
||||
_terrainSurfaceTypeToEntryMap[terrainSurfaceType] = entryIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AddEntryForTerrainEdge(ObjectEntryIndex terrainEdgeType)
|
||||
{
|
||||
assert(terrainEdgeType < std::size(_terrainEdgeTypeToEntryMap));
|
||||
if (_terrainEdgeTypeToEntryMap[terrainEdgeType] == OBJECT_ENTRY_INDEX_NULL)
|
||||
{
|
||||
auto identifier = RCT1::GetTerrainEdgeObject(terrainEdgeType);
|
||||
if (!identifier.empty())
|
||||
{
|
||||
auto entryIndex = _terrainEdgeEntries.GetOrAddEntry(identifier);
|
||||
_terrainEdgeTypeToEntryMap[terrainEdgeType] = entryIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AddEntryForFootpathRailings(ObjectEntryIndex railingsType)
|
||||
{
|
||||
assert(railingsType < std::size(_footpathRailingsTypeToEntryMap));
|
||||
@@ -1455,6 +1513,8 @@ private:
|
||||
}));
|
||||
AppendRequiredObjects(result, ObjectType::ParkEntrance, std::vector<std::string>({ "rct2.pkent1" }));
|
||||
AppendRequiredObjects(result, ObjectType::Water, _waterEntry);
|
||||
AppendRequiredObjects(result, ObjectType::TerrainSurface, _terrainSurfaceEntries);
|
||||
AppendRequiredObjects(result, ObjectType::TerrainEdge, _terrainEdgeEntries);
|
||||
AppendRequiredObjects(result, ObjectType::FootpathSurface, _footpathSurfaceEntries);
|
||||
AppendRequiredObjects(result, ObjectType::FootpathRailings, _footpathRailingsEntries);
|
||||
RCT12AddDefaultObjects(result);
|
||||
@@ -1532,9 +1592,12 @@ private:
|
||||
auto dst2 = dst->AsSurface();
|
||||
auto src2 = src->AsSurface();
|
||||
|
||||
auto surfaceStyle = _terrainSurfaceTypeToEntryMap[src2->GetSurfaceStyle()];
|
||||
auto edgeStyle = _terrainEdgeTypeToEntryMap[src2->GetEdgeStyle()];
|
||||
|
||||
dst2->SetSlope(src2->GetSlope());
|
||||
dst2->SetSurfaceStyle(RCT1::GetTerrain(src2->GetSurfaceStyle()));
|
||||
dst2->SetEdgeStyle(RCT1::GetTerrainEdge(src2->GetEdgeStyle()));
|
||||
dst2->SetSurfaceStyle(surfaceStyle);
|
||||
dst2->SetEdgeStyle(edgeStyle);
|
||||
dst2->SetGrassLength(src2->GetGrassLength());
|
||||
dst2->SetOwnership(src2->GetOwnership());
|
||||
dst2->SetParkFences(src2->GetParkFences());
|
||||
|
||||
@@ -116,7 +116,7 @@ namespace RCT1
|
||||
return map[rct1SpriteType];
|
||||
}
|
||||
|
||||
ObjectEntryIndex GetTerrain(uint8_t terrainSurface)
|
||||
std::string_view GetTerrainSurfaceObject(uint8_t terrainSurface)
|
||||
{
|
||||
static constexpr std::string_view map[RCT1_NUM_TERRAIN_SURFACES] =
|
||||
{
|
||||
@@ -137,16 +137,10 @@ namespace RCT1
|
||||
"rct2.surface.gridpurple",
|
||||
"rct2.surface.gridgreen",
|
||||
};
|
||||
std::string selectedSurface = "rct2.surface.grass";
|
||||
if (terrainSurface < std::size(map))
|
||||
{
|
||||
selectedSurface = map[terrainSurface];
|
||||
}
|
||||
|
||||
return object_manager_get_loaded_object_entry_index(ObjectEntryDescriptor(selectedSurface));
|
||||
return terrainSurface < std::size(map) ? map[terrainSurface] : map[0];
|
||||
}
|
||||
|
||||
ObjectEntryIndex GetTerrainEdge(uint8_t terrainEdge)
|
||||
std::string_view GetTerrainEdgeObject(uint8_t terrainEdge)
|
||||
{
|
||||
static constexpr std::string_view map[RCT1_NUM_TERRAIN_EDGES] =
|
||||
{
|
||||
@@ -166,13 +160,7 @@ namespace RCT1
|
||||
"rct1.ll.edge.skyscrapera",
|
||||
"rct1.ll.edge.skyscraperb",
|
||||
};
|
||||
std::string selectedEdge = "rct2.edge.rock";
|
||||
if (terrainEdge < std::size(map))
|
||||
{
|
||||
selectedEdge = map[terrainEdge];
|
||||
}
|
||||
|
||||
return object_manager_get_loaded_object_entry_index(ObjectEntryDescriptor(selectedEdge));
|
||||
return terrainEdge < std::size(map) ? map[terrainEdge] : map[0];
|
||||
}
|
||||
|
||||
uint8_t GetRideType(uint8_t rideType, uint8_t vehicleType)
|
||||
|
||||
@@ -23,8 +23,6 @@ namespace RCT1
|
||||
|
||||
colour_t GetColour(colour_t colour);
|
||||
PeepSpriteType GetPeepSpriteType(uint8_t rct1SpriteType);
|
||||
ObjectEntryIndex GetTerrain(uint8_t terrain);
|
||||
ObjectEntryIndex GetTerrainEdge(uint8_t terrainEdge);
|
||||
|
||||
uint8_t GetRideType(uint8_t rideType, uint8_t vehicleType);
|
||||
RCT1VehicleColourSchemeCopyDescriptor GetColourSchemeCopyDescriptor(uint8_t vehicleType);
|
||||
@@ -43,6 +41,8 @@ namespace RCT1
|
||||
std::string_view GetFootpathRailingsObject(uint8_t footpathRailingsType);
|
||||
std::string_view GetSceneryGroupObject(uint8_t sceneryGroupType);
|
||||
std::string_view GetWaterObject(uint8_t waterType);
|
||||
std::string_view GetTerrainSurfaceObject(uint8_t terrain);
|
||||
std::string_view GetTerrainEdgeObject(uint8_t terrainEdge);
|
||||
|
||||
const std::vector<const char*> GetSceneryObjects(uint8_t sceneryType);
|
||||
} // namespace RCT1
|
||||
|
||||
@@ -1387,7 +1387,7 @@ std::optional<uint8_t> GetStyleFromMusicIdentifier(std::string_view identifier)
|
||||
return {};
|
||||
}
|
||||
|
||||
void RCT12AddDefaultObjects(ObjectList& objectList)
|
||||
void SetDefaultRCT2TerrainObjects(ObjectList& objectList)
|
||||
{
|
||||
// Surfaces
|
||||
objectList.SetObject(ObjectType::TerrainSurface, 0, "rct2.surface.grass");
|
||||
@@ -1425,7 +1425,10 @@ void RCT12AddDefaultObjects(ObjectList& objectList)
|
||||
objectList.SetObject(ObjectType::TerrainEdge, 12, "rct1.ll.edge.stonegrey");
|
||||
objectList.SetObject(ObjectType::TerrainEdge, 13, "rct1.ll.edge.skyscrapera");
|
||||
objectList.SetObject(ObjectType::TerrainEdge, 14, "rct1.ll.edge.skyscraperb");
|
||||
}
|
||||
|
||||
void RCT12AddDefaultObjects(ObjectList& objectList)
|
||||
{
|
||||
// Stations
|
||||
for (size_t i = 0; i < std::size(_stationStyles); i++)
|
||||
{
|
||||
|
||||
@@ -936,4 +936,5 @@ track_type_t RCT12FlatTrackTypeToOpenRCT2(RCT12TrackType origTrackType);
|
||||
RCT12TrackType OpenRCT2FlatTrackTypeToRCT12(track_type_t origTrackType);
|
||||
std::string_view GetStationIdentifierFromStyle(uint8_t style);
|
||||
std::optional<uint8_t> GetStyleFromMusicIdentifier(std::string_view identifier);
|
||||
void SetDefaultRCT2TerrainObjects(ObjectList& objectList);
|
||||
void RCT12AddDefaultObjects(ObjectList& objectList);
|
||||
|
||||
@@ -1549,6 +1549,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
SetDefaultRCT2TerrainObjects(objectList);
|
||||
RCT12AddDefaultObjects(objectList);
|
||||
return objectList;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user