[Bf-blender-cvs] [8a752357d8e] temp-node-error-messages: Rewrite error message API for generality as general "UI storage"

Hans Goudey noreply at git.blender.org
Tue Feb 16 04:49:25 CET 2021


Commit: 8a752357d8e75194faf8e5601f4177e8e9c8ba48
Author: Hans Goudey
Date:   Mon Feb 15 21:49:08 2021 -0600
Branches: temp-node-error-messages
https://developer.blender.org/rB8a752357d8e75194faf8e5601f4177e8e9c8ba48

Rewrite error message API for generality as general "UI storage"

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

M	source/blender/blenkernel/BKE_node.h
A	source/blender/blenkernel/BKE_node_ui_storage.hh
M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/node.cc
A	source/blender/blenkernel/intern/node_ui_storage.cc
M	source/blender/editors/space_node/node_draw.cc
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_distribute.cc
M	source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
M	source/blender/nodes/intern/node_geometry_exec.cc

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

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 06e19a3d190..62c06af0884 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -848,7 +848,7 @@ bool BKE_node_is_connected_to_output(struct bNodeTree *ntree, struct bNode *node
 /* ************** COMMON NODES *************** */
 
 #define NODE_UNDEFINED -2 /* node type is not registered */
-#define NODE_CUSTOM -1    /* for dynamically registered custom types */
+#define NODE_CUSTOM -1 /* for dynamically registered custom types */
 #define NODE_GROUP 2
 // #define NODE_FORLOOP 3       /* deprecated */
 // #define NODE_WHILELOOP   4   /* deprecated */
@@ -940,33 +940,6 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree,
                                  struct Scene *scene,
                                  const int layer_index);
 
-typedef struct NodeWarningContextNodesModifier {
-  const Object *object;
-  const char *modifier_name;
-} NodeWarningContextNodesModifier;
-
-typedef enum eNodeWarningType {
-  NODE_WARNING_ERROR,
-  NODE_WARNING_INFO,
-} eNodeWarningType;
-
-typedef struct NodeWarning {
-  eNodeWarningType type;
-  char *message;
-} NodeWarning;
-
-void BKE_nodetree_error_message_add(struct bNodeTree *ntree,
-                                    const struct Object *object,
-                                    const char *modifier_name,
-                                    const struct bNode *node,
-                                    const eNodeWarningType type,
-                                    const char *message);
-
-void BKE_nodetree_error_messages_clear(struct bNodeTree *ntree);
-
-const NodeWarning *BKE_nodetree_error_message_get(const struct bNodeTree *ntree,
-                                                  const bNode *node);
-
 /* -------------------------------------------------------------------- */
 /** \name Shader Nodes
  * \{ */
