[Bf-blender-cvs] [5481e5119b1] functions: use multimap to more generally store socket origins

Jacques Lucke noreply at git.blender.org
Tue Jul 2 16:12:00 CEST 2019


Commit: 5481e5119b14fff4f8e89496b4dd6afa5762c539
Author: Jacques Lucke
Date:   Tue Jul 2 15:31:01 2019 +0200
Branches: functions
https://developer.blender.org/rB5481e5119b14fff4f8e89496b4dd6afa5762c539

use multimap to more generally store socket origins

===================================================================

M	release/scripts/startup/nodes/tests.py
M	source/blender/blenkernel/BKE_node_tree.hpp
M	source/blender/blenkernel/intern/node_tree.cpp
M	source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
M	source/blender/simulations/bparticles/c_wrapper.cpp

===================================================================

diff --git a/release/scripts/startup/nodes/tests.py b/release/scripts/startup/nodes/tests.py
index 517d89fe68d..f3730b11590 100644
--- a/release/scripts/startup/nodes/tests.py
+++ b/release/scripts/startup/nodes/tests.py
@@ -2,5 +2,5 @@ import unittest
 
 def register():
     loader = unittest.TestLoader()
-    tests = loader.discover("function_nodes", pattern="test*")
+    tests = loader.discover("nodes", pattern="test*")
     unittest.TextTestRunner(verbosity=1).run(tests)
diff --git a/source/blender/blenkernel/BKE_node_tree.hpp b/source/blender/blenkernel/BKE_node_tree.hpp
index 68c4c1ac864..16e03b028f6 100644
--- a/source/blender/blenkernel/BKE_node_tree.hpp
+++ b/source/blender/blenkernel/BKE_node_tree.hpp
@@ -7,11 +7,13 @@
 #include "BLI_small_map.hpp"
 #include "BLI_small_vector.hpp"
 #include "BLI_listbase_wrapper.hpp"
+#include "BLI_multimap.hpp"
 
 namespace BKE {
 
 using BLI::ArrayRef;
 using BLI::ListBaseWrapper;
+using BLI::MultiMap;
 using BLI::SmallMap;
 using BLI::SmallVector;
 using BLI::StringRef;
@@ -24,27 +26,27 @@ class BNodeTreeLookup {
  public:
   BNodeTreeLookup(bNodeTree *btree);
 
-  struct DataLink {
+  struct SingleOriginLink {
     bNodeSocket *from;
     bNodeSocket *to;
     bNodeLink *source_link;
   };
 
-  const ArrayRef<DataLink> data_links()
+  const ArrayRef<SingleOriginLink> single_origin_links()
   {
-    return m_data_links;
+    return m_single_origin_links;
   }
 
   SmallVector<bNode *> nodes_with_idname(StringRef idname);
 
  private:
   bool is_reroute(bNode *bnode);
-  bNodeSocket *try_find_data_origin(bNodeSocket *bsocket);
+  bNodeSocket *try_find_single_origin(bNodeSocket *bsocket);
 
   SmallVector<bNode *> m_nodes;
   SmallMap<bNodeSocket *, bNode *> m_node_by_socket;
-  SmallMap<bNodeSocket *, bNodeSocket *> m_direct_origin;
-  SmallVector<DataLink> m_data_links;
+  MultiMap<bNodeSocket *, bNodeSocket *> m_direct_origins;
+  SmallVector<SingleOriginLink> m_single_origin_links;
 };
 
 }  // namespace BKE
diff --git a/source/blender/blenkernel/intern/node_tree.cpp b/source/blender/blenkernel/intern/node_tree.cpp
index 5469f3d5c89..4980ed69190 100644
--- a/source/blender/blenkernel/intern/node_tree.cpp
+++ b/source/blender/blenkernel/intern/node_tree.cpp
@@ -14,8 +14,7 @@ BNodeTreeLookup::BNodeTreeLookup(bNodeTree *btree) : m_nodes(btree->nodes, true)
   }
 
   for (bNodeLink *blink : bLinkList(&btree->links)) {
-    BLI_assert(!m_direct_origin.contains(blink->tosock));
-    m_direct_origin.add(blink->tosock, blink->fromsock);
+    m_direct_origins.add(blink->tosock, blink->fromsock);
   }
 
   for (bNodeLink *blink : bLinkList(&btree->links)) {
@@ -24,21 +23,21 @@ BNodeTreeLookup::BNodeTreeLookup(bNodeTree *btree) : m_nodes(btree->nodes, true)
     if (this->is_reroute(target_node)) {
       continue;
     }
-    bNodeSocket *origin = this->try_find_data_origin(target);
+    bNodeSocket *origin = this->try_find_single_origin(target);
     if (origin != nullptr) {
-      m_data_links.append(DataLink{origin, target, blink});
+      m_single_origin_links.append(SingleOriginLink{origin, target, blink});
     }
   }
 }
 
