[Bf-blender-cvs] [e800a2d5fab] functions: experimental initial grid emitter

Jacques Lucke noreply at git.blender.org
Wed Jul 17 18:03:13 CEST 2019


Commit: e800a2d5fab1c38bc888af7ade03b0574888b517
Author: Jacques Lucke
Date:   Wed Jul 17 17:45:44 2019 +0200
Branches: functions
https://developer.blender.org/rBe800a2d5fab1c38bc888af7ade03b0574888b517

experimental initial grid emitter

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

A	release/scripts/startup/nodes/bparticle_nodes/initial_grid_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/nodes/bparticle_nodes/initial_grid_emitter.py b/release/scripts/startup/nodes/bparticle_nodes/initial_grid_emitter.py
new file mode 100644
index 00000000000..5bd7a1f3a06
--- /dev/null
+++ b/release/scripts/startup/nodes/bparticle_nodes/initial_grid_emitter.py
@@ -0,0 +1,16 @@
+import bpy
+from bpy.props import *
+from .. base import BParticlesNode
+from .. socket_builder import SocketBuilder
+
+class InitialGridEmitterNode(bpy.types.Node, BParticlesNode):
+    bl_idname = "bp_InitialGridEmitterNode"
+    bl_label = "Initial Grid Emitter"
+
+    def declaration(self, builder : SocketBuilder):
+        builder.fixed_input("amount_x", "Amount X", "Integer", default=10)
+        builder.fixed_input("amount_y", "Amount Y", "Integer", default=10)
+        builder.fixed_input("step_x", "Step X", "Float", default=0.2)
+        builder.fixed_input("step_y", "Step Y", "Float", default=0.2)
+        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 0f78af8818a..92a0e17942b 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -185,4 +185,27 @@ void CustomFunctionEmitter::emit(EmitterInterface &interface)
   }
 }
 
+void InitialGridEmitter::emit(EmitterInterface &interface)
+{
+  if (!interface.is_first_step()) {
+    return;
+  }
+
+  SmallVector<float3> new_positions;
+
+  float offset_x = -(m_amount_x * m_step_x / 2.0f);
+  float offset_y = -(m_amount_y * m_step_y / 2.0f);
+
+  for (uint x = 0; x < m_amount_x; x++) {
+    for (uint y = 0; y < m_amount_y; y++) {
+      new_positions.append(float3(x * m_step_x + offset_x, y * m_step_y + offset_y, 0.0f));
+    }
+  }
+
+  auto target = interface.particle_allocator().request(m_particle_type_name, new_positions.size());
+  target.set_float3("Position", new_positions);
+  target.fill_float("Birth Time", interface.time_span().start());
+  target.fill_float("Size", m_size);
+}
+
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/emitters.hpp b/source/blender/simulations/bparticles/emitters.hpp
index 65ad3c30ded..789a4d0277e 100644
--- a/source/blender/simulations/bparticles/emitters.hpp
+++ b/source/blender/simulations/bparticles/emitters.hpp
@@ -85,4 +85,32 @@ class CustomFunctionEmitter : public Emitter {
   void emit(EmitterInterface &interface) override;
 };
 
+class InitialGridEmitter : public Emitter {
+ private:
+  std::string m_particle_type_name;
+  uint m_amount_x;
+  uint m_amount_y;
+  float m_step_x;
+  float m_step_y;
+  float m_size;
+
+ public:
+  InitialGridEmitter(StringRef particle_type_name,
+                     uint amount_x,
+                     uint amount_y,
+                     float step_x,
+                     float step_y,
+                     float size)
+      : m_particle_type_name(particle_type_name.to_std_string()),
+        m_amount_x(amount_x),
+        m_amount_y(amount_y),
+        m_step_x(step_x),
+        m_step_y(step_y),
+        m_size(size)
+  {
+  }
+
+  void emit(EmitterInterface &interface) override;
+};
+
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index 0cca7d12d71..3b30e5c2283 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -378,6 +378,25 @@ static std::unique_ptr<Emitter> BUILD_EMITTER_custom_function(BuildContext &ctx,
   return std::unique_ptr<Emitter>(new CustomFunctionEmitter(particle_type_name, fn));
 }
 
+static std::unique_ptr<Emitter> BUILD_EMITTER_initial_grid(BuildContext &ctx,
+                                                           bNode *bnode,
+                                                           StringRef particle_type_name)
+{
+  SharedFunction fn = create_function_for_data_inputs(bnode, ctx.indexed_tree, ctx.data_graph);
+
+  TupleCallBody *body = fn->body<TupleCallBody>();
+  FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
+  body->call__setup_execution_context(fn_in, fn_out);
+
+  return std::unique_ptr<Emitter>(
+      new InitialGridEmitter(particle_type_name,
+                             body->get_output<uint>(fn_out, 0, "Amount X"),
+                             body->get_output<uint>(fn_out, 1, "Amount Y"),
+                             body->get_output<float>(fn_out, 2, "Step X"),
+                             body->get_output<float>(fn_out, 3, "Step Y"),
+                             body->get_output<float>(fn_out, 4, "Size")));
+}
+
 BLI_LAZY_INIT(StringMap<ForceFromNodeCallback>, get_force_builders)
 {
   StringMap<ForceFromNodeCallback> map;
@@ -401,6 +420,7 @@ BLI_LAZY_INIT(StringMap<EmitterFromNodeCallback>, get_emitter_builders)
   map.add_new("bp_PointEmitterNode", BUILD_EMITTER_moving_point);
   map.add_new("bp_MeshEmitterNode", BUILD_EMITTER_mesh_surface);
   map.add_new("bp_CustomEmitterNode", BUILD_EMITTER_custom_function);
+  map.add_new("bp_InitialGridEmitterNode", BUILD_EMITTER_initial_grid);
   return map;
 }



More information about the Bf-blender-cvs mailing list