Commit: 10c73f79fa18aa25b92f2eb9d19ac097541f22e7
Author: Jacques Lucke
Date:   Mon Mar 9 16:05:24 2020 +0100
Branches: particle-solver-dev
https://developer.blender.org/rB10c73f79fa18aa25b92f2eb9d19ac097541f22e7

simple collision object node

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

A       release/scripts/startup/nodes/bparticle_nodes/collision_object.py
M       source/blender/simulations/bparticles/node_frontend.cpp
M       source/blender/simulations/bparticles/simulate.cpp
M       source/blender/simulations/bparticles/simulate.hpp

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

diff --git a/release/scripts/startup/nodes/bparticle_nodes/collision_object.py 
b/release/scripts/startup/nodes/bparticle_nodes/collision_object.py
new file mode 100644
index 00000000000..31cdd1f3b34
--- /dev/null
+++ b/release/scripts/startup/nodes/bparticle_nodes/collision_object.py
@@ -0,0 +1,11 @@
+import bpy
+from .. base import SimulationNode
+from .. node_builder import NodeBuilder
+
+class CollisionObjectNode(bpy.types.Node, SimulationNode):
+    bl_idname = "fn_CollisionObjectNode"
+    bl_label = "Collision Object"
+
+    def declaration(self, builder: NodeBuilder):
+        builder.fixed_input("object", "Object", "Object", display_name=False)
+        builder.influences_output("collider", "Collider")
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp 
b/source/blender/simulations/bparticles/node_frontend.cpp
index f3dc4b7cd9b..63aed77bdec 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -66,6 +66,7 @@ class InfluencesCollector {
   StringMultiMap<Event *> m_events;
   StringMultiMap<OffsetHandler *> m_offset_handlers;
   StringMap<AttributesInfoBuilder *> m_attributes;
+  StringMultiMap<Object *> m_collision_objects;
 };
 
 class FunctionTreeData {
@@ -694,6 +695,16 @@ class FNodeInfluencesBuilder {
     }
   }
 
+  void add_collision_object(ArrayRef<std::string> system_names, Object *object)
+  {
+    for (StringRef system_name : system_names) {
+      if 
(!m_influences_collector.m_collision_objects.lookup_default(system_name)
+               .contains(object)) {
+        m_influences_collector.m_collision_objects.add(system_name, object);
+      }
+    }
+  }
+
   std::string node_identifier()
   {
     std::stringstream ss;
@@ -1033,6 +1044,24 @@ static void PARSE_always_execute(FNodeInfluencesBuilder 
&builder)
   builder.add_offset_handler(system_names, offset_handler);
 }
 
+static void PARSE_collision_object(FNodeInfluencesBuilder &builder)
+{
+  ArrayRef<std::string> system_names = builder.find_target_system_names(0, 
"Collider");
+
+  Optional<NamedGenericTupleRef> inputs = builder.compute_inputs({0});
+  if (!inputs.has_value()) {
+    return;
+  }
+
+  ObjectIDHandle object_handle = inputs->relocate_out<ObjectIDHandle>(0, 
"Object");
+  Object *object = builder.id_handle_lookup().lookup(object_handle);
+  if (object == nullptr || object->type != OB_MESH) {
+    return;
+  }
+
+  builder.add_collision_object(system_names, object);
+}
+
 static StringMap<ParseNodeCallback, BLI::RawAllocator> 
create_node_parsers_map()
 {
   StringMap<ParseNodeCallback, BLI::RawAllocator> map;
@@ -1047,6 +1076,7 @@ static StringMap<ParseNodeCallback, BLI::RawAllocator> 
create_node_parsers_map()
   map.add_new("fn_CustomEventNode", PARSE_custom_event);
   map.add_new("fn_AlwaysExecuteNode", PARSE_always_execute);
   map.add_new("fn_ForceNode", PARSE_custom_force);
+  map.add_new("fn_CollisionObjectNode", PARSE_collision_object);
   return map;
 }
 
@@ -1161,6 +1191,7 @@ class NodeTreeStepSimulator : public StepSimulator {
           integrators.lookup(name),
           influences_collector.m_events.lookup_default(name),
           influences_collector.m_offset_handlers.lookup_default(name),
+          influences_collector.m_collision_objects.lookup_default(name),
       };
       systems_to_simulate.add_new(name, type_info);
     }
diff --git a/source/blender/simulations/bparticles/simulate.cpp 
b/source/blender/simulations/bparticles/simulate.cpp
index 22d3752343f..6538242901d 100644
--- a/source/blender/simulations/bparticles/simulate.cpp
+++ b/source/blender/simulations/bparticles/simulate.cpp
@@ -430,6 +430,11 @@ void simulate_particles(SimulationState &simulation_state,
 {
   SCOPED_TIMER(__func__);
 
+  systems_to_simulate.foreach_item([](StringRef name, ParticleSystemInfo 
&system_info) {
+    system_info.collision_objects.print_as_lines(
+        name, [](Object *object) { std::cout << object->id.name; });
+  });
+
   ParticlesState &particles_state = simulation_state.particles();
   FloatInterval simulation_time_span = 
simulation_state.time().current_update_time();
 
diff --git a/source/blender/simulations/bparticles/simulate.hpp 
b/source/blender/simulations/bparticles/simulate.hpp
index a3c7f120925..3c7eae9a9e9 100644
--- a/source/blender/simulations/bparticles/simulate.hpp
+++ b/source/blender/simulations/bparticles/simulate.hpp
@@ -6,12 +6,15 @@
 #include "offset_handler_interface.hpp"
 #include "emitter_interface.hpp"
 
+#include "DNA_object_types.h"
+
 namespace BParticles {
 
 struct ParticleSystemInfo {
   Integrator *integrator;
   ArrayRef<Event *> events;
   ArrayRef<OffsetHandler *> offset_handlers;
+  ArrayRef<Object *> collision_objects;
 };
 
 void simulate_particles(SimulationState &state,

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to