GUI: new osc renderer, part 12
This commit is contained in:
parent
4242e79144
commit
523a290374
|
|
@ -48,6 +48,14 @@ const char* autoColsTypes[]={
|
||||||
"Mode 3"
|
"Mode 3"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void _drawOsc(const ImDrawList* drawList, const ImDrawCmd* cmd) {
|
||||||
|
if (cmd!=NULL) {
|
||||||
|
if (cmd->UserCallbackData!=NULL) {
|
||||||
|
((FurnaceGUI*)(((PendingDrawOsc*)cmd->UserCallbackData)->gui))->runPendingDrawOsc((PendingDrawOsc*)cmd->UserCallbackData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
float FurnaceGUI::computeGradPos(int type, int chan) {
|
float FurnaceGUI::computeGradPos(int type, int chan) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case GUI_OSCREF_NONE:
|
case GUI_OSCREF_NONE:
|
||||||
|
|
@ -584,9 +592,13 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
ImGui::ItemSize(size,style.FramePadding.y);
|
ImGui::ItemSize(size,style.FramePadding.y);
|
||||||
if (ImGui::ItemAdd(rect,ImGui::GetID("chOscDisplay"))) {
|
if (ImGui::ItemAdd(rect,ImGui::GetID("chOscDisplay"))) {
|
||||||
if (!e->isRunning()) {
|
if (!e->isRunning()) {
|
||||||
for (unsigned short j=0; j<precision; j++) {
|
if (newOscCode) {
|
||||||
float x=(float)j/(float)precision;
|
memset(fft->oscTex,0,2048*sizeof(float));
|
||||||
waveform[j]=ImLerp(inRect.Min,inRect.Max,ImVec2(x,0.5f));
|
} else {
|
||||||
|
for (unsigned short j=0; j<precision; j++) {
|
||||||
|
float x=(float)j/(float)precision;
|
||||||
|
waveform[j]=ImLerp(inRect.Min,inRect.Max,ImVec2(x,0.5f));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int displaySize=(float)(buf->rate)*(chanOscWindowSize/1000.0f);
|
int displaySize=(float)(buf->rate)*(chanOscWindowSize/1000.0f);
|
||||||
|
|
@ -605,15 +617,27 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
}
|
}
|
||||||
if (maxavg>0.0000001) maxavg=0.5/maxavg;
|
if (maxavg>0.0000001) maxavg=0.5/maxavg;
|
||||||
|
|
||||||
for (unsigned short j=0; j<precision; j++) {
|
if (newOscCode) {
|
||||||
float x=(float)j/(float)precision;
|
for (unsigned short j=0; j<precision && j<2048; j++) {
|
||||||
float y;
|
float y;
|
||||||
if (j>=precision/2) {
|
if (j>=precision/2) {
|
||||||
y=fft->inBuf[((j-(precision/2))*FURNACE_FFT_SIZE*2)/(precision)];
|
y=fft->inBuf[((j-(precision/2))*FURNACE_FFT_SIZE*2)/(precision)];
|
||||||
} else {
|
} else {
|
||||||
y=fft->corrBuf[(j*FURNACE_FFT_SIZE)/precision]*maxavg;
|
y=fft->corrBuf[(j*FURNACE_FFT_SIZE)/precision]*maxavg;
|
||||||
|
}
|
||||||
|
fft->oscTex[j]=y*2.0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (unsigned short j=0; j<precision; j++) {
|
||||||
|
float x=(float)j/(float)precision;
|
||||||
|
float y;
|
||||||
|
if (j>=precision/2) {
|
||||||
|
y=fft->inBuf[((j-(precision/2))*FURNACE_FFT_SIZE*2)/(precision)];
|
||||||
|
} else {
|
||||||
|
y=fft->corrBuf[(j*FURNACE_FFT_SIZE)/precision]*maxavg;
|
||||||
|
}
|
||||||
|
waveform[j]=ImLerp(inRect.Min,inRect.Max,ImVec2(x,0.5f-y));
|
||||||
}
|
}
|
||||||
waveform[j]=ImLerp(inRect.Min,inRect.Max,ImVec2(x,0.5f-y));
|
|
||||||
}
|
}
|
||||||
if (fft->loudEnough) {
|
if (fft->loudEnough) {
|
||||||
String cPhase=fmt::sprintf("\n%.1f (b: %d t: %d)",fft->waveLen,fft->waveLenBottom,fft->waveLenTop);
|
String cPhase=fmt::sprintf("\n%.1f (b: %d t: %d)",fft->waveLen,fft->waveLenBottom,fft->waveLenTop);
|
||||||
|
|
@ -641,14 +665,26 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
if (maxLevel<y) maxLevel=y;
|
if (maxLevel<y) maxLevel=y;
|
||||||
}
|
}
|
||||||
dcOff=(minLevel+maxLevel)*0.5f;
|
dcOff=(minLevel+maxLevel)*0.5f;
|
||||||
for (unsigned short j=0; j<precision; j++) {
|
|
||||||
float x=(float)j/(float)precision;
|
if (newOscCode) {
|
||||||
float y=(float)buf->data[(unsigned short)(fft->needle+(j*displaySize/precision))]/32768.0f;
|
for (unsigned short j=0; j<precision; j++) {
|
||||||
y-=dcOff;
|
float y=(float)buf->data[(unsigned short)(fft->needle+(j*displaySize/precision))]/32768.0f;
|
||||||
if (y<-0.5f) y=-0.5f;
|
y-=dcOff;
|
||||||
if (y>0.5f) y=0.5f;
|
if (y<-0.5f) y=-0.5f;
|
||||||
y*=chanOscAmplify;
|
if (y>0.5f) y=0.5f;
|
||||||
waveform[j]=ImLerp(inRect.Min,inRect.Max,ImVec2(x,0.5f-y));
|
y*=chanOscAmplify*2.0f;
|
||||||
|
fft->oscTex[j]=y;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (unsigned short j=0; j<precision; j++) {
|
||||||
|
float x=(float)j/(float)precision;
|
||||||
|
float y=(float)buf->data[(unsigned short)(fft->needle+(j*displaySize/precision))]/32768.0f;
|
||||||
|
y-=dcOff;
|
||||||
|
if (y<-0.5f) y=-0.5f;
|
||||||
|
if (y>0.5f) y=0.5f;
|
||||||
|
y*=chanOscAmplify;
|
||||||
|
waveform[j]=ImLerp(inRect.Min,inRect.Max,ImVec2(x,0.5f-y));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -662,13 +698,27 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
|
|
||||||
color=chanOscGrad.get(xVal,1.0f-yVal);
|
color=chanOscGrad.get(xVal,1.0f-yVal);
|
||||||
}
|
}
|
||||||
ImGui::PushClipRect(inRect.Min,inRect.Max,false);
|
|
||||||
|
|
||||||
//ImDrawListFlags prevFlags=dl->Flags;
|
if (rend->supportsDrawOsc() && newOscCode) {
|
||||||
//dl->Flags&=~(ImDrawListFlags_AntiAliasedLines|ImDrawListFlags_AntiAliasedLinesUseTex);
|
fft->drawOp.gui=this;
|
||||||
dl->AddPolyline(waveform,precision,color,ImDrawFlags_None,dpiScale);
|
fft->drawOp.data=fft->oscTex;
|
||||||
//dl->Flags=prevFlags;
|
fft->drawOp.len=precision;
|
||||||
|
fft->drawOp.pos0=inRect.Min;
|
||||||
|
fft->drawOp.pos1=inRect.Max;
|
||||||
|
fft->drawOp.color=ImGui::ColorConvertU32ToFloat4(color);
|
||||||
|
|
||||||
|
dl->AddCallback(_drawOsc,&fft->drawOp);
|
||||||
|
dl->AddCallback(ImDrawCallback_ResetRenderState,NULL);
|
||||||
|
} else {
|
||||||
|
//ImGui::PushClipRect(inRect.Min,inRect.Max,false);
|
||||||
|
//ImDrawListFlags prevFlags=dl->Flags;
|
||||||
|
//dl->Flags&=~(ImDrawListFlags_AntiAliasedLines|ImDrawListFlags_AntiAliasedLinesUseTex);
|
||||||
|
dl->AddPolyline(waveform,precision,color,ImDrawFlags_None,dpiScale);
|
||||||
|
//dl->Flags=prevFlags;
|
||||||
|
//ImGui::PopClipRect();
|
||||||
|
}
|
||||||
|
|
||||||
|
//ImGui::PushClipRect(inRect.Min,inRect.Max,false);
|
||||||
if (!chanOscTextFormat.empty()) {
|
if (!chanOscTextFormat.empty()) {
|
||||||
String text;
|
String text;
|
||||||
bool inFormat=false;
|
bool inFormat=false;
|
||||||
|
|
@ -776,7 +826,7 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
dl->AddText(ImLerp(inRect.Min,inRect.Max,ImVec2(0.0f,0.0f)),ImGui::GetColorU32(chanOscTextColor),text.c_str());
|
dl->AddText(ImLerp(inRect.Min,inRect.Max,ImVec2(0.0f,0.0f)),ImGui::GetColorU32(chanOscTextColor),text.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::PopClipRect();
|
//ImGui::PopClipRect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4679,6 +4679,11 @@ bool FurnaceGUI::loop() {
|
||||||
pushToggleColors(newOscCode);
|
pushToggleColors(newOscCode);
|
||||||
if (ImGui::Button("New Code")) newOscCode=!newOscCode;
|
if (ImGui::Button("New Code")) newOscCode=!newOscCode;
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
|
ImGui::AlignTextToFramePadding();
|
||||||
|
ImGui::Text("Line size");
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::SetNextItemWidth(120.0f*dpiScale);
|
||||||
|
ImGui::InputFloat("##NewCodeLS",&newOscLineWidth,1,1,"%.1f");
|
||||||
} else if (renderBackend==GUI_BACKEND_GL) {
|
} else if (renderBackend==GUI_BACKEND_GL) {
|
||||||
ImGui::Text("Master, are you playing a trick on me?\nThat's not very nice!");
|
ImGui::Text("Master, are you playing a trick on me?\nThat's not very nice!");
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -6949,6 +6954,8 @@ bool FurnaceGUI::init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
newOscLineWidth=dpiScale;
|
||||||
|
|
||||||
updateWindowTitle();
|
updateWindowTitle();
|
||||||
|
|
||||||
rend->clear(ImVec4(0.0,0.0,0.0,1.0));
|
rend->clear(ImVec4(0.0,0.0,0.0,1.0));
|
||||||
|
|
@ -7327,6 +7334,7 @@ FurnaceGUI::FurnaceGUI():
|
||||||
shallDetectScale(0),
|
shallDetectScale(0),
|
||||||
cpuCores(0),
|
cpuCores(0),
|
||||||
secondTimer(0.0f),
|
secondTimer(0.0f),
|
||||||
|
newOscLineWidth(2.0f),
|
||||||
userEvents(0xffffffff),
|
userEvents(0xffffffff),
|
||||||
mobileMenuPos(0.0f),
|
mobileMenuPos(0.0f),
|
||||||
autoButtonSize(0.0f),
|
autoButtonSize(0.0f),
|
||||||
|
|
|
||||||
|
|
@ -1522,7 +1522,7 @@ class FurnaceGUI {
|
||||||
int wheelCalmDown;
|
int wheelCalmDown;
|
||||||
int shallDetectScale;
|
int shallDetectScale;
|
||||||
int cpuCores;
|
int cpuCores;
|
||||||
float secondTimer;
|
float secondTimer, newOscLineWidth;
|
||||||
unsigned int userEvents;
|
unsigned int userEvents;
|
||||||
float mobileMenuPos, autoButtonSize, mobileEditAnim;
|
float mobileMenuPos, autoButtonSize, mobileEditAnim;
|
||||||
ImVec2 mobileEditButtonPos, mobileEditButtonSize;
|
ImVec2 mobileEditButtonPos, mobileEditButtonSize;
|
||||||
|
|
@ -2310,6 +2310,8 @@ class FurnaceGUI {
|
||||||
bool ready, loudEnough, waveCorr;
|
bool ready, loudEnough, waveCorr;
|
||||||
fftw_plan plan;
|
fftw_plan plan;
|
||||||
fftw_plan planI;
|
fftw_plan planI;
|
||||||
|
PendingDrawOsc drawOp;
|
||||||
|
float oscTex[2048];
|
||||||
ChanOscStatus():
|
ChanOscStatus():
|
||||||
inBuf(NULL),
|
inBuf(NULL),
|
||||||
outBuf(NULL),
|
outBuf(NULL),
|
||||||
|
|
|
||||||
|
|
@ -150,7 +150,7 @@ static void _drawOsc(const ImDrawList* drawList, const ImDrawCmd* cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void FurnaceGUI::runPendingDrawOsc(PendingDrawOsc* which) {
|
void FurnaceGUI::runPendingDrawOsc(PendingDrawOsc* which) {
|
||||||
rend->drawOsc(which->data,which->len,which->pos0,which->pos1,which->color,ImVec2(canvasW,canvasH),dpiScale);
|
rend->drawOsc(which->data,which->len,which->pos0,which->pos1,which->color,ImVec2(canvasW,canvasH),newOscLineWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FurnaceGUI::drawOsc() {
|
void FurnaceGUI::drawOsc() {
|
||||||
|
|
|
||||||
|
|
@ -164,19 +164,27 @@ const char* sh_oscRender_srcF=
|
||||||
"out vec4 fur_FragColor;\n"
|
"out vec4 fur_FragColor;\n"
|
||||||
"void main() {\n"
|
"void main() {\n"
|
||||||
" vec2 uv = fur_fragCoord/uResolution;\n"
|
" vec2 uv = fur_fragCoord/uResolution;\n"
|
||||||
" vec2 tresh = vec2(uLineWidth)/uResolution;\n"
|
" uv.y *= 2.0;\n"
|
||||||
|
" vec2 tresh = vec2(1.0,1.0)/uResolution;\n"
|
||||||
|
" float x1 = uv.x-uAdvance;\n"
|
||||||
" float x2 = uv.x;\n"
|
" float x2 = uv.x;\n"
|
||||||
" float x3 = uv.x+uAdvance;\n"
|
" float x3 = uv.x+uAdvance;\n"
|
||||||
|
" float val1 = texture(oscVal,x2).x;\n"
|
||||||
" float val2 = texture(oscVal,x2).x;\n"
|
" float val2 = texture(oscVal,x2).x;\n"
|
||||||
" float val3 = texture(oscVal,x3).x;\n"
|
" float val3 = texture(oscVal,x3).x;\n"
|
||||||
" float valmax = max(val2,val3);\n"
|
" float valmax = max(max(val1,val2),val3);\n"
|
||||||
" float valmin = min(val2,val3);\n"
|
" float valmin = min(min(val1,val2),val3);\n"
|
||||||
" float vald = abs(valmax-valmin);\n"
|
" float slope = abs(valmax-valmin)*uResolution.y*0.5;\n"
|
||||||
" float alpha = 1.0-abs(uv.y-val2)/max(tresh.y,vald);\n"
|
" float alpha = 0.0;\n"
|
||||||
" if (vald>(1.0/uResolution.y)) {\n"
|
" if (uv.y>=valmin) {\n"
|
||||||
" fur_FragColor = vec4(1.0,0.0,0.0,uColor.w*alpha);\n"
|
" alpha=valmax*uResolution.y*0.5-fur_fragCoord.y+uLineWidth*0.75;\n"
|
||||||
" } else {\n"
|
" } else {\n"
|
||||||
" fur_FragColor = vec4(uColor.xyz,uColor.w*alpha);\n"
|
" alpha=fur_fragCoord.y-valmin*uResolution.y*0.5+uLineWidth*0.75;\n"
|
||||||
|
" }\n"
|
||||||
|
" if (slope>1.0) {\n"
|
||||||
|
" fur_FragColor = vec4(uColor.xyz,uColor.w*clamp(alpha,0.0,1.0));\n"
|
||||||
|
" } else {\n"
|
||||||
|
" fur_FragColor = vec4(uColor.xyz,uColor.w*clamp(alpha,0.0,1.0));\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue