[Bf-blender-cvs] [105353359c3] functions: improve birth time handling in action interface
Jacques Lucke
noreply at git.blender.org
Fri Jun 28 13:50:01 CEST 2019
Commit: 105353359c3f82572fde6bf111c345ab25869acd
Author: Jacques Lucke
Date: Fri Jun 28 13:49:47 2019 +0200
Branches: functions
https://developer.blender.org/rB105353359c3f82572fde6bf111c345ab25869acd
improve birth time handling in action interface
===================================================================
M source/blender/simulations/bparticles/actions.cpp
M source/blender/simulations/bparticles/core.cpp
M source/blender/simulations/bparticles/core.hpp
===================================================================
diff --git a/source/blender/simulations/bparticles/actions.cpp b/source/blender/simulations/bparticles/actions.cpp
index d432fa218b1..b0531331268 100644
--- a/source/blender/simulations/bparticles/actions.cpp
+++ b/source/blender/simulations/bparticles/actions.cpp
@@ -43,19 +43,18 @@ class SpawnAction : public Action {
SmallVector<float3> new_positions;
SmallVector<float3> new_velocities;
- SmallVector<float> new_birth_times;
+ SmallVector<uint> original_indices;
for (uint i : particles.range()) {
uint pindex = particles.get_particle_index(i);
new_positions.append(positions[pindex] + float3(20, 0, 0));
new_velocities.append(float3(1, 1, 10));
- new_birth_times.append(interface.current_times()[i]);
+ original_indices.append(i);
}
- auto &target = interface.request_emit_target(0, particles.size());
+ auto &target = interface.request_emit_target(0, original_indices);
target.set_float3("Position", new_positions);
target.set_float3("Velocity", new_velocities);
- target.set_float("Birth Time", new_birth_times);
}
};
@@ -72,11 +71,10 @@ class ExplodeAction : public Action {
auto positions = particles.attributes().get_float3("Position");
auto kill_states = particles.attributes().get_byte("Kill State");
- auto current_times = interface.current_times();
SmallVector<float3> new_positions;
SmallVector<float3> new_velocities;
- SmallVector<float> new_birth_times;
+ SmallVector<uint> original_indices;
uint parts_amount = 100;
@@ -85,16 +83,16 @@ class ExplodeAction : public Action {
kill_states[pindex] = 1;
new_positions.append_n_times(positions[pindex], parts_amount);
- new_birth_times.append_n_times(current_times[i], parts_amount);
+ original_indices.append_n_times(i, parts_amount);
+
for (uint j = 0; j < parts_amount; j++) {
new_velocities.append(random_direction() * 4);
}
}
- auto &target = interface.request_emit_target(1, new_positions.size());
+ auto &target = interface.request_emit_target(1, original_indices);
target.set_float3("Position", new_positions);
target.set_float3("Velocity", new_velocities);
- target.set_float("Birth Time", new_birth_times);
}
};
diff --git a/source/blender/simulations/bparticles/core.cpp b/source/blender/simulations/bparticles/core.cpp
index 47fcacd3c00..669f67e1f2c 100644
--- a/source/blender/simulations/bparticles/core.cpp
+++ b/source/blender/simulations/bparticles/core.cpp
@@ -126,8 +126,11 @@ ActionInterface::~ActionInterface()
}
}
-InstantEmitTarget &ActionInterface::request_emit_target(uint particle_type_id, uint size)
+InstantEmitTarget &ActionInterface::request_emit_target(uint particle_type_id,
+ ArrayRef<uint> original_indices)
{
+ uint size = original_indices.size();
+
SmallVector<ParticlesBlock *> blocks;
SmallVector<Range<uint>> ranges;
m_block_allocator.allocate_block_ranges(particle_type_id, size, blocks, ranges);
@@ -135,6 +138,13 @@ InstantEmitTarget &ActionInterface::request_emit_target(uint particle_type_id, u
auto *target = new InstantEmitTarget(particle_type_id, attributes_info, blocks, ranges);
m_emit_targets.append(target);
+
+ SmallVector<float> birth_times(size);
+ for (uint i = 0; i < size; i++) {
+ birth_times[i] = m_current_times[original_indices[i]];
+ }
+ target->set_float("Birth Time", birth_times);
+
return *target;
}
diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index e8489496934..17676fa980a 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -366,7 +366,7 @@ class ActionInterface {
return m_particles;
}
- InstantEmitTarget &request_emit_target(uint particle_type_id, uint size);
+ InstantEmitTarget &request_emit_target(uint particle_type_id, ArrayRef<uint> original_indices);
ArrayRef<InstantEmitTarget *> emit_targets()
{
More information about the Bf-blender-cvs
mailing list