From 408880fa54987acb533ce8ff8dc31b3a72aec6d0 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Wed, 2 Oct 2013 09:37:50 +0200 Subject: WINTERMUTE: Fix regression with _skipThisFrame This broke loading in Broken Circle demo. We now reset the queue state when skipping a frame, and re-use lastFrameIter instead of keeping track of lastAddedTicket separately. --- .../base/gfx/osystem/base_render_osystem.cpp | 23 +++++++++++----------- .../base/gfx/osystem/base_render_osystem.h | 1 - 2 files changed, 11 insertions(+), 13 deletions(-) (limited to 'engines') diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp index e9eea07b35..3eba3b34b5 100644 --- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp +++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp @@ -157,8 +157,15 @@ bool BaseRenderOSystem::flip() { _dirtyRect = nullptr; g_system->updateScreen(); _needsFlip = false; + + // Reset ticketing state _drawNum = 1; _lastFrameIter = _renderQueue.end(); + RenderQueueIterator it; + for (it = _renderQueue.begin(); it != _renderQueue.end(); ++it) { + (*it)->_wantsDraw = false; + } + addDirtyRect(_renderRect); return true; } @@ -266,12 +273,6 @@ void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::S return; } - // Start searching from the beginning for the first and second items (since it's empty the first time around - // then keep incrementing the start-position, to avoid comparing against already used tickets. - if (_drawNum == 0 || _drawNum == 1) { - _lastAddedTicket = _renderQueue.begin(); - } - // Skip rects that are completely outside the screen: if ((dstRect->left < 0 && dstRect->right < 0) || (dstRect->top < 0 && dstRect->bottom < 0)) { return; @@ -279,12 +280,13 @@ void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::S if (owner) { // Fade-tickets are owner-less RenderTicket compare(owner, nullptr, srcRect, dstRect, transform); - RenderQueueIterator it; + RenderQueueIterator it = _lastFrameIter; + ++it; // Avoid calling end() and operator* every time, when potentially going through // LOTS of tickets. RenderQueueIterator endIterator = _renderQueue.end(); RenderTicket *compareTicket = nullptr; - for (it = _lastAddedTicket; it != endIterator; ++it) { + for (; it != endIterator; ++it) { compareTicket = *it; if (*(compareTicket) == compare && compareTicket->_isValid) { if (_disableDirtyRects) { @@ -332,26 +334,24 @@ void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) { _renderQueue.push_back(renderTicket); ++_lastFrameIter; addDirtyRect(renderTicket->_dstRect); - ++_lastAddedTicket; } else { // Before something RenderQueueIterator pos = _lastFrameIter; _renderQueue.insert(pos, renderTicket); --_lastFrameIter; addDirtyRect(renderTicket->_dstRect); - _lastAddedTicket = pos; } } void BaseRenderOSystem::drawFromQueuedTicket(const RenderQueueIterator &ticket) { RenderTicket *renderTicket = *ticket; + assert(!renderTicket->_wantsDraw); renderTicket->_wantsDraw = true; ++_lastFrameIter; // Was drawn last round, still in the same order if (*_lastFrameIter == renderTicket) { _drawNum++; - ++_lastAddedTicket; } else { --_lastFrameIter; // Remove the ticket from the list @@ -558,7 +558,6 @@ void BaseRenderOSystem::endSaveLoad() { it = _renderQueue.erase(it); delete ticket; } - _lastAddedTicket = _renderQueue.begin(); // HACK: After a save the buffer will be drawn before the scripts get to update it, // so just skip this single frame. _skipThisFrame = true; diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.h b/engines/wintermute/base/gfx/osystem/base_render_osystem.h index ab62d242c0..6dc8948717 100644 --- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h +++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h @@ -128,7 +128,6 @@ private: void drawFromSurface(RenderTicket *ticket, Common::Rect *dstRect, Common::Rect *clipRect); Common::Rect *_dirtyRect; Common::List _renderQueue; - RenderQueueIterator _lastAddedTicket; bool _needsFlip; uint32 _drawNum; ///< The global number of the current draw-operation. -- cgit v1.2.3