[Bf-blender-cvs] [22624ad774f] functions: cleanup handling of emitter action contexts

Jacques Lucke noreply at git.blender.org
Wed Sep 4 19:43:15 CEST 2019


Commit: 22624ad774f59b172fffaeef186ab4b1787435f3
Author: Jacques Lucke
Date:   Wed Sep 4 12:13:00 2019 +0200
Branches: functions
https://developer.blender.org/rB22624ad774f59b172fffaeef186ab4b1787435f3

cleanup handling of emitter action contexts

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

M	source/blender/simulations/bparticles/action_contexts.hpp
M	source/blender/simulations/bparticles/action_interface.hpp
M	source/blender/simulations/bparticles/emitters.cpp
M	source/blender/simulations/bparticles/events.cpp
M	source/blender/simulations/bparticles/particle_function_input_providers.cpp

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

diff --git a/source/blender/simulations/bparticles/action_contexts.hpp b/source/blender/simulations/bparticles/action_contexts.hpp
index 3501ec6d635..c76c00b5bee 100644
--- a/source/blender/simulations/bparticles/action_contexts.hpp
+++ b/source/blender/simulations/bparticles/action_contexts.hpp
@@ -9,88 +9,7 @@ namespace BParticles {
 using BLI::float3;
 using BLI::float4x4;
 
-class MeshSurfaceActionContext : public ActionContext {
- public:
-  virtual Object *object() const = 0;
-  virtual ArrayRef<float4x4> world_transforms() const = 0;
-  virtual ArrayRef<float3> local_positions() const = 0;
-  virtual ArrayRef<float3> local_normals() const = 0;
-  virtual ArrayRef<float3> world_normals() const = 0;
-  virtual ArrayRef<uint> looptri_indices() const = 0;
-};
-
-class MeshEmitterContext : public MeshSurfaceActionContext, public EmitterActionContext {
- private:
-  Object *m_object;
-  ArrayRef<float4x4> m_world_transforms;
-  ArrayRef<float3> m_local_positions;
-  ArrayRef<float3> m_local_normals;
-  ArrayRef<float3> m_world_normals;
-  ArrayRef<uint> m_looptri_indices;
-
-  ArrayRef<float4x4> m_all_world_transforms;
-  ArrayRef<float3> m_all_local_positions;
-  ArrayRef<float3> m_all_local_normals;
-  ArrayRef<float3> m_all_world_normals;
-  ArrayRef<uint> m_all_looptri_indices;
-
- public:
-  MeshEmitterContext(Object *object,
-                     ArrayRef<float4x4> all_world_transforms,
-                     ArrayRef<float3> all_local_positions,
-                     ArrayRef<float3> all_local_normals,
-                     ArrayRef<float3> all_world_normals,
-                     ArrayRef<uint> all_looptri_indices)
-      : m_object(object),
-        m_all_world_transforms(all_world_transforms),
-        m_all_local_positions(all_local_positions),
-        m_all_local_normals(all_local_normals),
-        m_all_world_normals(all_world_normals),
-        m_all_looptri_indices(all_looptri_indices)
-  {
-  }
-
-  void update(Range<uint> slice) override
-  {
-    m_world_transforms = m_all_world_transforms.slice(slice.start(), slice.size());
-    m_local_positions = m_all_local_positions.slice(slice.start(), slice.size());
-    m_local_normals = m_all_local_normals.slice(slice.start(), slice.size());
-    m_world_normals = m_all_world_normals.slice(slice.start(), slice.size());
-    m_looptri_indices = m_all_looptri_indices.slice(slice.start(), slice.size());
-  }
-
-  Object *object() const override
-  {
-    return m_object;
-  }
-
-  ArrayRef<float4x4> world_transforms() const override
-  {
-    return m_world_transforms;
-  }
-
-  ArrayRef<float3> local_positions() const override
-  {
-    return m_local_positions;
-  }
-
-  ArrayRef<float3> local_normals() const override
-  {
-    return m_local_normals;
-  }
-
-  ArrayRef<float3> world_normals() const override
-  {
-    return m_world_normals;
-  }
-
-  ArrayRef<uint> looptri_indices() const override
-  {
-    return m_looptri_indices;
-  }
-};
-
-class MeshCollisionContext : public MeshSurfaceActionContext {
+class MeshSurfaceContext : public ActionContext {
  private:
   Object *m_object;
   ArrayRef<float4x4> m_world_transforms;
@@ -100,12 +19,12 @@ class MeshCollisionContext : public MeshSurfaceActionContext {
   ArrayRef<uint> m_looptri_indices;
 
  public:
-  MeshCollisionContext(Object *object,
-                       ArrayRef<float4x4> world_transforms,
-                       ArrayRef<float3> local_positions,
-                       ArrayRef<float3> local_normals,
-                       ArrayRef<float3> world_normals,
-                       ArrayRef<uint> looptri_indices)
+  MeshSurfaceContext(Object *object,
+                     ArrayRef<float4x4> world_transforms,
+                     ArrayRef<float3> local_positions,
+                     ArrayRef<float3> local_normals,
+                     ArrayRef<float3> world_normals,
+                     ArrayRef<uint> looptri_indices)
       : m_object(object),
         m_world_transforms(world_transforms),
         m_local_positions(local_positions),
@@ -115,32 +34,32 @@ class MeshCollisionContext : public MeshSurfaceActionContext {
   {
   }
 
-  Object *object() const override
+  Object *object() const
   {
     return m_object;
   }
 
-  ArrayRef<float4x4> world_transforms() const override
+  ArrayRef<float4x4> world_transforms() const
   {
     return m_world_transforms;
   }
 
-  ArrayRef<float3> local_positions() const override
+  ArrayRef<float3> local_positions() const
   {
     return m_local_positions;
   }
 
-  ArrayRef<float3> local_normals() const override
+  ArrayRef<float3> local_normals() const
   {
     return m_local_normals;
   }
 
-  ArrayRef<float3> world_normals() const override
+  ArrayRef<float3> world_normals() const
   {
     return m_world_normals;
   }
 
-  ArrayRef<uint> looptri_indices() const override
+  ArrayRef<uint> looptri_indices() const
   {
     return m_looptri_indices;
   }
diff --git a/source/blender/simulations/bparticles/action_interface.hpp b/source/blender/simulations/bparticles/action_interface.hpp
index 7e9d37e45cf..9b5b4f7f274 100644
--- a/source/blender/simulations/bparticles/action_interface.hpp
+++ b/source/blender/simulations/bparticles/action_interface.hpp
@@ -22,11 +22,6 @@ class ActionContext {
   virtual ~ActionContext();
 };
 
-class EmitterActionContext {
- public:
-  virtual void update(Range<uint> slice) = 0;
-};
-
 class SourceParticleActionContext : public ActionContext {
  private:
   ArrayRef<uint> m_all_source_indices;
@@ -92,9 +87,10 @@ class Action {
 
   virtual void execute(ActionInterface &interface) = 0;
 
+  template<typename BuildContextF>
   void execute_from_emitter(AttributesRefGroup &new_particles,
                             EmitterInterface &emitter_interface,
-                            EmitterActionContext *emitter_action_context = nullptr);
+                            const BuildContextF &build_context);
   void execute_from_event(EventExecuteInterface &event_interface,
                           ActionContext *action_context = nullptr);
   void execute_for_subset(ArrayRef<uint> pindices, ActionInterface &action_interface);
@@ -128,31 +124,22 @@ inline ActionInterface::ActionInterface(ParticleAllocator &particle_allocator,
 class EmptyActionContext : public ActionContext {
 };
 
-class EmptyEmitterActionContext : public EmitterActionContext {
-  void update(Range<uint> UNUSED(slice))
-  {
-  }
-};
-
+template<typename BuildContextF>
 inline void Action::execute_from_emitter(AttributesRefGroup &new_particles,
                                          EmitterInterface &emitter_interface,
-                                         EmitterActionContext *emitter_action_context)
+                                         const BuildContextF &build_context)
 {
   AttributesInfo info;
   std::array<void *, 0> buffers;
 
-  EmptyEmitterActionContext empty_emitter_context;
-  EmitterActionContext &used_emitter_context = (emitter_action_context == nullptr) ?
-                                                   empty_emitter_context :
-                                                   *emitter_action_context;
-
   uint offset = 0;
   for (AttributesRef attributes : new_particles) {
     uint range_size = attributes.size();
-
-    used_emitter_context.update(Range<uint>(offset, offset + range_size));
+    Range<uint> range(offset, offset + range_size);
     offset += range_size;
 
+    auto action_context = build_context(range);
+
     AttributesRef offsets(info, buffers, range_size);
     TemporaryArray<float> durations(range_size);
     durations.fill(0);
@@ -163,7 +150,7 @@ inline void Action::execute_from_emitter(AttributesRefGroup &new_particles,
                                      offsets,
                                      attributes.get<float>("Birth Time"),
                                      durations,
-                                     dynamic_cast<ActionContext &>(used_emitter_context));
+                                     action_context);
     this->execute(action_interface);
   }
 }
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index ffd17d8f49a..71a56c85827 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -308,14 +308,15 @@ void SurfaceEmitter::emit(EmitterInterface &interface)
     new_particles.set<float3>("Position", positions_at_birth);
     new_particles.set<float>("Birth Time", birth_times);
 
-    MeshEmitterContext emitter_context(m_object,
-                                       transforms_at_birth,
-                                       local_positions,
-                                       local_normals,
-                                       world_normals,
-                                       triangles_to_sample);
-
-    m_on_birth_action->execute_from_emitter(new_particles, interface, &emitter_context);
+    m_on_birth_action->execute_from_emitter(
+        new_particles, interface, [&](Range<uint> range) -> MeshSurfaceContext {
+          return MeshSurfaceContext(m_object,
+                                    ArrayRef<float4x4>(transforms_at_birth).slice(range),
+                                    ArrayRef<float3>(local_positions).slice(range),
+                                    ArrayRef<float3>(local_normals).slice(range),
+                                    ArrayRef<float3>(world_normals).slice(range),
+                                    ArrayRef<uint>(triangles_to_sample).slice(range));
+        });
   }
 }
 
diff --git a/source/blender/simulations/bparticles/events.cpp b/source/blender/simulations/bparticles/events.cpp
index d560353bca4..d6da8943830 100644
--- a/source/blender/simulations/bparticles/events.cpp
+++ b/source/blender/simulations/bparticles/events.cpp
@@ -153,10 +153,10 @@ void MeshCollisionEvent::execute(EventExecuteInterface &interface)
     last_collision_times[pindex] = interface.current_times()[pindex];
   }
 
-  MeshCollisionContext action_context(
+  MeshSurfaceContext surface_context(
       m_object, world_transforms, local_positions, local_normals, world_normals, looptri_indices);
 
-  m_action->execute_from_event(interface, &action_con

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list