diff --git a/src/gui/osc.cpp b/src/gui/osc.cpp index 906e02e02..8f5104930 100644 --- a/src/gui/osc.cpp +++ b/src/gui/osc.cpp @@ -319,6 +319,7 @@ void FurnaceGUI::drawOsc() { _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; i2048) len=2048; memcpy(oscData,data,len*sizeof(float)); + int lastArrayBuf=0; + int lastElemArrayBuf=0; + int lastTex=0; + int lastProgram=0; + int lastActiveTex=0; + C(glGetIntegerv(GL_ACTIVE_TEXTURE,&lastActiveTex)); + C(furActiveTexture(GL_TEXTURE0)); + +#ifdef USE_GLES + C(glGetIntegerv(GL_TEXTURE_BINDING_2D,&lastTex)); +#else + C(glGetIntegerv(GL_TEXTURE_BINDING_1D,&lastTex)); +#endif + #ifdef USE_GLES C(glBindTexture(GL_TEXTURE_2D,oscDataTex)); C(glTexImage2D(GL_TEXTURE_2D,0,GL_RED_EXT,2048,1,0,GL_RED_EXT,GL_FLOAT,oscData)); @@ -392,13 +404,13 @@ void FurnaceGUIRenderGL::drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 po C(glTexImage1D(GL_TEXTURE_1D,0,GL_RED,2048,0,GL_RED,GL_FLOAT,oscData)); #endif - C(glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)); - C(glEnable(GL_BLEND)); + //C(glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)); + //C(glEnable(GL_BLEND)); pos0.x=(2.0f*pos0.x/canvasSize.x)-1.0f; - pos0.y=(2.0f*pos0.y/canvasSize.y)-1.0f; + pos0.y=1.0f-(2.0f*pos0.y/canvasSize.y); pos1.x=(2.0f*pos1.x/canvasSize.x)-1.0f; - pos1.y=(2.0f*pos1.y/canvasSize.y)-1.0f; + pos1.y=1.0f-(2.0f*pos1.y/canvasSize.y); oscVertex[0][0]=pos0.x; oscVertex[0][1]=pos1.y; @@ -406,36 +418,51 @@ void FurnaceGUIRenderGL::drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 po oscVertex[0][3]=1.0f; oscVertex[1][0]=pos1.x; oscVertex[1][1]=pos1.y; - oscVertex[1][2]=1.0f; + oscVertex[1][2]=(float)len; oscVertex[1][3]=1.0f; oscVertex[2][0]=pos0.x; oscVertex[2][1]=pos0.y; oscVertex[2][2]=0.0f; - oscVertex[2][3]=0.0f; + oscVertex[2][3]=-1.0f; oscVertex[3][0]=pos1.x; oscVertex[3][1]=pos0.y; - oscVertex[3][2]=1.0f; - oscVertex[3][3]=0.0f; + oscVertex[3][2]=(float)len; + oscVertex[3][3]=-1.0f; + + C(glGetIntegerv(GL_ARRAY_BUFFER_BINDING,&lastArrayBuf)); + C(glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING,&lastElemArrayBuf)); C(furBindBuffer(GL_ARRAY_BUFFER,oscVertexBuf)); + C(furBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0)); C(furBufferData(GL_ARRAY_BUFFER,sizeof(oscVertex),oscVertex,GL_STATIC_DRAW)); C(furVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,4*sizeof(float),NULL)); - //C(furVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,4*sizeof(float),(void*)(2*sizeof(float)))); + C(furVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,4*sizeof(float),(void*)(2*sizeof(float)))); C(furEnableVertexAttribArray(0)); - //C(furEnableVertexAttribArray(1)); - C(furActiveTexture(GL_TEXTURE0)); - C(glBindTexture(GL_TEXTURE_2D,oscDataTex)); + C(furEnableVertexAttribArray(1)); + + C(glGetIntegerv(GL_CURRENT_PROGRAM,&lastProgram)); C(furUseProgram(sh_oscRender_program)); C(furUniform4fv(sh_oscRender_uColor,1,(float*)&color)); C(furUniform1f(sh_oscRender_uLineWidth,lineWidth)); - C(furUniform2f(sh_oscRender_uResolution,1.0f,1.0f)); + C(furUniform2f(sh_oscRender_uResolution,2048.0f,1.0f)); C(furUniform1i(sh_oscRender_oscVal,0)); C(glDrawArrays(GL_TRIANGLE_STRIP,0,4)); - //C(furDisableVertexAttribArray(1)); - C(furUseProgram(0)); - C(glBindTexture(GL_TEXTURE_2D,0)); + C(furDisableVertexAttribArray(1)); + + // restore state + C(furUseProgram(lastProgram)); + + C(furBindBuffer(GL_ARRAY_BUFFER,lastArrayBuf)); + C(furBindBuffer(GL_ELEMENT_ARRAY_BUFFER,lastElemArrayBuf)); + +#ifdef USE_GLES + C(glBindTexture(GL_TEXTURE_2D,lastTex)); +#else + C(glBindTexture(GL_TEXTURE_1D,lastTex)); +#endif + C(furActiveTexture(lastActiveTex)); } void FurnaceGUIRenderGL::present() { @@ -558,6 +585,7 @@ bool FurnaceGUIRenderGL::init(SDL_Window* win) { } C(furGenBuffers(1,&quadBuf)); + C(furGenBuffers(1,&oscVertexBuf)); return true; }