[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 *)¤t_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 *)¤t_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 *)¤t_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 *)¤t_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 *)¤t_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