From e17df27f66da17bfb461caefe6d7dee44d5c9a5e Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 20 Feb 2024 15:40:48 -0500 Subject: [PATCH] GUI: new osc renderer, part 26 sorry another window --- src/gui/gui.cpp | 27 +++++++++++++++++++++++++++ src/gui/gui.h | 3 +++ src/gui/osc.cpp | 2 +- src/gui/render/abstract.cpp | 8 ++++++++ src/gui/render/renderGL.cpp | 34 ++++++++++++++++++++++++++++++---- src/gui/render/renderGL.h | 2 ++ 6 files changed, 71 insertions(+), 5 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 31df9002f..b4ed3b41d 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4674,6 +4674,30 @@ bool FurnaceGUI::loop() { 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 if (ImGui::IsMouseReleased(ImGuiMouseButton_Left) && selecting) { if (!selectingFull) cursor=selEnd; @@ -6950,6 +6974,9 @@ bool FurnaceGUI::init() { ImGui::CreateContext(); rend->initGUI(sdlWin); + // NEW CODE - REMOVE WHEN DONE + newOscFragment=rend->getStupidFragment(); + applyUISettings(); logD("building font..."); diff --git a/src/gui/gui.h b/src/gui/gui.h index 84c953403..c15167410 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -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 present(); virtual bool supportsDrawOsc(); + virtual const char* getStupidFragment(); + virtual bool regenOscShader(const char* fragment); virtual bool getOutputSize(int& w, int& h); virtual int getWindowFlags(); virtual void preInit(); @@ -1478,6 +1480,7 @@ class FurnaceGUI { int sampleTexW, sampleTexH; bool updateSampleTex; + String newOscFragment; String workingDir, fileName, clipboard, warnString, errorString, lastError, curFileName, nextFile, sysSearchQuery, newSongQuery, paletteQuery; String workingDirSong, workingDirIns, workingDirWave, workingDirSample, workingDirAudioExport; String workingDirVGMExport, workingDirZSMExport, workingDirROMExport, workingDirFont, workingDirColors, workingDirKeybinds; diff --git a/src/gui/osc.cpp b/src/gui/osc.cpp index 990363e0f..a70d244a7 100644 --- a/src/gui/osc.cpp +++ b/src/gui/osc.cpp @@ -307,7 +307,7 @@ void FurnaceGUI::drawOsc() { } else { for (int i=0; i0.5f) y=0.5f; diff --git a/src/gui/render/abstract.cpp b/src/gui/render/abstract.cpp index 2b5e9413d..4d304e2e0 100644 --- a/src/gui/render/abstract.cpp +++ b/src/gui/render/abstract.cpp @@ -110,5 +110,13 @@ bool FurnaceGUIRender::isDead() { return false; } +const char* FurnaceGUIRender::getStupidFragment() { + return "Only OpenGL"; +} + +bool FurnaceGUIRender::regenOscShader(const char* fragment) { + return false; +} + FurnaceGUIRender::~FurnaceGUIRender() { } diff --git a/src/gui/render/renderGL.cpp b/src/gui/render/renderGL.cpp index fa51f71e4..1349c919e 100644 --- a/src/gui/render/renderGL.cpp +++ b/src/gui/render/renderGL.cpp @@ -46,6 +46,8 @@ PFNGLATTACHSHADERPROC furAttachShader=NULL; PFNGLBINDATTRIBLOCATIONPROC furBindAttribLocation=NULL; PFNGLCREATEPROGRAMPROC furCreateProgram=NULL; PFNGLLINKPROGRAMPROC furLinkProgram=NULL; +PFNGLDELETEPROGRAMPROC furDeleteProgram=NULL; +PFNGLDELETESHADERPROC furDeleteShader=NULL; PFNGLGETPROGRAMIVPROC furGetProgramiv=NULL; PFNGLUSEPROGRAMPROC furUseProgram=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)