[Bf-blender-cvs] [66d255d8eda] temp-modifiers-instancing: improve support for object socket
Jacques Lucke
noreply at git.blender.org
Tue Nov 10 18:09:36 CET 2020
Commit: 66d255d8edac239d37381d4f299fc68bfb71df4e
Author: Jacques Lucke
Date: Tue Nov 10 17:31:00 2020 +0100
Branches: temp-modifiers-instancing
https://developer.blender.org/rB66d255d8edac239d37381d4f299fc68bfb71df4e
improve support for object socket
===================================================================
M source/blender/editors/space_node/drawnode.c
M source/blender/modifiers/intern/MOD_nodes.cc
M source/blender/nodes/NOD_derived_node_tree.hh
M source/blender/nodes/intern/derived_node_tree.cc
===================================================================
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 165e88242d1..4aaa6eeae35 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -3352,7 +3352,7 @@ static const float std_node_socket_colors[][4] = {
{0.0, 0.0, 0.0, 1.0}, /*__SOCK_MESH (deprecated) */
{0.06, 0.52, 0.15, 1.0}, /* SOCK_INT */
{0.39, 0.39, 0.39, 1.0}, /* SOCK_STRING */
- {0.40, 0.10, 0.10, 1.0}, /* SOCK_OBJECT */
+ {0.85, 0.34, 0.11, 1.0}, /* SOCK_OBJECT */
{0.10, 0.40, 0.10, 1.0}, /* SOCK_IMAGE */
{0.00, 0.83, 0.64, 1.0}, /* SOCK_GEOMETRY */
};
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 3f622dee782..5c62e29bf05 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -29,6 +29,7 @@
#include "BLI_float3.hh"
#include "BLI_listbase.h"
+#include "BLI_set.hh"
#include "BLI_string.h"
#include "BLI_utildefines.h"
@@ -74,6 +75,12 @@
using blender::float3;
+/* To be replaced soon. */
+using namespace blender;
+using namespace blender::nodes;
+using namespace blender::fn;
+using namespace blender::bke;
+
static void initData(ModifierData *md)
{
NodesModifierData *nmd = (NodesModifierData *)md;
@@ -83,11 +90,49 @@ static void initData(ModifierData *md)
MEMCPY_STRUCT_AFTER(nmd, DNA_struct_default_get(NodesModifierData), modifier);
}
+static void addIdsUsedBySocket(const ListBase *sockets, Set<ID *> &ids)
+{
+ LISTBASE_FOREACH (const bNodeSocket *, socket, sockets) {
+ if (socket->type == SOCK_OBJECT) {
+ Object *object = ((bNodeSocketValueObject *)socket->default_value)->value;
+ if (object != nullptr) {
+ ids.add(&object->id);
+ }
+ }
+ }
+}
+
+static void findUsedIds(const bNodeTree &tree, Set<ID *> &ids)
+{
+ Set<const bNodeTree *> handled_groups;
+
+ LISTBASE_FOREACH (const bNode *, node, &tree.nodes) {
+ addIdsUsedBySocket(&node->inputs, ids);
+ addIdsUsedBySocket(&node->outputs, ids);
+
+ if (node->type == NODE_GROUP) {
+ const bNodeTree *group = (bNodeTree *)node->id;
+ if (group != nullptr && handled_groups.add(group)) {
+ findUsedIds(*group, ids);
+ }
+ }
+ }
+}
+
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
{
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
if (nmd->node_group != nullptr) {
DEG_add_node_tree_relation(ctx->node, nmd->node_group, "Nodes Modifier");
+
+ Set<ID *> used_ids;
+ findUsedIds(*nmd->node_group, used_ids);
+ for (ID *id : used_ids) {
+ if (GS(id->name) == ID_OB) {
+ DEG_add_object_relation(ctx->node, (Object *)id, DEG_OB_COMP_TRANSFORM, "Nodes Modifier");
+ DEG_add_object_relation(ctx->node, (Object *)id, DEG_OB_COMP_GEOMETRY, "Nodes Modifier");
+ }
+ }
}
/* TODO: Add relations for IDs in settings. */
@@ -124,12 +169,6 @@ static bool isDisabled(const struct Scene *UNUSED(scene),
return false;
}
-/* To be replaced soon. */
-using namespace blender;
-using namespace blender::nodes;
-using namespace blender::fn;
-using namespace blender::bke;
-
class GeometryNodesEvaluator {
private:
LinearAllocator<> allocator_;
@@ -181,8 +220,6 @@ class GeometryNodesEvaluator {
const int total_inputs = from_sockets.size() + from_group_inputs.size();
BLI_assert(total_inputs <= 1);
- const CPPType &type = *socket_cpp_type_get(*socket_to_compute.typeinfo());
-
if (total_inputs == 0) {
/* The input is not connected, use the value from the socket itself. */
return get_unlinked_input_value(socket_to_compute);
@@ -660,18 +697,13 @@ static void initialize_group_input(NodesModifierData &nmd,
static void fill_data_handle_map(const DerivedNodeTree &tree, PersistentDataHandleMap &handle_map)
{
+ Set<ID *> used_ids;
+ findUsedIds(*tree.btree(), used_ids);
+
int current_handle = 0;
- for (const NodeTreeRef *tree_ref : tree.used_node_tree_refs()) {
- for (const SocketRef *socket_ref : tree_ref->sockets()) {
- const bNodeSocket *bsocket = socket_ref->bsocket();
- if (bsocket->type == SOCK_OBJECT) {
- Object *object = ((bNodeSocketValueObject *)bsocket->default_value)->value;
- if (object != nullptr) {
- handle_map.add(current_handle, object->id);
- current_handle++;
- }
- }
- }
+ for (ID *id : used_ids) {
+ handle_map.add(current_handle, *id);
+ current_handle++;
}
}
diff --git a/source/blender/nodes/NOD_derived_node_tree.hh b/source/blender/nodes/NOD_derived_node_tree.hh
index 6166df6dc61..e7ff5d6b9f8 100644
--- a/source/blender/nodes/NOD_derived_node_tree.hh
+++ b/source/blender/nodes/NOD_derived_node_tree.hh
@@ -187,11 +187,14 @@ class DerivedNodeTree : NonCopyable, NonMovable {
MultiValueMap<const bNodeType *, DNode *> nodes_by_type_;
VectorSet<const NodeTreeRef *> used_node_tree_refs_;
+ bNodeTree *btree_;
public:
DerivedNodeTree(bNodeTree *btree, NodeTreeRefMap &node_tree_refs);
~DerivedNodeTree();
+ bNodeTree *btree() const;
+
Span<const DNode *> nodes() const;
Span<const DNode *> nodes_by_type(StringRefNull idname) const;
Span<const DNode *> nodes_by_type(const bNodeType *nodetype) const;
@@ -497,6 +500,11 @@ inline int DParentNode::id() const
* DerivedNodeTree inline methods.
*/
+inline bNodeTree *DerivedNodeTree::btree() const
+{
+ return btree_;
+}
+
inline Span<const DNode *> DerivedNodeTree::nodes() const
{
return nodes_by_id_;
diff --git a/source/blender/nodes/intern/derived_node_tree.cc b/source/blender/nodes/intern/derived_node_tree.cc
index 6b4c447d393..69e417868fb 100644
--- a/source/blender/nodes/intern/derived_node_tree.cc
+++ b/source/blender/nodes/intern/derived_node_tree.cc
@@ -28,8 +28,10 @@ static const NodeTreeRef &get_tree_ref(NodeTreeRefMap &node_tree_refs, bNodeTree
[&]() { return std::make_unique<NodeTreeRef>(btree); });
}
-DerivedNodeTree::DerivedNodeTree(bNodeTree *btree, NodeTreeRefMap &node_tree_refs)
+DerivedNodeTree::DerivedNodeTree(bNodeTree *btree, NodeTreeRefMap &node_tree_refs) : btree_(btree)
{
+ BLI_assert(btree != nullptr);
+
const NodeTreeRef &main_tree_ref = get_tree_ref(node_tree_refs, btree);
used_node_tree_refs_.add_new(&main_tree_ref);
More information about the Bf-blender-cvs
mailing list