textures.c: fix regressions for loner textures

This commit is contained in:
veclav talica 2024-07-14 18:36:48 +03:00
parent bd53a931c0
commit 7218acb40b
4 changed files with 19 additions and 12 deletions

View File

@ -11,20 +11,20 @@ static void ingame_tick(struct state *state) {
world_drawdef(scn->world);
player_calc(scn->player);
unfurl_triangle("/assets/player/baron-walk.png",
unfurl_triangle("/assets/big-violet.png",
(t_fvec3){ -1, -1, 0 },
(t_fvec3){ 1, -1, 0 },
(t_fvec3){ 1, 1, 0 },
(t_shvec2){ 0, 0 },
(t_shvec2){ 48, 0 },
(t_shvec2){ 48, 48 });
(t_shvec2){ 2048, 0 },
(t_shvec2){ 2048, 2048 });
unfurl_triangle("/assets/player/baron-walk.png",
unfurl_triangle("/assets/big-violet.png",
(t_fvec3){ 1, 1, 0 },
(t_fvec3){ -1, 1, 0 },
(t_fvec3){ -1, -1, 0 },
(t_shvec2){ 48, 48 },
(t_shvec2){ 0, 48 },
(t_shvec2){ 2048, 2048 },
(t_shvec2){ 0, 2048 },
(t_shvec2){ 0, 0 });
}

View File

@ -25,8 +25,7 @@ struct texture_cache_item {
struct texture_cache {
/* from context */
SDL_Window *window;
SDL_Window *window; /* from context */
struct texture_cache_item *hash;
@ -34,7 +33,7 @@ struct texture_cache {
SDL_Surface **atlas_surfaces;
GLuint *atlas_textures; /* shared by atlas textures */
int atlas_index;
int atlas_index; /* atlas that is currently being built */
bool is_dirty; /* current atlas needs to be recreated */
};

View File

@ -537,7 +537,6 @@ void render(void) {
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(60, 1, 0, 0);
glEnable(GL_CULL_FACE);
glDepthFunc(GL_LESS);

View File

@ -125,6 +125,7 @@ static void upload_texture_from_surface(GLuint texture, SDL_Surface *surface) {
static void recreate_current_atlas_texture(struct texture_cache *cache) {
/* TODO: figure out if SDL_UpdateTexture alone is faster than blitting */
/* TODO: should surfaces be freed after they cannot be referenced in atlas builing? */
SDL_Surface *atlas_surface = cache->atlas_surfaces[cache->atlas_index];
/* clear */
@ -132,9 +133,14 @@ static void recreate_current_atlas_texture(struct texture_cache *cache) {
/* blit the texture surfaces onto the atlas */
for (size_t i = 0; i < shlenu(cache->hash); ++i) {
/* skip all that aren't part of currently built one */
if (cache->hash[i].value.atlas_index != cache->atlas_index)
continue;
/* skip loners */
if (cache->hash[i].value.loner_texture != 0)
continue;
SDL_BlitSurface(cache->hash[i].value.data,
NULL,
atlas_surface,
@ -155,7 +161,10 @@ static void recreate_current_atlas_texture(struct texture_cache *cache) {
static stbrp_rect *create_rects_from_cache(struct texture_cache *cache) {
stbrp_rect *rects = NULL;
for (size_t i = 0; i < shlenu(cache->hash); ++i) {
SDL_Surface *surface_data = cache->hash[i].value.data;
if (cache->hash[i].value.loner_texture != 0)
continue;
const SDL_Surface *surface_data = cache->hash[i].value.data;
stbrp_rect new_rect = {
.w = surface_data->w,
.h = surface_data->h,
@ -293,7 +302,7 @@ static t_texture_key textures_load(struct texture_cache *cache, const char *path
new_texture.data = surface;
/* it's a "loner texture," it doesn't fit in an atlas so it's not in one */
if (surface->w > TEXTURE_ATLAS_SIZE || surface->h > TEXTURE_ATLAS_SIZE) {
if (surface->w >= TEXTURE_ATLAS_SIZE || surface->h >= TEXTURE_ATLAS_SIZE) {
new_texture.loner_texture = new_gl_texture();
upload_texture_from_surface(new_texture.loner_texture, surface);
new_texture.srcrect = (t_rect) { .w = surface->w, .h = surface->h };