Commit: 49c3eb847869ee6bfb477bd20ce22dd409dc85e5
Author: Jacques Lucke
Date: Wed Nov 27 14:42:15 2019 +0100
Branches: functions
https://developer.blender.org/rB49c3eb847869ee6bfb477bd20ce22dd409dc85e5
replace virtual with inlined tree
===================================================================
M source/blender/blenkernel/BKE_inlined_node_tree.h
M source/blender/blenkernel/intern/inlined_node_tree.cc
M source/blender/functions/FN_vtree_multi_function_network.h
M source/blender/functions/FN_vtree_multi_function_network_generation.h
M source/blender/functions/intern/vtree_multi_function_network/builder.cc
M source/blender/functions/intern/vtree_multi_function_network/builder.h
M source/blender/functions/intern/vtree_multi_function_network/generate.cc
M
source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
M source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
M source/blender/modifiers/intern/MOD_functionpoints_cxx.cc
M source/blender/simulations/bparticles/c_wrapper.cpp
M source/blender/simulations/bparticles/node_frontend.cpp
M source/blender/simulations/bparticles/node_frontend.hpp
M source/blender/simulations/bparticles/particle_function_builder.cpp
M source/blender/simulations/bparticles/particle_function_builder.hpp
===================================================================
diff --git a/source/blender/blenkernel/BKE_inlined_node_tree.h
b/source/blender/blenkernel/BKE_inlined_node_tree.h
index 3040562ce08..ba0935bc359 100644
--- a/source/blender/blenkernel/BKE_inlined_node_tree.h
+++ b/source/blender/blenkernel/BKE_inlined_node_tree.h
@@ -23,6 +23,7 @@ class InlinedNodeTree;
class XSocket : BLI::NonCopyable, BLI::NonMovable {
protected:
XNode *m_node;
+ const VSocket *m_vsocket;
bool m_is_input;
/* Input and output sockets share the same id-space. */
@@ -36,13 +37,17 @@ class XSocket : BLI::NonCopyable, BLI::NonMovable {
bool is_input() const;
bool is_output() const;
+ const XSocket &as_base() const;
const XInputSocket &as_input() const;
const XOutputSocket &as_output() const;
+
+ PointerRNA *rna() const;
+ StringRefNull idname() const;
+ StringRefNull name() const;
};
class XInputSocket : public XSocket {
private:
- const VInputSocket *m_vsocket;
Vector<XOutputSocket *> m_linked_sockets;
Vector<XGroupInput *> m_linked_group_inputs;
@@ -58,7 +63,6 @@ class XInputSocket : public XSocket {
class XOutputSocket : public XSocket {
private:
- const VOutputSocket *m_vsocket;
Vector<XInputSocket *> m_linked_sockets;
friend InlinedNodeTree;
@@ -108,8 +112,14 @@ class XNode : BLI::NonCopyable, BLI::NonMovable {
const XInputSocket &input(uint index) const;
const XOutputSocket &output(uint index) const;
+ const XInputSocket &input(uint index, StringRef expected_name) const;
+ const XOutputSocket &output(uint index, StringRef expected_name) const;
uint id() const;
+
+ PointerRNA *rna() const;
+ StringRefNull idname() const;
+ StringRefNull name() const;
};
class XParentNode : BLI::NonCopyable, BLI::NonMovable {
@@ -140,6 +150,8 @@ class InlinedNodeTree : BLI::NonCopyable, BLI::NonMovable {
Vector<XInputSocket *> m_input_sockets;
Vector<XOutputSocket *> m_output_sockets;
+ StringMap<Vector<XNode *>> m_nodes_by_idname;
+
public:
InlinedNodeTree(bNodeTree *btree, BTreeVTreeMap &vtrees);
~InlinedNodeTree();
@@ -147,6 +159,16 @@ class InlinedNodeTree : BLI::NonCopyable, BLI::NonMovable {
std::string to_dot() const;
void to_dot__clipboard() const;
+ const XSocket &socket_by_id(uint id) const;
+ uint socket_count() const;
+ uint node_count() const;
+
+ ArrayRef<const XSocket *> all_sockets() const;
+ ArrayRef<const XNode *> all_nodes() const;
+ ArrayRef<const XInputSocket *> all_input_sockets() const;
+ ArrayRef<const XOutputSocket *> all_output_sockets() const;
+ ArrayRef<const XNode *> nodes_with_idname(StringRef idname) const;
+
private:
void expand_groups(Vector<XNode *> &all_nodes,
Vector<XGroupInput *> &all_group_inputs,
@@ -209,11 +231,40 @@ inline const XOutputSocket &XNode::output(uint index)
const
return *m_outputs[index];
}
+inline const XInputSocket &XNode::input(uint index, StringRef expected_name)
const
+{
+ BLI_assert(m_inputs[index]->name() == expected_name);
+ UNUSED_VARS_NDEBUG(expected_name);
+ return *m_inputs[index];
+}
+
+inline const XOutputSocket &XNode::output(uint index, StringRef expected_name)
const
+{
+ BLI_assert(m_outputs[index]->name() == expected_name);
+ UNUSED_VARS_NDEBUG(expected_name);
+ return *m_outputs[index];
+}
+
inline uint XNode::id() const
{
return m_id;
}
+inline PointerRNA *XNode::rna() const
+{
+ return m_vnode->rna();
+}
+
+inline StringRefNull XNode::idname() const
+{
+ return m_vnode->idname();
+}
+
+inline StringRefNull XNode::name() const
+{
+ return m_vnode->name();
+}
+
inline const XParentNode *XParentNode::parent() const
{
return m_parent;
@@ -249,6 +300,11 @@ inline bool XSocket::is_output() const
return !m_is_input;
}
+inline const XSocket &XSocket::as_base() const
+{
+ return *this;
+}
+
inline const XInputSocket &XSocket::as_input() const
{
BLI_assert(this->is_input());
@@ -261,9 +317,24 @@ inline const XOutputSocket &XSocket::as_output() const
return *(const XOutputSocket *)this;
}
+inline PointerRNA *XSocket::rna() const
+{
+ return m_vsocket->rna();
+}
+
+inline StringRefNull XSocket::idname() const
+{
+ return m_vsocket->idname();
+}
+
+inline StringRefNull XSocket::name() const
+{
+ return m_vsocket->name();
+}
+
inline const VInputSocket &XInputSocket::vsocket() const
{
- return *m_vsocket;
+ return m_vsocket->as_input();
}
inline ArrayRef<const XOutputSocket *> XInputSocket::linked_sockets() const
@@ -283,7 +354,7 @@ inline bool XInputSocket::is_linked() const
inline const VOutputSocket &XOutputSocket::vsocket() const
{
- return *m_vsocket;
+ return m_vsocket->as_output();
}
inline ArrayRef<const XInputSocket *> XOutputSocket::linked_sockets() const
@@ -311,6 +382,52 @@ inline uint XGroupInput::id() const
return m_id;
}
+inline const XSocket &InlinedNodeTree::socket_by_id(uint id) const
+{
+ return *m_sockets_by_id[id];
+}
+
+inline uint InlinedNodeTree::socket_count() const
+{
+ return m_sockets_by_id.size();
+}
+
+inline uint InlinedNodeTree::node_count() const
+{
+ return m_node_by_id.size();
+}
+
+inline ArrayRef<const XSocket *> InlinedNodeTree::all_sockets() const
+{
+ return m_sockets_by_id.as_ref();
+}
+
+inline ArrayRef<const XNode *> InlinedNodeTree::all_nodes() const
+{
+ return m_node_by_id.as_ref();
+}
+
+inline ArrayRef<const XInputSocket *> InlinedNodeTree::all_input_sockets()
const
+{
+ return m_input_sockets.as_ref();
+}
+
+inline ArrayRef<const XOutputSocket *> InlinedNodeTree::all_output_sockets()
const
+{
+ return m_output_sockets.as_ref();
+}
+
+inline ArrayRef<const XNode *> InlinedNodeTree::nodes_with_idname(StringRef
idname) const
+{
+ auto *nodes = m_nodes_by_idname.lookup_ptr(idname);
+ if (nodes == nullptr) {
+ return {};
+ }
+ else {
+ return nodes->as_ref();
+ }
+}
+
} // namespace BKE
#endif /* __BKE_INLINED_NODE_TREE_H__ */
diff --git a/source/blender/blenkernel/intern/inlined_node_tree.cc
b/source/blender/blenkernel/intern/inlined_node_tree.cc
index 5fa1253110d..aefca7e8546 100644
--- a/source/blender/blenkernel/intern/inlined_node_tree.cc
+++ b/source/blender/blenkernel/intern/inlined_node_tree.cc
@@ -180,7 +180,7 @@ BLI_NOINLINE void
InlinedNodeTree::expand_group__relink_inputs(
if (outside_interface.is_linked()) {
XGroupInput &group_input =
*m_allocator.construct<XGroupInput>().release();
group_input.m_id = all_group_inputs.append_and_get_index(&group_input);
- group_input.m_vsocket = outside_interface.m_vsocket;
+ group_input.m_vsocket = &outside_interface.m_vsocket->as_input();
group_input.m_parent = group_node.m_parent;
group_input.m_linked_sockets.append(&outside_interface);
@@ -342,6 +342,13 @@ BLI_NOINLINE void
InlinedNodeTree::store_tree_in_this_and_init_ids(
XNode *xnode = m_node_by_id[node_index];
xnode->m_id = node_index;
+ if (m_nodes_by_idname.contains(xnode->idname())) {
+ m_nodes_by_idname.lookup(xnode->idname()).append(xnode);
+ }
+ else {
+ m_nodes_by_idname.add_new(xnode->idname(), {xnode});
+ }
+
for (XInputSocket *xsocket : xnode->m_inputs) {
xsocket->m_id = m_sockets_by_id.append_and_get_index(xsocket);
m_input_sockets.append(xsocket);
diff --git a/source/blender/functions/FN_vtree_multi_function_network.h
b/source/blender/functions/FN_vtree_multi_function_network.h
index 1e18bec872b..2a543071b77 100644
--- a/source/blender/functions/FN_vtree_multi_function_network.h
+++ b/source/blender/functions/FN_vtree_multi_function_network.h
@@ -1,7 +1,7 @@
#ifndef __FN_VTREE_MULTI_FUNCTION_NETWORK_H__
#define __FN_VTREE_MULTI_FUNCTION_NETWORK_H__
-#include "BKE_virtual_node_tree.h"
+#include "BKE_inlined_node_tree.h"
#include "BLI_multi_map.h"
@@ -9,11 +9,11 @@
namespace FN {
-using BKE::VInputSocket;
-using BKE::VirtualNodeTree;
-using BKE::VNode;
-using BKE::VOutputSocket;
-using BKE::VSocket;
+using BKE::InlinedNodeTree;
+using BKE::XInputSocket;
+using BKE::XNode;
+using BKE::XOutputSocket;
+using BKE::XSocket;
using BLI::MultiMap;
#define VTreeMFSocketMap_UNMAPPED UINT_MAX
@@ -24,14 +24,14 @@ class VTreeMFSocketMap {
/* An input vsocket can be mapped to multiple sockets.
* An output vsocket can be mapped to at most one socket.
*/
- const VirtualNodeTree *m_vtree;
+ const InlinedNodeTree *m_vtree;
const MFNetwork *m_network;
Array<uint> m_single_socket_by_vsocket;
MultiMap<uint, uint> m_multiple_inputs_by_vsocket;
Array<uint> m_vsocket_by_socket;
public:
- VTreeMFSocketMap(const VirtualNodeTree &vtree,
+ VTreeMFSocketMap(const InlinedNodeTree &vtree,
const MFNetwork &network,
Array<uint> single_socket_by_vsocket,
MultiMap<uint, uint> multiple_inputs_by_vsocket,
@@ -44,7 +44,7 @@ class VTreeMFSocketMap {
{
}
- bool is_mapped(const VSocket &vsocket) const
+ bool is_mapped(const XSocket &vsocket) const
{
return m_single_socket_by_vsocket[vsocket.id()] <
VTreeMFSocketMap_MULTIMAPPED;
}
@@ -54,14 +54,14 @@ class VTreeMFSocketMap {
return m_vsocket_by_socket[socket.id()] != VTreeMFSocketMap_UNMAPPED;
}
- const MFInputSocket &lookup_singly_mapped_input_socket(const VInputSocket
&vsocket) const
+ const MFInputSocket &lookup_singly_mapped_input_socket(const XInputSocket
&vsocket) const
{
BLI_assert(this->lookup_socket(vsocket).size() == 1);
uint mapped_id = m_single_socket_by_vsocket[vsocket.id()];
return m_network->socket_by_id(mapped_id).as_input();
}
- Vector<const MFInputSocket *> lookup_socket(const VInputSocket &vsocket)
const
+ Vector<const MFInputSocket *> lookup_socket(const XInputSocket &vsocket)
const
{
uint id = vsocket.id();
uint mapped_value = m_single_socket_by_vsocket[id];
@@ -84,19 +84,19 @@ class VTreeMFSocketMap {
}
}
- const MFOutputSocket &lookup_socket(const VOutputSocket &vsocket) const
+ const MFOutputSocket &lookup_socket(const XOutputSocket &vsocket) const
{
uint mapped_id = m_single_socket_by_vsocket[vsocket.id()];
return m_network->socket_by_id(mapped_id).as_output();
}
- const VInputSocket &lookup_vsocket(const MFInputSocket &socket) const
+ const XInputSocket
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs