Skip to content

Commit f1e89ed

Browse files
committed
ui: add mechanism that clear/update cached textures
1 parent 1811409 commit f1e89ed

File tree

7 files changed

+72
-60
lines changed

7 files changed

+72
-60
lines changed

src/graphics/boilerplate.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,15 @@ void graphics_draw_inset_rect(vec2i start, vec2i size) {
5959
}
6060

6161
int graphics_save_to_texture(int image_id, vec2i pos, vec2i size) {
62-
return graphics_renderer()->save_texture_from_screen(image_id, pos.x, pos.y, size.x, size.y);
62+
return graphics_renderer()->save_texture_from_screen(image_id, pos, size.x, size.y);
6363
}
6464

6565
void graphics_delete_saved_texture(int image_id) {
66-
return graphics_renderer()->delete_saved_texture(image_id);
66+
graphics_renderer()->delete_saved_texture(image_id);
67+
}
68+
69+
void graphics_clear_saved_texture(int image_id, color clr) {
70+
graphics_renderer()->clear_saved_texture(image_id, clr);
6771
}
6872

6973
void graphics_draw_from_texture(int image_id, vec2i pos, vec2i size) {

src/graphics/graphics.h

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ void graphics_fill_rect(vec2i start, vec2i size, color color);
3030
void graphics_shade_rect(vec2i start, vec2i size, int darkness);
3131

3232
int graphics_save_to_texture(int image_id, vec2i pos, vec2i size);
33+
void graphics_clear_saved_texture(int image_id, color clr);
3334
void graphics_delete_saved_texture(int image_id);
3435
void graphics_draw_from_texture(int image_id, vec2i pos, vec2i size);
3536

src/platform/renderer.cpp

+48-9
Original file line numberDiff line numberDiff line change
@@ -418,15 +418,34 @@ static buffer_texture* get_saved_texture_info(int texture_id) {
418418
return (it != data.texture_buffers.end() ? it : nullptr);
419419
}
420420

421-
int graphics_renderer_interface::save_texture_from_screen(int texture_id, int x, int y, int width, int height) {
421+
int graphics_renderer_interface::save_texture_from_screen(int texture_id, vec2i pos, int width, int height) {
422422
auto &data = g_renderer_data;
423423
SDL_Texture* former_target = SDL_GetRenderTarget(data.renderer);
424424
if (!former_target) {
425425
return 0;
426426
}
427427

428428
buffer_texture texture_info;
429-
texture_info.texture = SDL_CreateTexture(data.renderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_TARGET, width, height);
429+
buffer_texture *exist_texture_info = get_saved_texture_info(texture_id);
430+
if (exist_texture_info) {
431+
int w, h;
432+
uint32_t format;
433+
SDL_QueryTexture(exist_texture_info->texture, &format, nullptr, &w, &h);
434+
if (w == width && h == height) {
435+
texture_info = *exist_texture_info;
436+
}
437+
}
438+
439+
if (!texture_info.texture) {
440+
texture_info.texture = SDL_CreateTexture(data.renderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_TARGET, width, height);
441+
442+
texture_info.id = ++data.texture_buffer_id;
443+
texture_info.width = width;
444+
texture_info.height = height;
445+
446+
data.texture_buffers.push_back(texture_info);
447+
}
448+
430449
if (!texture_info.texture) {
431450
return 0;
432451
}
@@ -439,19 +458,13 @@ int graphics_renderer_interface::save_texture_from_screen(int texture_id, int x,
439458

440459
SDL_Rect former_viewport;
441460
SDL_RenderGetViewport(data.renderer, &former_viewport);
442-
SDL_Rect src_rect = {x + former_viewport.x, y + former_viewport.y, width, height};
461+
SDL_Rect src_rect = {pos.x + former_viewport.x, pos.y + former_viewport.y, width, height};
443462
SDL_Rect dst_rect = {0, 0, width, height};
444463
SDL_SetRenderTarget(data.renderer, texture_info.texture);
445464
SDL_RenderCopy(data.renderer, former_target, &src_rect, &dst_rect);
446465
SDL_SetRenderTarget(data.renderer, former_target);
447466
SDL_RenderSetViewport(data.renderer, &former_viewport);
448467

449-
texture_info.id = ++data.texture_buffer_id;
450-
texture_info.width = width;
451-
texture_info.height = height;
452-
453-
data.texture_buffers.push_back(texture_info);
454-
455468
return texture_info.id;
456469
}
457470

@@ -478,6 +491,32 @@ void graphics_renderer_interface::draw_saved_texture_to_screen(int texture_id, i
478491
SDL_RenderCopy(data.renderer, texture_info->texture, &src_coords, &dst_coords);
479492
}
480493

494+
void graphics_renderer_interface::clear_saved_texture(int texture_id, color clr) {
495+
auto &data = g_renderer_data;
496+
SDL_Texture *former_target = SDL_GetRenderTarget(data.renderer);
497+
if (!former_target) {
498+
return;
499+
}
500+
501+
buffer_texture *texture_info = get_saved_texture_info(texture_id);
502+
if (!texture_info) {
503+
return;
504+
}
505+
506+
SDL_Rect former_viewport;
507+
SDL_RenderGetViewport(data.renderer, &former_viewport);
508+
SDL_Rect dst_rect = { 0, 0, texture_info->width, texture_info->height };
509+
SDL_SetRenderTarget(data.renderer, texture_info->texture);
510+
SDL_SetRenderDrawColor(data.renderer,
511+
(clr & COLOR_CHANNEL_ALPHA) >> COLOR_BITSHIFT_ALPHA,
512+
(clr & COLOR_CHANNEL_RED) >> COLOR_BITSHIFT_RED,
513+
(clr & COLOR_CHANNEL_GREEN) >> COLOR_BITSHIFT_GREEN,
514+
(clr & COLOR_CHANNEL_BLUE) >> COLOR_BITSHIFT_BLUE);
515+
516+
SDL_SetRenderTarget(data.renderer, former_target);
517+
SDL_RenderSetViewport(data.renderer, &former_viewport);
518+
}
519+
481520
static void create_blend_texture(int type) {
482521
auto &data = g_renderer_data;
483522
SDL_Texture* texture = SDL_CreateTexture(data.renderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_TARGET, 58, 30);

src/platform/renderer.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,10 @@ class graphics_renderer_interface {
8484
void update_custom_texture_yuv(int type, const uint8_t* y_data, int y_width, const uint8_t* cb_data, int cb_width, const uint8_t* cr_data, int cr_width);
8585
void draw_custom_texture(int type, int x, int y, float scale);
8686

87-
int save_texture_from_screen(int image_id, int x, int y, int width, int height);
87+
int save_texture_from_screen(int image_id, vec2i pos, int width, int height);
8888
void delete_saved_texture(int image_id);
8989
void draw_saved_texture_to_screen(int image_id, int x, int y, int width, int height);
90+
void clear_saved_texture(int image_id, color clr);
9091
void set_texture_scale_mode(SDL_Texture *texture, float scale_factor);
9192
unsigned int premult_alpha();
9293

src/widget/widget_minimap.cpp

+12-40
Original file line numberDiff line numberDiff line change
@@ -123,21 +123,10 @@ void minimap_window::draw_foreground() {
123123
graphics_set_clip_rectangle(screen_offset, size);
124124

125125
if (refresh_requested || scroll_in_progress() || draw_force) {
126-
// if (data.refresh_requested) {
127126
draw_uncached(screen_offset);
128127
refresh_requested = 0;
129-
// } else {
130-
// draw_using_cache(x_offset, y_offset, width_tiles, height_tiles, scroll_in_progress());
131-
// }
132-
// if (GAME_ENV == ENGINE_ENV_C3) {
133-
// graphics_draw_horizontal_line(x_offset - 1, x_offset - 1 + width_tiles * 2, y_offset - 1,
134-
// COLOR_MINIMAP_DARK);
135-
// graphics_draw_vertical_line(x_offset - 1, y_offset, y_offset + height_tiles, COLOR_MINIMAP_DARK);
136-
// graphics_draw_vertical_line(x_offset - 1 + width_tiles * 2, y_offset, y_offset + height_tiles,
137-
// COLOR_MINIMAP_LIGHT);
138-
// }
139128
} else {
140-
//draw_using_cache(screen_offset);
129+
graphics_draw_from_texture(cached_texture, screen_offset, size);
141130
}
142131

143132
draw_force = false;
@@ -226,8 +215,9 @@ void minimap_window::draw_minimap_tile(vec2i screen, tile2i point) {
226215
int terrain = map_terrain_get(grid_offset);
227216
// exception for fort ground: display as empty land
228217
if (terrain & TERRAIN_BUILDING) {
229-
if (building_at(grid_offset)->type == BUILDING_FORT_GROUND)
218+
if (building_at(grid_offset)->type == BUILDING_FORT_GROUND) {
230219
terrain = 0;
220+
}
231221
}
232222

233223
if (terrain & TERRAIN_BUILDING) {
@@ -340,42 +330,24 @@ void minimap_window::draw_viewport_rectangle(painter &ctx) {
340330
graphics_draw_rect(vec2i{x_offset, y_offset}, vec2i{view_width_tiles * 2 + 8, view_height_tiles + 3}, COLOR_MINIMAP_VIEWPORT);
341331
}
342332

343-
static void prepare_minimap_cache(int width, int height) {
344-
return;
345-
// if (width != data.width || height != data.height ||
346-
// !graphics_renderer()->has_custom_image(CUSTOM_IMAGE_MINIMAP)) {
347-
// graphics_renderer()->create_custom_image(CUSTOM_IMAGE_MINIMAP, width, height);
348-
// }
349-
// data.cache = graphics_renderer()->get_custom_image_buffer(CUSTOM_IMAGE_MINIMAP, &data.cache_width);
350-
}
351-
352333
void minimap_window::clear() {
353-
for (int y = 0; y < size.y; y++) {
354-
color* line = &cache[y * cache_width];
355-
for (int x = 0; x < cache_width; x++) {
356-
line[x] = COLOR_BLACK;
357-
}
358-
}
334+
graphics_clear_saved_texture(cached_texture, 0xff000000);
359335
}
360336

361337
void minimap_window::draw() {
362-
if (frame_num % 30 == 0) {
363-
OZZY_PROFILER_SECTION("Render/Frame/Window/City/Sidebar Expanded/Minimap Tiles");
364-
clear();
365-
city_view_foreach_minimap_tile(screen_offset.x, screen_offset.y, absolute_tile.x(), absolute_tile.y(), draw_size.x, draw_size.y, [this] (vec2i screen, tile2i point) {
366-
draw_minimap_tile(screen, point);
367-
});
368-
// graphics_renderer()->update_custom_image(CUSTOM_IMAGE_MINIMAP);
369-
// graphics_renderer()->draw_custom_image(CUSTOM_IMAGE_MINIMAP, data.x_offset, data.y_offset, 1.0f);
370-
}
371-
frame_num++;
338+
OZZY_PROFILER_SECTION("Render/Frame/Window/City/Sidebar Expanded/Minimap Tiles");
339+
clear();
340+
city_view_foreach_minimap_tile(screen_offset.x, screen_offset.y, absolute_tile.x(), absolute_tile.y(), draw_size.x, draw_size.y, [this] (vec2i screen, tile2i point) {
341+
draw_minimap_tile(screen, point);
342+
});
372343
}
373344

374345
void minimap_window::draw_uncached(vec2i pos) {
375346
screen_offset = pos;
376347
enemy_color = ENEMY_COLOR_BY_CLIMATE[scenario_property_climate()];
377-
prepare_minimap_cache(2 * draw_size.x, draw_size.y);
378-
g_minimap_window.draw();
348+
draw();
349+
350+
cached_texture = graphics_save_to_texture(cached_texture, screen_offset, size);
379351
}
380352

381353
void widget_minimap_draw(vec2i offset, int force) {

src/widget/widget_minimap.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,13 @@ struct minimap_window : public autoconfig_window_t<minimap_window> {
99
vec2i draw_size;
1010
vec2i screen_offset;
1111
vec2i size;
12-
int frame_num = 0;
1312
int cache_width;
1413
color enemy_color;
15-
color *cache;
1614
vec2i rel_mouse;
1715
vec2i mouse_last_coords;
1816
int refresh_requested;
1917
bool draw_force = false;
18+
int cached_texture = 0;
2019
animation_t terrain_canal;
2120
animation_t terrain_water;
2221
animation_t terrain_shrub;

src/widget/widget_sidebar.cpp

+2-6
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,13 @@ void ui::sidebar_window_expanded::ui_draw_foreground() {
168168
ui.pos.x = x_offset;
169169

170170
ui.begin_widget(ui.pos);
171+
widget_minimap_draw({ x_offset + 12, MINIMAP_Y_OFFSET }, 0);
172+
171173
ui.draw();
172174
const animation_t &anim = window_build_menu_image();
173175
ui["build_image"].image(image_desc{ anim.pack, anim.iid, anim.offset });
174176
ui.end_widget();
175177

176-
widget_minimap_draw({x_offset + 12, MINIMAP_Y_OFFSET}, 1);
177-
178178
int messages = city_message_count();
179179

180180
ui["show_messages"].readonly = (messages <= 0);
@@ -195,11 +195,7 @@ void ui::sidebar_window_expanded::ui_draw_foreground() {
195195
refresh_build_menu_buttons();
196196
}
197197

198-
widget_minimap_draw({ x_offset + 12, MINIMAP_Y_OFFSET }, 0);
199-
200198
sidebar_extra_draw_foreground();
201-
202-
//window_request_refresh();
203199
draw_debug_ui(10, 30);
204200
}
205201

0 commit comments

Comments
 (0)