From: <sag...@us...> - 2015-06-27 21:42:04
|
Revision: 5373 http://sourceforge.net/p/modplug/code/5373 Author: saga-games Date: 2015-06-27 21:41:58 +0000 (Sat, 27 Jun 2015) Log Message: ----------- [Imp] Add very basic detection for backward-scrolling patterns to reduce motion sickness with smoothly scrolling patterns. Modified Paths: -------------- trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2015-06-27 21:05:39 UTC (rev 5372) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2015-06-27 21:41:58 UTC (rev 5373) @@ -165,7 +165,10 @@ && (m_nMidRow != 0 || GetYScrollPos() > 0) // If active row is not centered, only scroll when display position is actually not at the top && IsLiveRecord()) // Actually playing live (not paused or stepping) { - return Util::muldivr_unsigned(m_szCell.cy, m_nPlayTick, std::max(1u, m_nTicksOnRow)); + uint32 tick = m_nPlayTick; + // Avoid jerky animation with backwards-going patterns + if(m_smoothScrollBackwards) tick = m_nTicksOnRow - m_nPlayTick - 1; + return Util::muldivr_unsigned(m_szCell.cy, tick, std::max(1u, m_nTicksOnRow)); } return 0; } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2015-06-27 21:05:39 UTC (rev 5372) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2015-06-27 21:41:58 UTC (rev 5373) @@ -191,6 +191,7 @@ m_nDragItem = 0; m_bInItemRect = false; m_bContinueSearch = false; + m_smoothScrollBackwards = false; m_Status = psShowPluginNames; m_nXScroll = m_nYScroll = 0; m_nPattern = 0; @@ -3762,9 +3763,19 @@ m_pEffectVis->SetPlayCursor(nPat, nRow); } - // Don't follow song if user drags selections or scrollbars. + // Simple detection of backwards-going patterns to avoid jerky animation + m_smoothScrollBackwards = false; + if((TrackerSettings::Instance().m_dwPatternSetup & PATTERN_SMOOTHSCROLL) && pSndFile->Patterns.IsValidPat(nPat)) + { + for(const ModCommand *m = pSndFile->Patterns[nPat].GetRow(nRow), *mEnd = m + pSndFile->GetNumChannels(); m != mEnd; m++) + { + if(m->command == CMD_PATTERNBREAK) m_smoothScrollBackwards = (m->param == nRow - 1); + } + } + m_nTicksOnRow = pnotify->ticksOnRow; SetPlayCursor(nPat, nRow, pnotify->tick); + // Don't follow song if user drags selections or scrollbars. if((m_Status & (psFollowSong | psDragActive)) == psFollowSong) { if (nPat < pSndFile->Patterns.Size()) Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2015-06-27 21:05:39 UTC (rev 5372) +++ trunk/OpenMPT/mptrack/View_pat.h 2015-06-27 21:41:58 UTC (rev 5373) @@ -190,6 +190,7 @@ DWORD m_dwLastNoteEntryTime; //rewbs.customkeys bool m_bLastNoteEntryBlocked : 1; bool m_bContinueSearch : 1, m_bWholePatternFitsOnScreen : 1; + bool m_smoothScrollBackwards : 1; ModCommand m_PCNoteEditMemory; // PC Note edit memory static ModCommand m_cmdOld; // Quick cursor copy/paste data This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |