GUI: new osc renderer, part 2 - warning
why does it crash...
This commit is contained in:
parent
5ec7c4a541
commit
e41e8ed962
|
@ -7260,6 +7260,10 @@ bool FurnaceGUI::finish() {
|
||||||
oscValues[i]=NULL;
|
oscValues[i]=NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (oscValuesAverage) {
|
||||||
|
delete[] oscValuesAverage;
|
||||||
|
oscValuesAverage=NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (backupTask.valid()) {
|
if (backupTask.valid()) {
|
||||||
backupTask.get();
|
backupTask.get();
|
||||||
|
@ -7700,6 +7704,7 @@ FurnaceGUI::FurnaceGUI():
|
||||||
subPortPos(0.0f,0.0f),
|
subPortPos(0.0f,0.0f),
|
||||||
oscTotal(0),
|
oscTotal(0),
|
||||||
oscWidth(512),
|
oscWidth(512),
|
||||||
|
oscValuesAverage(NULL),
|
||||||
oscZoom(0.5f),
|
oscZoom(0.5f),
|
||||||
oscWindowSize(20.0f),
|
oscWindowSize(20.0f),
|
||||||
oscInput(0.0f),
|
oscInput(0.0f),
|
||||||
|
|
|
@ -1435,7 +1435,7 @@ class FurnaceGUIRender {
|
||||||
virtual void destroyFontsTexture();
|
virtual void destroyFontsTexture();
|
||||||
virtual void renderGUI();
|
virtual void renderGUI();
|
||||||
virtual void wipe(float alpha);
|
virtual void wipe(float alpha);
|
||||||
virtual void drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 pos1, ImVec4 color);
|
virtual void drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 pos1, ImVec4 color, ImVec2 canvasSize, float lineWidth);
|
||||||
virtual void present();
|
virtual void present();
|
||||||
virtual bool getOutputSize(int& w, int& h);
|
virtual bool getOutputSize(int& w, int& h);
|
||||||
virtual int getWindowFlags();
|
virtual int getWindowFlags();
|
||||||
|
@ -1448,6 +1448,22 @@ class FurnaceGUIRender {
|
||||||
virtual ~FurnaceGUIRender();
|
virtual ~FurnaceGUIRender();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct PendingDrawOsc {
|
||||||
|
void* gui;
|
||||||
|
float* data;
|
||||||
|
size_t len;
|
||||||
|
ImVec2 pos0;
|
||||||
|
ImVec2 pos1;
|
||||||
|
ImVec4 color;
|
||||||
|
PendingDrawOsc():
|
||||||
|
gui(NULL),
|
||||||
|
data(NULL),
|
||||||
|
len(0),
|
||||||
|
pos0(0,0),
|
||||||
|
pos1(0,0),
|
||||||
|
color(0,0,0,0) {}
|
||||||
|
};
|
||||||
|
|
||||||
class FurnaceGUI {
|
class FurnaceGUI {
|
||||||
DivEngine* e;
|
DivEngine* e;
|
||||||
|
|
||||||
|
@ -2256,6 +2272,7 @@ class FurnaceGUI {
|
||||||
// oscilloscope
|
// oscilloscope
|
||||||
int oscTotal, oscWidth;
|
int oscTotal, oscWidth;
|
||||||
float* oscValues[DIV_MAX_OUTPUTS];
|
float* oscValues[DIV_MAX_OUTPUTS];
|
||||||
|
float* oscValuesAverage;
|
||||||
float oscZoom;
|
float oscZoom;
|
||||||
float oscWindowSize;
|
float oscWindowSize;
|
||||||
float oscInput, oscInput1;
|
float oscInput, oscInput1;
|
||||||
|
@ -2670,6 +2687,7 @@ class FurnaceGUI {
|
||||||
void runBackupThread();
|
void runBackupThread();
|
||||||
void pushPartBlend();
|
void pushPartBlend();
|
||||||
void popPartBlend();
|
void popPartBlend();
|
||||||
|
void runPendingDrawOsc(PendingDrawOsc* which);
|
||||||
bool detectOutOfBoundsWindow(SDL_Rect& failing);
|
bool detectOutOfBoundsWindow(SDL_Rect& failing);
|
||||||
int processEvent(SDL_Event* ev);
|
int processEvent(SDL_Event* ev);
|
||||||
bool loop();
|
bool loop();
|
||||||
|
|
|
@ -100,6 +100,19 @@ void FurnaceGUI::readOsc() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (oscValuesAverage==NULL) {
|
||||||
|
oscValuesAverage=new float[2048];
|
||||||
|
}
|
||||||
|
memset(oscValuesAverage,0,2048*sizeof(float));
|
||||||
|
for (int i=0; i<oscWidth; i++) {
|
||||||
|
float avg=0;
|
||||||
|
for (int j=0; j<e->getAudioDescGot().outChans; j++) {
|
||||||
|
avg+=oscValues[j][i];
|
||||||
|
}
|
||||||
|
avg/=e->getAudioDescGot().outChans;
|
||||||
|
oscValuesAverage[i]=avg;
|
||||||
|
}
|
||||||
|
|
||||||
/*for (int i=0; i<oscWidth; i++) {
|
/*for (int i=0; i<oscWidth; i++) {
|
||||||
oscValues[i]=(i&1)?0.3:0;
|
oscValues[i]=(i&1)?0.3:0;
|
||||||
}*/
|
}*/
|
||||||
|
@ -126,14 +139,20 @@ void FurnaceGUI::readOsc() {
|
||||||
e->oscReadPos=readPos;
|
e->oscReadPos=readPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _pushPartBlend(const ImDrawList* drawList, const ImDrawCmd* cmd) {
|
PendingDrawOsc _do;
|
||||||
|
|
||||||
|
void _drawOsc(const ImDrawList* drawList, const ImDrawCmd* cmd) {
|
||||||
if (cmd!=NULL) {
|
if (cmd!=NULL) {
|
||||||
if (cmd->UserCallbackData!=NULL) {
|
if (cmd->UserCallbackData!=NULL) {
|
||||||
((FurnaceGUI*)cmd->UserCallbackData)->pushPartBlend();
|
((FurnaceGUI*)(((PendingDrawOsc*)cmd->UserCallbackData)->gui))->runPendingDrawOsc((PendingDrawOsc*)cmd->UserCallbackData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FurnaceGUI::runPendingDrawOsc(PendingDrawOsc* which) {
|
||||||
|
rend->drawOsc(which->data,which->len,which->pos0,which->pos1,which->color,ImVec2(canvasW,canvasH),dpiScale);
|
||||||
|
}
|
||||||
|
|
||||||
void FurnaceGUI::drawOsc() {
|
void FurnaceGUI::drawOsc() {
|
||||||
if (nextWindow==GUI_WINDOW_OSCILLOSCOPE) {
|
if (nextWindow==GUI_WINDOW_OSCILLOSCOPE) {
|
||||||
oscOpen=true;
|
oscOpen=true;
|
||||||
|
@ -191,7 +210,7 @@ void FurnaceGUI::drawOsc() {
|
||||||
inRect.Max.x-=dpiScale;
|
inRect.Max.x-=dpiScale;
|
||||||
inRect.Max.y-=dpiScale;
|
inRect.Max.y-=dpiScale;
|
||||||
ImGuiStyle& style=ImGui::GetStyle();
|
ImGuiStyle& style=ImGui::GetStyle();
|
||||||
//ImU32 color=ImGui::GetColorU32(isClipping?uiColors[GUI_COLOR_OSC_WAVE_PEAK]:uiColors[GUI_COLOR_OSC_WAVE]);
|
ImU32 color=ImGui::GetColorU32(isClipping?uiColors[GUI_COLOR_OSC_WAVE_PEAK]:uiColors[GUI_COLOR_OSC_WAVE]);
|
||||||
ImU32 borderColor=ImGui::GetColorU32(uiColors[GUI_COLOR_OSC_BORDER]);
|
ImU32 borderColor=ImGui::GetColorU32(uiColors[GUI_COLOR_OSC_BORDER]);
|
||||||
ImU32 refColor=ImGui::GetColorU32(uiColors[GUI_COLOR_OSC_REF]);
|
ImU32 refColor=ImGui::GetColorU32(uiColors[GUI_COLOR_OSC_REF]);
|
||||||
ImU32 guideColor=ImGui::GetColorU32(uiColors[GUI_COLOR_OSC_GUIDE]);
|
ImU32 guideColor=ImGui::GetColorU32(uiColors[GUI_COLOR_OSC_GUIDE]);
|
||||||
|
@ -276,13 +295,7 @@ void FurnaceGUI::drawOsc() {
|
||||||
if (settings.oscMono) {
|
if (settings.oscMono) {
|
||||||
for (int i=0; i<oscWidth-24; i++) {
|
for (int i=0; i<oscWidth-24; i++) {
|
||||||
float x=(float)i/(float)(oscWidth-24);
|
float x=(float)i/(float)(oscWidth-24);
|
||||||
float avg=0;
|
float y=oscValuesAverage[i+12]*oscZoom;
|
||||||
for (int j=0; j<e->getAudioDescGot().outChans; j++) {
|
|
||||||
avg+=oscValues[j][i+12];
|
|
||||||
}
|
|
||||||
avg/=e->getAudioDescGot().outChans;
|
|
||||||
|
|
||||||
float y=avg*oscZoom;
|
|
||||||
if (!settings.oscEscapesBoundary) {
|
if (!settings.oscEscapesBoundary) {
|
||||||
if (y<-0.5f) y=-0.5f;
|
if (y<-0.5f) y=-0.5f;
|
||||||
if (y>0.5f) y=0.5f;
|
if (y>0.5f) y=0.5f;
|
||||||
|
@ -290,7 +303,6 @@ void FurnaceGUI::drawOsc() {
|
||||||
waveform[i]=ImLerp(inRect.Min,inRect.Max,ImVec2(x,0.5f-y));
|
waveform[i]=ImLerp(inRect.Min,inRect.Max,ImVec2(x,0.5f-y));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
if (settings.oscEscapesBoundary) {
|
if (settings.oscEscapesBoundary) {
|
||||||
dl->PushClipRectFullScreen();
|
dl->PushClipRectFullScreen();
|
||||||
dl->AddPolyline(waveform,oscWidth-24,color,ImDrawFlags_None,dpiScale);
|
dl->AddPolyline(waveform,oscWidth-24,color,ImDrawFlags_None,dpiScale);
|
||||||
|
@ -298,8 +310,15 @@ void FurnaceGUI::drawOsc() {
|
||||||
} else {
|
} else {
|
||||||
dl->AddPolyline(waveform,oscWidth-24,color,ImDrawFlags_None,dpiScale);
|
dl->AddPolyline(waveform,oscWidth-24,color,ImDrawFlags_None,dpiScale);
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
//dl->AddCallback(_renderOsc,this);
|
_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);
|
||||||
} else {
|
} else {
|
||||||
for (int ch=0; ch<e->getAudioDescGot().outChans; ch++) {
|
for (int ch=0; ch<e->getAudioDescGot().outChans; ch++) {
|
||||||
for (int i=0; i<oscWidth-24; i++) {
|
for (int i=0; i<oscWidth-24; i++) {
|
||||||
|
|
|
@ -71,7 +71,7 @@ void FurnaceGUIRender::renderGUI() {
|
||||||
void FurnaceGUIRender::wipe(float alpha) {
|
void FurnaceGUIRender::wipe(float alpha) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void FurnaceGUIRender::drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 pos1, ImVec4 color) {
|
void FurnaceGUIRender::drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 pos1, ImVec4 color, ImVec2 canvasSize, float lineWidth) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void FurnaceGUIRender::present() {
|
void FurnaceGUIRender::present() {
|
||||||
|
|
|
@ -35,6 +35,7 @@ PFNGLBINDBUFFERPROC furBindBuffer=NULL;
|
||||||
PFNGLBUFFERDATAPROC furBufferData=NULL;
|
PFNGLBUFFERDATAPROC furBufferData=NULL;
|
||||||
PFNGLVERTEXATTRIBPOINTERPROC furVertexAttribPointer=NULL;
|
PFNGLVERTEXATTRIBPOINTERPROC furVertexAttribPointer=NULL;
|
||||||
PFNGLENABLEVERTEXATTRIBARRAYPROC furEnableVertexAttribArray=NULL;
|
PFNGLENABLEVERTEXATTRIBARRAYPROC furEnableVertexAttribArray=NULL;
|
||||||
|
PFNGLDISABLEVERTEXATTRIBARRAYPROC furDisableVertexAttribArray=NULL;
|
||||||
PFNGLACTIVETEXTUREPROC furActiveTexture=NULL;
|
PFNGLACTIVETEXTUREPROC furActiveTexture=NULL;
|
||||||
|
|
||||||
PFNGLCREATESHADERPROC furCreateShader=NULL;
|
PFNGLCREATESHADERPROC furCreateShader=NULL;
|
||||||
|
@ -369,8 +370,15 @@ void FurnaceGUIRenderGL::wipe(float alpha) {
|
||||||
C(glDrawArrays(GL_TRIANGLE_STRIP,0,4));
|
C(glDrawArrays(GL_TRIANGLE_STRIP,0,4));
|
||||||
}
|
}
|
||||||
|
|
||||||
void FurnaceGUIRenderGL::drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 pos1, ImVec4 color) {
|
void FurnaceGUIRenderGL::drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 pos1, ImVec4 color, ImVec2 canvasSize, float lineWidth) {
|
||||||
if (!furUseProgram) return;
|
if (!furUseProgram) return;
|
||||||
|
if (!furUniform4fv) return;
|
||||||
|
if (!furUniform1f) return;
|
||||||
|
if (!furUniform2f) return;
|
||||||
|
if (!furUniform1i) return;
|
||||||
|
|
||||||
|
logV("%d",oscVertexBuf);
|
||||||
|
if (len>2048) len=2048;
|
||||||
|
|
||||||
memcpy(oscData,data,len*sizeof(float));
|
memcpy(oscData,data,len*sizeof(float));
|
||||||
|
|
||||||
|
@ -385,31 +393,32 @@ void FurnaceGUIRenderGL::drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 po
|
||||||
C(glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA));
|
C(glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA));
|
||||||
C(glEnable(GL_BLEND));
|
C(glEnable(GL_BLEND));
|
||||||
|
|
||||||
|
pos0.x=(2.0f*pos0.x/canvasSize.x)-1.0f;
|
||||||
|
pos0.y=(2.0f*pos0.y/canvasSize.y)-1.0f;
|
||||||
|
pos1.x=(2.0f*pos1.x/canvasSize.x)-1.0f;
|
||||||
|
pos1.y=(2.0f*pos1.y/canvasSize.y)-1.0f;
|
||||||
|
|
||||||
oscVertex[0][0]=pos0.x;
|
oscVertex[0][0]=pos0.x;
|
||||||
oscVertex[0][1]=pos1.y;
|
oscVertex[0][1]=pos1.y;
|
||||||
oscVertex[0][2]=0.0f;
|
oscVertex[0][2]=0.0f;
|
||||||
oscVertex[0][3]=0.0f;
|
oscVertex[0][3]=1.0f;
|
||||||
oscVertex[0][4]=1.0f;
|
|
||||||
oscVertex[1][0]=pos1.x;
|
oscVertex[1][0]=pos1.x;
|
||||||
oscVertex[1][1]=pos1.y;
|
oscVertex[1][1]=pos1.y;
|
||||||
oscVertex[1][2]=0.0f;
|
oscVertex[1][2]=1.0f;
|
||||||
oscVertex[1][3]=1.0f;
|
oscVertex[1][3]=1.0f;
|
||||||
oscVertex[1][4]=1.0f;
|
|
||||||
oscVertex[2][0]=pos0.x;
|
oscVertex[2][0]=pos0.x;
|
||||||
oscVertex[2][1]=pos0.y;
|
oscVertex[2][1]=pos0.y;
|
||||||
oscVertex[2][2]=0.0f;
|
oscVertex[2][2]=0.0f;
|
||||||
oscVertex[2][3]=0.0f;
|
oscVertex[2][3]=0.0f;
|
||||||
oscVertex[2][4]=0.0f;
|
|
||||||
oscVertex[3][0]=pos1.x;
|
oscVertex[3][0]=pos1.x;
|
||||||
oscVertex[3][1]=pos0.y;
|
oscVertex[3][1]=pos0.y;
|
||||||
oscVertex[3][2]=0.0f;
|
oscVertex[3][2]=1.0f;
|
||||||
oscVertex[3][3]=1.0f;
|
oscVertex[3][3]=0.0f;
|
||||||
oscVertex[3][4]=0.0f;
|
|
||||||
|
|
||||||
C(furBindBuffer(GL_ARRAY_BUFFER,oscVertexBuf));
|
C(furBindBuffer(GL_ARRAY_BUFFER,oscVertexBuf));
|
||||||
C(furBufferData(GL_ARRAY_BUFFER,sizeof(oscVertex),oscVertex,GL_STATIC_DRAW));
|
C(furBufferData(GL_ARRAY_BUFFER,sizeof(oscVertex),oscVertex,GL_STATIC_DRAW));
|
||||||
C(furVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,5,NULL));
|
C(furVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,4*sizeof(float),NULL));
|
||||||
C(furVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,5,(void*)3));
|
C(furVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,4*sizeof(float),(void*)(2*sizeof(float))));
|
||||||
C(furEnableVertexAttribArray(0));
|
C(furEnableVertexAttribArray(0));
|
||||||
C(furEnableVertexAttribArray(1));
|
C(furEnableVertexAttribArray(1));
|
||||||
C(furActiveTexture(GL_TEXTURE0));
|
C(furActiveTexture(GL_TEXTURE0));
|
||||||
|
@ -417,11 +426,13 @@ void FurnaceGUIRenderGL::drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 po
|
||||||
|
|
||||||
C(furUseProgram(sh_oscRender_program));
|
C(furUseProgram(sh_oscRender_program));
|
||||||
C(furUniform4fv(sh_oscRender_uColor,1,(float*)&color));
|
C(furUniform4fv(sh_oscRender_uColor,1,(float*)&color));
|
||||||
C(furUniform1f(sh_oscRender_uLineWidth,2.0f));
|
C(furUniform1f(sh_oscRender_uLineWidth,lineWidth));
|
||||||
C(furUniform2f(sh_oscRender_uResolution,1.0f,1.0f));
|
C(furUniform2f(sh_oscRender_uResolution,1.0f,1.0f));
|
||||||
C(furUniform1i(sh_oscRender_oscVal,0));
|
C(furUniform1i(sh_oscRender_oscVal,0));
|
||||||
|
|
||||||
C(glDrawArrays(GL_TRIANGLE_STRIP,0,4));
|
C(glDrawArrays(GL_TRIANGLE_STRIP,0,4));
|
||||||
|
C(furDisableVertexAttribArray(1));
|
||||||
|
C(furUseProgram(0));
|
||||||
C(glBindTexture(GL_TEXTURE_2D,0));
|
C(glBindTexture(GL_TEXTURE_2D,0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -493,6 +504,7 @@ bool FurnaceGUIRenderGL::init(SDL_Window* win) {
|
||||||
LOAD_PROC_MANDATORY(furBufferData,PFNGLBUFFERDATAPROC,"glBufferData");
|
LOAD_PROC_MANDATORY(furBufferData,PFNGLBUFFERDATAPROC,"glBufferData");
|
||||||
LOAD_PROC_MANDATORY(furVertexAttribPointer,PFNGLVERTEXATTRIBPOINTERPROC,"glVertexAttribPointer");
|
LOAD_PROC_MANDATORY(furVertexAttribPointer,PFNGLVERTEXATTRIBPOINTERPROC,"glVertexAttribPointer");
|
||||||
LOAD_PROC_MANDATORY(furEnableVertexAttribArray,PFNGLENABLEVERTEXATTRIBARRAYPROC,"glEnableVertexAttribArray");
|
LOAD_PROC_MANDATORY(furEnableVertexAttribArray,PFNGLENABLEVERTEXATTRIBARRAYPROC,"glEnableVertexAttribArray");
|
||||||
|
LOAD_PROC_MANDATORY(furDisableVertexAttribArray,PFNGLDISABLEVERTEXATTRIBARRAYPROC,"glDisableVertexAttribArray");
|
||||||
LOAD_PROC_MANDATORY(furActiveTexture,PFNGLACTIVETEXTUREPROC,"glActiveTexture");
|
LOAD_PROC_MANDATORY(furActiveTexture,PFNGLACTIVETEXTUREPROC,"glActiveTexture");
|
||||||
|
|
||||||
LOAD_PROC_OPTIONAL(furCreateShader,PFNGLCREATESHADERPROC,"glCreateShader");
|
LOAD_PROC_OPTIONAL(furCreateShader,PFNGLCREATESHADERPROC,"glCreateShader");
|
||||||
|
|
|
@ -24,7 +24,7 @@ class FurnaceGUIRenderGL: public FurnaceGUIRender {
|
||||||
SDL_Window* sdlWin;
|
SDL_Window* sdlWin;
|
||||||
float quadVertex[4][3];
|
float quadVertex[4][3];
|
||||||
unsigned int quadBuf;
|
unsigned int quadBuf;
|
||||||
float oscVertex[4][5];
|
float oscVertex[4][4];
|
||||||
unsigned int oscVertexBuf;
|
unsigned int oscVertexBuf;
|
||||||
unsigned int oscDataTex;
|
unsigned int oscDataTex;
|
||||||
float oscData[2048];
|
float oscData[2048];
|
||||||
|
@ -61,7 +61,7 @@ class FurnaceGUIRenderGL: public FurnaceGUIRender {
|
||||||
void destroyFontsTexture();
|
void destroyFontsTexture();
|
||||||
void renderGUI();
|
void renderGUI();
|
||||||
void wipe(float alpha);
|
void wipe(float alpha);
|
||||||
void drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 pos1, ImVec4 color);
|
void drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 pos1, ImVec4 color, ImVec2 canvasSize, float lineWidth);
|
||||||
void present();
|
void present();
|
||||||
bool getOutputSize(int& w, int& h);
|
bool getOutputSize(int& w, int& h);
|
||||||
int getWindowFlags();
|
int getWindowFlags();
|
||||||
|
|
Loading…
Reference in a new issue