[Bf-blender-cvs] [e87cd0c8077] functions: introduce input provider interface

Jacques Lucke noreply at git.blender.org
Mon Jul 29 17:57:32 CEST 2019


Commit: e87cd0c80774100b53cc1f902ad6bbb3aa929452
Author: Jacques Lucke
Date:   Mon Jul 29 14:02:04 2019 +0200
Branches: functions
https://developer.blender.org/rBe87cd0c80774100b53cc1f902ad6bbb3aa929452

introduce input provider interface

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

M	source/blender/simulations/bparticles/particle_function.cpp
M	source/blender/simulations/bparticles/particle_function.hpp
M	source/blender/simulations/bparticles/particle_function_builder.cpp

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

diff --git a/source/blender/simulations/bparticles/particle_function.cpp b/source/blender/simulations/bparticles/particle_function.cpp
index b6752abe677..be4438e2e9a 100644
--- a/source/blender/simulations/bparticles/particle_function.cpp
+++ b/source/blender/simulations/bparticles/particle_function.cpp
@@ -42,41 +42,30 @@ ParticleFunction::~ParticleFunction()
 
 std::unique_ptr<ParticleFunctionResult> ParticleFunction::compute(ActionInterface &interface)
 {
-  return this->compute(interface.array_allocator(),
-                       interface.particles().pindices(),
-                       interface.particles().attributes(),
-                       &interface.context());
+  return this->compute(interface.array_allocator(), interface.particles(), &interface.context());
 }
 
 std::unique_ptr<ParticleFunctionResult> ParticleFunction::compute(
     OffsetHandlerInterface &interface)
 {
-  return this->compute(interface.array_allocator(),
-                       interface.particles().pindices(),
-                       interface.particles().attributes(),
-                       nullptr);
+  return this->compute(interface.array_allocator(), interface.particles(), nullptr);
 }
 
 std::unique_ptr<ParticleFunctionResult> ParticleFunction::compute(ForceInterface &interface)
 {
   ParticlesBlock &block = interface.block();
   return this->compute(interface.array_allocator(),
-                       block.active_range().as_array_ref(),
-                       block.attributes(),
+                       ParticleSet(block, block.active_range().as_array_ref()),
                        nullptr);
 }
 
 std::unique_ptr<ParticleFunctionResult> ParticleFunction::compute(EventFilterInterface &interface)
 {
-  return this->compute(interface.array_allocator(),
-                       interface.particles().pindices(),
-                       interface.particles().attributes(),
-                       nullptr);
+  return this->compute(interface.array_allocator(), interface.particles(), nullptr);
 }
 
 std::unique_ptr<ParticleFunctionResult> ParticleFunction::compute(ArrayAllocator &array_allocator,
-                                                                  ArrayRef<uint> pindices,
-                                                                  AttributeArrays attributes,
+                                                                  ParticleSet particles,
                                                                   ActionContext *action_context)
 {
   uint parameter_amount = m_parameter_depends_on_particle.size();
@@ -91,7 +80,7 @@ std::unique_ptr<ParticleFunctionResult> ParticleFunction::compute(ArrayAllocator
   result->m_output_indices = m_output_indices;
 
   this->init_without_deps(result, array_allocator);
-  this->init_with_deps(result, array_allocator, pindices, attributes, action_context);
+  this->init_with_deps(result, array_allocator, particles, action_context);
 
   return std::unique_ptr<ParticleFunctionResult>(result);
 }
@@ -129,8 +118,7 @@ void ParticleFunction::init_without_deps(ParticleFunctionResult *result,
 
 void ParticleFunction::init_with_deps(ParticleFunctionResult *result,
                                       ArrayAllocator &array_allocator,
-                                      ArrayRef<uint> pindices,
-                                      AttributeArrays attributes,
+                                      ParticleSet particles,
                                       ActionContext *action_context)
 {
   if (m_fn_with_deps->output_amount() == 0) {
@@ -146,7 +134,8 @@ void ParticleFunction::init_with_deps(ParticleFunctionResult *result,
 
   for (uint i = 0; i < m_fn_with_deps->input_amount(); i++) {
     auto *provider = m_input_providers[i];
-    auto array = provider->get(attributes, action_context);
+    InputProviderInterface interface(array_allocator, particles, action_context);
+    auto array = provider->get(interface);
     BLI_assert(array.buffer != nullptr);
     BLI_assert(array.stride > 0);
 
@@ -184,7 +173,7 @@ void ParticleFunction::init_with_deps(ParticleFunctionResult *result,
 
   FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
 
-  for (uint pindex : pindices) {
+  for (uint pindex : particles.pindices()) {
     for (uint i = 0; i < input_buffers.size(); i++) {
       void *ptr = POINTER_OFFSET(input_buffers[i], pindex * input_strides[i]);
       fn_in.copy_in__dynamic(i, ptr);
diff --git a/source/blender/simulations/bparticles/particle_function.hpp b/source/blender/simulations/bparticles/particle_function.hpp
index 7fb0e66f1a0..0cacb0146a5 100644
--- a/source/blender/simulations/bparticles/particle_function.hpp
+++ b/source/blender/simulations/bparticles/particle_function.hpp
@@ -85,12 +85,43 @@ struct ParticleFunctionInputArray {
   }
 };
 
+class InputProviderInterface {
+ private:
+  ArrayAllocator &m_array_allocator;
+  ParticleSet m_particles;
+  ActionContext *m_action_context;
+
+ public:
+  InputProviderInterface(ArrayAllocator &array_allocator,
+                         ParticleSet particles,
+                         ActionContext *action_context)
+      : m_array_allocator(array_allocator),
+        m_particles(particles),
+        m_action_context(action_context)
+  {
+  }
+
+  ArrayAllocator &array_allocator()
+  {
+    return m_array_allocator;
+  }
+
+  ParticleSet particles()
+  {
+    return m_particles;
+  }
+
+  ActionContext *action_context()
+  {
+    return m_action_context;
+  }
+};
+
 class ParticleFunctionInputProvider {
  public:
   virtual ~ParticleFunctionInputProvider();
 
-  virtual ParticleFunctionInputArray get(AttributeArrays attributes,
-                                         ActionContext *action_context) = 0;
+  virtual ParticleFunctionInputArray get(InputProviderInterface &interface) = 0;
 };
 
 class ParticleFunction {
@@ -139,16 +170,14 @@ class ParticleFunction {
 
  private:
   std::unique_ptr<ParticleFunctionResult> compute(ArrayAllocator &array_allocator,
-                                                  ArrayRef<uint> pindices,
-                                                  AttributeArrays attributes,
+                                                  ParticleSet particles,
                                                   ActionContext *action_context);
 
   void init_without_deps(ParticleFunctionResult *result, ArrayAllocator &array_allocator);
 
   void init_with_deps(ParticleFunctionResult *result,
                       ArrayAllocator &array_allocator,
-                      ArrayRef<uint> pindices,
-                      AttributeArrays attributes,
+                      ParticleSet particles,
                       ActionContext *action_context);
 };
 
diff --git a/source/blender/simulations/bparticles/particle_function_builder.cpp b/source/blender/simulations/bparticles/particle_function_builder.cpp
index 9a279f4b7d3..76f1dc28db3 100644
--- a/source/blender/simulations/bparticles/particle_function_builder.cpp
+++ b/source/blender/simulations/bparticles/particle_function_builder.cpp
@@ -58,9 +58,9 @@ class AttributeInputProvider : public ParticleFunctionInputProvider {
   {
   }
 
-  ParticleFunctionInputArray get(AttributeArrays attributes,
-                                 ActionContext *UNUSED(action_context)) override
+  ParticleFunctionInputArray get(InputProviderInterface &interface) override
   {
+    AttributeArrays attributes = interface.particles().attributes();
     uint attribute_index = attributes.attribute_index(m_name);
     uint stride = attributes.attribute_stride(attribute_index);
     void *buffer = attributes.get_ptr(attribute_index);
@@ -69,9 +69,9 @@ class AttributeInputProvider : public ParticleFunctionInputProvider {
 };
 
 class CollisionNormalInputProvider : public ParticleFunctionInputProvider {
-  ParticleFunctionInputArray get(AttributeArrays UNUSED(attributes),
-                                 ActionContext *action_context) override
+  ParticleFunctionInputArray get(InputProviderInterface &interface) override
   {
+    ActionContext *action_context = interface.action_context();
     BLI_assert(action_context != nullptr);
     CollisionEventInfo *collision_info = dynamic_cast<CollisionEventInfo *>(action_context);
     BLI_assert(collision_info != nullptr);



More information about the Bf-blender-cvs mailing list