[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