[Bf-blender-cvs] [a5492417284] functions: bring back functionality of old actions

Jacques Lucke noreply at git.blender.org
Thu Dec 19 15:59:27 CET 2019


Commit: a54924172845ace473a702a6a46eb36d2b3abd3a
Author: Jacques Lucke
Date:   Thu Dec 19 15:52:10 2019 +0100
Branches: functions
https://developer.blender.org/rBa54924172845ace473a702a6a46eb36d2b3abd3a

bring back functionality of old actions

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

M	source/blender/simulations/bparticles/actions.cpp
M	source/blender/simulations/bparticles/particle_action.cpp
M	source/blender/simulations/bparticles/particle_action.hpp

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

diff --git a/source/blender/simulations/bparticles/actions.cpp b/source/blender/simulations/bparticles/actions.cpp
index b6e72ce642c..e88ebfb3eba 100644
--- a/source/blender/simulations/bparticles/actions.cpp
+++ b/source/blender/simulations/bparticles/actions.cpp
@@ -13,25 +13,32 @@ void ActionSequence::execute(ParticleActionContext &context)
   }
 }
 
-static void update_position_and_velocity_offsets(ParticleActionContext &UNUSED(context))
+static void update_position_and_velocity_offsets(ParticleActionContext &context)
 {
-  // AttributesRef attributes = context.attributes();
-  // AttributesRef attribute_offsets = context.attribute_offsets();
-
-  // auto velocities = attributes.get<float3>("Velocity");
-  // auto position_offsets = attribute_offsets.try_get<float3>("Position");
-  // auto velocity_offsets = attribute_offsets.try_get<float3>("Velocity");
-
-  // for (uint pindex : context.pindex_mask()) {
-  //   float3 velocity = velocities[pindex];
-
-  //   if (position_offsets.has_value()) {
-  //     position_offsets.value()[pindex] = velocity * context.remaining_time_in_step(pindex);
-  //   }
-  //   if (velocity_offsets.has_value()) {
-  //     velocity_offsets.value()[pindex] = float3(0);
-  //   }
-  // }
+  auto *offsets_context = context.try_find<ParticleIntegratedOffsets>();
+  auto *remaining_times_context = context.try_find<ParticleRemainingTimeInStep>();
+  if (offsets_context == nullptr || remaining_times_context == nullptr) {
+    return;
+  }
+
+  AttributesRef attributes = context.attributes();
+  AttributesRef attribute_offsets = offsets_context->offsets;
+  ArrayRef<float> remaining_times = remaining_times_context->remaining_times;
+
+  auto velocities = attributes.get<float3>("Velocity");
+  auto position_offsets = attribute_offsets.try_get<float3>("Position");
+  auto velocity_offsets = attribute_offsets.try_get<float3>("Velocity");
+
+  for (uint pindex : context.pindex_mask().indices()) {
+    float3 velocity = velocities[pindex];
+
+    if (position_offsets.has_value()) {
+      position_offsets.value()[pindex] = velocity * remaining_times[pindex];
+    }
+    if (velocity_offsets.has_value()) {
+      velocity_offsets.value()[pindex] = float3(0);
+    }
+  }
 }
 
 void ConditionAction::execute(ParticleActionContext &context)
@@ -87,6 +94,12 @@ void SpawnParticlesAction::execute(ParticleActionContext &context)
     return;
   }
 
