From 40209337eaaefc47604eb2dbe689cda4a3d97d50 Mon Sep 17 00:00:00 2001 From: MinaciousGrace Date: Sat, 3 Jun 2017 18:18:45 -0400 Subject: [PATCH] remove obsolete index and add ability to reconcile busted keys with proper ones --- src/SongManager.cpp | 15 ++++++++--- src/SongManager.h | 3 +-- src/Steps.cpp | 64 ++++++++++++++++++++++++--------------------- src/Steps.h | 4 +++ 4 files changed, 50 insertions(+), 36 deletions(-) diff --git a/src/SongManager.cpp b/src/SongManager.cpp index cc0785f75e..105c67e05a 100644 --- a/src/SongManager.cpp +++ b/src/SongManager.cpp @@ -357,16 +357,23 @@ vector Playlist::GetKeys() { return o; } +void SongManager::ReconcileBustedKeys(string& ck) { + if (StepsByKey.count(ck)) + return; + + FOREACHUM(string, Steps*, StepsByKey, i) { + for (auto& n : i->second->bustedkeys) + if (ck == n) + ck = n; + } +} + // Only store 1 steps/song pointer per key -Mina void SongManager::AddKeyedPointers(Song* new_song) { const vector steps = new_song->GetAllSteps(); for (size_t i = 0; i < steps.size(); ++i) { const RString& ck = steps[i]->GetChartKey(); if (!StepsByKey.count(ck)) { - if (steps.size() > 1) { - multichartbs.emplace(ck); - } - StepsByKey.emplace(ck, steps[i]); if (!SongsByKey.count(ck)) { SongsByKey.emplace(ck, new_song); diff --git a/src/SongManager.h b/src/SongManager.h index 8e2ff8c47c..1a8f0a5a26 100644 --- a/src/SongManager.h +++ b/src/SongManager.h @@ -190,11 +190,10 @@ class SongManager // Lua void PushSelf( lua_State *L ); - - set multichartbs; map allplaylists; string activeplaylist; string playlistcourse; + void ReconcileBustedKeys(string& ck); map> groupderps; protected: diff --git a/src/Steps.cpp b/src/Steps.cpp index 6a58728f08..82caa09fd7 100644 --- a/src/Steps.cpp +++ b/src/Steps.cpp @@ -348,6 +348,9 @@ bool Steps::IsRecalcValid() { if (m_StepsType != StepsType_dance_single) return false; + if (m_CachedRadarValues[RadarCategory_Notes] < 200) + return false; + TimingData* td = GetTimingData(); if (td->HasWarps()) return false; @@ -382,51 +385,52 @@ void Steps::CalcEtternaMetadata() { stuffnthings = MinaSDCalc(GetNoteData().SerializeNoteData(etaner), GetNoteData().GetNumTracks(), 0.93f, 1.f, GetTimingData()->HasWarps()); ChartKey = GenerateChartKey(*m_pNoteData, GetTimingData()); + for (int i = 0; i < 8; ++i) + bustedkeys.emplace_back(GenerateBustedChartKey(*m_pNoteData, GetTimingData(), i)); + m_pNoteData->UnsetNerv(); m_pNoteData->UnsetSerializedNoteData(); GetTimingData()->UnsetEtaner(); } -/* -RString Steps::GenerateChartKey(NoteData& nd, TimingData *td) { -RString o = "X"; // I was thinking of using "C" to indicate chart.. however.. X is cooler... - Mina -vector& nerv = nd.GetNonEmptyRowVector(); +string Steps::GenerateBustedChartKey(NoteData& nd, TimingData *td, int cores) { + RString o = "X"; // I was thinking of using "C" to indicate chart.. however.. X is cooler... - Mina + vector& nerv = nd.GetNonEmptyRowVector(); -unsigned int numThreads = max(std::thread::hardware_concurrency(), 1u); -std::vector keyParts; -keyParts.reserve(numThreads); + unsigned int numThreads = min(std::thread::hardware_concurrency(), 1u + cores); + std::vector keyParts; + keyParts.reserve(numThreads); -size_t segmentSize = nerv.size() / numThreads; -std::vector threads; -threads.reserve(numThreads); + size_t segmentSize = nerv.size() / numThreads; + std::vector threads; + threads.reserve(numThreads); -for (unsigned int curThread = 0; curThread < numThreads; curThread++) -{ -keyParts.push_back(""); -size_t start = segmentSize * curThread; -size_t end = start + segmentSize; -if (curThread + 1 == numThreads) -end = nerv.size(); + for (unsigned int curThread = 0; curThread < numThreads; curThread++) + { + keyParts.push_back(""); + size_t start = segmentSize * curThread; + size_t end = start + segmentSize; + if (curThread + 1 == numThreads) + end = nerv.size(); -threads.push_back(std::thread(&Steps::FillStringWithBPMs, this, start, end, std::ref(nerv), std::ref(nd), td, std::ref(keyParts[curThread]))); -} + threads.push_back(std::thread(&Steps::FillStringWithBPMs, this, start, end, std::ref(nerv), std::ref(nd), td, std::ref(keyParts[curThread]))); + } -for (auto& t : threads) -{ -if (t.joinable()) -t.join(); -} + for (auto& t : threads) + { + if (t.joinable()) + t.join(); + } -// handle empty charts if they get to here -mina -if (*keyParts.data() == "") -return ""; + // handle empty charts if they get to here -mina + if (*keyParts.data() == "") + return ""; -o.append(BinaryToHex(CryptManager::GetSHA1ForString(*keyParts.data()))); + o.append(BinaryToHex(CryptManager::GetSHA1ForString(*keyParts.data()))); -return o; + return o; } -*/ RString Steps::GenerateChartKey(NoteData& nd, TimingData *td) diff --git a/src/Steps.h b/src/Steps.h index 572396440a..e36d8c827b 100644 --- a/src/Steps.h +++ b/src/Steps.h @@ -174,6 +174,10 @@ class Steps void CalcEtternaMetadata(); + string GenerateBustedChartKey(NoteData & nd, TimingData * td, int cores); + vector bustedkeys; + void MakeBustedKeys(); + // this is bugged and returns true for files with negative bpms when it shouldn't - mina bool IsRecalcValid();