GUI: new osc renderer, part 3
now we have something
This commit is contained in:
parent
27b1a410eb
commit
e13444230e
|
@ -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++) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue