From a793f286c581a3314730cc376119358ddb10c0e1 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 7 Apr 2024 02:58:57 -0500 Subject: [PATCH] renderGL1: more texture fixes --- src/gui/chanOsc.cpp | 2 +- src/gui/gui.h | 2 ++ src/gui/intro.cpp | 11 +++++++---- src/gui/render/abstract.cpp | 8 ++++++++ src/gui/render/renderGL1.cpp | 20 ++++++++++++++++---- src/gui/render/renderGL1.h | 2 ++ src/gui/sampleEdit.cpp | 2 +- src/gui/tutorial.cpp | 2 +- 8 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/gui/chanOsc.cpp b/src/gui/chanOsc.cpp index a75698111..bb7e345be 100644 --- a/src/gui/chanOsc.cpp +++ b/src/gui/chanOsc.cpp @@ -239,7 +239,7 @@ void FurnaceGUI::drawChanOsc() { ImVec2 gradLeft=ImGui::GetCursorPos(); ImVec2 gradSize=ImVec2(400.0f*dpiScale,400.0f*dpiScale); - ImGui::Image(rend->getTextureID(chanOscGradTex),gradSize); + ImGui::Image(rend->getTextureID(chanOscGradTex),gradSize,ImVec2(0,0),ImVec2(rend->getTextureU(chanOscGradTex),rend->getTextureV(chanOscGradTex))); ImVec2 gradLeftAbs=ImGui::GetItemRectMin(); if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) { if (chanOscGrad.points.size()<32) { diff --git a/src/gui/gui.h b/src/gui/gui.h index 4b5500200..0e57cc97b 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1426,6 +1426,8 @@ enum FurnaceGUIBlendMode { class FurnaceGUIRender { public: virtual ImTextureID getTextureID(FurnaceGUITexture* which); + virtual float getTextureU(FurnaceGUITexture* which); + virtual float getTextureV(FurnaceGUITexture* which); virtual bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch); virtual bool unlockTexture(FurnaceGUITexture* which); virtual bool updateTexture(FurnaceGUITexture* which, void* data, int pitch); diff --git a/src/gui/intro.cpp b/src/gui/intro.cpp index e87482d9d..cbb4ff042 100644 --- a/src/gui/intro.cpp +++ b/src/gui/intro.cpp @@ -63,10 +63,13 @@ void FurnaceGUI::drawImage(ImDrawList* dl, FurnaceGUIImages image, const ImVec2& posAbs.y+rectMin.x*sin(rotate)+rectMax.y*cos(rotate) ); - ImVec2 uv0=ImVec2(uvMin.x,uvMin.y); - ImVec2 uv1=ImVec2(uvMax.x,uvMin.y); - ImVec2 uv2=ImVec2(uvMax.x,uvMax.y); - ImVec2 uv3=ImVec2(uvMin.x,uvMax.y); + float uScale=rend->getTextureU(img); + float vScale=rend->getTextureV(img); + + ImVec2 uv0=ImVec2(uvMin.x*uScale,uvMin.y*vScale); + ImVec2 uv1=ImVec2(uvMax.x*uScale,uvMin.y*vScale); + ImVec2 uv2=ImVec2(uvMax.x*uScale,uvMax.y*vScale); + ImVec2 uv3=ImVec2(uvMin.x*uScale,uvMax.y*vScale); ImU32 colorConverted=ImGui::GetColorU32(imgColor); diff --git a/src/gui/render/abstract.cpp b/src/gui/render/abstract.cpp index aaab1bdf1..8a3ebcc82 100644 --- a/src/gui/render/abstract.cpp +++ b/src/gui/render/abstract.cpp @@ -23,6 +23,14 @@ ImTextureID FurnaceGUIRender::getTextureID(FurnaceGUITexture* which) { return NULL; } +float FurnaceGUIRender::getTextureU(FurnaceGUITexture* which) { + return 1.0; +} + +float FurnaceGUIRender::getTextureV(FurnaceGUITexture* which) { + return 1.0; +} + bool FurnaceGUIRender::lockTexture(FurnaceGUITexture* which, void** data, int* pitch) { return false; } diff --git a/src/gui/render/renderGL1.cpp b/src/gui/render/renderGL1.cpp index 221c4c941..71c52f389 100644 --- a/src/gui/render/renderGL1.cpp +++ b/src/gui/render/renderGL1.cpp @@ -44,13 +44,23 @@ ImTextureID FurnaceGUIRenderGL1::getTextureID(FurnaceGUITexture* which) { return (ImTextureID)ret; } +float FurnaceGUIRenderGL1::getTextureU(FurnaceGUITexture* which) { + FurnaceGL1Texture* t=(FurnaceGL1Texture*)which; + return (float)t->width/(float)t->widthReal; +} + +float FurnaceGUIRenderGL1::getTextureV(FurnaceGUITexture* which) { + FurnaceGL1Texture* t=(FurnaceGL1Texture*)which; + return (float)t->height/(float)t->heightReal; +} + bool FurnaceGUIRenderGL1::lockTexture(FurnaceGUITexture* which, void** data, int* pitch) { FurnaceGL1Texture* t=(FurnaceGL1Texture*)which; if (t->lockedData!=NULL) return false; - t->lockedData=new unsigned char[t->width*t->height*4]; + t->lockedData=new unsigned char[t->widthReal*t->heightReal*4]; *data=t->lockedData; - *pitch=t->width*4; + *pitch=t->widthReal*4; return true; } @@ -59,7 +69,7 @@ bool FurnaceGUIRenderGL1::unlockTexture(FurnaceGUITexture* which) { if (t->lockedData==NULL) return false; C(glBindTexture(GL_TEXTURE_2D,t->id)); - C(glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,t->width,t->height,0,GL_RGBA,GL_UNSIGNED_BYTE,t->lockedData)); + C(glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,t->widthReal,t->heightReal,0,GL_RGBA,GL_UNSIGNED_BYTE,t->lockedData)); C(glFlush()); delete[] t->lockedData; @@ -73,8 +83,10 @@ bool FurnaceGUIRenderGL1::updateTexture(FurnaceGUITexture* which, void* data, in if (t->width*4!=pitch) return false; + logV("GL1 updateTexture..."); + C(glBindTexture(GL_TEXTURE_2D,t->id)); - C(glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,t->width,t->height,0,GL_RGBA,GL_UNSIGNED_BYTE,data)); + C(glTexSubImage2D(GL_TEXTURE_2D,0,0,0,t->width,t->height,GL_RGBA,GL_UNSIGNED_BYTE,data)); return true; } diff --git a/src/gui/render/renderGL1.h b/src/gui/render/renderGL1.h index e55263563..29d9837fe 100644 --- a/src/gui/render/renderGL1.h +++ b/src/gui/render/renderGL1.h @@ -28,6 +28,8 @@ class FurnaceGUIRenderGL1: public FurnaceGUIRender { public: ImTextureID getTextureID(FurnaceGUITexture* which); + float getTextureU(FurnaceGUITexture* which); + float getTextureV(FurnaceGUITexture* which); bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch); bool unlockTexture(FurnaceGUITexture* which); bool updateTexture(FurnaceGUITexture* which, void* data, int pitch); diff --git a/src/gui/sampleEdit.cpp b/src/gui/sampleEdit.cpp index 6440ebf55..d53c61368 100644 --- a/src/gui/sampleEdit.cpp +++ b/src/gui/sampleEdit.cpp @@ -1589,7 +1589,7 @@ void FurnaceGUI::drawSampleEdit() { updateSampleTex=false; } - ImGui::ImageButton(rend->getTextureID(sampleTex),avail,ImVec2(0,0),ImVec2(1,1),0); + ImGui::ImageButton(rend->getTextureID(sampleTex),avail,ImVec2(0,0),ImVec2(rend->getTextureU(sampleTex),rend->getTextureV(sampleTex)),0); ImVec2 rectMin=ImGui::GetItemRectMin(); ImVec2 rectMax=ImGui::GetItemRectMax(); diff --git a/src/gui/tutorial.cpp b/src/gui/tutorial.cpp index 709a60d1a..f3a9ad261 100644 --- a/src/gui/tutorial.cpp +++ b/src/gui/tutorial.cpp @@ -843,7 +843,7 @@ void FurnaceGUI::drawTutorial() { dl->AddRectFilled(ImVec2(0,0),ImVec2(canvasW,canvasH),0xff000000); - dl->AddImage(rend->getTextureID(cvTex),p0,p1); + dl->AddImage(rend->getTextureID(cvTex),p0,p1,ImVec2(0,0),ImVec2(rend->getTextureU(cvTex),rend->getTextureV(cvTex))); if (mobileUI) { dl->AddRect(dpadUpStart,dpadUpEnd,0xff0000ff,0,0,dpiScale);