Commit: c2e13a2f94c377c7e96ac296bdc6bab9e4703d55 Author: Jacques Lucke Date: Sat Jun 29 15:51:38 2019 +0200 Branches: functions https://developer.blender.org/rBc2e13a2f94c377c7e96ac296bdc6bab9e4703d55
combine event and action =================================================================== M source/blender/simulations/bparticles/c_wrapper.cpp M source/blender/simulations/bparticles/core.cpp M source/blender/simulations/bparticles/core.hpp M source/blender/simulations/bparticles/simulate.cpp =================================================================== diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp index 28dfd825384..8627f572072 100644 --- a/source/blender/simulations/bparticles/c_wrapper.cpp +++ b/source/blender/simulations/bparticles/c_wrapper.cpp @@ -107,31 +107,45 @@ class EulerIntegrator : public Integrator { } }; +class EventActionTest : public EventAction { + public: + Event *m_event; + Action *m_action; + + ~EventActionTest() + { + delete m_event; + delete m_action; + } + + void filter(EventInterface &interface) override + { + m_event->filter(interface); + } + + void execute(ActionInterface &interface) override + { + m_action->execute(interface); + } +}; + class ModifierParticleType : public ParticleType { public: - SmallVector<Event *> m_events; - SmallVector<Action *> m_actions; + SmallVector<EventAction *> m_event_actions; EulerIntegrator *m_integrator; ~ModifierParticleType() { delete m_integrator; - for (Event *event : m_events) { - delete event; - } - for (Action *action : m_actions) { - delete action; + for (EventAction *event_action : m_event_actions) { + delete event_action; } } - ArrayRef<Event *> events() override + ArrayRef<EventAction *> event_actions() override { - return m_events; - } - ArrayRef<Action *> action_per_event() override - { - return m_actions; + return m_event_actions; } Integrator &integrator() override @@ -206,17 +220,24 @@ void BParticles_simulate_modifier(NodeParticlesModifierData *npmd, if (npmd->collision_object) { BKE_bvhtree_from_mesh_get( &treedata, (Mesh *)npmd->collision_object->data, BVHTREE_FROM_LOOPTRI, 4); - type0->m_events.append( - EVENT_mesh_collection(&treedata, npmd->collision_object->obmat).release()); - type0->m_actions.append(ACTION_explode().release()); + + EventActionTest *event_action = new EventActionTest(); + event_action->m_event = + EVENT_mesh_collection(&treedata, npmd->collision_object->obmat).release(); + event_action->m_action = ACTION_explode().release(); + type0->m_event_actions.append(event_action); } type0->m_integrator = new EulerIntegrator(); type0->m_integrator->m_forces.append(FORCE_directional({0, 0, -2}).release()); auto *type1 = new ModifierParticleType(); description.m_types.add_new(1, type1); - type1->m_events.append(EVENT_age_reached(0.3f).release()); - type1->m_actions.append(ACTION_kill().release()); + { + EventActionTest *event_action = new EventActionTest(); + event_action->m_event = EVENT_age_reached(0.3f).release(); + event_action->m_action = ACTION_kill().release(); + type1->m_event_actions.append(event_action); + } type1->m_integrator = new EulerIntegrator(); simulate_step(state, description); diff --git a/source/blender/simulations/bparticles/core.cpp b/source/blender/simulations/bparticles/core.cpp index b9f08ad883e..c79ad5cd9f1 100644 --- a/source/blender/simulations/bparticles/core.cpp +++ b/source/blender/simulations/bparticles/core.cpp @@ -22,6 +22,10 @@ Event::~Event() { } +EventAction::~EventAction() +{ +} + ParticleType::~ParticleType() { } diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp index e46660ca7ee..5f159172133 100644 --- a/source/blender/simulations/bparticles/core.hpp +++ b/source/blender/simulations/bparticles/core.hpp @@ -407,6 +407,14 @@ class Action { virtual void execute(ActionInterface &interface) = 0; }; +class EventAction { + public: + virtual ~EventAction(); + + virtual void filter(EventInterface &interface) = 0; + virtual void execute(ActionInterface &interface) = 0; +}; + class Emitter { public: virtual ~Emitter(); @@ -429,9 +437,8 @@ class ParticleType { public: virtual ~ParticleType(); - virtual ArrayRef<Event *> events() = 0; - virtual ArrayRef<Action *> action_per_event() = 0; virtual Integrator &integrator() = 0; + virtual ArrayRef<EventAction *> event_actions() = 0; virtual ArrayRef<std::string> byte_attributes() { diff --git a/source/blender/simulations/bparticles/simulate.cpp b/source/blender/simulations/bparticles/simulate.cpp index a311ba6c81a..499d53ed19f 100644 --- a/source/blender/simulations/bparticles/simulate.cpp +++ b/source/blender/simulations/bparticles/simulate.cpp @@ -36,7 +36,7 @@ BLI_NOINLINE static void find_next_event_per_particle(ParticleSet particles, AttributeArrays &attribute_offsets, ArrayRef<float> durations, float end_time, - ArrayRef<Event *> events, + ArrayRef<EventAction *> event_actions, ArrayRef<float> last_event_times, ArrayRef<int> r_next_event_indices, ArrayRef<float> r_time_factors_to_next_event, @@ -45,18 +45,18 @@ BLI_NOINLINE static void find_next_event_per_particle(ParticleSet particles, r_next_event_indices.fill(-1); r_time_factors_to_next_event.fill(1.0f); - for (uint event_index = 0; event_index < events.size(); event_index++) { + for (uint event_index = 0; event_index < event_actions.size(); event_index++) { SmallVector<uint> triggered_indices; SmallVector<float> triggered_time_factors; - Event *event = events[event_index]; + EventAction *event_action = event_actions[event_index]; EventInterface interface(particles, attribute_offsets, durations, end_time, triggered_indices, triggered_time_factors); - event->filter(interface); + event_action->filter(interface); for (uint i = 0; i < triggered_indices.size(); i++) { uint index = triggered_indices[i]; @@ -180,22 +180,20 @@ BLI_NOINLINE static void run_actions(BlockAllocator &block_allocator, ParticlesBlock &block, ArrayRef<SmallVector<uint>> particle_indices_per_event, ArrayRef<SmallVector<float>> current_time_per_particle, - ArrayRef<Event *> events, - ArrayRef<Action *> action_per_event) + ArrayRef<EventAction *> event_actions) { - BLI_assert(events.size() == particle_indices_per_event.size()); - BLI_assert(events.size() == current_time_per_particle.size()); - BLI_assert(events.size() == action_per_event.size()); + BLI_assert(event_actions.size() == particle_indices_per_event.size()); + BLI_assert(event_actions.size() == current_time_per_particle.size()); - for (uint event_index = 0; event_index < events.size(); event_index++) { - Action *action = action_per_event[event_index]; + for (uint event_index = 0; event_index < event_actions.size(); event_index++) { + EventAction *event_action = event_actions[event_index]; ParticleSet particles(block, particle_indices_per_event[event_index]); if (particles.size() == 0) { continue; } ActionInterface interface(particles, block_allocator, current_time_per_particle[event_index]); - action->execute(interface); + event_action->execute(interface); } } @@ -220,7 +218,7 @@ BLI_NOINLINE static void simulate_to_next_event(BlockAllocator &block_allocator, attribute_offsets, durations, end_time, - particle_type.events(), + particle_type.event_actions(), last_event_times, next_event_indices, time_factors_to_next_event, @@ -237,11 +235,11 @@ BLI_NOINLINE static void simulate_to_next_event(BlockAllocator &block_allocator, update_remaining_attribute_offsets( particles_with_events, time_factors_to_next_event, attribute_offsets); - SmallVector<SmallVector<uint>> particles_per_event(particle_type.events().size()); + SmallVector<SmallVector<uint>> particles_per_event(particle_type.event_actions().size()); find_particle_indices_per_event( indices_with_event, particles.indices(), next_event_indices, particles_per_event); - SmallVector<SmallVector<float>> current_time_per_particle(particle_type.events().size()); + SmallVector<SmallVector<float>> current_time_per_particle(particle_type.event_actions().size()); compute_current_time_per_particle(indices_with_event, durations, end_time, @@ -253,8 +251,7 @@ BLI_NOINLINE static void simulate_to_next_event(BlockAllocator &block_allocator, particles.block(), particles_per_event, current_time_per_particle, - particle_type.events(), - particle_type.action_per_event()); + particle_type.event_actions()); find_unfinished_particles(indices_with_event, particles.indices(), _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs