[Bf-blender-cvs] [5d319ba8ff2] functions: new Drag Force node

Jacques Lucke noreply at git.blender.org
Mon Sep 9 17:23:01 CEST 2019


Commit: 5d319ba8ff29fce667ccc865dfb5c0a6f576404b
Author: Jacques Lucke
Date:   Mon Sep 9 16:17:32 2019 +0200
Branches: functions
https://developer.blender.org/rB5d319ba8ff29fce667ccc865dfb5c0a6f576404b

new Drag Force node

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

A	release/scripts/startup/nodes/bparticle_nodes/forces.py
D	release/scripts/startup/nodes/bparticle_nodes/gravity_force.py
D	release/scripts/startup/nodes/bparticle_nodes/turbulence_force.py
M	source/blender/simulations/bparticles/forces.cpp
M	source/blender/simulations/bparticles/forces.hpp
M	source/blender/simulations/bparticles/node_frontend.cpp

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

diff --git a/release/scripts/startup/nodes/bparticle_nodes/forces.py b/release/scripts/startup/nodes/bparticle_nodes/forces.py
new file mode 100644
index 00000000000..938418c0932
--- /dev/null
+++ b/release/scripts/startup/nodes/bparticle_nodes/forces.py
@@ -0,0 +1,31 @@
+import bpy
+from bpy.props import *
+from .. base import BParticlesNode
+from .. node_builder import NodeBuilder
+
+class TurbulenceForceNode(bpy.types.Node, BParticlesNode):
+    bl_idname = "bp_TurbulenceForceNode"
+    bl_label = "Turbulence Force"
+
+    def declaration(self, builder: NodeBuilder):
+        builder.fixed_input("strength", "Strength", "Vector", default=(1, 1, 1))
+        builder.particle_effector_output("force", "Force")
+
+
+class GravityForceNode(bpy.types.Node, BParticlesNode):
+    bl_idname = "bp_GravityForceNode"
+    bl_label = "Gravity Force"
+
+    def declaration(self, builder: NodeBuilder):
+        builder.fixed_input("direction", "Direction", "Vector", default=(0, 0, -1))
+        builder.fixed_input("falloff", "Falloff", "Falloff")
+        builder.particle_effector_output("force", "Force")
+
+
+class DragForceNode(bpy.types.Node, BParticlesNode):
+    bl_idname = "bp_DragForceNode"
+    bl_label = "Drag Force"
+
+    def declaration(self, builder: NodeBuilder):
+        builder.fixed_input("strength", "Strength", 'Float', default=1)
+        builder.particle_effector_output("force", "Force")
diff --git a/release/scripts/startup/nodes/bparticle_nodes/gravity_force.py b/release/scripts/startup/nodes/bparticle_nodes/gravity_force.py
deleted file mode 100644
index f83eb7ba0aa..00000000000
--- a/release/scripts/startup/nodes/bparticle_nodes/gravity_force.py
+++ /dev/null
@@ -1,13 +0,0 @@
-import bpy
-from bpy.props import *
-from .. base import BParticlesNode
-from .. node_builder import NodeBuilder
-
-class GravityForceNode(bpy.types.Node, BParticlesNode):
-    bl_idname = "bp_GravityForceNode"
-    bl_label = "Gravity Force"
-
-    def declaration(self, builder: NodeBuilder):
-        builder.fixed_input("direction", "Direction", "Vector", default=(0, 0, -1))
-        builder.fixed_input("falloff", "Falloff", "Falloff")
-        builder.particle_effector_output("force", "Force")
diff --git a/release/scripts/startup/nodes/bparticle_nodes/turbulence_force.py b/release/scripts/startup/nodes/bparticle_nodes/turbulence_force.py
deleted file mode 100644
index 14530165c07..00000000000
--- a/release/scripts/startup/nodes/bparticle_nodes/turbulence_force.py
+++ /dev/null
@@ -1,12 +0,0 @@
-import bpy
-from bpy.props import *
-from .. base import BParticlesNode
-from .. node_builder import NodeBuilder
-
-class TurbulenceForceNode(bpy.types.Node, BParticlesNode):
-    bl_idname = "bp_TurbulenceForceNode"
-    bl_label = "Turbulence Force"
-
-    def declaration(self, builder: NodeBuilder):
-        builder.fixed_input("strength", "Strength", "Vector", default=(1, 1, 1))
-        builder.particle_effector_output("force", "Force")
diff --git a/source/blender/simulations/bparticles/forces.cpp b/source/blender/simulations/bparticles/forces.cpp
index 7284d6e5f6a..0cf1ad6057e 100644
--- a/source/blender/simulations/bparticles/forces.cpp
+++ b/source/blender/simulations/bparticles/forces.cpp
@@ -41,4 +41,18 @@ void TurbulenceForce::add_force(ForceInterface &interface)
   }
 }
 
