1
0
Fork 0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-12-23 01:59:43 +01:00

Don't draw texture onto itself for scrolling

Drawing a texture onto itself seems to produce issues on Metal.

To fix this, use a temporary texture instead, that then gets drawn onto
the original texture.

Fixes #927.
This commit is contained in:
Misa 2023-03-03 16:02:53 -08:00 committed by Misa Elizabeth Kai
parent 8c697487fd
commit 5eecc2a21d
2 changed files with 16 additions and 41 deletions

View file

@ -191,6 +191,7 @@ void Graphics::create_buffers(void)
menuoffTexture = CREATE_TEXTURE; menuoffTexture = CREATE_TEXTURE;
foregroundTexture = CREATE_TEXTURE; foregroundTexture = CREATE_TEXTURE;
backgroundTexture = CREATE_SCROLL_TEXTURE; backgroundTexture = CREATE_SCROLL_TEXTURE;
tempScrollingTexture = CREATE_SCROLL_TEXTURE;
towerbg.texture = CREATE_SCROLL_TEXTURE; towerbg.texture = CREATE_SCROLL_TEXTURE;
titlebg.texture = CREATE_SCROLL_TEXTURE; titlebg.texture = CREATE_SCROLL_TEXTURE;
@ -208,6 +209,7 @@ void Graphics::destroy_buffers(void)
VVV_freefunc(SDL_DestroyTexture, menuoffTexture); VVV_freefunc(SDL_DestroyTexture, menuoffTexture);
VVV_freefunc(SDL_DestroyTexture, foregroundTexture); VVV_freefunc(SDL_DestroyTexture, foregroundTexture);
VVV_freefunc(SDL_DestroyTexture, backgroundTexture); VVV_freefunc(SDL_DestroyTexture, backgroundTexture);
VVV_freefunc(SDL_DestroyTexture, tempScrollingTexture);
VVV_freefunc(SDL_DestroyTexture, towerbg.texture); VVV_freefunc(SDL_DestroyTexture, towerbg.texture);
VVV_freefunc(SDL_DestroyTexture, titlebg.texture); VVV_freefunc(SDL_DestroyTexture, titlebg.texture);
} }
@ -649,48 +651,20 @@ void Graphics::draw_sprite(const int x, const int y, const int t, const SDL_Colo
draw_grid_tile(grphx.im_sprites, t, x, y, sprites_rect.w, sprites_rect.h, color); draw_grid_tile(grphx.im_sprites, t, x, y, sprites_rect.w, sprites_rect.h, color);
} }
void Graphics::scroll_texture(SDL_Texture* texture, const int x, const int y) void Graphics::scroll_texture(SDL_Texture* texture, SDL_Texture* temp, const int x, const int y)
{ {
SDL_Texture* target = SDL_GetRenderTarget(gameScreen.m_renderer);
SDL_Rect texture_rect = {0, 0, 0, 0}; SDL_Rect texture_rect = {0, 0, 0, 0};
SDL_QueryTexture(texture, NULL, NULL, &texture_rect.w, &texture_rect.h); SDL_QueryTexture(texture, NULL, NULL, &texture_rect.w, &texture_rect.h);
if (x < 0) const SDL_Rect src = {0, 0, texture_rect.w, texture_rect.h};
{ const SDL_Rect dest = {x, y, texture_rect.w, texture_rect.h};
for (int i = 0; i < texture_rect.w; i -= x)
{
const SDL_Rect src = {i, 0, x * -1, texture_rect.h};
const SDL_Rect dest = {i + x, 0, x * -1, texture_rect.h};
copy_texture(texture, &src, &dest);
}
}
else if (x > 0)
{
for (int i = texture_rect.w; i > 0; i -= x)
{
const SDL_Rect src = {i - x, 0, x, texture_rect.h};
const SDL_Rect dest = {i, 0, x, texture_rect.h};
copy_texture(texture, &src, &dest);
}
}
if (y < 0) set_render_target(temp);
{ clear();
for (int i = 0; i < texture_rect.h; i -= y)
{
const SDL_Rect src = {0, i, texture_rect.w, y * -1};
const SDL_Rect dest = {0, i + y, texture_rect.w, y * -1};
copy_texture(texture, &src, &dest); copy_texture(texture, &src, &dest);
} set_render_target(target);
} copy_texture(temp, &src, &src);
else if (y > 0)
{
for (int i = texture_rect.h; i > 0; i -= y)
{
const SDL_Rect src = {0, i - y, texture_rect.w, y};
const SDL_Rect dest = {0, i, texture_rect.w, y};
copy_texture(texture, &src, &dest);
}
}
} }
#ifndef NO_CUSTOM_LEVELS #ifndef NO_CUSTOM_LEVELS
@ -2530,7 +2504,7 @@ void Graphics::updatebackground(int t)
if (backgrounddrawn) if (backgrounddrawn)
{ {
scroll_texture(backgroundTexture, -3, 0); scroll_texture(backgroundTexture, tempScrollingTexture, -3, 0);
for (int j = 0; j < 15; j++) for (int j = 0; j < 15; j++)
{ {
for (int i = 0; i < 2; i++) for (int i = 0; i < 2; i++)
@ -2573,7 +2547,7 @@ void Graphics::updatebackground(int t)
if (backgrounddrawn) if (backgrounddrawn)
{ {
scroll_texture(backgroundTexture, 0, -3); scroll_texture(backgroundTexture, tempScrollingTexture, 0, -3);
for (int j = 0; j < 2; j++) for (int j = 0; j < 2; j++)
{ {
for (int i = 0; i < 21; i++) for (int i = 0; i < 21; i++)
@ -2778,7 +2752,7 @@ void Graphics::updatetowerbackground(TowerBG& bg_obj)
else else
{ {
//just update the bottom //just update the bottom
scroll_texture(bg_obj.texture, 0, -bg_obj.bscroll); scroll_texture(bg_obj.texture, tempScrollingTexture, 0, -bg_obj.bscroll);
if (bg_obj.scrolldir == 0) if (bg_obj.scrolldir == 0)
{ {
for (int i = 0; i < 40; i++) for (int i = 0; i < 40; i++)

View file

@ -162,7 +162,7 @@ public:
void draw_sprite(int x, int y, int t, int r, int g, int b); void draw_sprite(int x, int y, int t, int r, int g, int b);
void draw_sprite(int x, int y, int t, SDL_Color color); void draw_sprite(int x, int y, int t, SDL_Color color);
void scroll_texture(SDL_Texture* texture, int x, int y); void scroll_texture(SDL_Texture* texture, SDL_Texture* temp, int x, int y);
void printcrewname(int x, int y, int t); void printcrewname(int x, int y, int t);
void printcrewnamedark(int x, int y, int t); void printcrewnamedark(int x, int y, int t);
@ -314,6 +314,7 @@ public:
SDL_Texture* ghostTexture; SDL_Texture* ghostTexture;
SDL_Texture* backgroundTexture; SDL_Texture* backgroundTexture;
SDL_Texture* foregroundTexture; SDL_Texture* foregroundTexture;
SDL_Texture* tempScrollingTexture;
TowerBG towerbg; TowerBG towerbg;
TowerBG titlebg; TowerBG titlebg;