renderGL1: more texture fixes

This commit is contained in:
tildearrow 2024-04-07 02:58:57 -05:00
parent 20e7c4633d
commit a793f286c5
8 changed files with 38 additions and 11 deletions

View file

@ -239,7 +239,7 @@ void FurnaceGUI::drawChanOsc() {
ImVec2 gradLeft=ImGui::GetCursorPos(); ImVec2 gradLeft=ImGui::GetCursorPos();
ImVec2 gradSize=ImVec2(400.0f*dpiScale,400.0f*dpiScale); 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(); ImVec2 gradLeftAbs=ImGui::GetItemRectMin();
if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) { if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) {
if (chanOscGrad.points.size()<32) { if (chanOscGrad.points.size()<32) {

View file

@ -1426,6 +1426,8 @@ enum FurnaceGUIBlendMode {
class FurnaceGUIRender { class FurnaceGUIRender {
public: public:
virtual ImTextureID getTextureID(FurnaceGUITexture* which); 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 lockTexture(FurnaceGUITexture* which, void** data, int* pitch);
virtual bool unlockTexture(FurnaceGUITexture* which); virtual bool unlockTexture(FurnaceGUITexture* which);
virtual bool updateTexture(FurnaceGUITexture* which, void* data, int pitch); virtual bool updateTexture(FurnaceGUITexture* which, void* data, int pitch);

View file

@ -63,10 +63,13 @@ void FurnaceGUI::drawImage(ImDrawList* dl, FurnaceGUIImages image, const ImVec2&
posAbs.y+rectMin.x*sin(rotate)+rectMax.y*cos(rotate) posAbs.y+rectMin.x*sin(rotate)+rectMax.y*cos(rotate)
); );
ImVec2 uv0=ImVec2(uvMin.x,uvMin.y); float uScale=rend->getTextureU(img);
ImVec2 uv1=ImVec2(uvMax.x,uvMin.y); float vScale=rend->getTextureV(img);
ImVec2 uv2=ImVec2(uvMax.x,uvMax.y);
ImVec2 uv3=ImVec2(uvMin.x,uvMax.y); 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); ImU32 colorConverted=ImGui::GetColorU32(imgColor);

View file

@ -23,6 +23,14 @@ ImTextureID FurnaceGUIRender::getTextureID(FurnaceGUITexture* which) {
return NULL; 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) { bool FurnaceGUIRender::lockTexture(FurnaceGUITexture* which, void** data, int* pitch) {
return false; return false;
} }

View file

@ -44,13 +44,23 @@ ImTextureID FurnaceGUIRenderGL1::getTextureID(FurnaceGUITexture* which) {
return (ImTextureID)ret; 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) { bool FurnaceGUIRenderGL1::lockTexture(FurnaceGUITexture* which, void** data, int* pitch) {
FurnaceGL1Texture* t=(FurnaceGL1Texture*)which; FurnaceGL1Texture* t=(FurnaceGL1Texture*)which;
if (t->lockedData!=NULL) return false; 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; *data=t->lockedData;
*pitch=t->width*4; *pitch=t->widthReal*4;
return true; return true;
} }
@ -59,7 +69,7 @@ bool FurnaceGUIRenderGL1::unlockTexture(FurnaceGUITexture* which) {
if (t->lockedData==NULL) return false; if (t->lockedData==NULL) return false;
C(glBindTexture(GL_TEXTURE_2D,t->id)); 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()); C(glFlush());
delete[] t->lockedData; delete[] t->lockedData;
@ -73,8 +83,10 @@ bool FurnaceGUIRenderGL1::updateTexture(FurnaceGUITexture* which, void* data, in
if (t->width*4!=pitch) return false; if (t->width*4!=pitch) return false;
logV("GL1 updateTexture...");
C(glBindTexture(GL_TEXTURE_2D,t->id)); 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; return true;
} }

View file

@ -28,6 +28,8 @@ class FurnaceGUIRenderGL1: public FurnaceGUIRender {
public: public:
ImTextureID getTextureID(FurnaceGUITexture* which); ImTextureID getTextureID(FurnaceGUITexture* which);
float getTextureU(FurnaceGUITexture* which);
float getTextureV(FurnaceGUITexture* which);
bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch); bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch);
bool unlockTexture(FurnaceGUITexture* which); bool unlockTexture(FurnaceGUITexture* which);
bool updateTexture(FurnaceGUITexture* which, void* data, int pitch); bool updateTexture(FurnaceGUITexture* which, void* data, int pitch);

View file

@ -1589,7 +1589,7 @@ void FurnaceGUI::drawSampleEdit() {
updateSampleTex=false; 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 rectMin=ImGui::GetItemRectMin();
ImVec2 rectMax=ImGui::GetItemRectMax(); ImVec2 rectMax=ImGui::GetItemRectMax();

View file

@ -843,7 +843,7 @@ void FurnaceGUI::drawTutorial() {
dl->AddRectFilled(ImVec2(0,0),ImVec2(canvasW,canvasH),0xff000000); 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) { if (mobileUI) {
dl->AddRect(dpadUpStart,dpadUpEnd,0xff0000ff,0,0,dpiScale); dl->AddRect(dpadUpStart,dpadUpEnd,0xff0000ff,0,0,dpiScale);