Fix RenderTexture Y-flip and add text debug output
RenderTexture fix: - Add flippedY_ flag to Texture class for tracking FBO textures - RenderTexture marks its texture as Y-flipped - Sprite::draw() flips V coordinates for flipped textures - This should fix upside-down entities and grid content Text debug: - Log first glyph UV coordinates - Log texture binding in drawTriangles for Text shader - Warn if Text shader used without texture bound Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
50b63a8d06
commit
d89376901a
2 changed files with 36 additions and 0 deletions
|
|
@ -460,6 +460,22 @@ void SDL2Renderer::drawTriangles(const float* vertices, size_t vertexCount,
|
||||||
glBindTexture(GL_TEXTURE_2D, textureId);
|
glBindTexture(GL_TEXTURE_2D, textureId);
|
||||||
int texLoc = glGetUniformLocation(program, "u_texture");
|
int texLoc = glGetUniformLocation(program, "u_texture");
|
||||||
glUniform1i(texLoc, 0);
|
glUniform1i(texLoc, 0);
|
||||||
|
|
||||||
|
// Debug: verify texture binding for text shader
|
||||||
|
static int texBindDebug = 0;
|
||||||
|
if (texBindDebug < 2 && shaderType == ShaderType::Text) {
|
||||||
|
std::cout << "drawTriangles(Text): textureId=" << textureId
|
||||||
|
<< " texLoc=" << texLoc << " program=" << program << std::endl;
|
||||||
|
texBindDebug++;
|
||||||
|
}
|
||||||
|
} else if (shaderType == ShaderType::Text) {
|
||||||
|
// This would explain solid boxes - texture not being bound!
|
||||||
|
static bool warnOnce = true;
|
||||||
|
if (warnOnce) {
|
||||||
|
std::cerr << "WARNING: Text shader used but texture not bound! texCoords="
|
||||||
|
<< (texCoords ? "valid" : "null") << " textureId=" << textureId << std::endl;
|
||||||
|
warnOnce = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
|
|
@ -1022,6 +1038,7 @@ bool RenderTexture::create(unsigned int width, unsigned int height) {
|
||||||
// Set up internal texture to point to FBO color attachment
|
// Set up internal texture to point to FBO color attachment
|
||||||
texture_.setNativeHandle(colorTexture);
|
texture_.setNativeHandle(colorTexture);
|
||||||
texture_.setSize(width, height); // Critical: Sprite::draw needs texture size for UV calc
|
texture_.setSize(width, height); // Critical: Sprite::draw needs texture size for UV calc
|
||||||
|
texture_.setFlippedY(true); // FBO textures are Y-flipped in OpenGL
|
||||||
|
|
||||||
view_ = View(FloatRect(0, 0, static_cast<float>(width), static_cast<float>(height)));
|
view_ = View(FloatRect(0, 0, static_cast<float>(width), static_cast<float>(height)));
|
||||||
defaultView_ = view_;
|
defaultView_ = view_;
|
||||||
|
|
@ -1544,6 +1561,13 @@ void Sprite::draw(RenderTarget& target, RenderStates states) const {
|
||||||
float u1 = (rect.left + rect.width) / static_cast<float>(texSize.x);
|
float u1 = (rect.left + rect.width) / static_cast<float>(texSize.x);
|
||||||
float v1 = (rect.top + rect.height) / static_cast<float>(texSize.y);
|
float v1 = (rect.top + rect.height) / static_cast<float>(texSize.y);
|
||||||
|
|
||||||
|
// For RenderTexture (FBO) textures, flip V coordinates
|
||||||
|
// OpenGL FBOs store content with Y=0 at bottom, but we sample assuming Y=0 at top
|
||||||
|
if (texture_->isFlippedY()) {
|
||||||
|
v0 = 1.0f - v0;
|
||||||
|
v1 = 1.0f - v1;
|
||||||
|
}
|
||||||
|
|
||||||
// Two triangles forming a quad (6 vertices)
|
// Two triangles forming a quad (6 vertices)
|
||||||
float vertices[] = {
|
float vertices[] = {
|
||||||
p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, // Triangle 1
|
p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, // Triangle 1
|
||||||
|
|
@ -1667,6 +1691,15 @@ void Text::draw(RenderTarget& target, RenderStates states) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!vertices.empty()) {
|
if (!vertices.empty()) {
|
||||||
|
// Debug: log first glyph's UVs
|
||||||
|
static int uvDebugCount = 0;
|
||||||
|
if (uvDebugCount < 2 && texcoords.size() >= 12) {
|
||||||
|
std::cout << "Text UVs for first glyph: u0=" << texcoords[0] << " v0=" << texcoords[1]
|
||||||
|
<< " u1=" << texcoords[4] << " v1=" << texcoords[5]
|
||||||
|
<< " (vertexCount=" << (vertices.size()/2) << ")" << std::endl;
|
||||||
|
uvDebugCount++;
|
||||||
|
}
|
||||||
|
|
||||||
// Use text shader (uses alpha from texture, not full RGBA multiply)
|
// Use text shader (uses alpha from texture, not full RGBA multiply)
|
||||||
SDL2Renderer::getInstance().drawTriangles(
|
SDL2Renderer::getInstance().drawTriangles(
|
||||||
vertices.data(), vertices.size() / 2,
|
vertices.data(), vertices.size() / 2,
|
||||||
|
|
|
||||||
|
|
@ -656,6 +656,7 @@ class Texture {
|
||||||
unsigned int textureId_ = 0;
|
unsigned int textureId_ = 0;
|
||||||
bool smooth_ = false;
|
bool smooth_ = false;
|
||||||
bool repeated_ = false;
|
bool repeated_ = false;
|
||||||
|
bool flippedY_ = false; // True for RenderTexture (FBO) textures
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Texture() = default;
|
Texture() = default;
|
||||||
|
|
@ -671,6 +672,8 @@ public:
|
||||||
|
|
||||||
Vector2u getSize() const { return size_; }
|
Vector2u getSize() const { return size_; }
|
||||||
void setSize(unsigned int width, unsigned int height) { size_ = Vector2u(width, height); }
|
void setSize(unsigned int width, unsigned int height) { size_ = Vector2u(width, height); }
|
||||||
|
void setFlippedY(bool flipped) { flippedY_ = flipped; }
|
||||||
|
bool isFlippedY() const { return flippedY_; }
|
||||||
void setSmooth(bool smooth); // Implemented in SDL2Renderer.cpp
|
void setSmooth(bool smooth); // Implemented in SDL2Renderer.cpp
|
||||||
bool isSmooth() const { return smooth_; }
|
bool isSmooth() const { return smooth_; }
|
||||||
void setRepeated(bool repeated); // Implemented in SDL2Renderer.cpp
|
void setRepeated(bool repeated); // Implemented in SDL2Renderer.cpp
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue