[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