diff --git a/src/gui/gui.h b/src/gui/gui.h index 7008051f5..63f2bda1a 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -922,6 +922,7 @@ class FurnaceGUI { int oscRoundedCorners; int oscTakesEntireWindow; int oscBorder; + int oscEscapesBoundary; int separateFMColors; int insEditColorize; int metroVol; @@ -1012,6 +1013,7 @@ class FurnaceGUI { oscRoundedCorners(1), oscTakesEntireWindow(0), oscBorder(1), + oscEscapesBoundary(0), separateFMColors(0), insEditColorize(0), metroVol(100), diff --git a/src/gui/osc.cpp b/src/gui/osc.cpp index b90e7fd08..bac84416a 100644 --- a/src/gui/osc.cpp +++ b/src/gui/osc.cpp @@ -19,6 +19,7 @@ #include "gui.h" #include "imgui_internal.h" +#include // TODO: // - potentially move oscilloscope seek position to the end, and read the last samples @@ -224,11 +225,18 @@ void FurnaceGUI::drawOsc() { for (size_t i=0; i<512; i++) { float x=(float)i/512.0f; float y=oscValues[i]*oscZoom; - if (y<-0.5f) y=-0.5f; - if (y>0.5f) y=0.5f; + if (!settings.oscEscapesBoundary) { + if (y<-0.5f) y=-0.5f; + if (y>0.5f) y=0.5f; + } waveform[i]=ImLerp(inRect.Min,inRect.Max,ImVec2(x,0.5f-y)); } - dl->AddPolyline(waveform,512,color,ImDrawFlags_None,dpiScale); + if (settings.oscEscapesBoundary) { + ImDrawList* dlf=ImGui::GetForegroundDrawList(); + dlf->AddPolyline(waveform,512,color,ImDrawFlags_None,dpiScale); + } else { + dl->AddPolyline(waveform,512,color,ImDrawFlags_None,dpiScale); + } if (settings.oscBorder) { dl->AddRect(inRect.Min,inRect.Max,borderColor,settings.oscRoundedCorners?(8.0f*dpiScale):0.0f,0,1.5f*dpiScale); } diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index a5e0127df..671f30cc4 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -1219,6 +1219,11 @@ void FurnaceGUI::drawSettings() { settings.oscTakesEntireWindow=oscTakesEntireWindowB; } + bool oscEscapesBoundaryB=settings.oscEscapesBoundary; + if (ImGui::Checkbox("Waveform goes out of bounds",&oscEscapesBoundaryB)) { + settings.oscEscapesBoundary=oscEscapesBoundaryB; + } + bool oscBorderB=settings.oscBorder; if (ImGui::Checkbox("Border",&oscBorderB)) { settings.oscBorder=oscBorderB; @@ -1933,6 +1938,7 @@ void FurnaceGUI::syncSettings() { settings.oscRoundedCorners=e->getConfInt("oscRoundedCorners",1); settings.oscTakesEntireWindow=e->getConfInt("oscTakesEntireWindow",0); settings.oscBorder=e->getConfInt("oscBorder",1); + settings.oscEscapesBoundary=e->getConfInt("oscEscapesBoundary",0); settings.separateFMColors=e->getConfInt("separateFMColors",0); settings.insEditColorize=e->getConfInt("insEditColorize",0); settings.metroVol=e->getConfInt("metroVol",100); @@ -2130,6 +2136,7 @@ void FurnaceGUI::commitSettings() { e->setConf("oscRoundedCorners",settings.oscRoundedCorners); e->setConf("oscTakesEntireWindow",settings.oscTakesEntireWindow); e->setConf("oscBorder",settings.oscBorder); + e->setConf("oscEscapesBoundary",settings.oscEscapesBoundary); e->setConf("separateFMColors",settings.separateFMColors); e->setConf("insEditColorize",settings.insEditColorize); e->setConf("metroVol",settings.metroVol);