[Bf-blender-cvs] [bc3e2117cdc] temp-node-error-messages: WIP changes

Hans Goudey noreply at git.blender.org
Tue Jan 19 19:57:13 CET 2021


Commit: bc3e2117cdc0dd3451f8bccff52a704f21c10757
Author: Hans Goudey
Date:   Fri Jan 15 16:33:23 2021 -0600
Branches: temp-node-error-messages
https://developer.blender.org/rBbc3e2117cdc0dd3451f8bccff52a704f21c10757

WIP changes

===================================================================

M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/node.cc
M	source/blender/editors/space_node/node_draw.c
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/modifiers/intern/MOD_nodes.cc
M	source/blender/nodes/NOD_geometry_exec.hh
M	source/blender/nodes/geometry/nodes/node_geo_point_translate.cc

===================================================================

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 8ee1b9247b9..0220c41bc60 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -938,6 +938,14 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree,
                                  struct Scene *scene,
                                  const int layer_index);
 
+void BKE_nodetree_error_message_add(struct bNodeTree *ntree,
+                                    const struct bNode *node,
+                                    const char *message);
+
+void BKE_nodetree_error_messages_clear(struct bNodeTree *ntree);
+
+const char *BKE_nodetree_error_message_get(const struct bNodeTree *ntree, const bNode *node);
+
 /* -------------------------------------------------------------------- */
 /** \name Shader Nodes
  * \{ */
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index 8853c160c5c..c920a59fa61 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -49,6 +49,7 @@
 
 #include "BLI_ghash.h"
 #include "BLI_listbase.h"
+#include "BLI_map.hh"
 #include "BLI_math.h"
 #include "BLI_path_util.h"
 #include "BLI_string.h"
@@ -98,6 +99,60 @@ bNodeSocketType NodeSocketTypeUndefined;
 
 static CLG_LogRef LOG = {"bke.node"};
 
+/* -------------------------------------------------------------------- */
+/** \name Runtime (Error Messages)
+ * \{ */
+
+// typedef struct bNodeTreeRuntime {
+//   blender::Map<std::string, std::string> error_messages;
+// } bNodeTreeRuntime;
+
+class bNodeTreeRuntime {
+ public:
+  blender::Map<std::string, std::string> error_messages;
+};
+
+static void nodetree_runtime_ensure(bNodeTree *ntree)
+{
+  if (ntree->runtime == nullptr) {
+    ntree->runtime = new bNodeTreeRuntime();
+    // ntree->runtime = (bNodeTreeRuntime *)MEM_callocN(sizeof(bNodeTreeRuntime), __func__);
+    // new (ntree->runtime->error_messages) blender::Map<std::string, std::string>
+    // ntree->runtime->error_messages = blender::Map<std::string, std::string>();
+    blender::Map<std::string, std::string>(ntree->runtime->error_messages);
+  }
+}
+
+void BKE_nodetree_error_message_add(bNodeTree *ntree, const bNode *node, const char *message)
+{
+  nodetree_runtime_ensure(ntree);
+  bNodeTreeRuntime *runtime = ntree->runtime;
+
+  runtime->error_messages.add(node->name, std::string(message));
+}
+
+void BKE_nodetree_error_messages_clear(bNodeTree *ntree)
+{
+  bNodeTreeRuntime *runtime = ntree->runtime;
+  runtime->error_messages.clear();
+}
+
+const char *BKE_nodetree_error_message_get(const bNodeTree *ntree, const bNode *node)
+{
+  // nodetree_runtime_ensure((bNodeTree *)ntree);
+  bNodeTreeRuntime *runtime = ntree->runtime;
+  if (runtime == nullptr) {
+    return nullptr;
+  }
+  if (runtime->error_messages.contains(std::string(node->name))) {
+    return nullptr;
+  }
+  std::string message = runtime->error_messages.lookup(std::string(node->name));
+  return message.data();
+}
+
+/** \} */
+
 static void ntree_set_typeinfo(bNodeTree *ntree, bNodeTreeType *typeinfo);
 static void node_socket_copy(bNodeSocket *sock_dst, const bNodeSocket *sock_src, const int flag);
 static void free_localized_node_groups(bNodeTree *ntree);
@@ -266,6 +321,11 @@ static void ntree_free_data(ID *id)
   if (ntree->id.tag & LIB_TAG_LOCALIZED) {
     BKE_libblock_free_data(&ntree->id, true);
   }
+
+  delete ntree->runtime;
+  if (ntree->runtime != nullptr) {
+    MEM_freeN(ntree->runtime);
+  }
 }
 
 static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket *sock)
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index 04d6934cc47..c9c9f742468 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -539,6 +539,30 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
     }
   }
 
+  {
+    const char *message = BKE_nodetree_error_message_get(ntree, node);
+    if (message != NULL) {
+      uiLayout *layout = UI_block_layout(node->block,
+                                         UI_LAYOUT_VERTICAL,
+                                         UI_LAYOUT_PANEL,
+                                         locx + NODE_DYS,
+                                         dy,
+                                         NODE_WIDTH(node) - NODE_DY,
+                                         NODE_DY,
+                                         0,
+                                         UI_style_get_dpi());
+
+      if (node->flag & NODE_MUTED) {
+        uiLayoutSetActive(layout, false);
+      }
+
+      uiItemL(layout, message, ICON_ERROR);
+      UI_block_layout_resolve(node->block, NULL, &buty);
+
+      buty = min_ii(buty, dy - NODE_DY);
+    }
+  }
+
   /* little bit space in end */
   if (node->inputs.first || (node->flag & (NODE_OPTIONS | NODE_PREVIEW)) == 0) {
     dy -= NODE_DYS / 2;
@@ -1335,6 +1359,26 @@ static void node_draw_basis(const bContext *C,
     }
   }
 
