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:
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user