[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