From fc14211997fb41e248d69f46218ab1b8243b565f Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 10 Sep 2022 22:12:03 -0500 Subject: [PATCH] GUI: wave generator, part 9 it's complete! --- src/gui/waveEdit.cpp | 74 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 5 deletions(-) diff --git a/src/gui/waveEdit.cpp b/src/gui/waveEdit.cpp index 2b7e638b..69594f5d 100644 --- a/src/gui/waveEdit.cpp +++ b/src/gui/waveEdit.cpp @@ -593,7 +593,23 @@ void FurnaceGUI::drawWaveEdit() { if (waveGenSmooth<1) waveGenSmooth=1; } ImGui::TableNextColumn(); - ImGui::Button("Smooth"); + if (ImGui::Button("Smooth")) { + if (waveGenSmooth>0) e->lockEngine([this,wave]() { + int origData[256]; + memcpy(origData,wave->data,wave->len*sizeof(int)); + for (int i=0; ilen; i++) { + int dataSum=0; + for (int j=i; jlen; + dataSum+=origData[pos%wave->len]; + } + dataSum/=waveGenSmooth+1; + wave->data[i]=dataSum; + } + MARK_MODIFIED; + }); + } ImGui::TableNextRow(); ImGui::TableNextColumn(); @@ -623,7 +639,39 @@ void FurnaceGUI::drawWaveEdit() { buttonSizeHalf.x-=ImGui::GetStyle().ItemSpacing.x; buttonSizeHalf.x*=0.5; - ImGui::Button("Normalize",buttonSize); + if (ImGui::Button("Normalize",buttonSize)) { + e->lockEngine([this,wave]() { + // find lowest point + int lowest=wave->max; + for (int i=0; ilen; i++) { + if (wave->data[i]data[i]; + } + + // find highest point + int highest=0; + for (int i=0; ilen; i++) { + if (wave->data[i]>highest) highest=wave->data[i]; + } + + // abort if lowest and highest points are equal + if (lowest==highest) return; + + // abort if lowest and highest points already span the entire height + if (lowest==wave->max && highest==0) return; + + // apply offset + for (int i=0; ilen; i++) { + wave->data[i]-=lowest; + } + highest-=lowest; + + // scale + for (int i=0; ilen; i++) { + wave->data[i]=(wave->data[i]*wave->max)/highest; + } + MARK_MODIFIED; + }); + } if (ImGui::Button("Invert",buttonSize)) { e->lockEngine([this,wave]() { for (int i=0; ilen; i++) { @@ -633,9 +681,25 @@ void FurnaceGUI::drawWaveEdit() { }); } - ImGui::Button("/2",buttonSizeHalf); + if (ImGui::Button("Half",buttonSizeHalf)) { + int origData[256]; + memcpy(origData,wave->data,wave->len*sizeof(int)); + + for (int i=0; ilen; i++) { + wave->data[i]=origData[i>>1]; + } + MARK_MODIFIED; + } ImGui::SameLine(); - ImGui::Button("×2",buttonSizeHalf); + if (ImGui::Button("Double",buttonSizeHalf)) { + int origData[256]; + memcpy(origData,wave->data,wave->len*sizeof(int)); + + for (int i=0; ilen; i++) { + wave->data[i]=origData[(i*2)%wave->len]; + } + MARK_MODIFIED; + } if (ImGui::Button("Convert Signed/Unsigned",buttonSize)) { if (wave->max>0) e->lockEngine([this,wave]() { @@ -643,7 +707,7 @@ void FurnaceGUI::drawWaveEdit() { if (wave->data[i]>(wave->max/2)) { wave->data[i]-=(wave->max+1)/2; } else { - wave->data[i]+=wave->max/2; + wave->data[i]+=(wave->max+1)/2; } } MARK_MODIFIED;