[Bf-blender-cvs] [6e09d256579] temp-geometry-nodes-evaluator-refactor: bring back attribute search in node editor
Jacques Lucke
noreply at git.blender.org
Thu Sep 8 17:22:31 CEST 2022
Commit: 6e09d2565791924275cf48b1155e8318fbd9fe43
Author: Jacques Lucke
Date: Thu Sep 8 12:12:23 2022 +0200
Branches: temp-geometry-nodes-evaluator-refactor
https://developer.blender.org/rB6e09d2565791924275cf48b1155e8318fbd9fe43
bring back attribute search in node editor
===================================================================
M source/blender/editors/space_node/node_draw.cc
M source/blender/editors/space_node/node_geometry_attribute_search.cc
M source/blender/modifiers/intern/MOD_nodes.cc
===================================================================
diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc
index 9acce34430b..89a6dbab041 100644
--- a/source/blender/editors/space_node/node_draw.cc
+++ b/source/blender/editors/space_node/node_draw.cc
@@ -1028,6 +1028,7 @@ static std::optional<std::string> create_socket_inspection_string(TreeDrawContex
const bNodeSocket &socket)
{
using namespace blender::nodes::geo_eval_log;
+ tree_draw_ctx.geo_tree_log->ensure_socket_values();
ValueLog *value_log = tree_draw_ctx.geo_tree_log->find_socket_value_log(socket);
if (value_log == nullptr) {
return std::nullopt;
diff --git a/source/blender/editors/space_node/node_geometry_attribute_search.cc b/source/blender/editors/space_node/node_geometry_attribute_search.cc
index c9dbc1649c4..809c4b2fe59 100644
--- a/source/blender/editors/space_node/node_geometry_attribute_search.cc
+++ b/source/blender/editors/space_node/node_geometry_attribute_search.cc
@@ -71,6 +71,7 @@ static Vector<const GeometryAttributeInfo *> get_attribute_info_from_context(
if (tree_log == nullptr) {
return {};
}
+ tree_log->ensure_socket_values();
/* For the attribute input node, collect attribute information from all nodes in the group. */
if (node->type == GEO_NODE_INPUT_NAMED_ATTRIBUTE) {
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index e84f1e29687..c979ce381c9 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -125,11 +125,13 @@ using blender::nodes::geo_eval_log::GeoModifierLog;
using blender::threading::EnumerableThreadSpecific;
using namespace blender::fn::multi_function_types;
using blender::nodes::geo_eval_log::GeometryAttributeInfo;
+using blender::nodes::geo_eval_log::GeometryInfoLog;
using blender::nodes::geo_eval_log::GeoNodeLog;
using blender::nodes::geo_eval_log::GeoTreeLog;
using blender::nodes::geo_eval_log::NamedAttributeUsage;
using blender::nodes::geo_eval_log::NodeWarning;
using blender::nodes::geo_eval_log::NodeWarningType;
+using blender::nodes::geo_eval_log::ValueLog;
static void initData(ModifierData *md)
{
@@ -1395,6 +1397,16 @@ static NodesModifierData *get_modifier_data(Main &bmain,
return reinterpret_cast<NodesModifierData *>(md);
}
+static GeoTreeLog *get_root_tree_log(const NodesModifierData &nmd)
+{
+ if (nmd.runtime_eval_log == nullptr) {
+ return nullptr;
+ }
+ GeoModifierLog &modifier_log = *static_cast<GeoModifierLog *>(nmd.runtime_eval_log);
+ blender::bke::ModifierComputeContext compute_context{nullptr, nmd.modifier.name};
+ return &modifier_log.get_tree_log(compute_context.hash());
+}
+
static void attribute_search_update_fn(
const bContext *C, void *arg, const char *str, uiSearchItems *items, const bool is_first)
{
@@ -1403,27 +1415,52 @@ static void attribute_search_update_fn(
if (nmd == nullptr) {
return;
}
- // const geo_log::ModifierLog *modifier_log = static_cast<const geo_log::ModifierLog *>(
- // nmd->runtime_eval_log);
- // if (modifier_log == nullptr) {
- // return;
- // }
- // const geo_log::GeometryInfoLog *geometry_log = data.is_output ?
- // modifier_log->output_geometry_log() :
- // modifier_log->input_geometry_log();
- // if (geometry_log == nullptr) {
- // return;
- // }
-
- Span<GeometryAttributeInfo> infos;
-
- /* The shared attribute search code expects a span of pointers, so convert to that. */
- Array<const GeometryAttributeInfo *> info_ptrs(infos.size());
- for (const int i : infos.index_range()) {
- info_ptrs[i] = &infos[i];
+ if (nmd->node_group == nullptr) {
+ return;
+ }
+ GeoTreeLog *tree_log = get_root_tree_log(*nmd);
+ if (tree_log == nullptr) {
+ return;
+ }
+ tree_log->ensure_existing_attributes();
+ nmd->node_group->ensure_topology_cache();
+
+ Vector<const bNodeSocket *> sockets_to_check;
+ if (data.is_output) {
+ for (const bNode *node : nmd->node_group->nodes_by_type("NodeGroupOutput")) {
+ for (const bNodeSocket *socket : node->input_sockets()) {
+ if (socket->type == SOCK_GEOMETRY) {
+ sockets_to_check.append(socket);
+ }
+ }
+ }
+ }
+ else {
+ for (const bNode *node : nmd->node_group->nodes_by_type("NodeGroupInput")) {
+ for (const bNodeSocket *socket : node->output_sockets()) {
+ if (socket->type == SOCK_GEOMETRY) {
+ sockets_to_check.append(socket);
+ }
+ }
+ }
+ }
+ Set<StringRef> names;
+ Vector<const GeometryAttributeInfo *> attributes;
+ for (const bNodeSocket *socket : sockets_to_check) {
+ const ValueLog *value_log = tree_log->find_socket_value_log(*socket);
+ if (value_log == nullptr) {
+ continue;
+ }
+ if (const GeometryInfoLog *geo_log = dynamic_cast<const GeometryInfoLog *>(value_log)) {
+ for (const GeometryAttributeInfo &attribute : geo_log->attributes) {
+ if (names.add(attribute.name)) {
+ attributes.append(&attribute);
+ }
+ }
+ }
}
blender::ui::attribute_search_add_items(
- str, data.is_output, info_ptrs.as_span(), items, is_first);
+ str, data.is_output, attributes.as_span(), items, is_first);
}
static void attribute_search_exec_fn(bContext *C, void *data_v, void *item_v)
@@ -1454,8 +1491,7 @@ static void add_attribute_search_button(const bContext &C,
const bNodeSocket &socket,
const bool is_output)
{
- // const geo_log::ModifierLog *log = static_cast<geo_log::ModifierLog *>(nmd.runtime_eval_log);
- if (true) {
+ if (nmd.runtime_eval_log == nullptr) {
uiItemR(layout, md_ptr, rna_path_attribute_name.c_str(), 0, "", ICON_NONE);
return;
}
@@ -1680,12 +1716,10 @@ static void panel_draw(const bContext *C, Panel *panel)
}
/* Draw node warnings. */
- if (nmd->runtime_eval_log != nullptr) {
- GeoModifierLog &modifier_log = *static_cast<GeoModifierLog *>(nmd->runtime_eval_log);
- blender::bke::ModifierComputeContext compute_context{nullptr, nmd->modifier.name};
- GeoTreeLog &tree_log = modifier_log.get_tree_log(compute_context.hash());
- tree_log.ensure_node_warnings();
- for (const NodeWarning &warning : tree_log.all_warnings) {
+ GeoTreeLog *tree_log = get_root_tree_log(*nmd);
+ if (tree_log != nullptr) {
+ tree_log->ensure_node_warnings();
+ for (const NodeWarning &warning : tree_log->all_warnings) {
if (warning.type != NodeWarningType::Info) {
uiItemL(layout, warning.message.c_str(), ICON_ERROR);
}
@@ -1726,14 +1760,14 @@ static void internal_dependencies_panel_draw(const bContext *UNUSED(C), Panel *p
PointerRNA *ptr = modifier_panel_get_property_pointers(panel, nullptr);
NodesModifierData *nmd = static_cast<NodesModifierData *>(ptr->data);
- if (nmd->runtime_eval_log == nullptr) {
+ GeoTreeLog *tree_log = get_root_tree_log(*nmd);
+ if (tree_log == nullptr) {
return;
}
- GeoModifierLog &modifier_log = *static_cast<GeoModifierLog *>(nmd->runtime_eval_log);
- blender::bke::ModifierComputeContext compute_context{nullptr, nmd->modifier.name};
- GeoTreeLog &tree_log = modifier_log.get_tree_log(compute_context.hash());
- tree_log.ensure_used_named_attributes();
- const Map<std::string, NamedAttributeUsage> &usage_by_attribute = tree_log.used_named_attributes;
+
+ tree_log->ensure_used_named_attributes();
+ const Map<std::string, NamedAttributeUsage> &usage_by_attribute =
+ tree_log->used_named_attributes;
if (usage_by_attribute.is_empty()) {
uiItemL(layout, IFACE_("No named attributes used"), ICON_INFO);
More information about the Bf-blender-cvs
mailing list