From a0d6658a6576dba88d4a2545448ecfe181876d56 Mon Sep 17 00:00:00 2001 From: Kyzentun Keeslala Date: Tue, 7 Jun 2016 19:26:21 -0600 Subject: [PATCH] Changed NotesWriterSM to not mangle the timing data by adding stops when converting warps. --- src/NotesWriterSM.cpp | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/NotesWriterSM.cpp b/src/NotesWriterSM.cpp index 3f64896ff1..f03affbb22 100644 --- a/src/NotesWriterSM.cpp +++ b/src/NotesWriterSM.cpp @@ -89,6 +89,10 @@ static void WriteGlobalTags( RageFile &f, Song &out ) } f.PutLine( ";" ); + const vector &stops = timing.GetTimingSegments(SEGMENT_STOP); + const vector &delays = timing.GetTimingSegments(SEGMENT_DELAY); + + map allPauses; const vector &warps = timing.GetTimingSegments(SEGMENT_WARP); unsigned wSize = warps.size(); if( wSize > 0 ) @@ -99,31 +103,39 @@ static void WriteGlobalTags( RageFile &f, Song &out ) int iRow = ws->GetRow(); float fBPS = 60 / out.m_SongTiming.GetBPMAtRow(iRow); float fSkip = fBPS * ws->GetLength(); - out.m_SongTiming.AddSegment( StopSegment(iRow, -fSkip) ); + allPauses.insert(std::pair(ws->GetBeat(), -fSkip)); } } - // TODO: make Delays into Stops that start one row before. - const vector &stops = timing.GetTimingSegments(SEGMENT_STOP); - const vector &delays = timing.GetTimingSegments(SEGMENT_DELAY); - - map allPauses; for( unsigned i=0; i(fs->GetBeat(), fs->GetPause())); - - // erase stops with negative length - if( fs->GetPause() < 0 ) - timing.AddSegment( StopSegment(fs->GetRow(), 0) ); + // Handle warps on the same row by summing the values. Not sure this + // plays out the same. -Kyz + map::iterator already_exists= allPauses.find(fs->GetBeat()); + if(already_exists != allPauses.end()) + { + already_exists->second+= fs->GetPause(); + } + else + { + allPauses.insert(pair(fs->GetBeat(), fs->GetPause())); + } } // Delays can't be negative: thus, no effect. FOREACH_CONST(TimingSegment *, delays, ss) { float fBeat = NoteRowToBeat( (*ss)->GetRow()-1 ); float fPause = ToDelay(*ss)->GetPause(); - allPauses.insert( pair(fBeat, fPause) ); + map::iterator already_exists= allPauses.find(fBeat); + if(already_exists != allPauses.end()) + { + already_exists->second+= fPause; + } + else + { + allPauses.insert(pair(fBeat, fPause)); + } } f.Write( "#STOPS:" );