[Bf-blender-cvs] [1d807a8399a] functions: Allow emitters to emit multiple types of particles

Jacques Lucke noreply at git.blender.org
Wed Jun 26 18:19:16 CEST 2019


Commit: 1d807a8399a69e8e111a4b29ab66817664283598
Author: Jacques Lucke
Date:   Wed Jun 26 14:46:44 2019 +0200
Branches: functions
https://developer.blender.org/rB1d807a8399a69e8e111a4b29ab66817664283598

Allow emitters to emit multiple types of particles

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

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/emitters.cpp
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 4fdf4aa677b..1eb5705ab02 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -50,13 +50,13 @@ void BParticles_state_free(BParticlesState state)
   delete unwrap(state);
 }
 
-class ModifierStepParticleInfluences : public ParticleInfluences {
+class ModifierParticleType : public ParticleType {
  public:
   SmallVector<Force *> m_forces;
   SmallVector<Event *> m_events;
   SmallVector<Action *> m_actions;
 
-  ~ModifierStepParticleInfluences()
+  ~ModifierParticleType()
   {
     for (Force *force : m_forces) {
       delete force;
@@ -83,39 +83,20 @@ class ModifierStepParticleInfluences : public ParticleInfluences {
   }
 };
 
-class ModifierParticleType : public ParticleType {
- public:
-  SmallVector<Emitter *> m_emitters;
-  ModifierStepParticleInfluences m_influences;
-
-  ~ModifierParticleType()
-  {
-    for (Emitter *emitter : m_emitters) {
-      delete emitter;
-    }
-  }
-
-  ArrayRef<Emitter *> emitters() override
-  {
-    return m_emitters;
-  }
-
-  ParticleInfluences &influences() override
-  {
-    return m_influences;
-  }
-};
-
 class ModifierStepDescription : public StepDescription {
  public:
   float m_duration;
   SmallMap<uint, ModifierParticleType *> m_types;
+  SmallVector<Emitter *> m_emitters;
 
   ~ModifierStepDescription()
   {
     for (auto *type : m_types.values()) {
       delete type;
     }
+    for (Emitter *emitter : m_emitters) {
+      delete emitter;
+    }
   }
 
   float step_duration() override
@@ -123,6 +104,11 @@ class ModifierStepDescription : public StepDescription {
     return m_duration;
   }
 
+  ArrayRef<Emitter *> emitters() override
+  {
+    return m_emitters;
+  }
+
   ArrayRef<uint> particle_type_ids() override
   {
     return {0};
@@ -148,22 +134,22 @@ void BParticles_simulate_modifier(NodeParticlesModifierData *npmd,
   description.m_types.add_new(0, type);
 
   if (npmd->emitter_object) {
-    type->m_emitters.append(EMITTER_mesh_surface((Mesh *)npmd->emitter_object->data,
-                                                 npmd->emitter_object->obmat,
-                                                 npmd->control1)
-                                .release());
+    description.m_emitters.append(EMITTER_mesh_surface((Mesh *)npmd->emitter_object->data,
+                                                       npmd->emitter_object->obmat,
+                                                       npmd->control1)
+                                      .release());
   }
   BVHTreeFromMesh treedata = {0};
   if (npmd->collision_object) {
     BKE_bvhtree_from_mesh_get(
         &treedata, (Mesh *)npmd->collision_object->data, BVHTREE_FROM_LOOPTRI, 4);
-    type->m_influences.m_events.append(
+    type->m_events.append(
         EVENT_mesh_collection(&treedata, npmd->collision_object->obmat).release());
-    type->m_influences.m_actions.append(ACTION_kill().release());
+    type->m_actions.append(ACTION_kill().release());
   }
-  type->m_influences.m_forces.append(FORCE_directional({0, 0, -2}).release());
-  type->m_influences.m_events.append(EVENT_age_reached(3.0f).release());
-  type->m_influences.m_actions.append(ACTION_move({0, 1, 0}).release());
+  type->m_forces.append(FORCE_directional({0, 0, -2}).release());
+  type->m_events.append(EVENT_age_reached(3.0f).release());
+  type->m_actions.append(ACTION_move({0, 1, 0}).release());
   simulate_step(state, description);
 
   if (npmd->collision_object) {
diff --git a/source/blender/simulations/bparticles/core.cpp b/source/blender/simulations/bparticles/core.cpp
index 4febe4bf7b7..a9faa67c74c 100644
--- a/source/blender/simulations/bparticles/core.cpp
+++ b/source/blender/simulations/bparticles/core.cpp
@@ -18,10 +18,6 @@ Event::~Event()
 {
 }
 
-ParticleInfluences::~ParticleInfluences()
-{
-}
-
 ParticleType::~ParticleType()
 {
 }
diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index 44fa355743f..d60af1f87c2 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -198,7 +198,7 @@ class EmitterTarget {
   }
 };
 
-using RequestEmitterTarget = std::function<EmitterTarget &()>;
+using RequestEmitterTarget = std::function<EmitterTarget &(uint particle_type_id)>;
 
 class EmitterInterface {
  private:
@@ -209,19 +209,19 @@ class EmitterInterface {
   {
   }
 
-  EmitterTarget &request_raw()
+  EmitterTarget &request_raw(uint particle_type_id)
   {
-    EmitterTarget &target = m_request_target();
+    EmitterTarget &target = m_request_target(particle_type_id);
     BLI_assert(target.size() > 0);
     return target;
   }
 
-  JoinedAttributeArrays request(uint size)
+  JoinedAttributeArrays request(uint particle_type_id, uint size)
   {
     SmallVector<AttributeArrays> arrays_list;
     uint remaining_size = size;
     while (remaining_size > 0) {
-      EmitterTarget &target = this->request_raw();
+      EmitterTarget &target = this->request_raw(particle_type_id);
 
       uint size_to_use = std::min(target.size(), remaining_size);
       target.set_initialized(size_to_use);
@@ -229,8 +229,9 @@ class EmitterInterface {
       remaining_size -= size_to_use;
     }
 
-    AttributesInfo &info = (arrays_list.size() == 0) ? this->request_raw().attributes().info() :
-                                                       arrays_list[0].info();
+    AttributesInfo &info = (arrays_list.size() == 0) ?
+                               this->request_raw(particle_type_id).attributes().info() :
+                               arrays_list[0].info();
 
     return JoinedAttributeArrays(info, arrays_list);
   }
@@ -243,28 +244,21 @@ class Emitter {
   virtual void emit(EmitterInterface &interface) = 0;
 };
 
-class ParticleInfluences {
+class ParticleType {
  public:
-  virtual ~ParticleInfluences();
+  virtual ~ParticleType();
 
   virtual ArrayRef<Force *> forces() = 0;
   virtual ArrayRef<Event *> events() = 0;
   virtual ArrayRef<Action *> action_per_event() = 0;
 };
 
-class ParticleType {
- public:
-  virtual ~ParticleType();
-
-  virtual ArrayRef<Emitter *> emitters() = 0;
-  virtual ParticleInfluences &influences() = 0;
-};
-
 class StepDescription {
  public:
   virtual ~StepDescription();
 
   virtual float step_duration() = 0;
+  virtual ArrayRef<Emitter *> emitters() = 0;
 
   virtual ArrayRef<uint> particle_type_ids() = 0;
   virtual ParticleType &particle_type(uint type_id) = 0;
@@ -284,6 +278,11 @@ class ParticlesState {
   {
     return m_particle_containers;
   }
+
+  ParticlesContainer &particle_container(uint type_id)
+  {
+    return *m_particle_containers.lookup(type_id);
+  }
 };
 
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index c7820ad6a93..b072954f124 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -22,7 +22,7 @@ class PointEmitter : public Emitter {
 
   void emit(EmitterInterface &interface) override
   {
-    auto &target = interface.request_raw();
+    auto &target = interface.request_raw(0);
     auto positions = target.attributes().get_float3("Position");
     auto velocities = target.attributes().get_float3("Velocity");
 
@@ -69,7 +69,7 @@ class SurfaceEmitter : public Emitter {
       velocities.append(m_transform.transform_direction(normal * m_normal_velocity));
     }
 
-    auto target = interface.request(positions.size());
+    auto target = interface.request(0, positions.size());
     target.set_float3("Position", positions);
     target.set_float3("Velocity", velocities);
   }
@@ -100,7 +100,7 @@ class PathEmitter : public Emitter {
       }
     }
 
-    auto target = interface.request(positions.size());
+    auto target = interface.request(0, positions.size());
     target.set_float3("Position", positions);
     target.set_float3("Velocity", SmallVector<float3>(positions.size()));
   }
diff --git a/source/blender/simulations/bparticles/simulate.cpp b/source/blender/simulations/bparticles/simulate.cpp
index 86efb0ed4bd..3ce7a3a47e7 100644
--- a/source/blender/simulations/bparticles/simulate.cpp
+++ b/source/blender/simulations/bparticles/simulate.cpp
@@ -143,7 +143,7 @@ BLI_NOINLINE static void compute_combined_forces_on_particles(ParticleSet partic
 
 BLI_NOINLINE static void compute_ideal_attribute_offsets(ParticleSet particles,
                                                          ArrayRef<float> durations,
-                                                         ParticleInfluences &influences,
+                                                         ParticleType &particle_type,
                                                          IdealOffsets r_offsets)
 {
   BLI_assert(particles.size() == durations.size());
@@ -151,7 +151,7 @@ BLI_NOINLINE static void compute_ideal_attribute_offsets(ParticleSet particles,
   BLI_assert(particles.size() == r_offsets.velocity_offsets.size());
 
   SmallVector<float3> combined_force{particles.size()};
-  compute_combined_forces_on_particles(particles, influences.forces(), combined_force);
+  compute_combined_forces_on_particles(particles, particle_type.forces(), combined_force);
 
   auto velocities = particles.attributes().get_float3("Velocity");
 
@@ -170,7 +170,7 @@ BLI_NOINLINE static void compute_ideal_attribute_offsets(ParticleSet particles,
 BLI_NOINLINE static void simulate_to_next_event(ParticleSet particles,
                                                 ArrayRef<float> durations,
                                                 float end_time,
-                                                ParticleInfluences &influences,
+                                                ParticleType &particle_type,
                                                 ArrayRef<float> last_event_times,
                                                 SmallVector<uint> &r_unfinished_particle_indices,
                                                 SmallVector<float> &r_remaining_durations)
@@ -179,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list