Commit: 69ab1bd73ca7957cf7bb42fd534c3c65e7dab02a Author: Jacques Lucke Date: Thu Sep 8 11:01:37 2022 +0200 Branches: temp-geometry-nodes-evaluator-refactor https://developer.blender.org/rB69ab1bd73ca7957cf7bb42fd534c3c65e7dab02a
cleanup =================================================================== M source/blender/editors/space_node/node_draw.cc =================================================================== diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index 9d5ce17a9be..f5a39bfd631 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -180,6 +180,12 @@ void ED_node_tag_update_id(ID *id) namespace blender::ed::space_node { +static void node_socket_add_tooltip_in_node_editor(TreeDrawContext *UNUSED(tree_draw_ctx), + const bNodeTree *ntree, + const bNode *node, + const bNodeSocket *sock, + uiLayout *layout); + static bool compare_nodes(const bNode *a, const bNode *b) { /* These tell if either the node or any of the parent nodes is selected. @@ -333,390 +339,182 @@ float2 node_from_view(const bNode &node, const float2 &co) return result; } -struct SocketTooltipData { - const bNodeTree *ntree; - const bNode *node; - const bNodeSocket *socket; -}; - -static bool node_socket_has_tooltip(const bNodeTree *ntree, const bNodeSocket *socket) +/** + * Based on settings and sockets in node, set drawing rect info. + */ +static void node_update_basis(const bContext &C, + TreeDrawContext &tree_draw_ctx, + bNodeTree &ntree, + bNode &node, + uiBlock &block) { - if (ntree->type == NTREE_GEOMETRY) { - return true; - } + PointerRNA nodeptr; + RNA_pointer_create(&ntree.id, &RNA_Node, &node, &nodeptr); - if (socket->runtime->declaration != nullptr) { - const nodes::SocketDeclaration &socket_decl = *socket->runtime->declaration; - return !socket_decl.description().is_empty(); - } + const bool node_options = node.typeinfo->draw_buttons && (node.flag & NODE_OPTIONS); + const bool inputs_first = node.inputs.first && + !(node.outputs.first || (node.flag & NODE_PREVIEW) || node_options); - return false; -} + /* Get "global" coordinates. */ + float2 loc = node_to_view(node, float2(0)); + /* Round the node origin because text contents are always pixel-aligned. */ + loc.x = round(loc.x); + loc.y = round(loc.y); -static void create_inspection_string_for_generic_value(const GPointer value, std::stringstream &ss) -{ - auto id_to_inspection_string = [&](const ID *id, const short idcode) { - ss << (id ? id->name + 2 : TIP_("None")) << " (" << TIP_(BKE_idtype_idcode_to_name(idcode)) - << ")"; - }; + int dy = loc.y; - const CPPType &type = *value.type(); - const void *buffer = value.get(); - if (type.is<Object *>()) { - id_to_inspection_string(*static_cast<const ID *const *>(buffer), ID_OB); - } - else if (type.is<Material *>()) { - id_to_inspection_string(*static_cast<const ID *const *>(buffer), ID_MA); - } - else if (type.is<Tex *>()) { - id_to_inspection_string(*static_cast<const ID *const *>(buffer), ID_TE); - } - else if (type.is<Image *>()) { - id_to_inspection_string(*static_cast<const ID *const *>(buffer), ID_IM); - } - else if (type.is<Collection *>()) { - id_to_inspection_string(*static_cast<const ID *const *>(buffer), ID_GR); - } - else if (type.is<int>()) { - ss << *(int *)buffer << TIP_(" (Integer)"); - } - else if (type.is<float>()) { - ss << *(float *)buffer << TIP_(" (Float)"); - } - else if (type.is<blender::float3>()) { - ss << *(blender::float3 *)buffer << TIP_(" (Vector)"); - } - else if (type.is<bool>()) { - ss << ((*(bool *)buffer) ? TIP_("True") : TIP_("False")) << TIP_(" (Boolean)"); - } - else if (type.is<std::string>()) { - ss << *(std::string *)buffer << TIP_(" (String)"); + /* Header. */ + dy -= NODE_DY; + + /* Add a little bit of padding above the top socket. */ + if (node.outputs.first || inputs_first) { + dy -= NODE_DYS / 2; } -} -static void create_inspection_string_for_field_info(const geo_log::FieldInfoLog &value_log, - std::stringstream &ss) -{ - const CPPType &type = value_log.type; - const Span<std::string> input_tooltips = value_log.input_tooltips; + /* Output sockets. */ + bool add_output_space = false; - if (input_tooltips.is_empty()) { - /* Should have been logged as constant value. */ - BLI_assert_unreachable(); - ss << "Value has not been logged"; - } - else { - if (type.is<int>()) { - ss << TIP_("Integer field"); + int buty; + LISTBASE_FOREACH (bNodeSocket *, socket, &node.outputs) { + if (nodeSocketIsHidden(socket)) { + continue; } - else if (type.is<float>()) { - ss << TIP_("Float field"); + + PointerRNA sockptr; + RNA_pointer_create(&ntree.id, &RNA_NodeSocket, socket, &sockptr); + + uiLayout *layout = UI_block_layout(&block, + UI_LAYOUT_VERTICAL, + UI_LAYOUT_PANEL, + loc.x + NODE_DYS, + dy, + NODE_WIDTH(node) - NODE_DY, + NODE_DY, + 0, + UI_style_get_dpi()); + + if (node.flag & NODE_MUTED) { + uiLayoutSetActive(layout, false); } - else if (type.is<blender::float3>()) { - ss << TIP_("Vector field"); + + /* Context pointers for current node and socket. */ + uiLayoutSetContextPointer(layout, "node", &nodeptr); + uiLayoutSetContextPointer(layout, "socket", &sockptr); + + /* Align output buttons to the right. */ + uiLayout *row = uiLayoutRow(layout, true); + uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_RIGHT); + const char *socket_label = nodeSocketLabel(socket); + socket->typeinfo->draw((bContext *)&C, row, &sockptr, &nodeptr, IFACE_(socket_label)); + + node_socket_add_tooltip_in_node_editor(&tree_draw_ctx, &ntree, &node, socket, row); + + UI_block_align_end(&block); + UI_block_layout_resolve(&block, nullptr, &buty); + + /* Ensure minimum socket height in case layout is empty. */ + buty = min_ii(buty, dy - NODE_DY); + + /* Round the socket location to stop it from jiggling. */ + socket->locx = round(loc.x + NODE_WIDTH(node)); + socket->locy = round(dy - NODE_DYS); + + dy = buty; + if (socket->next) { + dy -= NODE_SOCKDY; } - else if (type.is<bool>()) { - ss << TIP_("Boolean field"); + + add_output_space = true; + } + + if (add_output_space) { + dy -= NODE_DY / 4; + } + + node.prvr.xmin = loc.x + NODE_DYS; + node.prvr.xmax = loc.x + NODE_WIDTH(node) - NODE_DYS; + + /* preview rect? */ + if (node.flag & NODE_PREVIEW) { + float aspect = 1.0f; + + if (node.preview_xsize && node.preview_ysize) { + aspect = (float)node.preview_ysize / (float)node.preview_xsize; } - else if (type.is<std::string>()) { - ss << TIP_("String field"); + + dy -= NODE_DYS / 2; + node.prvr.ymax = dy; + + if (aspect <= 1.0f) { + node.prvr.ymin = dy - aspect * (NODE_WIDTH(node) - NODE_DY); } - else if (type.is<blender::ColorGeometry4f>()) { - ss << TIP_("Color field"); + else { + /* Width correction of image. XXX huh? (ton) */ + float dx = (NODE_WIDTH(node) - NODE_DYS) - (NODE_WIDTH(node) - NODE_DYS) / aspect; + + node.prvr.ymin = dy - (NODE_WIDTH(node) - NODE_DY); + + node.prvr.xmin += 0.5f * dx; + node.prvr.xmax -= 0.5f * dx; } - ss << TIP_(" based on:\n"); - for (const int i : input_tooltips.index_range()) { - const blender::StringRef tooltip = input_tooltips[i]; - ss << "\u2022 " << tooltip; - if (i < input_tooltips.size() - 1) { - ss << ".\n"; - } + dy = node.prvr.ymin - NODE_DYS / 2; + + /* Make sure that maximums are bigger or equal to minimums. */ + if (node.prvr.xmax < node.prvr.xmin) { + SWAP(float, node.prvr.xmax, node.prvr.xmin); + } + if (node.prvr.ymax < node.prvr.ymin) { + SWAP(float, node.prvr.ymax, node.prvr.ymin); } } -} -static void create_inspection_string_for_geometry_info(const geo_log::GeometryInfoLog &value_log, - std::stringstream &ss, - const nodes::decl::Geometry *socket_decl) -{ - Span<GeometryComponentType> component_types = value_log.component_types; - if (component_types.is_empty()) { - ss << TIP_("Empty Geometry"); - return; + /* Buttons rect? */ + if (node_options) { + dy -= NODE_DYS / 2; + + uiLayout *layout = UI_block_layout(&block, + UI_LAYOUT_VERTICAL, + UI_LAYOUT_PANEL, + loc.x + NODE_DYS, + dy, + NODE_WIDTH(node) - NODE_DY, + 0, + 0, + UI_style_get_dpi()); + + if (node.flag & NODE_MUTED) { + uiLayoutSetActive(layout, false); + } + + uiLayoutSetContextPointer(layout, "node", &nodeptr); + + node.typeinfo->draw_buttons(layout, (bContext *)&C, &nodeptr); + + UI_block_align_end(&block); + UI_block_layout_resolve(&block, nullptr, &buty); + + dy = buty - NODE_DYS / 2; } - auto to_string = [](int value) { - char str[16]; - BLI_str_format_int_grouped(str, value); - return std::string(str); - }; + /* Input sockets. */ + LISTBASE_FOREACH (bNodeSocket *, socket, &node.inputs) { + if (nodeSocketIsHidden(socket)) { + continue; + } - ss << TIP_("Geometry:\n"); - for (GeometryComponentType type : component_types) { - const char *line_end = (type == component_types.last()) ? "" : ".\n"; - switch (type) { - case GEO_COMPONENT_TYPE_MESH: { - const geo_log::GeometryInfoLog::MeshInfo &mesh_info = *value_log.mesh_info; - char line[256]; - BLI_snprintf(line, - sizeof(line), - @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs