From 1b80b9618924380871c710fa0367df0c81f9e384 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 26 Aug 2022 03:03:36 -0500 Subject: [PATCH] prepare for chip swapping --- src/engine/engine.cpp | 61 +++++++++++++++++++++++++++++++++++++++++- src/gui/sysManager.cpp | 13 ++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 153a8db97..c4e1346eb 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -18,6 +18,7 @@ */ #include "dispatch.h" +#include "song.h" #define _USE_MATH_DEFINES #include "engine.h" #include "instrument.h" @@ -1406,7 +1407,65 @@ bool DivEngine::swapSystem(int src, int dest, bool preserveOrder) { if (!preserveOrder) { // move channels - // TODO: a lot of work! + unsigned char unswappedChannels[DIV_MAX_CHANS]; + unsigned char swappedChannels[DIV_MAX_CHANS]; + std::vector> swapList; + std::vector chanList; + + int tchans=0; + + for (int i=0; i& i: swapList) { + for (int& j: i) { + swappedChannels[index++]=j; + } + } + + logV("swap list:"); + for (int i=0; i %d",unswappedChannels[i],swappedChannels[i]); + } + + // swap channels + bool allComplete=false; + while (!allComplete) { + logD("doing swap..."); + allComplete=true; + for (int i=0; i %d -> %d",unswappedChannels[i],unswappedChannels[swappedChannels[i]]); + unswappedChannels[i]^=unswappedChannels[swappedChannels[i]]; + unswappedChannels[swappedChannels[i]]^=unswappedChannels[i]; + unswappedChannels[i]^=unswappedChannels[swappedChannels[i]]; + } + } + } } DivSystem srcSystem=song.system[src]; diff --git a/src/gui/sysManager.cpp b/src/gui/sysManager.cpp index e43b4dfed..2be87fc9a 100644 --- a/src/gui/sysManager.cpp +++ b/src/gui/sysManager.cpp @@ -22,6 +22,9 @@ #include "IconsFontAwesome4.h" #include +static int _src, _dest; +static bool _preserveOrder; + void FurnaceGUI::drawSysManager() { if (nextWindow==GUI_WINDOW_SYS_MANAGER) { sysManagerOpen=true; @@ -30,7 +33,15 @@ void FurnaceGUI::drawSysManager() { } if (!sysManagerOpen) return; if (ImGui::Begin("Chip Manager",&sysManagerOpen,globalWinFlags)) { - ImGui::Text("Stuff here..."); + ImGui::Text("Call swapSystem() with arguments:"); + ImGui::InputInt("src",&_src); + ImGui::InputInt("dest",&_dest); + ImGui::Checkbox("preserveOrder",&_preserveOrder); + if (ImGui::Button("Call")) { + if (!e->swapSystem(_src,_dest,_preserveOrder)) { + showError(e->getLastError()); + } + } } if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_SYS_MANAGER; ImGui::End();