+void DragForce::add_force(ForceInterface &interface)
+{
+  MutableArrayRef<float3> destination = interface.combined_destination();
+  auto velocities = interface.attributes().get<float3>("Velocity");
+
+  auto inputs = m_compute_inputs->compute(interface);
+
+  for (uint pindex : interface.pindices()) {
+    float3 velocity = velocities[pindex];
+    float strength = inputs->get<float>("Strength", 0, pindex);
+    destination[pindex] -= velocity * strength;
+  }
+}
+
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/forces.hpp b/source/blender/simulations/bparticles/forces.hpp
index 5c07615d5d9..bdae5422cc2 100644
--- a/source/blender/simulations/bparticles/forces.hpp
+++ b/source/blender/simulations/bparticles/forces.hpp
@@ -42,4 +42,17 @@ class TurbulenceForce : public Force {
   void add_force(ForceInterface &interface) override;
 };
 
+class DragForce : public Force {
+ private:
+  std::unique_ptr<ParticleFunction> m_compute_inputs;
+
+ public:
+  DragForce(std::unique_ptr<ParticleFunction> compute_inputs)
+      : m_compute_inputs(std::move(compute_inputs))
+  {
+  }
+
+  void add_force(ForceInterface &interface) override;
+};
+
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index 398a18325a4..c5abebfbdfd 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -435,6 +435,24 @@ static void PARSE_turbulence_force(BehaviorCollector &collector,
   }
 }
 
+static void PARSE_drag_force(BehaviorCollector &collector,
+                             VTreeDataGraph &vtree_data_graph,
+                             WorldTransition &UNUSED(world_transition),
+                             VirtualNode *vnode)
+{
+  Vector<std::string> type_names = find_connected_particle_type_names(vnode->output(0, "Force"));
+  for (std::string &type_name : type_names) {
+    auto fn_or_error = create_particle_function(vnode, vtree_data_graph);
+    if (fn_or_error.is_error()) {
+      continue;
+    }
+    std::unique_ptr<ParticleFunction> compute_inputs = fn_or_error.extract_value();
+
+    Force *force = new DragForce(std::move(compute_inputs));
+    collector.m_forces.add(type_name, force);
+  }
+}
+
 static void PARSE_mesh_collision(BehaviorCollector &collector,
                                  VTreeDataGraph &vtree_data_graph,
                                  WorldTransition &UNUSED(world_transition),
@@ -498,6 +516,7 @@ BLI_LAZY_INIT_STATIC(StringMap<ParseNodeCallback>, get_node_parsers)
   map.add_new("bp_TurbulenceForceNode", PARSE_turbulence_force);
   map.add_new("bp_MeshCollisionEventNode", PARSE_mesh_collision);
   map.add_new("bp_SizeOverTimeNode", PARSE_size_over_time);
+  map.add_new("bp_DragForceNode", PARSE_drag_force);
   return map;
 }



More information about the Bf-blender-cvs mailing list