Merge pull request #626 from NQNStudios:fix-blue-text-again

Fix shop item highlighted text again

Fix #86 which was re-opened by the scale-aware text change.
This commit is contained in:
2025-02-18 09:37:08 -05:00
committed by GitHub
4 changed files with 47 additions and 6 deletions

View File

@@ -122,18 +122,34 @@ void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,const
rect_draw_some_item(src.getTexture(), dest_rect, targ_gworld, targ_rect, &maskShader);
}
std::map<sf::RenderTexture*,std::vector<sf::Text>> store_scale_aware_text;
std::map<sf::RenderTexture*,std::vector<ScaleAwareText>> store_scale_aware_text;
std::map<sf::RenderTexture*,rectangle> store_clip_rects;
static void draw_stored_scale_aware_text(sf::RenderTexture& texture, sf::RenderTarget& dest_window, rectangle targ_rect) {
// Temporarily switch target window to its unscaled view to draw scale-aware text
sf::View view = dest_window.getView();
dest_window.setView(dest_window.getDefaultView());
std::vector<sf::Text> stored_text = store_scale_aware_text[&texture];
for(sf::Text str_to_draw : stored_text){
std::vector<ScaleAwareText> stored_text = store_scale_aware_text[&texture];
for(ScaleAwareText text : stored_text){
sf::Text str_to_draw = text.text;
if(!text.clip_rect.empty()){
rectangle rect = text.clip_rect;
rect.offset(targ_rect.left, targ_rect.top);
rect.top *= get_ui_scale();
rect.left *= get_ui_scale();
rect.bottom *= get_ui_scale();
rect.right *= get_ui_scale();
// For debugging:
if(false)
frame_rect(dest_window, rect, Colours::RED);
clip_rect(dest_window, rect);
}
sf::Vector2f position = str_to_draw.getPosition();
position = position + sf::Vector2f {0.0f+targ_rect.left, 0.0f+targ_rect.top};
str_to_draw.setPosition(position * (float)get_ui_scale());
dest_window.draw(str_to_draw);
if(!text.clip_rect.empty())
undo_clip(dest_window);
}
dest_window.setView(view);
}

View File

@@ -242,8 +242,18 @@ void Region::setStencil(sf::RenderWindow& where) {
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
}
extern std::map<sf::RenderTexture*,rectangle> store_clip_rects;
void clip_rect(sf::RenderTarget& where, rectangle rect) {
rect &= rectangle(where); // Make sure we don't draw out of bounds
// Text isn't actually drawn onto Render Textures, so the render texture's clip rect
// needs to be stored externally to be applied to text later
if(dynamic_cast<sf::RenderTexture*>(&where) != nullptr){
sf::RenderTexture* p = dynamic_cast<sf::RenderTexture*>(&where);
store_clip_rects[p] = rect;
}
// TODO: Make sure this works for the scissor test...
setActiveRenderTarget(where);
auto viewport = where.getView().getViewport();
@@ -259,6 +269,11 @@ void clip_region(sf::RenderWindow& where, Region& region) {
}
void undo_clip(sf::RenderTarget& where) {
if(dynamic_cast<sf::RenderTexture*>(&where) != nullptr){
sf::RenderTexture* p = dynamic_cast<sf::RenderTexture*>(&where);
store_clip_rects.erase(p);
}
setActiveRenderTarget(where);
glDisable(GL_SCISSOR_TEST);
glDisable(GL_STENCIL_TEST);

View File

@@ -29,6 +29,11 @@ public:
rectangle getEnclosingRect();
};
struct ScaleAwareText {
sf::Text text;
rectangle clip_rect;
};
void fill_rect(sf::RenderTarget& target, rectangle rect, sf::Color colour);
void fill_circle(sf::RenderTarget& target, rectangle rect, sf::Color colour);
void fill_roundrect(sf::RenderTarget& target, rectangle rect, int rad, sf::Color colour);

View File

@@ -136,7 +136,8 @@ break_info_t calculate_line_wrapping(rectangle dest_rect, std::string str, TextS
}
// I don't know of a better way to do this than using pointers as keys.
extern std::map<sf::RenderTexture*,std::vector<sf::Text>> store_scale_aware_text;
extern std::map<sf::RenderTexture*,std::vector<ScaleAwareText>> store_scale_aware_text;
extern std::map<sf::RenderTexture*,rectangle> store_clip_rects;
void clear_scale_aware_text(sf::RenderTexture& texture) {
store_scale_aware_text.erase(&texture);
@@ -158,9 +159,13 @@ void draw_scale_aware_text(sf::RenderTarget& dest_window, sf::Text str_to_draw)
// What we can do is save the sf::Text with its relative position and render
// it onto the RenderWindow that eventually draws the RenderTexture.
if(store_scale_aware_text.find(p) == store_scale_aware_text.end()){
store_scale_aware_text[p] = std::vector<sf::Text> {};
store_scale_aware_text[p] = std::vector<ScaleAwareText> {};
}
store_scale_aware_text[p].push_back(str_to_draw);
ScaleAwareText text = { str_to_draw, {}};
if(store_clip_rects.find(p) != store_clip_rects.end()){
text.clip_rect = store_clip_rects[p];
}
store_scale_aware_text[p].push_back(text);
}
}