[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