[Bf-blender-cvs] [e8e94a68001] functions: Allow emitters to emit into separate buffers

Jacques Lucke noreply at git.blender.org
Tue Jun 18 12:39:00 CEST 2019


Commit: e8e94a680010a89170dd41aa67406494f12fcbee
Author: Jacques Lucke
Date:   Tue Jun 18 11:46:14 2019 +0200
Branches: functions
https://developer.blender.org/rBe8e94a680010a89170dd41aa67406494f12fcbee

Allow emitters to emit into separate buffers

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

M	source/blender/simulations/bparticles/attributes.cpp
M	source/blender/simulations/bparticles/attributes.hpp
M	source/blender/simulations/bparticles/c_wrapper.cpp
M	source/blender/simulations/bparticles/core.hpp
M	source/blender/simulations/bparticles/emitter.cpp
M	source/blender/simulations/bparticles/particles_container.cpp
M	source/blender/simulations/bparticles/playground_solver.cpp

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

diff --git a/source/blender/simulations/bparticles/attributes.cpp b/source/blender/simulations/bparticles/attributes.cpp
index 6fb572bbb37..e77bd2916fb 100644
--- a/source/blender/simulations/bparticles/attributes.cpp
+++ b/source/blender/simulations/bparticles/attributes.cpp
@@ -31,4 +31,55 @@ SmallVector<void *> AttributesInfo::allocate_separate_arrays(uint size) const
   return pointers;
 }
 
+void JoinedAttributeArrays::set_elements(uint index, void *data)
+{
+  AttributeType type = m_info.type_of(index);
+  uint element_size = size_of_attribute_type(type);
+
+  void *remaining_data = data;
+
+  for (auto arrays : m_arrays) {
+    void *target = arrays.get_ptr(index);
+    uint bytes_to_copy = element_size * arrays.size();
+    memcpy(target, remaining_data, bytes_to_copy);
+
+    remaining_data = POINTER_OFFSET(remaining_data, bytes_to_copy);
+  }
+}
+
+void JoinedAttributeArrays::set_byte(uint index, ArrayRef<uint8_t> data)
+{
+  BLI_assert(data.size() == m_size);
+  BLI_assert(m_info.type_of(index) == AttributeType::Byte);
+  this->set_elements(index, (void *)data.begin());
+}
+void JoinedAttributeArrays::set_float(uint index, ArrayRef<float> data)
+{
+  BLI_assert(data.size() == m_size);
+  BLI_assert(m_info.type_of(index) == AttributeType::Float);
+  this->set_elements(index, (void *)data.begin());
+}
+void JoinedAttributeArrays::set_float3(uint index, ArrayRef<float3> data)
+{
+  BLI_assert(data.size() == m_size);
+  BLI_assert(m_info.type_of(index) == AttributeType::Float3);
+  this->set_elements(index, (void *)data.begin());
+}
+
+void JoinedAttributeArrays::set_byte(StringRef name, ArrayRef<uint8_t> data)
+{
+  uint index = m_info.attribute_index(name);
+  this->set_byte(index, data);
+}
+void JoinedAttributeArrays::set_float(StringRef name, ArrayRef<float> data)
+{
+  uint index = m_info.attribute_index(name);
+  this->set_float(index, data);
+}
+void JoinedAttributeArrays::set_float3(StringRef name, ArrayRef<float3> data)
+{
+  uint index = m_info.attribute_index(name);
+  this->set_float3(index, data);
+}
+
 };  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/attributes.hpp b/source/blender/simulations/bparticles/attributes.hpp
index 05f307e7c70..3a6717ea0db 100644
--- a/source/blender/simulations/bparticles/attributes.hpp
+++ b/source/blender/simulations/bparticles/attributes.hpp
@@ -91,6 +91,11 @@ class AttributesInfo {
     return m_float3_attributes;
   }
 
+  friend bool operator==(const AttributesInfo &a, const AttributesInfo &b)
+  {
+    return &a == &b;
+  }
+
   SmallVector<void *> allocate_separate_arrays(uint size) const;
 };
 
