libsdl-org / SDL

Simple Directmedia Layer
https://libsdl.org
zlib License
9.81k stars 1.82k forks source link

Renderer texture clipping no longer respects scale (`SDL_SetRenderScale`) #11318

Open AntTheAlchemist opened 2 days ago

AntTheAlchemist commented 2 days ago

A recent change has caused textures to be cut-off from being drawn (clipped) when a scale is being set. Seems to affecting all renderers and platforms.

SDL_SetRenderScale(renderer, 0.5f, 0.5f) will see textures only being draw on the top-left quarter of the window.

The cause of this will probably be clear to whomever made a recent commit relating to texture clipping logic / viewport.

slouken commented 2 days ago

@icculus probably knows what's going on here.

AntTheAlchemist commented 2 days ago

A little test to reproduce. SDL_RenderDebugText is SO useful!

#include <SDL3/SDL_main.h>
#include <SDL3/SDL.h>
int main(int argc, char** argv) {
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Window* win = SDL_CreateWindow(nullptr, 500, 500, SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIGH_PIXEL_DENSITY);
    SDL_Renderer* ren = SDL_CreateRenderer(win, nullptr);
    SDL_SetRenderVSync(ren, 1);
    SDL_SetRenderScale(ren, 0.5f, 0.5f);
    bool running = true;
    while(running) {
        SDL_PumpEvents();
        SDL_Event event;
        while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_EVENT_FIRST, SDL_EVENT_LAST) == 1) {
            switch (event.type) {
            case SDL_EVENT_QUIT:
                running = false;
                break;
            }
        }
        SDL_SetRenderDrawColor(ren, 0, 0, 0, SDL_ALPHA_OPAQUE);
        SDL_RenderClear(ren);
        SDL_SetRenderDrawColor(ren, 0, 255, 0, SDL_ALPHA_OPAQUE);
        for(int r = 0; r < 500; r++) 
            SDL_RenderDebugText(ren, SDL_randf() * 1000, SDL_randf() * 1000, "*");
        SDL_RenderPresent(ren);
        SDL_Delay(100);
    }
    SDL_DestroyRenderer(ren);
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}
AntTheAlchemist commented 1 day ago

Ah, yes. ef758d0 broke things for me.