GUI: new osc renderer, part 3

now we have something
This commit is contained in:
tildearrow 2024-02-10 14:23:33 -05:00
parent 27b1a410eb
commit e13444230e
2 changed files with 49 additions and 20 deletions

View file

@ -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; ch<e->getAudioDescGot().outChans; ch++) {
for (int i=0; i<oscWidth-24; i++) {

View file

@ -114,7 +114,8 @@ const char* sh_oscRender_srcF=
" float valmin = min(min(val1,val2),val3);\n"
" float vald = abs(valmax-valmin);\n"
" float alpha = 1.0-abs(uv.y-val2)/max(tresh.y,vald);\n"
" gl_FragColor = vec4(uColor.xyz,uColor.w*alpha);\n"
" //gl_FragColor = vec4(uColor.xyz,uColor.w*alpha);\n"
" gl_FragColor = vec4(clamp(0.5+val2*0.5,0.0,1.0),0.0,0.0,1.0);\n"
"}\n";
#else
const char* sh_wipe_srcV=
@ -377,13 +378,24 @@ void FurnaceGUIRenderGL::drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 po
if (!furUniform2f) return;
if (!furUniform1i) return;
if (furBufferData) return;
logV("%d",oscVertexBuf);
if (len>2048) 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;
}