Commit: 873f483836af88d05ecac525de2380db0410df39 Author: Jacques Lucke Date: Fri Jul 5 11:15:57 2019 +0200 Branches: functions https://developer.blender.org/rB873f483836af88d05ecac525de2380db0410df39
new change direction action =================================================================== A release/scripts/startup/nodes/bparticle_nodes/change_direction.py M source/blender/simulations/bparticles/actions.cpp M source/blender/simulations/bparticles/actions.hpp M source/blender/simulations/bparticles/c_wrapper.cpp =================================================================== diff --git a/release/scripts/startup/nodes/bparticle_nodes/change_direction.py b/release/scripts/startup/nodes/bparticle_nodes/change_direction.py new file mode 100644 index 00000000000..b3487c13ffa --- /dev/null +++ b/release/scripts/startup/nodes/bparticle_nodes/change_direction.py @@ -0,0 +1,13 @@ +import bpy +from bpy.props import * +from .. base import BParticlesNode +from .. socket_builder import SocketBuilder + +class ChangeParticleDirectionNode(bpy.types.Node, BParticlesNode): + bl_idname = "bp_ChangeParticleDirectionNode" + bl_label = "Change Particle Direction" + + def declaration(self, builder : SocketBuilder): + builder.control_flow_input("control_in", "(In)") + builder.fixed_input("direction", "Direction", "Vector") + builder.control_flow_output("control_out", "(Out)") diff --git a/source/blender/simulations/bparticles/actions.cpp b/source/blender/simulations/bparticles/actions.cpp index 34c878a2aa5..3427a6d2ec1 100644 --- a/source/blender/simulations/bparticles/actions.cpp +++ b/source/blender/simulations/bparticles/actions.cpp @@ -14,6 +14,36 @@ class NoneAction : public Action { } }; +class ChangeDirectionAction : public Action { + private: + SharedFunction m_compute_direction_fn; + TupleCallBody *m_compute_direction_body; + + public: + ChangeDirectionAction(SharedFunction &compute_direction_fn) + : m_compute_direction_fn(compute_direction_fn) + { + m_compute_direction_body = m_compute_direction_fn->body<TupleCallBody>(); + } + + void execute(EventExecuteInterface &interface) override + { + ParticleSet particles = interface.particles(); + auto velocities = particles.attributes().get_float3("Velocity"); + + FN_TUPLE_CALL_ALLOC_TUPLES(m_compute_direction_body, fn_in, fn_out); + + FN::ExecutionStack stack; + FN::ExecutionContext execution_context(stack); + + for (uint pindex : particles.indices()) { + m_compute_direction_body->call(fn_in, fn_out, execution_context); + float3 direction = fn_out.get<float3>(0); + velocities[pindex] = direction; + } + } +}; + class KillAction : public Action { void execute(EventExecuteInterface &interface) override { @@ -122,6 +152,11 @@ Action *ACTION_none() return new NoneAction(); } +Action *ACTION_change_direction(SharedFunction &compute_direction_fn) +{ + return new ChangeDirectionAction(compute_direction_fn); +} + Action *ACTION_kill() { return new KillAction(); diff --git a/source/blender/simulations/bparticles/actions.hpp b/source/blender/simulations/bparticles/actions.hpp index 3f14abfe8d8..3af29afe23d 100644 --- a/source/blender/simulations/bparticles/actions.hpp +++ b/source/blender/simulations/bparticles/actions.hpp @@ -1,9 +1,14 @@ #pragma once +#include "FN_tuple_call.hpp" + #include "core.hpp" namespace BParticles { +using FN::SharedFunction; +using FN::TupleCallBody; + class Action { public: virtual ~Action() = 0; @@ -12,6 +17,7 @@ class Action { }; Action *ACTION_none(); +Action *ACTION_change_direction(SharedFunction &compute_direction_fn); Action *ACTION_kill(); Action *ACTION_move(float3 offset); Action *ACTION_spawn(); diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp index 15af0816d56..d19e3f1a49a 100644 --- a/source/blender/simulations/bparticles/c_wrapper.cpp +++ b/source/blender/simulations/bparticles/c_wrapper.cpp @@ -41,6 +41,7 @@ using namespace BParticles; +using BKE::bSocketList; using BKE::IndexedNodeTree; using BKE::SocketWithNode; using BLI::ArrayRef; @@ -242,6 +243,16 @@ static Action *build_action(SocketWithNode start, if (STREQ(bnode->idname, "bp_KillParticleNode")) { return ACTION_kill(); } + else if (STREQ(bnode->idname, "bp_ChangeParticleDirectionNode")) { + bNodeSocket *direction_socket = bSocketList(bnode->inputs).get(1); + + FN::DFGraphSocket direction_input = data_graph.lookup_socket(direction_socket); + FN::FunctionGraph function_graph(data_graph.graph(), {}, {direction_input}); + SharedFunction compute_direction_fn = function_graph.new_function("Compute Direction"); + FN::fgraph_add_TupleCallBody(compute_direction_fn, function_graph); + + return ACTION_change_direction(compute_direction_fn); + } else { return nullptr; } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs