From 3836756115fd3ddc5201df2bf98510a5e5b4a201 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 10 Feb 2024 14:50:23 -0500 Subject: [PATCH] GUI: new osc renderer, part 4 we have a waveform --- src/gui/gui.h | 1 + src/gui/osc.cpp | 32 +++++++++++++++++--------------- src/gui/render/abstract.cpp | 4 ++++ src/gui/render/renderGL.cpp | 19 ++++++++++++------- src/gui/render/renderGL.h | 1 + 5 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/gui/gui.h b/src/gui/gui.h index a821530c0..684b47a33 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1437,6 +1437,7 @@ class FurnaceGUIRender { virtual void wipe(float alpha); virtual void drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 pos1, ImVec4 color, ImVec2 canvasSize, float lineWidth); virtual void present(); + virtual bool supportsDrawOsc(); virtual bool getOutputSize(int& w, int& h); virtual int getWindowFlags(); virtual void preInit(); diff --git a/src/gui/osc.cpp b/src/gui/osc.cpp index 8f5104930..3cb1393f1 100644 --- a/src/gui/osc.cpp +++ b/src/gui/osc.cpp @@ -303,23 +303,25 @@ void FurnaceGUI::drawOsc() { waveform[i]=ImLerp(inRect.Min,inRect.Max,ImVec2(x,0.5f-y)); } - if (settings.oscEscapesBoundary) { - dl->PushClipRectFullScreen(); - dl->AddPolyline(waveform,oscWidth-24,color,ImDrawFlags_None,dpiScale); - dl->PopClipRect(); + if (rend->supportsDrawOsc()) { + _do.gui=this; + _do.data=&oscValuesAverage[12]; + _do.len=oscWidth-24; + _do.pos0=inRect.Min; + _do.pos1=inRect.Max; + _do.color=isClipping?uiColors[GUI_COLOR_OSC_WAVE_PEAK]:uiColors[GUI_COLOR_OSC_WAVE]; + + dl->AddCallback(_drawOsc,&_do); + dl->AddCallback(ImDrawCallback_ResetRenderState,NULL); } else { - dl->AddPolyline(waveform,oscWidth-24,color,ImDrawFlags_None,dpiScale); + if (settings.oscEscapesBoundary) { + dl->PushClipRectFullScreen(); + dl->AddPolyline(waveform,oscWidth-24,color,ImDrawFlags_None,dpiScale); + dl->PopClipRect(); + } else { + dl->AddPolyline(waveform,oscWidth-24,color,ImDrawFlags_None,dpiScale); + } } - - _do.gui=this; - _do.data=&oscValuesAverage[12]; - _do.len=oscWidth-24; - _do.pos0=inRect.Min; - _do.pos1=inRect.Max; - _do.color=isClipping?uiColors[GUI_COLOR_OSC_WAVE_PEAK]:uiColors[GUI_COLOR_OSC_WAVE]; - - dl->AddCallback(_drawOsc,&_do); - dl->AddCallback(ImDrawCallback_ResetRenderState,NULL); } else { for (int ch=0; chgetAudioDescGot().outChans; ch++) { for (int i=0; i