[Bf-blender-cvs] [da04c045fe9] functions: velocity and size input for point emitter

Jacques Lucke noreply at git.blender.org
Tue Jul 16 18:20:42 CEST 2019


Commit: da04c045fe9825b7a4f3987dcd985c43388e5788
Author: Jacques Lucke
Date:   Tue Jul 16 18:18:53 2019 +0200
Branches: functions
https://developer.blender.org/rBda04c045fe9825b7a4f3987dcd985c43388e5788

velocity and size input for point emitter

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

M	release/scripts/startup/bl_operators/modifiers.py
M	release/scripts/startup/nodes/bparticle_nodes/point_emitter.py
M	source/blender/simulations/bparticles/emitters.cpp
M	source/blender/simulations/bparticles/emitters.hpp
M	source/blender/simulations/bparticles/inserters.cpp

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

diff --git a/release/scripts/startup/bl_operators/modifiers.py b/release/scripts/startup/bl_operators/modifiers.py
index cc60a7341e6..826c9eacc9e 100644
--- a/release/scripts/startup/bl_operators/modifiers.py
+++ b/release/scripts/startup/bl_operators/modifiers.py
@@ -72,7 +72,7 @@ class NewBParticlesTree(bpy.types.Operator, ModifierOperator):
         type_node = tree.nodes.new("bp_ParticleTypeNode")
 
         emitter_node = tree.nodes.new("bp_PointEmitterNode")
-        emitter_node.location = (-250, 100)
+        emitter_node.location = (-250, 200)
 
         gravity_node = tree.nodes.new("bp_GravityForceNode")
         gravity_node.location = (-250, -100)
diff --git a/release/scripts/startup/nodes/bparticle_nodes/point_emitter.py b/release/scripts/startup/nodes/bparticle_nodes/point_emitter.py
index e4812378e51..cfabceea526 100644
--- a/release/scripts/startup/nodes/bparticle_nodes/point_emitter.py
+++ b/release/scripts/startup/nodes/bparticle_nodes/point_emitter.py
@@ -9,4 +9,6 @@ class PointEmitterNode(bpy.types.Node, BParticlesNode):
 
     def declaration(self, builder : SocketBuilder):
         builder.fixed_input("position", "Position", "Vector")
+        builder.fixed_input("velocity", "Velocity", "Vector", default=(1, 0, 0))
+        builder.fixed_input("size", "Size", "Float", default=0.01)
         builder.emitter_output("emitter", "Emitter")
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index 8f89d610abb..0f78af8818a 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -25,18 +25,21 @@ static float random_float()
 void PointEmitter::emit(EmitterInterface &interface)
 {
   SmallVector<float3> new_positions(m_amount);
-  SmallVector<float> new_sizes(m_amount, 0.1f);
+  SmallVector<float3> new_velocities(m_amount);
+  SmallVector<float> new_sizes(m_amount);
   SmallVector<float> birth_times(m_amount);
 
   for (uint i = 0; i < m_amount; i++) {
     float t = i / (float)m_amount;
-    float3 point = m_point.interpolate(t);
-    new_positions[i] = point;
+    new_positions[i] = m_point.interpolate(t);
+    new_velocities[i] = m_velocity.interpolate(t);
+    new_sizes[i] = m_size.interpolate(t);
     birth_times[i] = interface.time_span().interpolate(t);
   }
 
   auto target = interface.particle_allocator().request(m_particle_type_name, new_positions.size());
   target.set_float3("Position", new_positions);
+  target.set_float3("Velocity", new_velocities);
   target.set_float("Size", new_sizes);
   target.set_float("Birth Time", birth_times);
 }
diff --git a/source/blender/simulations/bparticles/emitters.hpp b/source/blender/simulations/bparticles/emitters.hpp
index db962de0d78..65ad3c30ded 100644
--- a/source/blender/simulations/bparticles/emitters.hpp
+++ b/source/blender/simulations/bparticles/emitters.hpp
@@ -49,12 +49,22 @@ class SurfaceEmitter : public Emitter {
 class PointEmitter : public Emitter {
  private:
   std::string m_particle_type_name;
-  InterpolatedFloat3 m_point;
   uint m_amount;
+  InterpolatedFloat3 m_point;
+  InterpolatedFloat3 m_velocity;
+  InterpolatedFloat m_size;
 
  public:
-  PointEmitter(StringRef particle_type_name, InterpolatedFloat3 point, uint amount)
-      : m_particle_type_name(particle_type_name.to_std_string()), m_point(point), m_amount(amount)
+  PointEmitter(StringRef particle_type_name,
+               uint amount,
+               InterpolatedFloat3 point,
+               InterpolatedFloat3 velocity,
+               InterpolatedFloat size)
+      : m_particle_type_name(particle_type_name.to_std_string()),
+        m_amount(amount),
+        m_point(point),
+        m_velocity(velocity),
+        m_size(size)
   {
   }
 
diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index 51630b92f50..bdf52b890aa 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -267,8 +267,13 @@ static std::unique_ptr<Emitter> BUILD_EMITTER_moving_point(BuildContext &ctx,
   body->call__setup_execution_context(fn_in, fn_out);
 
   auto point = ctx.world_state.get_interpolated_value(
-      bnode->name, body->get_output<float3>(fn_out, 0, "Position"));
-  return std::unique_ptr<PointEmitter>(new PointEmitter(particle_type_name, point, 10));
+      bnode->name + StringRef("Position"), body->get_output<float3>(fn_out, 0, "Position"));
+  auto velocity = ctx.world_state.get_interpolated_value(
+      bnode->name + StringRef("Velocity"), body->get_output<float3>(fn_out, 1, "Velocity"));
+  auto size = ctx.world_state.get_interpolated_value(bnode->name + StringRef("Size"),
+                                                     body->get_output<float>(fn_out, 2, "Size"));
+  return std::unique_ptr<PointEmitter>(
+      new PointEmitter(particle_type_name, 10, point, velocity, size));
 }
 
 static void match_inputs_to_node_outputs(FN::DataFlowGraphBuilder &builder,



More information about the Bf-blender-cvs mailing list