GUI: new osc renderer, part 26
sorry another window
This commit is contained in:
parent
086c792d33
commit
e17df27f66
|
@ -4674,6 +4674,30 @@ bool FurnaceGUI::loop() {
|
||||||
MEASURE(effectList,drawEffectList());
|
MEASURE(effectList,drawEffectList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NEW CODE - REMOVE WHEN DONE
|
||||||
|
if (ImGui::Begin("Shader Editor 2024",NULL)) {
|
||||||
|
ImGui::PushFont(patFont);
|
||||||
|
ImGui::InputTextMultiline("##SHFragment",&newOscFragment,ImVec2(ImGui::GetContentRegionAvail().x,ImGui::GetContentRegionAvail().y-ImGui::GetFrameHeightWithSpacing()),ImGuiInputTextFlags_UndoRedo);
|
||||||
|
ImGui::PopFont();
|
||||||
|
if (ImGui::Button("Save")) {
|
||||||
|
FILE* f=ps_fopen("/storage/emulated/0/osc.fsh","w");
|
||||||
|
if (f==NULL) {
|
||||||
|
showError("Something happened");
|
||||||
|
} else {
|
||||||
|
fwrite(newOscFragment.c_str(),1,newOscFragment.size(),f);
|
||||||
|
fclose(f);
|
||||||
|
showError("Saved!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::SameLine();
|
||||||
|
if (ImGui::Button("Apply")) {
|
||||||
|
if (!rend->regenOscShader(newOscFragment.c_str())) {
|
||||||
|
showError("Of course you screwed it up, again!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::End();
|
||||||
|
|
||||||
// release selection if mouse released
|
// release selection if mouse released
|
||||||
if (ImGui::IsMouseReleased(ImGuiMouseButton_Left) && selecting) {
|
if (ImGui::IsMouseReleased(ImGuiMouseButton_Left) && selecting) {
|
||||||
if (!selectingFull) cursor=selEnd;
|
if (!selectingFull) cursor=selEnd;
|
||||||
|
@ -6950,6 +6974,9 @@ bool FurnaceGUI::init() {
|
||||||
ImGui::CreateContext();
|
ImGui::CreateContext();
|
||||||
rend->initGUI(sdlWin);
|
rend->initGUI(sdlWin);
|
||||||
|
|
||||||
|
// NEW CODE - REMOVE WHEN DONE
|
||||||
|
newOscFragment=rend->getStupidFragment();
|
||||||
|
|
||||||
applyUISettings();
|
applyUISettings();
|
||||||
|
|
||||||
logD("building font...");
|
logD("building font...");
|
||||||
|
|
|
@ -1435,6 +1435,8 @@ class FurnaceGUIRender {
|
||||||
virtual void drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 pos1, ImVec4 color, ImVec2 canvasSize, float lineWidth);
|
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 supportsDrawOsc();
|
virtual bool supportsDrawOsc();
|
||||||
|
virtual const char* getStupidFragment();
|
||||||
|
virtual bool regenOscShader(const char* fragment);
|
||||||
virtual bool getOutputSize(int& w, int& h);
|
virtual bool getOutputSize(int& w, int& h);
|
||||||
virtual int getWindowFlags();
|
virtual int getWindowFlags();
|
||||||
virtual void preInit();
|
virtual void preInit();
|
||||||
|
@ -1478,6 +1480,7 @@ class FurnaceGUI {
|
||||||
int sampleTexW, sampleTexH;
|
int sampleTexW, sampleTexH;
|
||||||
bool updateSampleTex;
|
bool updateSampleTex;
|
||||||
|
|
||||||
|
String newOscFragment;
|
||||||
String workingDir, fileName, clipboard, warnString, errorString, lastError, curFileName, nextFile, sysSearchQuery, newSongQuery, paletteQuery;
|
String workingDir, fileName, clipboard, warnString, errorString, lastError, curFileName, nextFile, sysSearchQuery, newSongQuery, paletteQuery;
|
||||||
String workingDirSong, workingDirIns, workingDirWave, workingDirSample, workingDirAudioExport;
|
String workingDirSong, workingDirIns, workingDirWave, workingDirSample, workingDirAudioExport;
|
||||||
String workingDirVGMExport, workingDirZSMExport, workingDirROMExport, workingDirFont, workingDirColors, workingDirKeybinds;
|
String workingDirVGMExport, workingDirZSMExport, workingDirROMExport, workingDirFont, workingDirColors, workingDirKeybinds;
|
||||||
|
|
|
@ -307,7 +307,7 @@ void FurnaceGUI::drawOsc() {
|
||||||
} else {
|
} else {
|
||||||
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 y=oscValuesAverage[i+12];
|
float y=oscValuesAverage[i+12]*0.5f;
|
||||||
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;
|
||||||
|
|
|
@ -110,5 +110,13 @@ bool FurnaceGUIRender::isDead() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* FurnaceGUIRender::getStupidFragment() {
|
||||||
|
return "Only OpenGL";
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FurnaceGUIRender::regenOscShader(const char* fragment) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
FurnaceGUIRender::~FurnaceGUIRender() {
|
FurnaceGUIRender::~FurnaceGUIRender() {
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,8 @@ PFNGLATTACHSHADERPROC furAttachShader=NULL;
|
||||||
PFNGLBINDATTRIBLOCATIONPROC furBindAttribLocation=NULL;
|
PFNGLBINDATTRIBLOCATIONPROC furBindAttribLocation=NULL;
|
||||||
PFNGLCREATEPROGRAMPROC furCreateProgram=NULL;
|
PFNGLCREATEPROGRAMPROC furCreateProgram=NULL;
|
||||||
PFNGLLINKPROGRAMPROC furLinkProgram=NULL;
|
PFNGLLINKPROGRAMPROC furLinkProgram=NULL;
|
||||||
|
PFNGLDELETEPROGRAMPROC furDeleteProgram=NULL;
|
||||||
|
PFNGLDELETESHADERPROC furDeleteShader=NULL;
|
||||||
PFNGLGETPROGRAMIVPROC furGetProgramiv=NULL;
|
PFNGLGETPROGRAMIVPROC furGetProgramiv=NULL;
|
||||||
PFNGLUSEPROGRAMPROC furUseProgram=NULL;
|
PFNGLUSEPROGRAMPROC furUseProgram=NULL;
|
||||||
PFNGLGETUNIFORMLOCATIONPROC furGetUniformLocation=NULL;
|
PFNGLGETUNIFORMLOCATIONPROC furGetUniformLocation=NULL;
|
||||||
|
@ -115,9 +117,9 @@ const char* sh_oscRender_srcF=
|
||||||
" if ((fur_fragCoord.y-uLineWidth)>valmax*uResolution.y) discard;\n"
|
" if ((fur_fragCoord.y-uLineWidth)>valmax*uResolution.y) discard;\n"
|
||||||
" if ((fur_fragCoord.y+uLineWidth)<valmin*uResolution.y) discard;\n"
|
" if ((fur_fragCoord.y+uLineWidth)<valmin*uResolution.y) discard;\n"
|
||||||
" float slope=abs(valmax-valmin)*uResolution.y;\n"
|
" float slope=abs(valmax-valmin)*uResolution.y;\n"
|
||||||
" float slopeDiv=min(1.0,1.0/slope);\n"
|
" float slopeDiv=min(1.0,2.0/ceil(slope));\n"
|
||||||
" float xRight=fur_fragCoord.x+uLineWidth;\n"
|
" float xRight=ceil(fur_fragCoord.x+uLineWidth);\n"
|
||||||
" for (float x=max(0.0,fur_fragCoord.x-uLineWidth); x<=xRight; x+=slopeDiv) {\n"
|
" for (float x=max(0.0,floor(fur_fragCoord.x-uLineWidth)); x<=xRight; x+=slopeDiv) {\n"
|
||||||
" float val0=texture2D(oscVal,vec2(floor(x)*oneStep,1.0)).x*uResolution.y;\n"
|
" float val0=texture2D(oscVal,vec2(floor(x)*oneStep,1.0)).x*uResolution.y;\n"
|
||||||
" float val1=texture2D(oscVal,vec2(floor(x+1.0)*oneStep,1.0)).x*uResolution.y;\n"
|
" float val1=texture2D(oscVal,vec2(floor(x+1.0)*oneStep,1.0)).x*uResolution.y;\n"
|
||||||
" float val=mix(val0,val1,fract(x));\n"
|
" float val=mix(val0,val1,fract(x));\n"
|
||||||
|
@ -437,7 +439,7 @@ 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));
|
||||||
|
|
||||||
float width=fabs(pos1.x-pos0.x);
|
//float width=fabs(pos1.x-pos0.x);
|
||||||
float height=fabs(pos1.y-pos0.y)*0.5;
|
float height=fabs(pos1.y-pos0.y)*0.5;
|
||||||
|
|
||||||
pos0.x=(2.0f*pos0.x/canvasSize.x)-1.0f;
|
pos0.x=(2.0f*pos0.x/canvasSize.x)-1.0f;
|
||||||
|
@ -587,6 +589,8 @@ bool FurnaceGUIRenderGL::init(SDL_Window* win) {
|
||||||
LOAD_PROC_OPTIONAL(furLinkProgram,PFNGLLINKPROGRAMPROC,"glLinkProgram");
|
LOAD_PROC_OPTIONAL(furLinkProgram,PFNGLLINKPROGRAMPROC,"glLinkProgram");
|
||||||
LOAD_PROC_OPTIONAL(furGetProgramiv,PFNGLGETPROGRAMIVPROC,"glGetProgramiv");
|
LOAD_PROC_OPTIONAL(furGetProgramiv,PFNGLGETPROGRAMIVPROC,"glGetProgramiv");
|
||||||
LOAD_PROC_OPTIONAL(furUseProgram,PFNGLUSEPROGRAMPROC,"glUseProgram");
|
LOAD_PROC_OPTIONAL(furUseProgram,PFNGLUSEPROGRAMPROC,"glUseProgram");
|
||||||
|
LOAD_PROC_OPTIONAL(furDeleteProgram,PFNGLDELETEPROGRAMPROC,"glDeleteProgram");
|
||||||
|
LOAD_PROC_OPTIONAL(furDeleteShader,PFNGLDELETESHADERPROC,"glDeleteShader");
|
||||||
LOAD_PROC_OPTIONAL(furGetUniformLocation,PFNGLGETUNIFORMLOCATIONPROC,"glGetUniformLocation");
|
LOAD_PROC_OPTIONAL(furGetUniformLocation,PFNGLGETUNIFORMLOCATIONPROC,"glGetUniformLocation");
|
||||||
LOAD_PROC_OPTIONAL(furUniform1f,PFNGLUNIFORM1FPROC,"glUniform1f");
|
LOAD_PROC_OPTIONAL(furUniform1f,PFNGLUNIFORM1FPROC,"glUniform1f");
|
||||||
LOAD_PROC_OPTIONAL(furUniform2f,PFNGLUNIFORM2FPROC,"glUniform2f");
|
LOAD_PROC_OPTIONAL(furUniform2f,PFNGLUNIFORM2FPROC,"glUniform2f");
|
||||||
|
@ -630,6 +634,28 @@ bool FurnaceGUIRenderGL::init(SDL_Window* win) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* FurnaceGUIRenderGL::getStupidFragment() {
|
||||||
|
return sh_oscRender_srcF;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FurnaceGUIRenderGL::regenOscShader(const char* fragment) {
|
||||||
|
if (sh_oscRender_have) {
|
||||||
|
furDeleteProgram(sh_oscRender_program);
|
||||||
|
furDeleteShader(sh_oscRender_vertex);
|
||||||
|
furDeleteShader(sh_oscRender_fragment);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((sh_oscRender_have=createShader(sh_oscRender_srcV,fragment,sh_oscRender_vertex,sh_oscRender_fragment,sh_oscRender_program,sh_oscRender_attrib))==true) {
|
||||||
|
sh_oscRender_uColor=furGetUniformLocation(sh_oscRender_program,"uColor");
|
||||||
|
sh_oscRender_uLineWidth=furGetUniformLocation(sh_oscRender_program,"uLineWidth");
|
||||||
|
sh_oscRender_uResolution=furGetUniformLocation(sh_oscRender_program,"uResolution");
|
||||||
|
sh_oscRender_oscVal=furGetUniformLocation(sh_oscRender_program,"oscVal");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void FurnaceGUIRenderGL::initGUI(SDL_Window* win) {
|
void FurnaceGUIRenderGL::initGUI(SDL_Window* win) {
|
||||||
ImGui_ImplSDL2_InitForOpenGL(win,context);
|
ImGui_ImplSDL2_InitForOpenGL(win,context);
|
||||||
ImGui_ImplOpenGL3_Init();
|
ImGui_ImplOpenGL3_Init();
|
||||||
|
|
|
@ -57,6 +57,8 @@ class FurnaceGUIRenderGL: public FurnaceGUIRender {
|
||||||
bool destroyTexture(FurnaceGUITexture* which);
|
bool destroyTexture(FurnaceGUITexture* which);
|
||||||
void setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode);
|
void setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode);
|
||||||
void setBlendMode(FurnaceGUIBlendMode mode);
|
void setBlendMode(FurnaceGUIBlendMode mode);
|
||||||
|
const char* getStupidFragment();
|
||||||
|
bool regenOscShader(const char* fragment);
|
||||||
void clear(ImVec4 color);
|
void clear(ImVec4 color);
|
||||||
bool newFrame();
|
bool newFrame();
|
||||||
void createFontsTexture();
|
void createFontsTexture();
|
||||||
|
|
Loading…
Reference in a new issue