@@ -100,12 +105,12 @@ class AttributeArraysCore {
  private:
   AttributesInfo &m_info;
   SmallVector<void *> m_arrays;
-  uint m_size;
+  uint m_size = 0;
 
  public:
   AttributeArraysCore() = default;
 
-  AttributeArraysCore(AttributesInfo &info, ArrayRef<void *> arrays);
+  AttributeArraysCore(AttributesInfo &info, ArrayRef<void *> arrays, uint size);
 
   AttributesInfo &info();
   void *get_ptr(uint index);
@@ -128,6 +133,8 @@ class AttributeArrays {
 
   uint attribute_index(StringRef name);
 
+  void *get_ptr(uint index) const;
+
   ArrayRef<uint8_t> get_byte(uint index) const;
   ArrayRef<uint8_t> get_byte(StringRef name);
   ArrayRef<float> get_float(uint index) const;
@@ -139,11 +146,38 @@ class AttributeArrays {
   AttributeArrays take_front(uint n) const;
 };
 
+class JoinedAttributeArrays {
+ private:
+  AttributesInfo &m_info;
+  SmallVector<AttributeArrays> m_arrays;
+  uint m_size;
+
+ public:
+  JoinedAttributeArrays(AttributesInfo &info, ArrayRef<AttributeArrays> arrays_list);
+
+  AttributesInfo &info();
+
+  uint size() const;
+  ArrayRef<AttributeArrays> arrays_list();
+
+  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);
+  void set_float(StringRef name, ArrayRef<float> data);
+  void set_float3(uint index, ArrayRef<float3> data);
+  void set_float3(StringRef name, ArrayRef<float3> data);
+
+ private:
+  void set_elements(uint index, void *data);
+};
+
 /* Attribute Arrays Core
  *****************************************/
 
-inline AttributeArraysCore::AttributeArraysCore(AttributesInfo &info, ArrayRef<void *> arrays)
-    : m_info(info), m_arrays(arrays.to_small_vector())
+inline AttributeArraysCore::AttributeArraysCore(AttributesInfo &info,
+                                                ArrayRef<void *> arrays,
+                                                uint size)
+    : m_info(info), m_arrays(arrays.to_small_vector()), m_size(size)
 {
 }
 
@@ -201,6 +235,14 @@ inline uint AttributeArrays::attribute_index(StringRef name)
   return this->info().attribute_index(name);
 }
 
+inline void *AttributeArrays::get_ptr(uint index) const
+{
+  void *ptr = m_core.get_ptr(index);
+  AttributeType type = m_core.get_type(index);
+  uint size = size_of_attribute_type(type);
+  return POINTER_OFFSET(ptr, m_start * size);
+}
+
 inline ArrayRef<uint8_t> AttributeArrays::get_byte(uint index) const
 {
   BLI_assert(m_core.get_type(index) == AttributeType::Byte);
@@ -245,4 +287,33 @@ inline AttributeArrays AttributeArrays::take_front(uint n) const
   return AttributeArrays(m_core, m_start, n);
 }
 
+/* Joined Attribute Arrays
+ ******************************************/
+
+inline JoinedAttributeArrays::JoinedAttributeArrays(AttributesInfo &info,
+                                                    ArrayRef<AttributeArrays> arrays_list)
+    : m_info(info), m_arrays(arrays_list.to_small_vector())
+{
+  m_size = 0;
+  for (AttributeArrays arrays : arrays_list) {
+    BLI_assert(arrays.info() == m_info);
+    m_size += arrays.size();
+  }
+}
+
+inline AttributesInfo &JoinedAttributeArrays::info()
+{
+  return m_info;
+}
+
+inline uint JoinedAttributeArrays::size() const
+{
+  return m_size;
+}
+
+inline ArrayRef<AttributeArrays> JoinedAttributeArrays::arrays_list()
+{
+  return m_arrays;
+}
+
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index 5f8451d337a..226e2471449 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -18,8 +18,9 @@
 using BParticles::AttributeArrays;
 using BParticles::AttributeType;
 using BParticles::Description;
-using BParticles::EmitterBuffers;
+using BParticles::EmitterHelper;
 using BParticles::EmitterInfoBuilder;
+using BParticles::EmitterTarget;
 using BParticles::ParticlesBlock;
 using BParticles::Solver;
 using BParticles::StateBase;
@@ -79,10 +80,9 @@ class TestEmitter : public BParticles::Emitter {
     builder.inits_attribute("Velocity", AttributeType::Float3);
   }
 
-  void emit(BParticles::RequestEmitterBufferCB request_buffers) override
+  void emit(EmitterHelper helper) override
   {
-    EmitterBuffers &dst = request_buffers();
-    BLI_assert(dst.size() > 0);
+    EmitterTarget &dst = helper.request_raw();
 
     auto positions = dst.buffers().get_float3("Position");
     auto velocities = dst.buffers().get_float3("Velocity");
diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index 5aa8c33ccee..e889ca72b6e 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -10,6 +10,7 @@
 #include "BLI_string_ref.hpp"
 
 #include "attributes.hpp"
+#include "particles_container.hpp"
 
 namespace BParticles {
 class Description;
@@ -40,38 +41,6 @@ class Action {
   virtual void execute(AttributeArrays &attributes, ArrayRef<uint> indices_to_influence) = 0;
 };
 
-class EmitterBuffers {
- private:
-  AttributeArrays m_buffers;
-  uint m_emitted_amount = 0;
-
- public:
-  EmitterBuffers(AttributeArrays buffers) : m_buffers(buffers)
-  {
-  }
-
-  void set_initialized(uint n)
-  {
-    m_emitted_amount += n;
-    BLI_assert(m_emitted_amount <= m_buffers.size());
-  }
-
-  uint emitted_amount()
-  {
-    return m_emitted_amount;
-  }
-
-  AttributeArrays &buffers()
-  {
-    return m_buffers;
-  }
-
-  uint size()
-  {
-    return m_buffers.size();
-  }
-};
-
 class EmitterInfo {
  private:
   EmitterInfo()
@@ -162,14 +131,82 @@ class EmitterInfoBuilder {
   }
 };
 
-using RequestEmitterBufferCB = std::function<EmitterBuffers &()>;
+class EmitterTarget {
+ private:
+  AttributeArrays m_buffers;
+  uint m_emitted_amount = 0;
+
+ public:
+  EmitterTarget(AttributeArrays buffers) : m_buffers(buffers)
+  {
+  }
+
+  void set_initialized(uint n)
+  {
+    m_emitted_amount += n;
+    BLI_assert(m_emitted_amount <= m_buffers.size());
+  }
+
+  uint emitted_amount()
+  {
+    return m_emitted_amount;
+  }
+
+  AttributeArrays &buffers()
+  {
+    return m_buffers;
+  }
+
+  uint size()
+  {
+    return m_buffers.size();
+  }
+};
+
+using RequestEmitterTarget = std::function<EmitterTarget &()>;
+
+class EmitterHelper {
+ private:
+  RequestEmitterTarget &m_request_target;
+
+ public:
+  EmitterHelper(RequestEmitterTarget &request_target) : m_request_target(request_target)
+  {
+  }
+
+  EmitterTarget &request_raw()
+  {
+    EmitterTarget &target = m_request_target();
+    BLI_assert(target.size() > 0);
+    return target;
+  }
+
+  JoinedAttributeArrays request(uint size)
+  {
+    SmallVector<AttributeArrays> arrays_list;
+    uint remaining_size = size;
+    while (remaining_size > 0) {
+      EmitterTarget &target = this->request_raw();
+
+      uint size_to_use = std::min(target.size(), remaining_size);
+      target.set_initialized(size_to_use);
+      arrays_list.append(target.buffers().take_front(size_to_use));
+      remaining_size -= size_to_use;
+    }
+
+    AttributesInfo &info = (arrays_list.size() == 0) ? this->request_raw().buffers().info() :
+                                                       arrays_list[0].info();
+
+    return JoinedAttributeArrays(info, arrays_list);
+  }
+};
 
 class Emitter {
  public:
   virtual ~Emitter();
 
   virtual void info(EmitterInfoBuilder &info) const = 0;
-  virtual void emit(RequestEmitterBufferCB request_buffers) = 0;
+  virtual void emit(EmitterHelper helper) = 0;
 };
 
 class Description

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list