Commit: 878028d385cb8ec44d80af2882964777cc3d0423 Author: Jacques Lucke Date: Thu Jun 27 15:07:39 2019 +0200 Branches: functions https://developer.blender.org/rB878028d385cb8ec44d80af2882964777cc3d0423
make it easier for emitters to specify birth moments =================================================================== M source/blender/simulations/bparticles/core.cpp M source/blender/simulations/bparticles/core.hpp M source/blender/simulations/bparticles/emitters.cpp M source/blender/simulations/bparticles/simulate.cpp =================================================================== diff --git a/source/blender/simulations/bparticles/core.cpp b/source/blender/simulations/bparticles/core.cpp index b9e67a81f85..3ca4f9c22fd 100644 --- a/source/blender/simulations/bparticles/core.cpp +++ b/source/blender/simulations/bparticles/core.cpp @@ -62,9 +62,16 @@ ParticlesBlock &BlockAllocator::get_non_full_block(uint particle_type_id) return block; } -/* EmitterInterface +/* Emitter Interface ******************************************/ +EmitterInterface::~EmitterInterface() +{ + for (EmitTarget *target : m_targets) { + delete target; + } +} + EmitTarget &EmitterInterface::request(uint particle_type_id, uint size) { SmallVector<ParticlesBlock *> blocks; @@ -90,8 +97,8 @@ EmitTarget &EmitterInterface::request(uint particle_type_id, uint size) } ParticlesContainer &container = m_state.particle_container(particle_type_id); - m_targets.append(EmitTarget(particle_type_id, container.attributes_info(), blocks, ranges)); - return m_targets.last(); + m_targets.append(new EmitTarget(particle_type_id, container.attributes_info(), blocks, ranges)); + return *m_targets.last(); } /* EmitTarget @@ -200,4 +207,17 @@ void EmitTarget::fill_float3(StringRef name, float3 value) this->fill_float3(index, value); } +void EmitTarget::set_birth_moment(float time_factor) +{ + BLI_assert(time_factor >= 0.0 && time_factor <= 1.0f); + m_birth_moments.fill(time_factor); +} + +void EmitTarget::set_randomized_birth_moments() +{ + for (float &birth_moment : m_birth_moments) { + birth_moment = (rand() % 10000) / 10000.0f; + } +} + } // namespace BParticles diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp index e3071f4547f..945b49ec42d 100644 --- a/source/blender/simulations/bparticles/core.hpp +++ b/source/blender/simulations/bparticles/core.hpp @@ -64,6 +64,7 @@ class EmitTarget { AttributesInfo &m_attributes_info; SmallVector<ParticlesBlock *> m_blocks; SmallVector<Range<uint>> m_ranges; + SmallVector<float> m_birth_moments; uint m_size = 0; public: @@ -80,8 +81,11 @@ class EmitTarget { for (auto range : ranges) { m_size += range.size(); } + m_birth_moments = SmallVector<float>(m_size, 1.0f); } + EmitTarget(EmitTarget &other) = delete; + void set_byte(uint index, ArrayRef<uint8_t> data); void set_byte(StringRef name, ArrayRef<uint8_t> data); void set_float(uint index, ArrayRef<float> data); @@ -96,6 +100,9 @@ class EmitTarget { void fill_float3(uint index, float3 value); void fill_float3(StringRef name, float3 value); + void set_birth_moment(float time_factor); + void set_randomized_birth_moments(); + ArrayRef<ParticlesBlock *> blocks() { return m_blocks; @@ -106,6 +113,11 @@ class EmitTarget { return m_ranges; } + ArrayRef<float> birth_moments() + { + return m_birth_moments; + } + uint part_amount() { return m_ranges.size(); @@ -130,7 +142,7 @@ class EmitterInterface { private: ParticlesState &m_state; BlockAllocator &m_allocator; - SmallVector<EmitTarget> m_targets; + SmallVector<EmitTarget *> m_targets; public: EmitterInterface(ParticlesState &state, BlockAllocator &allocator) @@ -138,7 +150,9 @@ class EmitterInterface { { } - ArrayRef<EmitTarget> targets() + ~EmitterInterface(); + + ArrayRef<EmitTarget *> targets() { return m_targets; } diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp index 34a788be04d..aaeeb225b04 100644 --- a/source/blender/simulations/bparticles/emitters.cpp +++ b/source/blender/simulations/bparticles/emitters.cpp @@ -22,10 +22,10 @@ class PointEmitter : public Emitter { void emit(EmitterInterface &interface) override { - auto attributes = interface.request(0, 1); - attributes.set_float3("Position", {m_point}); - attributes.set_float3("Velocity", {float3{-1, -1, 0}}); - attributes.fill_float("Birth Factor", 1.0f); + EmitTarget &target = interface.request(0, 1); + target.set_float3("Position", {m_point}); + target.set_float3("Velocity", {float3{-1, -1, 0}}); + target.set_birth_moment(1.0f); } }; @@ -70,10 +70,10 @@ class SurfaceEmitter : public Emitter { velocities.append(m_transform.transform_direction(normal * m_normal_velocity)); } - auto target = interface.request(m_particle_type_id, positions.size()); + EmitTarget &target = interface.request(m_particle_type_id, positions.size()); target.set_float3("Position", positions); target.set_float3("Velocity", velocities); - target.fill_float("Birth Factor", 1.0f); + target.set_randomized_birth_moments(); } }; @@ -102,10 +102,10 @@ class PathEmitter : public Emitter { } } - auto target = interface.request(0, positions.size()); + EmitTarget &target = interface.request(0, positions.size()); target.set_float3("Position", positions); target.set_float3("Velocity", SmallVector<float3>(positions.size())); - target.fill_float("Birth Factor", 1.0f); + target.set_birth_moment(1.0f); } }; diff --git a/source/blender/simulations/bparticles/simulate.cpp b/source/blender/simulations/bparticles/simulate.cpp index 696d9f6b8fc..94190642264 100644 --- a/source/blender/simulations/bparticles/simulate.cpp +++ b/source/blender/simulations/bparticles/simulate.cpp @@ -380,18 +380,23 @@ BLI_NOINLINE static void emit_new_particles_from_emitter(StepDescription &descri EmitterInterface interface(state, block_allocator); emitter.emit(interface); - for (EmitTarget &target : interface.targets()) { + for (EmitTarget *target_ptr : interface.targets()) { + EmitTarget &target = *target_ptr; + ParticleType &particle_type = description.particle_type(target.particle_type_id()); + ArrayRef<float> all_birth_moments = target.birth_moments(); + uint particle_count = 0; + for (uint part = 0; part < target.part_amount(); part++) { ParticlesBlock &block = *target.blocks()[part]; Range<uint> range = target.ranges()[part]; AttributeArrays attributes = block.slice(range); - auto birth_times = attributes.get_float("Birth Time"); - auto birth_factors = attributes.get_float("Birth Factor"); + ArrayRef<float> birth_moments = all_birth_moments.slice(particle_count, range.size()); - for (uint i = 0; i < birth_factors.size(); i++) { - birth_times[i] = time_span.interpolate(birth_factors[i]); + auto birth_times = attributes.get_float("Birth Time"); + for (uint i = 0; i < birth_moments.size(); i++) { + birth_times[i] = time_span.interpolate(birth_moments[i]); } SmallVector<float> initial_step_durations; @@ -402,6 +407,8 @@ BLI_NOINLINE static void emit_new_particles_from_emitter(StepDescription &descri ParticleSet emitted_particles(block, static_number_range_ref(range)); step_individual_particles( emitted_particles, initial_step_durations, time_span.end(), particle_type); + + particle_count += emitted_particles.size(); } } } @@ -438,8 +445,7 @@ BLI_NOINLINE static void ensure_required_containers_exist( BLI_NOINLINE static AttributesInfo build_attribute_info_for_type(ParticleType &UNUSED(type), AttributesInfo &UNUSED(last_info)) { - AttributesInfo new_info{ - {"Kill State"}, {"Birth Time", "Birth Factor"}, {"Position", "Velocity"}}; + AttributesInfo new_info{{"Kill State"}, {"Birth Time"}, {"Position", "Velocity"}}; return new_info; } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs