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:
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1717,6 +1717,11 @@ namespace OpenRCT2
|
||||
return IsSpriteInteractedWithPaletteSet(rt, imageId, coords, paletteMap, imageType);
|
||||
}
|
||||
|
||||
const std::list<Viewport>& GetAllViewports()
|
||||
{
|
||||
return _viewports;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0068862C
|
||||
|
||||
@@ -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 });
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -333,7 +333,6 @@ namespace OpenRCT2
|
||||
|
||||
void TextinputCancel();
|
||||
|
||||
Viewport* WindowGetPreviousViewport(Viewport* current);
|
||||
void WindowInitAll();
|
||||
|
||||
void WindowFollowSprite(WindowBase& w, EntityId spriteIndex);
|
||||
|
||||
Reference in New Issue
Block a user