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

derived_node_tree.cc « intern « blenkernel « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: cebe4446a0215e3a12ecf3ebcccf5d50361db8fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
 * 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 "BKE_derived_node_tree.hh"

#define UNINITIALIZED_ID UINT32_MAX

namespace BKE {

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()
{
}

}  // namespace BKE