+  // {
+  //   const char *message = BKE_nodetree_error_message_get(ntree, node);
+  //   if (message != NULL) {
+  //     uiDefBut(block,
+  //              UI_BTYPE_LABEL,
+  //              1,
+  //              message,
+  //              0,
+  //              0,
+  //              2 * UI_UNIT_X,
+  //              UI_UNIT_Y,
+  //              NULL,
+  //              0.0,
+  //              0.0,
+  //              0,
+  //              0,
+  //              "");
+  //   }
+  // }
+
   UI_block_end(C, node->block);
   UI_block_draw(C, node->block);
   node->block = NULL;
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index b6904f6ae5b..78368d98706 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -42,6 +42,7 @@ struct bNodeInstanceHash;
 struct bNodeLink;
 struct bNodePreview;
 struct bNodeTreeExec;
+struct bNodeTreeRuntime;
 struct bNodeType;
 struct uiBlock;
 
@@ -495,6 +496,8 @@ typedef struct bNodeTree {
   int (*test_break)(void *);
   void (*update_draw)(void *);
   void *tbh, *prh, *sdh, *udh;
+
+  struct bNodeTreeRuntime *runtime;
 } bNodeTree;
 
 /* ntree->type, index */
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 5ef17aeddd1..b3fe2dea6c1 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -214,6 +214,7 @@ static bool isDisabled(const struct Scene *UNUSED(scene),
 
 class GeometryNodesEvaluator {
  private:
+  bNodeTree &btree_;
   blender::LinearAllocator<> allocator_;
   Map<const DInputSocket *, GMutablePointer> value_by_input_;
   Vector<const DInputSocket *> group_outputs_;
@@ -223,12 +224,14 @@ class GeometryNodesEvaluator {
   const Object *self_object_;
 
  public:
-  GeometryNodesEvaluator(const Map<const DOutputSocket *, GMutablePointer> &group_input_data,
+  GeometryNodesEvaluator(bNodeTree &btree,
+                         const Map<const DOutputSocket *, GMutablePointer> &group_input_data,
                          Vector<const DInputSocket *> group_outputs,
                          blender::nodes::MultiFunctionByNode &mf_by_node,
                          const PersistentDataHandleMap &handle_map,
                          const Object *self_object)
-      : group_outputs_(std::move(group_outputs)),
+      : btree_(btree),
+        group_outputs_(std::move(group_outputs)),
         mf_by_node_(mf_by_node),
         conversions_(blender::nodes::get_implicit_type_conversions()),
         handle_map_(handle_map),
@@ -306,7 +309,8 @@ class GeometryNodesEvaluator {
 
     /* Execute the node. */
     GValueMap<StringRef> node_outputs_map{allocator_};
-    GeoNodeExecParams params{bnode, node_inputs_map, node_outputs_map, handle_map_, self_object_};
+    GeoNodeExecParams params{
+        btree_, bnode, node_inputs_map, node_outputs_map, handle_map_, self_object_};
     this->execute_node(node, params);
 
     /* Forward computed outputs to linked input sockets. */
@@ -925,8 +929,9 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree,
   Vector<const DInputSocket *> group_outputs;
   group_outputs.append(&socket_to_compute);
 
+  bNodeTree *ntree = tree.btree();
   GeometryNodesEvaluator evaluator{
-      group_inputs, group_outputs, mf_by_node, handle_map, ctx->object};
+      *ntree, group_inputs, group_outputs, mf_by_node, handle_map, ctx->object};
   Vector<GMutablePointer> results = evaluator.execute();
   BLI_assert(results.size() == 1);
   GMutablePointer result = results[0];
diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh
index f278d6b4107..76204149a82 100644
--- a/source/blender/nodes/NOD_geometry_exec.hh
+++ b/source/blender/nodes/NOD_geometry_exec.hh
@@ -20,6 +20,7 @@
 
 #include "BKE_attribute_access.hh"
 #include "BKE_geometry_set.hh"
+#include "BKE_node.h"
 #include "BKE_persistent_data_handle.hh"
 
 #include "DNA_node_types.h"
@@ -49,6 +50,7 @@ using fn::GValueMap;
 
 class GeoNodeExecParams {
  private:
+  bNodeTree &ntree_;
   const bNode &node_;
   GValueMap<StringRef> &input_values_;
   GValueMap<StringRef> &output_values_;
@@ -56,12 +58,14 @@ class GeoNodeExecParams {
   const Object *self_object_;
 
  public:
-  GeoNodeExecParams(const bNode &node,
+  GeoNodeExecParams(bNodeTree &ntree,
+                    const bNode &node,
                     GValueMap<StringRef> &input_values,
                     GValueMap<StringRef> &output_values,
                     const PersistentDataHandleMap &handle_map,
                     const Object *self_object)
-      : node_(node),
+      : ntree_(ntree),
+        node_(node),
         input_values_(input_values),
         output_values_(output_values),
         handle_map_(handle_map),
@@ -163,6 +167,11 @@ class GeoNodeExecParams {
     return self_object_;
   }
 
+  void add_error_message(StringRef message)
+  {
+    BKE_nodetree_error_message_add(&ntree_, &node_, message.data());
+  }
+
   /**
    * Creates a read-only attribute based on node inputs. The met

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list