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;
}
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs