diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 13e45e81ab..b2142e1ed3 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 5badeb3ba9..fa6db36456 100644 --- a/src/openrct2/audio/Audio.cpp +++ b/src/openrct2/audio/Audio.cpp @@ -159,20 +159,19 @@ namespace OpenRCT2::Audio uint8_t rotation = GetCurrentRotation(); auto pos2 = Translate3DTo2DWithZ(rotation, location); - // Get all active viewports - auto viewports = WindowGetActiveViewports(); - for (auto* viewport : viewports) + 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 e9421d88ae..92961b1dbf 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 6d4c27df29..1dfa3e3133 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 68294e908c..e5892c29d2 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -916,18 +916,6 @@ static constexpr float kWindowScrollLocations[][2] = { }); } - std::vector WindowGetActiveViewports() - { - std::vector viewports; - WindowVisitEach([&viewports](WindowBase* w) { - if (w->viewport != nullptr && !(w->flags & WF_DEAD)) - { - viewports.push_back(w->viewport); - } - }); - return viewports; - } - Viewport* WindowGetPreviousViewport(Viewport* current) { bool foundPrevious = (current == nullptr); diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index 8e3bce33f6..57ecd6b433 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -333,7 +333,6 @@ namespace OpenRCT2 void TextinputCancel(); - std::vector WindowGetActiveViewports(); Viewport* WindowGetPreviousViewport(Viewport* current); void WindowInitAll();