-bNodeSocket *BNodeTreeLookup::try_find_data_origin(bNodeSocket *bsocket)
+bNodeSocket *BNodeTreeLookup::try_find_single_origin(bNodeSocket *bsocket)
 {
   BLI_assert(bsocket->in_out == SOCK_IN);
-  if (m_direct_origin.contains(bsocket)) {
-    bNodeSocket *origin = m_direct_origin.lookup(bsocket);
+  if (m_direct_origins.values_for_key(bsocket) == 1) {
+    bNodeSocket *origin = m_direct_origins.lookup(bsocket)[0];
     bNode *origin_node = m_node_by_socket.lookup(origin);
     if (this->is_reroute(origin_node)) {
-      return this->try_find_data_origin((bNodeSocket *)origin_node->inputs.first);
+      return this->try_find_single_origin((bNodeSocket *)origin_node->inputs.first);
     }
     else {
       return origin;
diff --git a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
index 794e2a9e4f6..e9c2455736f 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -140,7 +140,10 @@ static DFGB_SocketVector insert_function_output(BTreeGraphBuilder &builder)
 static bool insert_links(BTreeGraphBuilder &builder, GraphInserters &inserters)
 {
   BNodeTreeLookup btree_lookup(builder.btree());
-  for (auto &link : btree_lookup.data_links()) {
+  for (auto &link : btree_lookup.single_origin_links()) {
+    if (!builder.is_data_socket(link.to)) {
+      continue;
+    }
     if (!inserters.insert_link(builder, link.from, link.to, link.source_link)) {
       return false;
     }
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index 10ae8414f56..f7cae99927a 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -188,6 +188,7 @@ class ModifierStepDescription : public StepDescription {
   float m_duration;
   SmallMap<uint, ModifierParticleType *> m_types;
   SmallVector<Emitter *> m_emitters;
+  SmallVector<uint> m_particle_type_ids;
 
   ~ModifierStepDescription()
   {
@@ -211,7 +212,7 @@ class ModifierStepDescription : public StepDescription {
 
   ArrayRef<uint> particle_type_ids() override
   {
-    return {0, 1};
+    return m_particle_type_ids;
   }
 
   ParticleType &particle_type(uint type_id) override
@@ -220,10 +221,20 @@ class ModifierStepDescription : public StepDescription {
   }
 };
 
-// ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree)
-// {
-//   BNodeTreeLookup btree_lookup(btree);
-// }
+static ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree)
+{
+  ModifierStepDescription *step_description = new ModifierStepDescription();
+  BNodeTreeLookup btree_lookup(btree);
+
+  auto particle_type_nodes = btree_lookup.nodes_with_idname("bp_ParticleTypeNode");
+  for (uint i = 0; i < particle_type_nodes.size(); i++) {
+    ModifierParticleType *type = new ModifierParticleType();
+    step_description->m_types.add_new(i, type);
+    step_description->m_particle_type_ids.append(i);
+  }
+
+  return step_description;
+}
 
 void BParticles_simulate_modifier(NodeParticlesModifierData *npmd,
                                   Depsgraph *UNUSED(depsgraph),
@@ -231,40 +242,16 @@ void BParticles_simulate_modifier(NodeParticlesModifierData *npmd,
 {
   SCOPED_TIMER(__func__);
 
-  ParticlesState &state = *unwrap(state_c);
-  ModifierStepDescription description;
-  description.m_duration = 1.0f / 24.0f;
-
-  auto *type0 = new ModifierParticleType();
-  description.m_types.add_new(0, type0);
-  type0->m_integrator = new EulerIntegrator();
-  type0->m_integrator->m_forces.append(FORCE_directional({0, 0, -2}));
-
-  if (npmd->emitter_object) {
-    description.m_emitters.append(EMITTER_mesh_surface(0,
-                                                       (Mesh *)npmd->emitter_object->data,
-                                                       npmd->last_emitter_transforms,
-                                                       npmd->emitter_object->obmat,
-                                                       npmd->control1));
-    copy_m4_m4(npmd->last_emitter_transforms, npmd->emitter_object->obmat);
+  if (npmd->bparticles_tree == NULL) {
+    return;
   }
-  BVHTreeFromMesh treedata = {0};
-  if (npmd->collision_object) {
-    BKE_bvhtree_from_mesh_get(
-        &treedata, (Mesh *)npmd->collision_object->data, BVHTREE_FROM_LOOPTRI, 4);
-    type0->m_events.append(EVENT_mesh_bounce(&treedata, npmd->collision_object->obmat));
-  }
-
-  auto *type1 = new ModifierParticleType();
-  description.m_types.add_new(1, type1);
-  type1->m_integrator = new EulerIntegrator();
-  type1->m_events.append(new EventActionTest(EVENT_age_reached(0.3f), ACTION_kill()));
 
-  simulate_step(state, description);
+  ModifierStepDescription *step_description = step_description_from_node_tree(
+      npmd->bparticles_tree);
+  step_description->m_duration = 1.0f / 24.0f;
 
-  if (npmd->collision_object) {
-    free_bvhtree_from_mesh(&treedata);
-  }
+  ParticlesState &state = *unwrap(state_c);
+  simulate_step(state, *step_description);
 
   auto &containers = state.particle_containers();
   for (auto item : containers.items()) {



More information about the Bf-blender-cvs mailing list