[Bf-blender-cvs] [413af94fd25] functions: deduplicate node creation
Jacques Lucke
noreply at git.blender.org
Tue Nov 26 17:31:48 CET 2019
Commit: 413af94fd2552685ff3817a5df6fdf589a976522
Author: Jacques Lucke
Date: Tue Nov 26 16:03:25 2019 +0100
Branches: functions
https://developer.blender.org/rB413af94fd2552685ff3817a5df6fdf589a976522
deduplicate node creation
===================================================================
M source/blender/blenkernel/BKE_inlined_node_tree.h
M source/blender/blenkernel/BKE_virtual_node_tree.h
M source/blender/blenkernel/intern/inlined_node_tree.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_inlined_node_tree.h b/source/blender/blenkernel/BKE_inlined_node_tree.h
index a32eb8462fa..0cb242fda91 100644
--- a/source/blender/blenkernel/BKE_inlined_node_tree.h
+++ b/source/blender/blenkernel/BKE_inlined_node_tree.h
@@ -144,6 +144,9 @@ class InlinedNodeTree : BLI::NonCopyable, BLI::NonMovable {
Vector<XGroupInput *> &all_group_inputs,
Vector<XParentNode *> &all_parent_nodes,
BTreeVTreeMap &vtrees);
+ void insert_linked_nodes_for_vtree_in_id_order(const VirtualNodeTree &vtree,
+ Vector<XNode *> &all_nodes,
+ XParentNode *parent);
XNode &create_node(const VNode &vnode,
XParentNode *parent,
Map<const VInputSocket *, XInputSocket *> &inputs_map,
diff --git a/source/blender/blenkernel/BKE_virtual_node_tree.h b/source/blender/blenkernel/BKE_virtual_node_tree.h
index b7462e5545d..762367254c3 100644
--- a/source/blender/blenkernel/BKE_virtual_node_tree.h
+++ b/source/blender/blenkernel/BKE_virtual_node_tree.h
@@ -113,6 +113,8 @@ class VNode : BLI::NonCopyable, BLI::NonMovable {
bNode *bnode() const;
bNodeTree *btree() const;
+
+ uint id() const;
};
class VirtualNodeTree : BLI::NonCopyable, BLI::NonMovable {
@@ -308,6 +310,11 @@ inline bNode *VNode::bnode() const
return m_bnode;
}
+inline uint VNode::id() const
+{
+ return m_id;
+}
+
inline bNodeTree *VirtualNodeTree::btree() const
{
return m_btree;
diff --git a/source/blender/blenkernel/intern/inlined_node_tree.cc b/source/blender/blenkernel/intern/inlined_node_tree.cc
index 4596c28641c..28d982e956b 100644
--- a/source/blender/blenkernel/intern/inlined_node_tree.cc
+++ b/source/blender/blenkernel/intern/inlined_node_tree.cc
@@ -101,26 +101,7 @@ InlinedNodeTree::InlinedNodeTree(bNodeTree *btree, BTreeVTreeMap &vtrees) : m_bt
Vector<XGroupInput *> all_group_inputs;
Vector<XParentNode *> all_parent_nodes;
- Map<const VInputSocket *, XInputSocket *> inputs_map;
- Map<const VOutputSocket *, XOutputSocket *> outputs_map;
-
- /* Insert main nodes. */
- for (const VNode *vnode : main_vtree.nodes()) {
- XNode &node = this->create_node(*vnode, nullptr, inputs_map, outputs_map);
- all_nodes.append(&node);
- }
-
- /* Insert main links. */
- for (const VNode *vnode : main_vtree.nodes()) {
- for (const VInputSocket *to_vsocket : vnode->inputs()) {
- XInputSocket *to_socket = inputs_map.lookup(to_vsocket);
- for (const VOutputSocket *from_vsocket : to_vsocket->linked_sockets()) {
- XOutputSocket *from_socket = outputs_map.lookup(from_vsocket);
- to_socket->m_linked_sockets.append(from_socket);
- from_socket->m_linked_sockets.append(to_socket);
- }
- }
- }
+ this->insert_linked_nodes_for_vtree_in_id_order(main_vtree, all_nodes, nullptr);
/* Expand node groups one after another. */
for (uint i = 0; i < all_nodes.size(); i++) {
@@ -192,33 +173,20 @@ void InlinedNodeTree::expand_group_node(XNode &group_node,
sub_parent.m_parent = group_node.m_parent;
sub_parent.m_vnode = &group_vnode;
- Map<const VInputSocket *, XInputSocket *> inputs_map;
- Map<const VOutputSocket *, XOutputSocket *> outputs_map;
-
- /* Insert nodes of group. */
- for (const VNode *vnode : vtree.nodes()) {
- XNode &node = this->create_node(*vnode, &sub_parent, inputs_map, outputs_map);
- all_nodes.append(&node);
- }
-
- /* Insert links of group. */
- for (const VNode *vnode : vtree.nodes()) {
- for (const VInputSocket *to_vsocket : vnode->inputs()) {
- XInputSocket *to_socket = inputs_map.lookup(to_vsocket);
- for (const VOutputSocket *from_vsocket : to_vsocket->linked_sockets()) {
- XOutputSocket *from_socket = outputs_map.lookup(from_vsocket);
- to_socket->m_linked_sockets.append(from_socket);
- from_socket->m_linked_sockets.append(to_socket);
- }
- }
- }
+ this->insert_linked_nodes_for_vtree_in_id_order(vtree, all_nodes, &sub_parent);
+ ArrayRef<XNode *> new_xnodes_by_id = all_nodes.as_ref().take_back(vtree.nodes().size());
Vector<const VOutputSocket *> group_inputs = get_group_inputs(vtree);
Vector<const VInputSocket *> group_outputs = get_group_outputs(vtree);
/* Relink links to group inputs. */
for (uint input_index : group_inputs.index_iterator()) {
- XOutputSocket &inside_interface = *outputs_map.lookup(group_inputs[input_index]);
+ const VOutputSocket *inside_interface_vsocket = group_inputs[input_index];
+ const VNode &inside_interface_vnode = inside_interface_vsocket->node();
+ XNode *inside_interface_xnode = new_xnodes_by_id[inside_interface_vnode.id()];
+
+ XOutputSocket &inside_interface =
+ *inside_interface_xnode->m_outputs[inside_interface_vsocket->index()];
XInputSocket &outside_interface = *group_node.m_inputs[input_index];
/* If the group input has no origin, insert a dummy group input. */
@@ -262,7 +230,12 @@ void InlinedNodeTree::expand_group_node(XNode &group_node,
/* Relink links to group outputs. */
for (uint output_index : group_outputs.index_iterator()) {
- XInputSocket &inside_interface = *inputs_map.lookup(group_outputs[output_index]);
+ const VInputSocket *inside_interface_vsocket = group_outputs[output_index];
+ const VNode &inside_interface_vnode = inside_interface_vsocket->node();
+ XNode *inside_interface_xnode = new_xnodes_by_id[inside_interface_vnode.id()];
+
+ XInputSocket &inside_interface =
+ *inside_interface_xnode->m_inputs[inside_interface_vsocket->index()];
XOutputSocket &outside_interface = *group_node.m_outputs[output_index];
for (XOutputSocket *inside_connected : inside_interface.m_linked_sockets) {
@@ -292,6 +265,32 @@ void InlinedNodeTree::expand_group_node(XNode &group_node,
}
}
+void InlinedNodeTree::insert_linked_nodes_for_vtree_in_id_order(const VirtualNodeTree &vtree,
+ Vector<XNode *> &all_nodes,
+ XParentNode *parent)
+{
+ Map<const VInputSocket *, XInputSocket *> inputs_map;
+ Map<const VOutputSocket *, XOutputSocket *> outputs_map;
+
+ /* Insert nodes of group. */
+ for (const VNode *vnode : vtree.nodes()) {
+ XNode &node = this->create_node(*vnode, parent, inputs_map, outputs_map);
+ all_nodes.append(&node);
+ }
+
+ /* Insert links of group. */
+ for (const VNode *vnode : vtree.nodes()) {
+ for (const VInputSocket *to_vsocket : vnode->inputs()) {
+ XInputSocket *to_socket = inputs_map.lookup(to_vsocket);
+ for (const VOutputSocket *from_vsocket : to_vsocket->linked_sockets()) {
+ XOutputSocket *from_socket = outputs_map.lookup(from_vsocket);
+ to_socket->m_linked_sockets.append(from_socket);
+ from_socket->m_linked_sockets.append(to_socket);
+ }
+ }
+ }
+}
+
XNode &InlinedNodeTree::create_node(const VNode &vnode,
XParentNode *parent,
Map<const VInputSocket *, XInputSocket *> &inputs_map,
@@ -333,12 +332,16 @@ static BLI::DotExport::Cluster *get_cluster_for_parent(
if (parent == nullptr) {
return nullptr;
}
- return clusters.lookup_or_add(parent, [&]() {
+ else if (!clusters.contains(parent)) {
auto *parent_cluster = get_cluster_for_parent(graph, clusters, parent->parent());
auto &new_cluster = graph.new_cluster(parent->vnode().name());
new_cluster.set_parent_cluster(parent_cluster);
+ clusters.add_new(parent, &new_cluster);
return &new_cluster;
- });
+ }
+ else {
+ return clusters.lookup(parent);
+ }
}
std::string InlinedNodeTree::to_dot() const
More information about the Bf-blender-cvs
mailing list