Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenkernel/intern/derived_node_tree.cc')
-rw-r--r--source/blender/blenkernel/intern/derived_node_tree.cc79
1 files changed, 78 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/derived_node_tree.cc b/source/blender/blenkernel/intern/derived_node_tree.cc
index 7a0896a1f17..cebe4446a02 100644
--- a/source/blender/blenkernel/intern/derived_node_tree.cc
+++ b/source/blender/blenkernel/intern/derived_node_tree.cc
@@ -16,10 +16,87 @@
#include "BKE_derived_node_tree.hh"
+#define UNINITIALIZED_ID UINT32_MAX
+
namespace BKE {
-DerivedNodeTree::DerivedNodeTree(bNodeTree *UNUSED(btree), NodeTreeRefMap &UNUSED(node_tree_refs))
+static const NodeTreeRef &get_tree_ref(NodeTreeRefMap &node_tree_refs, bNodeTree *btree)
+{
+ return *node_tree_refs.lookup_or_add(btree,
+ [&]() { return BLI::make_unique<NodeTreeRef>(btree); });
+}
+
+DerivedNodeTree::DerivedNodeTree(bNodeTree *btree, NodeTreeRefMap &node_tree_refs)
+{
+ const NodeTreeRef &main_tree_ref = get_tree_ref(node_tree_refs, btree);
+
+ Vector<DNode *> all_nodes;
+
+ this->insert_nodes_and_links_in_id_order(main_tree_ref, nullptr, all_nodes);
+}
+
+void DerivedNodeTree::insert_nodes_and_links_in_id_order(const NodeTreeRef &tree_ref,
+ DParentNode *parent,
+ Vector<DNode *> &r_nodes)
+{
+ Array<DSocket *, 64> sockets_map(tree_ref.sockets().size());
+
+ /* Insert nodes. */
+ for (const NodeRef *node_ref : tree_ref.nodes()) {
+ DNode &node = this->create_node(*node_ref, parent, sockets_map);
+ r_nodes.append(&node);
+ }
+
+ /* Insert links. */
+ for (const NodeRef *node_ref : tree_ref.nodes()) {
+ for (const InputSocketRef *to_socket_ref : node_ref->inputs()) {
+ DInputSocket *to_socket = (DInputSocket *)sockets_map[to_socket_ref->id()];
+ for (const OutputSocketRef *from_socket_ref : to_socket_ref->linked_sockets()) {
+ DOutputSocket *from_socket = (DOutputSocket *)sockets_map[from_socket_ref->id()];
+ to_socket->m_linked_sockets.append(from_socket);
+ from_socket->m_linked_sockets.append(to_socket);
+ }
+ }
+ }
+}
+
+DNode &DerivedNodeTree::create_node(const NodeRef &node_ref,
+ DParentNode *parent,
+ MutableArrayRef<DSocket *> r_sockets_map)
{
+ DNode &node = *m_allocator.construct<DNode>();
+ node.m_node_ref = &node_ref;
+ node.m_parent = parent;
+ node.m_id = UNINITIALIZED_ID;
+
+ node.m_inputs = m_allocator.construct_elements_and_pointer_array<DInputSocket>(
+ node_ref.inputs().size());
+ node.m_outputs = m_allocator.construct_elements_and_pointer_array<DOutputSocket>(
+ node_ref.outputs().size());
+
+ for (uint i : node.m_inputs.index_range()) {
+ const InputSocketRef &socket_ref = node_ref.input(i);
+ DInputSocket &socket = *node.m_inputs[i];
+
+ socket.m_id = UNINITIALIZED_ID;
+ socket.m_node = &node;
+ socket.m_socket_ref = &socket_ref;
+
+ r_sockets_map[socket_ref.id()] = &socket;
+ }
+
+ for (uint i : node.m_outputs.index_range()) {
+ const OutputSocketRef &socket_ref = node_ref.output(i);
+ DOutputSocket &socket = *node.m_outputs[i];
+
+ socket.m_id = UNINITIALIZED_ID;
+ socket.m_node = &node;
+ socket.m_socket_ref = &socket_ref;
+
+ r_sockets_map[socket_ref.id()] = &socket;
+ }
+
+ return node;
}
DerivedNodeTree::~DerivedNodeTree()