1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-31 10:45:16 +01:00

Merge pull request #24474 from Harry-Hopkinson/more-efficiently-search-viewports

Fix #24426: More efficiently search viewports.
This commit is contained in:
Matt
2025-05-29 21:24:14 +03:00
committed by GitHub
6 changed files with 15 additions and 31 deletions

View File

@@ -11,6 +11,7 @@
- Improved: [#24417] Improve the fallback vehicle sprites for Dive Loops.
- Improved: [#24433] The ride, new ride, scenery, path, viewport, park and tool windows no longer redraw every frame if they have not changed.
- Improved: [#24467] Apply tweening only to on-screen entities when not zoomed out for better performance with uncapped FPS.
- Improved: [#24474] More efficiently search viewports when playing Audio.
- Improved: [#24479] More descriptive error messages for `set` commands in the in-game console.
- Change: [#24342] g2.dat is now split into g2.dat and fonts.dat.
- Change: [#24362] The Windows installer now prevents installing to the same folder as RollerCoaster Tycoon 2 or Classic.

View File

@@ -159,19 +159,19 @@ namespace OpenRCT2::Audio
uint8_t rotation = GetCurrentRotation();
auto pos2 = Translate3DTo2DWithZ(rotation, location);
Viewport* viewport = nullptr;
while ((viewport = WindowGetPreviousViewport(viewport)) != nullptr)
const auto& activeViewports = GetAllViewports();
for (const auto& viewport : activeViewports)
{
if (viewport->flags & VIEWPORT_FLAG_SOUND_ON)
if (viewport.flags & VIEWPORT_FLAG_SOUND_ON)
{
int16_t vx = pos2.x - viewport->viewPos.x;
params.pan = viewport->pos.x + viewport->zoom.ApplyInversedTo(vx);
int16_t vx = pos2.x - viewport.viewPos.x;
params.pan = viewport.pos.x + viewport.zoom.ApplyInversedTo(vx);
auto sampleModifier = obj->GetSampleModifier(sampleIndex);
auto viewModifier = ((viewport->zoom.ApplyTo(-1024) - 1) * (1 << volumeDown)) + 1;
auto viewModifier = ((viewport.zoom.ApplyTo(-1024) - 1) * (1 << volumeDown)) + 1;
params.volume = sampleModifier + viewModifier;
if (!viewport->Contains(pos2) || params.volume < -10000)
if (!viewport.Contains(pos2) || params.volume < -10000)
{
params.in_range = false;
return params;

View File

@@ -1717,6 +1717,11 @@ namespace OpenRCT2
return IsSpriteInteractedWithPaletteSet(rt, imageId, coords, paletteMap, imageType);
}
const std::list<Viewport>& GetAllViewports()
{
return _viewports;
}
/**
*
* rct2: 0x0068862C

View File

@@ -183,6 +183,8 @@ namespace OpenRCT2
void ViewportCreate(WindowBase* w, const ScreenCoordsXY& screenCoords, int32_t width, int32_t height, const Focus& focus);
void ViewportRemove(Viewport* viewport);
const std::list<Viewport>& GetAllViewports();
void ViewportsInvalidate(int32_t x, int32_t y, int32_t z0, int32_t z1, ZoomLevel maxZoom);
void ViewportsInvalidate(const CoordsXYZ& pos, int32_t width, int32_t minHeight, int32_t maxHeight, ZoomLevel maxZoom);
void ViewportsInvalidate(const ScreenRect& screenRect, ZoomLevel maxZoom = ZoomLevel{ -1 });

View File

@@ -916,29 +916,6 @@ static constexpr float kWindowScrollLocations[][2] = {
});
}
Viewport* WindowGetPreviousViewport(Viewport* current)
{
bool foundPrevious = (current == nullptr);
for (auto it = g_window_list.rbegin(); it != g_window_list.rend(); it++)
{
auto& w = **it;
if (w.flags & WF_DEAD)
continue;
if (w.viewport != nullptr)
{
if (foundPrevious)
{
return w.viewport;
}
if (w.viewport == current)
{
foundPrevious = true;
}
}
}
return nullptr;
}
void WindowInitAll()
{
auto* windowMgr = Ui::GetWindowManager();

View File

@@ -333,7 +333,6 @@ namespace OpenRCT2
void TextinputCancel();
Viewport* WindowGetPreviousViewport(Viewport* current);
void WindowInitAll();
void WindowFollowSprite(WindowBase& w, EntityId spriteIndex);