diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index a9db1fa50bd..33bb5540b9f 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -2716,14 +2716,28 @@ static void count_multi_input_socket_links(bNodeTree &ntree, SpaceNode &snode) } } + +static float frame_node_label_height(const NodeFrame &frame_data) +{ + return frame_data.label_size * U.dpi_fac; +} + +#define NODE_FRAME_MARGIN (1.5f * U.widget_unit) + /* XXX Does a bounding box update by iterating over all children. * Not ideal to do this in every draw call, but doing as transform callback doesn't work, * since the child node totr rects are not updated properly at that point. */ static void frame_node_prepare_for_draw(bNode &node, Span nodes) { - const float margin = 1.5f * U.widget_unit; NodeFrame *data = (NodeFrame *)node.storage; + const float margin = NODE_FRAME_MARGIN; + const float has_label = node.label[0] != '\0'; + + const float label_height = frame_node_label_height(*data); + /* Add an additional 25 % to account for the descenders. This works well in most cases. */ + const float margin_top = 0.5f * margin + (has_label ? 1.25f * label_height : 0.5f * margin); + /* Initialize rect from current frame size. */ rctf rect; node_to_updated_rect(node, rect); @@ -2743,7 +2757,7 @@ static void frame_node_prepare_for_draw(bNode &node, Span nodes) noderect.xmin -= margin; noderect.xmax += margin; noderect.ymin -= margin; - noderect.ymax += margin; + noderect.ymax += margin_top; /* First child initializes frame. */ if (bbinit) { @@ -2841,8 +2855,7 @@ static void frame_node_draw_label(TreeDrawContext &tree_draw_ctx, BLF_enable(fontid, BLF_ASPECT); BLF_aspect(fontid, aspect, aspect, 1.0f); - /* Clamp. Otherwise it can suck up a LOT of memory. */ - BLF_size(fontid, MIN2(24.0f, font_size) * U.dpi_fac); + BLF_size(fontid, font_size * U.dpi_fac); /* Title color. */ int color_id = node_get_colorid(tree_draw_ctx, node); @@ -2850,21 +2863,18 @@ static void frame_node_draw_label(TreeDrawContext &tree_draw_ctx, UI_GetThemeColorBlendShade3ubv(TH_TEXT, color_id, 0.4f, 10, color); BLF_color3ubv(fontid, color); - const float margin = float(NODE_DY / 4); + const float margin = NODE_FRAME_MARGIN; const float width = BLF_width(fontid, label, sizeof(label)); - const float ascender = BLF_ascender(fontid); - const int label_height = ((margin / aspect) + (ascender * aspect)); + const int label_height = frame_node_label_height(*data); - /* 'x' doesn't need aspect correction */ const rctf &rct = node.runtime->totr; - /* XXX a bit hacky, should use separate align values for x and y. */ - float x = BLI_rctf_cent_x(&rct) - (0.5f * width); - float y = rct.ymax - label_height; + const float label_x = BLI_rctf_cent_x(&rct) - (0.5f * width); + const float label_y = rct.ymax - label_height - (0.5f * margin); - /* label */ + /* Label. */ const bool has_label = node.label[0] != '\0'; if (has_label) { - BLF_position(fontid, x, y, 0); + BLF_position(fontid, label_x, label_y, 0); BLF_draw(fontid, label, sizeof(label)); } @@ -2875,11 +2885,10 @@ static void frame_node_draw_label(TreeDrawContext &tree_draw_ctx, const float line_spacing = (line_height_max * aspect); const float line_width = (BLI_rctf_size_x(&rct) - 2 * margin) / aspect; - /* 'x' doesn't need aspect correction. */ - x = rct.xmin + margin; - y = rct.ymax - label_height - (has_label ? line_spacing : 0); + const float x = rct.xmin + margin; + float y = rct.ymax - label_height - (has_label ? line_spacing + margin : 0); - int y_min = y + ((margin * 2) - (y - rct.ymin)); + const int y_min = rct.ymin + margin; BLF_enable(fontid, BLF_CLIPPING | BLF_WORD_WRAP); BLF_clipping(fontid, rct.xmin, rct.ymin + margin, rct.xmax, rct.ymax); diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index bf1a9963f87..d84f221c862 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -11,6 +11,8 @@ #include "BLI_math.h" #include "BLI_utildefines.h" +#include "BLF_api.h" + #include "BLT_translation.h" #include "DNA_curves_types.h" @@ -4164,6 +4166,12 @@ static bNodeSocket *rna_NodeOutputFile_slots_new( return sock; } +static void rna_FrameNode_label_size_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + BLF_cache_clear(); + rna_Node_update(bmain, scene, ptr); +} + static void rna_ShaderNodeTexIES_mode_set(PointerRNA *ptr, int value) { bNode *node = (bNode *)ptr->data; @@ -4816,7 +4824,7 @@ static void def_frame(StructRNA *srna) RNA_def_property_int_sdna(prop, NULL, "label_size"); RNA_def_property_range(prop, 8, 64); RNA_def_property_ui_text(prop, "Label Font Size", "Font size to use for displaying the label"); - RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, NULL); + RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, "rna_FrameNode_label_size_update"); } static void def_clamp(StructRNA *srna)