From fbacfd421cbcbed394c8aa11b5dc6f85df3170aa Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 13 Nov 2022 15:41:40 -0500 Subject: [PATCH] prepare for new preset format --- src/engine/engine.h | 14 +++++++------- src/engine/sysDef.cpp | 4 ++++ src/gui/gui.cpp | 1 - src/gui/gui.h | 19 ++++++++++++++++--- src/gui/newSong.cpp | 15 +++------------ src/gui/presets.cpp | 22 ++++++++++++++++++++++ 6 files changed, 52 insertions(+), 23 deletions(-) diff --git a/src/engine/engine.h b/src/engine/engine.h index fc3e43998..bea954fa4 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -382,9 +382,9 @@ class DivEngine { std::vector midiOuts; std::vector cmdStream; std::vector possibleInsTypes; - DivSysDef* sysDefs[256]; - DivSystem sysFileMapFur[256]; - DivSystem sysFileMapDMF[256]; + static DivSysDef* sysDefs[256]; + static DivSystem sysFileMapFur[256]; + static DivSystem sysFileMapDMF[256]; struct SamplePreview { double rate; @@ -532,10 +532,10 @@ class DivEngine { void notifyWaveChange(int wave); // get system IDs - DivSystem systemFromFileFur(unsigned char val); - unsigned char systemToFileFur(DivSystem val); - DivSystem systemFromFileDMF(unsigned char val); - unsigned char systemToFileDMF(DivSystem val); + static DivSystem systemFromFileFur(unsigned char val); + static unsigned char systemToFileFur(DivSystem val); + static DivSystem systemFromFileDMF(unsigned char val); + static unsigned char systemToFileDMF(DivSystem val); // benchmark (returns time in seconds) double benchmarkPlayback(); diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index 44b312463..b23ed7130 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -23,6 +23,10 @@ #include "song.h" #include "../ta-log.h" +DivSysDef* DivEngine::sysDefs[256]; +DivSystem DivEngine::sysFileMapFur[256]; +DivSystem DivEngine::sysFileMapDMF[256]; + DivSystem DivEngine::systemFromFileFur(unsigned char val) { return sysFileMapFur[val]; } diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index a11b13525..845af6384 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -5655,7 +5655,6 @@ FurnaceGUI::FurnaceGUI(): curWindowLast(GUI_WINDOW_NOTHING), curWindowThreadSafe(GUI_WINDOW_NOTHING), lastPatternWidth(0.0f), - nextDesc(NULL), latchNote(-1), latchIns(-2), latchVol(-1), diff --git a/src/gui/gui.h b/src/gui/gui.h index 94d54823b..b467daac6 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -899,12 +899,25 @@ struct Gradient2D { } }; +struct FurnaceGUISysDefChip { + DivSystem sys; + int vol, pan; + const char* flags; + FurnaceGUISysDefChip(DivSystem s, int v, int p, const char* f): + sys(s), + vol(v), + pan(p), + flags(f) {} +}; + struct FurnaceGUISysDef { const char* name; - std::vector definition; + String definition; FurnaceGUISysDef(const char* n, std::initializer_list def): - name(n), definition(def) { + name(n) { + // fuck it } + FurnaceGUISysDef(const char* n, std::initializer_list def); }; struct FurnaceGUISysCategory { @@ -1404,7 +1417,7 @@ class FurnaceGUI { float patChanX[DIV_MAX_CHANS+1]; float patChanSlideY[DIV_MAX_CHANS+1]; float lastPatternWidth; - const int* nextDesc; + String nextDesc; String nextDescName; OperationMask opMaskDelete, opMaskPullDelete, opMaskInsert, opMaskPaste, opMaskTransposeNote, opMaskTransposeValue; diff --git a/src/gui/newSong.cpp b/src/gui/newSong.cpp index 7959149b8..596ef22a3 100644 --- a/src/gui/newSong.cpp +++ b/src/gui/newSong.cpp @@ -107,7 +107,7 @@ void FurnaceGUI::drawNewSong() { ImGui::TableNextRow(); ImGui::TableNextColumn(); if (ImGui::Selectable(i.name,false,ImGuiSelectableFlags_DontClosePopups)) { - nextDesc=i.definition.data(); + nextDesc=i.definition; nextDescName=i.name; accepted=true; } @@ -129,7 +129,7 @@ void FurnaceGUI::drawNewSong() { ImGui::CloseCurrentPopup(); } else { unsigned int selection=rand()%newSystemCat->systems.size(); - nextDesc=newSystemCat->systems[selection].definition.data(); + nextDesc=newSystemCat->systems[selection].definition; nextDescName=newSystemCat->systems[selection].name; accepted=true; } @@ -143,16 +143,7 @@ void FurnaceGUI::drawNewSong() { } if (accepted) { - // TODO: remove after porting all presets to new format - String oldDescFormat; - for (const int* i=nextDesc; *i; i+=4) { - oldDescFormat+=fmt::sprintf("%d ",e->systemToFileFur((DivSystem)i[0])); - oldDescFormat+=fmt::sprintf("%d ",i[1]); - oldDescFormat+=fmt::sprintf("%d ",i[2]); - oldDescFormat+=fmt::sprintf("%d ",i[3]); - } - String oldDesc=e->decodeSysDesc(oldDescFormat.c_str()); - e->createNew(oldDesc.c_str(),nextDescName); + e->createNew(nextDesc.c_str(),nextDescName); undoHist.clear(); redoHist.clear(); curFileName=""; diff --git a/src/gui/presets.cpp b/src/gui/presets.cpp index db9197d88..5d009414a 100644 --- a/src/gui/presets.cpp +++ b/src/gui/presets.cpp @@ -18,6 +18,7 @@ */ #include "gui.h" +#include // add system configurations here. // every entry is written in the following format: @@ -2323,3 +2324,24 @@ void FurnaceGUI::initSystemPresets() { )); sysCategories.push_back(cat); } + +FurnaceGUISysDef::FurnaceGUISysDef(const char* n, std::initializer_list def): + name(n) { + std::vector uncompiled=def; + int index=0; + for (FurnaceGUISysDefChip& i: uncompiled) { + definition+=fmt::sprintf( + "id%d=%d\nvol%d=%d\npan%d=%d\nflags%d=%s\n", + index, + DivEngine::systemToFileFur(i.sys), + index, + i.vol, + index, + i.pan, + index, + i.flags + ); + index++; + } +} +