+  auto *current_time_context = context.try_find<ParticleCurrentTimesContext>();
+  if (current_time_context == nullptr) {
+    return;
+  }
+  ArrayRef<float> current_times = current_time_context->current_times;
+
   uint array_size = context.pindex_mask().min_array_size();
 
   auto inputs = ParticleFunctionResult::Compute(
@@ -121,7 +134,7 @@ void SpawnParticlesAction::execute(ParticleActionContext &context)
 
   Vector<float> new_birth_times;
   for (uint i : context.pindex_mask().indices()) {
-    // new_birth_times.append_n_times(context.current_times()[i], particle_counts[i]);
+    new_birth_times.append_n_times(current_times[i], particle_counts[i]);
   }
   attribute_arrays.add_new("Birth Time", new_birth_times.as_mutable_ref());
 
diff --git a/source/blender/simulations/bparticles/particle_action.cpp b/source/blender/simulations/bparticles/particle_action.cpp
index 73c1c6564d0..f82a69df4d4 100644
--- a/source/blender/simulations/bparticles/particle_action.cpp
+++ b/source/blender/simulations/bparticles/particle_action.cpp
@@ -1,9 +1,122 @@
 #include "particle_action.hpp"
 
+BLI_CREATE_CLASS_ID(BParticles::ParticleCurrentTimesContext)
+BLI_CREATE_CLASS_ID(BParticles::ParticleIntegratedOffsets)
+BLI_CREATE_CLASS_ID(BParticles::ParticleRemainingTimeInStep)
+
 namespace BParticles {
 
+using BLI::LargeScopedArray;
+
 ParticleAction::~ParticleAction()
 {
 }
 
+void ParticleAction::execute_from_emitter(AttributesRefGroup &new_particles,
+                                          EmitterInterface &emitter_interface)
+{
+  for (AttributesRef attributes : new_particles) {
+    ParticleCurrentTimesContext current_times_context;
+    current_times_context.current_times = attributes.get<float>("Birth Time");
+
+    ParticleActionContext context(emitter_interface.particle_allocator(),
+                                  IndexMask(attributes.size()),
+                                  attributes,
+                                  {BLI::get_class_id<ParticleCurrentTimesContext>()},
+                                  {(void *)&current_times_context});
+    this->execute(context);
+  }
+}
+
+void ParticleAction::execute_for_new_particles(AttributesRefGroup &new_particles,
+                                               ParticleActionContext &parent_context)
+{
+
+  for (AttributesRef attributes : new_particles) {
+    ParticleCurrentTimesContext current_times_context;
+    current_times_context.current_times = attributes.get<float>("Birth Time");
+
+    ParticleActionContext context(parent_context.particle_allocator(),
+                                  IndexMask(attributes.size()),
+                                  attributes,
+                                  {BLI::get_class_id<ParticleCurrentTimesContext>()},
+                                  {(void *)&current_times_context});
+    this->execute(context);
+  }
+}
+
+void ParticleAction::execute_for_new_particles(AttributesRefGroup &new_particles,
+                                               OffsetHandlerInterface &offset_handler_interface)
+{
+  for (AttributesRef attributes : new_particles) {
+    ParticleCurrentTimesContext current_times_context;
+    current_times_context.current_times = attributes.get<float>("Birth Time");
+
+    ParticleActionContext context(offset_handler_interface.particle_allocator(),
+                                  IndexMask(attributes.size()),
+                                  attributes,
+                                  {BLI::get_class_id<ParticleCurrentTimesContext>()},
+                                  {(void *)&current_times_context});
+    this->execute(context);
+  }
+}
+
+void ParticleAction::execute_from_event(EventExecuteInterface &event_interface)
+{
+  ParticleCurrentTimesContext current_times_context;
+  current_times_context.current_times = event_interface.current_times();
+
+  ParticleIntegratedOffsets offsets_context = {event_interface.attribute_offsets()};
+
+  ParticleRemainingTimeInStep remaining_time_context;
+  remaining_time_context.remaining_times = event_interface.remaining_durations();
+
+  ParticleActionContext context(
+      event_interface.particle_allocator(),
+      event_interface.pindices(),
+      event_interface.attributes(),
+      {BLI::get_class_id<ParticleCurrentTimesContext>(),
+       BLI::get_class_id<ParticleIntegratedOffsets>(),
+       BLI::get_class_id<ParticleRemainingTimeInStep>()},
+      {(void *)&current_times_context, (void *)&offsets_context, (void *)&remaining_time_context});
+  this->execute(context);
+}
+
+void ParticleAction::execute_for_subset(IndexMask pindex_mask,
+                                        ParticleActionContext &parent_context)
+{
+  ParticleActionContext context(parent_context.particle_allocator(),
+                                pindex_mask,
+                                parent_context.attributes(),
+                                parent_context.custom_context_ids(),
+                                parent_context.custom_contexts());
+  this->execute(context);
+}
+
+void ParticleAction::execute_from_offset_handler(OffsetHandlerInterface &offset_handler_interface)
+{
+  LargeScopedArray<float> current_times(offset_handler_interface.array_size());
+  for (uint pindex : offset_handler_interface.pindices()) {
+    current_times[pindex] = offset_handler_interface.time_span(pindex).start();
+  }
+
+  ParticleCurrentTimesContext current_times_context;
+  current_times_context.current_times = current_times;
+
+  ParticleIntegratedOffsets offsets_context = {offset_handler_interface.attribute_offsets()};
+
+  ParticleRemainingTimeInStep remaining_time_context;
+  remaining_time_context.remaining_times = offset_handler_interface.remaining_durations();
+
+  ParticleActionContext context(
+      offset_handler_interface.particle_allocator(),
+      offset_handler_interface.pindices(),
+      offset_handler_interface.attributes(),
+      {BLI::get_class_id<ParticleCurrentTimesContext>(),
+       BLI::get_class_id<ParticleIntegratedOffsets>(),
+       BLI::get_class_id<ParticleRemainingTimeInStep>()},
+      {(void *)&current_times_context, (void *)&offsets_context, (void *)&remaining_time_context});
+  this->execute(context);
+}
+
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/particle_action.hpp b/source/blender/simulations/bparticles/particle_action.hpp
index e974b351150..7b62664cab0 100644
--- a/source/blender/simulations/bparticles/particle_action.hpp
+++ b/source/blender/simulations/bparticles/particle_action.hpp
@@ -36,6 +36,16 @@ class ParticleActionContext {
     BLI_assert(m_custom_context_ids.size() == m_custom_contexts.size());
   }
 
+  ArrayRef<BLI::class_id_t> custom_context_ids() const
+  {
+    return m_custom_context_ids;
+  }
+
+  ArrayRef<void *> custom_contexts() const
+  {
+    return m_custom_contexts;
+  }
+
   ParticleAllocator &particle_allocator()
   {
     return m_particle_allocator;
@@ -81,66 +91,16 @@ class ParticleAction {
   void execute_from_offset_handler(OffsetHandlerInterface &offset_handler_interface);
 };
 
-inline void ParticleAction::execute_from_emitter(AttributesRefGroup &new_particles,
-                                                 EmitterInterface &emitter_interface)
-{
-  for (AttributesRef attributes : new_particles) {
-    ParticleActionContext context(
-        emitter_interface.particle_allocator(), IndexMask(attributes.size()), attributes, {}, {});
-    this->execute(context);
-  }
-}
-
-inline void ParticleAction::execute_for_new_particles(AttributesRefGroup &new_particles,
-                                                      ParticleActionContext &parent_context)
-{
-  for (AttributesRef attributes : new_particles) {
-    ParticleActionContext context(
-        parent_context.particle_allocator(), IndexMask(attributes.size()), attributes, {}, {});
-  

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list