[Bf-blender-cvs] [a988a16e3d2] functions: new Change Particle Position node

Jacques Lucke noreply at git.blender.org
Wed Sep 11 11:36:57 CEST 2019


Commit: a988a16e3d242c90f1c8556f7d827765f9844993
Author: Jacques Lucke
Date:   Wed Sep 11 11:36:52 2019 +0200
Branches: functions
https://developer.blender.org/rBa988a16e3d242c90f1c8556f7d827765f9844993

new Change Particle Position node

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

M	release/scripts/startup/nodes/bparticle_nodes/change_attribute.py
M	source/blender/simulations/bparticles/actions.cpp
M	source/blender/simulations/bparticles/actions.hpp
M	source/blender/simulations/bparticles/node_frontend.cpp
M	source/blender/simulations/bparticles/particle_function.cpp

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

diff --git a/release/scripts/startup/nodes/bparticle_nodes/change_attribute.py b/release/scripts/startup/nodes/bparticle_nodes/change_attribute.py
index 0329f540e88..73d0a8894b2 100644
--- a/release/scripts/startup/nodes/bparticle_nodes/change_attribute.py
+++ b/release/scripts/startup/nodes/bparticle_nodes/change_attribute.py
@@ -37,6 +37,7 @@ class ChangeParticleVelocityNode(bpy.types.Node, BParticlesNode):
     def draw(self, layout):
         layout.prop(self, "mode", text="")
 
+
 class ChangeParticleSizeNode(bpy.types.Node, BParticlesNode):
     bl_idname = "bp_ChangeParticleSizeNode"
     bl_label = "Change Size"
@@ -44,3 +45,12 @@ class ChangeParticleSizeNode(bpy.types.Node, BParticlesNode):
     def declaration(self, builder: NodeBuilder):
         builder.fixed_input("size", "Size", "Float", default=0.01)
         builder.execute_output("execute", "Execute")
+
+
+class ChangeParticlePosition(bpy.types.Node, BParticlesNode):
+    bl_idname = "bp_ChangeParticlePositionNode"
+    bl_label = "Change Position"
+
+    def declaration(self, builder: NodeBuilder):
+        builder.fixed_input("position", "Position", "Vector")
+        builder.execute_output("execute", "Execute")
diff --git a/source/blender/simulations/bparticles/actions.cpp b/source/blender/simulations/bparticles/actions.cpp
index d0bf08042f0..3f34d29113b 100644
--- a/source/blender/simulations/bparticles/actions.cpp
+++ b/source/blender/simulations/bparticles/actions.cpp
@@ -105,6 +105,17 @@ void ChangeSizeAction::execute(ActionInterface &interface)
   }
 }
 
+void ChangePositionAction::execute(ActionInterface &interface)
+{
+  auto positions = interface.attributes().get<float3>("Position");
+
+  auto inputs = m_compute_inputs->compute(interface);
+  for (uint pindex : interface.pindices()) {
+    float3 position = inputs->get<float3>("Position", 0, pindex);
+    positions[pindex] = position;
+  }
+}
+
 void KillAction::execute(ActionInterface &interface)
 {
   interface.kill(interface.pindices());
diff --git a/source/blender/simulations/bparticles/actions.hpp b/source/blender/simulations/bparticles/actions.hpp
index 4c68c750985..b1cce7d87be 100644
--- a/source/blender/simulations/bparticles/actions.hpp
+++ b/source/blender/simulations/bparticles/actions.hpp
@@ -77,6 +77,19 @@ class ChangeSizeAction : public Action {
   void execute(ActionInterface &interface) override;
 };
 
+class ChangePositionAction : public Action {
+ private:
+  std::unique_ptr<ParticleFunction> m_compute_inputs;
+
+ public:
+  ChangePositionAction(std::unique_ptr<ParticleFunction> compute_inputs)
+      : m_compute_inputs(std::move(compute_inputs))
+  {
+  }
+
+  void execute(ActionInterface &interface) override;
+};
+
 class ExplodeAction : public Action {
  private:
   Vector<std::string> m_types_to_emit;
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index d4eca69f84a..5d0b2602dc9 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -199,6 +199,21 @@ static std::unique_ptr<Action> ACTION_change_size(VTreeDataGraph &vtree_data_gra
   return std::unique_ptr<Action>(action);
 }
 
+static std::unique_ptr<Action> ACTION_change_position(VTreeDataGraph &vtree_data_graph,
+                                                      VirtualSocket *execute_vsocket)
+{
+  VirtualNode *vnode = execute_vsocket->vnode();
+
+  auto fn_or_error = create_particle_function(vnode, vtree_data_graph);
+  if (fn_or_error.is_error()) {
+    return {};
+  }
+  std::unique_ptr<ParticleFunction> compute_inputs_fn = fn_or_error.extract_value();
+
+  Action *action = new ChangePositionAction(std::move(compute_inputs_fn));
+  return std::unique_ptr<Action>(action);
+}
+
 BLI_LAZY_INIT_STATIC(StringMap<ActionParserCallback>, get_action_parsers)
 {
   StringMap<ActionParserCallback> map;
@@ -208,6 +223,7 @@ BLI_LAZY_INIT_STATIC(StringMap<ActionParserCallback>, get_action_parsers)
   map.add_new("bp_ParticleConditionNode", ACTION_condition);
   map.add_new("bp_ChangeParticleColorNode", ACTION_change_color);
   map.add_new("bp_ChangeParticleSizeNode", ACTION_change_size);
+  map.add_new("bp_ChangeParticlePositionNode", ACTION_change_position);
   return map;
 }
 
diff --git a/source/blender/simulations/bparticles/particle_function.cpp b/source/blender/simulations/bparticles/particle_function.cpp
index 463ed83a32c..378e1e03a23 100644
--- a/source/blender/simulations/bparticles/particle_function.cpp
+++ b/source/blender/simulations/bparticles/particle_function.cpp
@@ -36,7 +36,8 @@ ParticleFunction::ParticleFunction(SharedFunction fn_no_deps,
   }
 
   if (m_fn_with_deps->output_amount() > 0) {
-    m_array_execution = FN::Functions::get_precompiled_array_execution(m_fn_with_deps);
+    // m_array_execution = FN::Functions::get_precompiled_array_execution(m_fn_with_deps);
+    m_array_execution = FN::Functions::get_tuple_call_array_execution(m_fn_with_deps);
   }
 }



More information about the Bf-blender-cvs mailing list