diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 1cc69e7d55..8cc74d0908 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -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. diff --git a/src/openrct2/audio/Audio.cpp b/src/openrct2/audio/Audio.cpp index 9505c952ab..fa6db36456 100644 --- a/src/openrct2/audio/Audio.cpp +++ b/src/openrct2/audio/Audio.cpp @@ -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; diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index a8f3aacfeb..e8032e2f68 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -1717,6 +1717,11 @@ namespace OpenRCT2 return IsSpriteInteractedWithPaletteSet(rt, imageId, coords, paletteMap, imageType); } + const std::list& GetAllViewports() + { + return _viewports; + } + /** * * rct2: 0x0068862C diff --git a/src/openrct2/interface/Viewport.h b/src/openrct2/interface/Viewport.h index 25fc7b6baa..37a65198d8 100644 --- a/src/openrct2/interface/Viewport.h +++ b/src/openrct2/interface/Viewport.h @@ -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& 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 }); diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index e5892c29d2..e0c59c7f6d 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -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(); diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index 57ecd6b433..233a18bab0 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -333,7 +333,6 @@ namespace OpenRCT2 void TextinputCancel(); - Viewport* WindowGetPreviousViewport(Viewport* current); void WindowInitAll(); void WindowFollowSprite(WindowBase& w, EntityId spriteIndex);