draw scale-aware text onto RenderTextures

This commit is contained in:
2025-02-04 21:39:05 -06:00
parent 6fa63307b1
commit 78d10987fe
7 changed files with 68 additions and 15 deletions

View File

@@ -481,6 +481,9 @@ void end_startup() {
}
static void loadImageToRenderTexture(sf::RenderTexture& tex, std::string imgName) {
// Clear scale-aware text stored for the previous texture instance:
clear_scale_aware_text(tex);
sf::Texture& temp_gworld = *ResMgr::graphics.get(imgName);
rectangle texrect(temp_gworld);
tex.create(texrect.width(), texrect.height());
@@ -661,6 +664,7 @@ void put_text_bar(std::string str, std::string right_str) {
text_bar_gworld.setActive(false);
auto& bar_gw = *ResMgr::graphics.get("textbar");
rect_draw_some_item(bar_gw, rectangle(bar_gw), text_bar_gworld, rectangle(bar_gw));
clear_scale_aware_text(text_bar_gworld);
TextStyle style;
style.colour = sf::Color::White;
style.font = FONT_BOLD;
@@ -696,7 +700,7 @@ void put_text_bar(std::string str, std::string right_str) {
void refresh_text_bar() {
mainPtr.setActive(false);
rect_draw_some_item(text_bar_gworld.getTexture(), rectangle(text_bar_gworld), mainPtr, win_to_rects[WINRECT_STATUS]);
rect_draw_some_item(text_bar_gworld, rectangle(text_bar_gworld), mainPtr, win_to_rects[WINRECT_STATUS]);
mainPtr.setActive();
}

View File

@@ -708,11 +708,13 @@ void draw_shop_graphics(bool item_pressed, bool item_help_pressed, rectangle cli
area_rect = rectangle(talk_gworld);
talk_gworld.setActive(false);
// Only re-render on top of the item that is clicked:
if(item_pressed || item_help_pressed) {
clip_area_rect.offset(-area_rect.left, -area_rect.top);
clip_rect(talk_gworld, clip_area_rect);
} else {
clear_scale_aware_text(talk_gworld);
frame_rect(talk_gworld, area_rect, Colours::BLACK);
area_rect.inset(1,1);
tileImage(talk_gworld, area_rect,bg[12]);
@@ -870,7 +872,7 @@ void refresh_shopping() {
rectangle from_rect(talk_gworld);
rectangle to_rect = from_rect;
to_rect.offset(talk_gword_offset_x, talk_gword_offset_y);
rect_draw_some_item(talk_gworld.getTexture(),from_rect,mainPtr,to_rect);
rect_draw_some_item(talk_gworld,from_rect,mainPtr,to_rect);
}
static void place_talk_face() {
@@ -898,7 +900,7 @@ void click_talk_rect(word_rect_t word) {
rectangle talkRect(talk_gworld), wordRect(word.rect);
mainPtr.setActive();
rect_draw_some_item(talk_gworld.getTexture(),talkRect,mainPtr,talk_area_rect);
rect_draw_some_item(talk_gworld,talkRect,mainPtr,talk_area_rect);
wordRect.offset(talk_area_rect.topLeft());
wordRect.width() += 10; // Arbitrary extra space fixes #481 and shouldn't cause any problems
TextStyle style;
@@ -911,7 +913,7 @@ void click_talk_rect(word_rect_t word) {
help_btn->draw();
mainPtr.display();
play_sound(37, time_in_ticks(5));
rect_draw_some_item(talk_gworld.getTexture(),talkRect,mainPtr,talk_area_rect);
rect_draw_some_item(talk_gworld,talkRect,mainPtr,talk_area_rect);
place_talk_face();
}
@@ -935,6 +937,7 @@ void place_talk_str(std::string str_to_place,std::string str_to_place2,short col
}
area_rect = rectangle(talk_gworld);
clear_scale_aware_text(talk_gworld);
frame_rect(talk_gworld, area_rect, sf::Color::Black);
area_rect.inset(1,1);
tileImage(talk_gworld, area_rect,bg[12]);
@@ -1002,14 +1005,14 @@ void place_talk_str(std::string str_to_place,std::string str_to_place2,short col
// Finally place processed graphics
mainPtr.setActive();
rect_draw_some_item(talk_gworld.getTexture(),oldRect,mainPtr,talk_area_rect);
rect_draw_some_item(talk_gworld,oldRect,mainPtr,talk_area_rect);
// I have no idea what this check is for; I'm jsut preserving it in case it was important
if(c_rect.right == 0) place_talk_face();
}
void refresh_talking() {
rectangle tempRect(talk_gworld);
rect_draw_some_item(talk_gworld.getTexture(),tempRect,mainPtr,talk_area_rect);
rect_draw_some_item(talk_gworld,tempRect,mainPtr,talk_area_rect);
place_talk_face();
}

View File

@@ -97,6 +97,7 @@ void put_pc_screen() {
rectangle info_from = {0,1,12,13}, switch_from = {0, 13, 12, 25};
pc_stats_gworld.setActive(false);
clear_scale_aware_text(pc_stats_gworld);
// First clean up gworld with pretty patterns
sf::Texture& orig = *ResMgr::graphics.get("statarea");
@@ -219,6 +220,7 @@ void put_item_screen(eItemWinMode screen_num) {
rectangle upper_frame_rect = {3,3,15,268};
item_stats_gworld.setActive(false);
clear_scale_aware_text(item_stats_gworld);
// First clean up gworld with pretty patterns
sf::Texture& orig = *ResMgr::graphics.get("inventory");
@@ -588,9 +590,9 @@ void refresh_stat_areas(short mode) {
if(mode == 1) x = sf::BlendAdd;
else x = sf::BlendNone;
rect_draw_some_item(pc_stats_gworld.getTexture(), rectangle(pc_stats_gworld), mainPtr, win_to_rects[WINRECT_PCSTATS], x);
rect_draw_some_item(item_stats_gworld.getTexture(), rectangle(item_stats_gworld), mainPtr, win_to_rects[WINRECT_INVEN], x);
rect_draw_some_item(text_area_gworld.getTexture(), rectangle(text_area_gworld), mainPtr, win_to_rects[WINRECT_TRANSCRIPT], x);
rect_draw_some_item(pc_stats_gworld, rectangle(pc_stats_gworld), mainPtr, win_to_rects[WINRECT_PCSTATS], x);
rect_draw_some_item(item_stats_gworld, rectangle(item_stats_gworld), mainPtr, win_to_rects[WINRECT_INVEN], x);
rect_draw_some_item(text_area_gworld, rectangle(text_area_gworld), mainPtr, win_to_rects[WINRECT_TRANSCRIPT], x);
}
rectangle get_stat_effect_rect(int code) {
@@ -1068,6 +1070,7 @@ void print_buf () {
rectangle store_text_rect,dest_rect,erase_rect = {2,2,136,255};
text_area_gworld.setActive(false);
clear_scale_aware_text(text_area_gworld);
// First clean up gworld with pretty patterns
tileImage(text_area_gworld, erase_rect,bg[6]);
@@ -1084,7 +1087,7 @@ void print_buf () {
sf::Text text(text_buffer[line_to_print].line, *ResMgr::fonts.get("plain"), 12);
text.setColor(Colours::BLACK);
text.setPosition(moveTo);
text_area_gworld.draw(text);
draw_scale_aware_text(text_area_gworld, text);
num_lines_printed++;
line_to_print++;
if(line_to_print== TEXT_BUF_LEN) {