From dbbf95ca50a9ebad1d6741c672192a9c93107e9e Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sat, 24 Aug 2013 12:24:12 +0200 Subject: WINTERMUTE: Mirror _drawNum with an iterator --- .../base/gfx/osystem/base_render_osystem.cpp | 21 +++++++++++++++++++++ .../base/gfx/osystem/base_render_osystem.h | 1 + 2 files changed, 22 insertions(+) (limited to 'engines/wintermute/base/gfx') diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp index 96bc3186b6..3a78437f35 100644 --- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp +++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp @@ -52,6 +52,7 @@ BaseRenderOSystem::BaseRenderOSystem(BaseGame *inGame) : BaseRenderer(inGame) { _renderSurface = new Graphics::Surface(); _blankSurface = new Graphics::Surface(); _drawNum = 1; + _lastFrameIter = _renderQueue.end(); _needsFlip = true; _skipThisFrame = false; _previousTicket = nullptr; @@ -159,6 +160,7 @@ bool BaseRenderOSystem::flip() { g_system->updateScreen(); _needsFlip = false; _drawNum = 1; + _lastFrameIter = _renderQueue.end(); addDirtyRect(_renderRect); return true; } @@ -189,6 +191,7 @@ bool BaseRenderOSystem::flip() { _needsFlip = false; } _drawNum = 1; + _lastFrameIter = _renderQueue.end(); return STATUS_OK; } @@ -372,10 +375,15 @@ void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) { renderTicket->_wantsDraw = true; // A new item always has _drawNum == 0 if (renderTicket->_drawNum == 0) { + ++_lastFrameIter; // In-order if (_renderQueue.empty() || _drawNum > (_renderQueue.back())->_drawNum) { + assert(_renderQueue.empty() || _lastFrameIter == _renderQueue.end()); + _lastFrameIter--; renderTicket->_drawNum = _drawNum++; _renderQueue.push_back(renderTicket); + ++_lastFrameIter; + assert(*_lastFrameIter == renderTicket); addDirtyRect(renderTicket->_dstRect); ++_lastAddedTicket; } else { @@ -386,23 +394,34 @@ void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) { break; } } + assert(!_renderQueue.empty() && _lastFrameIter != _renderQueue.end()); + assert(pos == _lastFrameIter); _renderQueue.insert(pos, renderTicket); renderTicket->_drawNum = _drawNum++; + --_lastFrameIter; + assert(*_lastFrameIter == renderTicket); // Increment the following tickets, so they still are in line RenderQueueIterator it; for (it = pos; it != _renderQueue.end(); ++it) { (*it)->_drawNum++; + assert((*it)->_wantsDraw == false); (*it)->_wantsDraw = false; } addDirtyRect(renderTicket->_dstRect); _lastAddedTicket = pos; } } else { + ++_lastFrameIter; // Was drawn last round, still in the same order if (_drawNum == renderTicket->_drawNum) { + assert((*_lastFrameIter)->_drawNum == _drawNum); + assert(*_lastFrameIter == renderTicket); _drawNum++; ++_lastAddedTicket; } else { + assert(*_lastFrameIter != renderTicket); + --_lastFrameIter; + assert(_drawNum < renderTicket->_drawNum); // Remove the ticket from the list RenderQueueIterator it = _renderQueue.begin(); while (it != _renderQueue.end()) { @@ -470,6 +489,7 @@ void BaseRenderOSystem::drawTickets() { // Apply the clear-color to the dirty rect. _renderSurface->fillRect(*_dirtyRect, _clearColor); _drawNum = 1; + _lastFrameIter = _renderQueue.end(); for (it = _renderQueue.begin(); it != _renderQueue.end(); ++it) { RenderTicket *ticket = *it; assert(ticket->_drawNum == _drawNum); @@ -641,6 +661,7 @@ void BaseRenderOSystem::endSaveLoad() { // so just skip this single frame. _skipThisFrame = true; _drawNum = 1; + _lastFrameIter = _renderQueue.end(); _renderSurface->fillRect(Common::Rect(0, 0, _renderSurface->h, _renderSurface->w), _renderSurface->format.ARGBToColor(255, 0, 0, 0)); g_system->copyRectToScreen((byte *)_renderSurface->getPixels(), _renderSurface->pitch, 0, 0, _renderSurface->w, _renderSurface->h); diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.h b/engines/wintermute/base/gfx/osystem/base_render_osystem.h index dd3cc6140e..3de696fb81 100644 --- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h +++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h @@ -128,6 +128,7 @@ private: bool _needsFlip; uint32 _drawNum; ///< The global number of the current draw-operation. + RenderQueueIterator _lastFrameIter; Common::Rect _renderRect; Graphics::Surface *_renderSurface; Graphics::Surface *_blankSurface; -- cgit v1.2.3