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 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) {

View file

@ -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);

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)
);
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);

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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);

View file

@ -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();

View file

@ -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);