[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