diff --git a/source/blender/blenkernel/BKE_node_ui_storage.hh b/source/blender/blenkernel/BKE_node_ui_storage.hh
new file mode 100644
index 00000000000..4a50bcf54ce
--- /dev/null
+++ b/source/blender/blenkernel/BKE_node_ui_storage.hh
@@ -0,0 +1,74 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#pragma once
+
+#include "BLI_hash.hh"
+#include "BLI_map.hh"
+
+struct bNode;
+struct bNodeTree;
+struct Object;
+struct ModifierData;
+
+struct NodeUIStorageContextModifier {
+  const struct Object *object;
+  const struct ModifierData *modifier;
+
+  uint64_t hash() const
+  {
+    const uint64_t hash1 = blender::DefaultHash<const Object *>{}(object);
+    const uint64_t hash2 = blender::DefaultHash<const ModifierData *>{}(modifier);
+    return hash1 ^ (hash2 * 33);
+  }
+
+  bool operator==(const NodeUIStorageContextModifier &other) const
+  {
+    return other.object == object && other.modifier == modifier;
+  }
+};
+
+enum class NodeWarningType {
+  Error,
+  Warning,
+  Info,
+};
+
+struct NodeWarning {
+  NodeWarningType type;
+  std::string message;
+};
+
+struct NodeUIStorage {
+  blender::Vector<NodeWarning> warnings;
+};
+
+struct NodeTreeUIStorage {
+  blender::Map<const struct bNode *, blender::Map<NodeUIStorageContextModifier, NodeUIStorage>>
+      node_map;
+
+  NodeTreeUIStorage() = default;
+};
+
+void BKE_nodetree_ui_storage_clear(struct bNodeTree &ntree);
+
+void BKE_nodetree_ui_storage_ensure(bNodeTree &ntree);
+
+void BKE_nodetree_error_message_add(struct bNodeTree &ntree,
+                                    const NodeUIStorageContextModifier &context,
+                                    const struct bNode &node,
+                                    const NodeWarningType type,
+                                    const std::string &message);
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 6b6d2b45d02..67b97cfee4f 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -199,6 +199,7 @@ set(SRC
   intern/multires_versioning.c
   intern/nla.c
   intern/node.cc
+  intern/node_ui_storage.cc
   intern/object.c
   intern/object_deform.c
   intern/object_dupli.c
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index 64f15e31c6e..32356671c05 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -69,6 +69,7 @@
 #include "BKE_lib_query.h"
 #include "BKE_main.h"
 #include "BKE_node.h"
+#include "BKE_node_ui_storage.hh"
 
 #include "BLI_ghash.h"
 #include "BLI_threads.h"
@@ -99,75 +100,6 @@ bNodeSocketType NodeSocketTypeUndefined;
 
 static CLG_LogRef LOG = {"bke.node"};
 
-/* -------------------------------------------------------------------- */
-/** \name Runtime (Error Messages)
- * \{ */
-
-class bNodeTreeRuntime {
- public:
-  blender::Map<const std::string, NodeWarning> error_messages;
-};
-
-static void nodetree_runtime_ensure(bNodeTree *ntree)
-{
-  if (ntree->runtime == nullptr) {
-    ntree->runtime = new bNodeTreeRuntime();
-  }
-}
-
-void BKE_nodetree_error_message_add(bNodeTree *ntree,
-                                    const Object *object,
-                                    const char *modifier_name,
-                                    const bNode *node,
-                                    const eNodeWarningType type,
-                                    const char *message)
-{
-  nodetree_runtime_ensure(ntree);
-  bNodeTreeRuntime *runtime = ntree->runtime;
-
-  NodeWarning warning = {type, BLI_strdup(message), object, modifier_name};
-
-  switch (type) {
-    case NODE_WARNING_ERROR:
-      CLOG_ERROR(
-          &LOG, "Node Tree: \"%s\", Node: \"%s\", %s", ntree->id.name + 2, node->name, message);
-      break;
-    case NODE_WARNING_INFO:
-      CLOG_INFO(
-          &LOG, 2, "Node Tree: \"%s\", Node: \"%s\", %s", ntree->id.name + 2, node->name, message);
-      break;
-  }
-
-  runtime->error_messages.add(node->name, warning);
-}
-
-void BKE_nodetree_error_messages_clear(bNodeTree *ntree)
-{
-  bNodeTreeRuntime *runtime = ntree->runtime;
-  if (runtime != nullptr) {
-    runtime->error_messages.clear();
-    runtime->error_messages.foreach_item([](const std::string UNUSED(node_name),
-                                            NodeWarning warning) { MEM_freeN(warning.message); });
-  }
-}
-
-const NodeWarning *BKE_nodetree_error_message_get(const bNodeTree *ntree, const bNode *node)
-{
-  bNodeTreeRuntime *runtime = ntree->runtime;
-  if (runtime == nullptr) {
-    return nullptr;
-  }
-
-  const std::string node_name = std::string(node->name);
-  if (runtime->error_messages.contains(node_name)) {
-    return &runtime->error_messages.lookup(node_name);
-  }
-
-  return nullptr;
-}
-
-/** \} */
-
 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);
@@ -343,8 +275,7 @@ static void ntree_free_data(ID *id)
     BKE_libblock_free_data(&ntree->id, true);
   }
 
-  delete ntree->runtime;
-  ntree->runtime = nullptr;
+  BKE_nodetree_ui_storage_clear(*ntree);
 }
 
 static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket *sock)
@@ -634,7 +565,7 @@ static void ntree_blend_write(BlendWriter *writer, ID *id, const void *id_addres
     ntree->interface_type = nullptr;
     ntree->progress = nullptr;
     ntree->execdata = nullptr;
-    ntree->runtime = nullptr;
+    // ntree->runtime = nullptr;
 
     BLO_write_id_struct(writer, bNodeTree, id_address, &ntree->id);
 
@@ -666,7 +597,7 @@ void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree)
 
   ntree->progress = nullptr;
   ntree->execdata = nullptr;
-  ntree->runtime = nullptr;
+  // ntree->runtime = nullptr;
 
   BLO_read_data_address(reader, &ntree->adt);
   BKE_animdata_blend_read_data(reader, ntree->adt);
diff --git a/source/blender/blenkernel/intern/node_ui_storage.cc b/source/blender/blenkernel/intern/node_ui_storage.cc
new file mode 100644
index 00000000000..844bf0fbb37
--- /dev/null
+++ b/source/blender/blenkernel/intern/node_ui_storage.cc
@@ -0,0 +1,99 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "CLG_log.h"
+
+#include "BLI_map.hh"
+#include "BLI_string_ref.hh"
+#include "BLI_vector.hh"
+
+#include "DNA_node_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_node_ui_storage.hh"
+
+static CLG_LogRef LOG = {"bke.node_ui_storage"};
+
+using blender::Map;
+using blender::StringRef;
+using blender::Vector;
+
+void BKE_nodetree_ui_storage_ensure(bNodeTree &ntree)
+{
+  if (ntree.runtime == nullptr) {
+    ntree.runtime = new NodeTreeUIStorage();
+  }
+}
+
+void BKE_nodetree_ui_storage_clear(bNodeTree &ntree)
+{
+  NodeTreeUIStorage *ui_storage = ntree.runtime;
+  if (ui_storag

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list