veandco / go-sdl2

SDL2 binding for Go
https://godoc.org/github.com/veandco/go-sdl2
BSD 3-Clause "New" or "Revised" License
2.21k stars 221 forks source link

Problem: It is not possible to use multiple Viewports #450

Closed chilicat closed 4 years ago

chilicat commented 4 years ago

consider the following example. It creates two viewports and draws a simple rect into each. I would expect to see a blue rect at 0,0 and a green rect at 200,0 but I only see the blue rect.

` renderer.SetDrawColor(0, 0, 0, 0) renderer.Clear() rect := &sdl.Rect{0, 0, 100, 100}

    viewport1 := &sdl.Rect{0, 0, 100, 100}
    renderer.SetViewport(viewport1)
    renderer.SetDrawColor(0, 0, 255, 0)
    renderer.FillRect(rect)

    viewport2 := &sdl.Rect{200, 0, 100, 100}
    renderer.SetViewport(viewport2)
    renderer.SetDrawColor(0, 255, 0, 0)
    renderer.FillRect(rect)

    renderer.Present()
    sdl.Delay(100)

`

go-sdl2: v0.4.0 Platform: MacOS Mojave

veeableful commented 4 years ago

Hi @chilicat, it seems to be the same with the C version below. I tried on Linux which worked but then it didn't work when I tried on macOS Mojave. I modified it a bit to have event loop which sometimes help but it still happens. I posted a question on the SDL2 Discourse here.

#include <SDL2/SDL.h>

static const int WINDOW_WIDTH  = 800;
static const int WINDOW_HEIGHT = 600;

int main()
{
    SDL_Init(SDL_INIT_EVERYTHING);

    SDL_Window *window = SDL_CreateWindow("Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, 0);
    SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    SDL_bool running = SDL_TRUE;

    while (running) {
        SDL_Event event;

        while (SDL_PollEvent(&event)) {
            switch (event.type) {
            case SDL_QUIT:
                running = SDL_FALSE;
                break;
            }
        }

        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
        SDL_RenderClear(renderer);
        SDL_Rect rect = {0, 0, 100, 100};

        SDL_Rect viewport1 = {0, 0, 100, 100};
        SDL_RenderSetViewport(renderer, &viewport1);
        SDL_SetRenderDrawColor(renderer, 0, 0, 255, 0);
        SDL_RenderFillRect(renderer, &rect);

        SDL_Rect viewport2 = {200, 0, 100, 100};
        SDL_RenderSetViewport(renderer, &viewport2);
        SDL_SetRenderDrawColor(renderer, 0, 255, 0, 0);
        SDL_RenderFillRect(renderer, &rect);

        SDL_RenderPresent(renderer);
        SDL_Delay(16);
    }

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}
veeableful commented 4 years ago

Hi @chilicat, it seems like it is a bug in SDL2. It's been fixed in Mercurial so it should be okay in the next release of SDL2!

chilicat commented 4 years ago

Ok, I close the ticket since it is an upstream issue. Thanks @veeableful.