[Bf-blender-cvs] [dbc453f414c] functions: extract methods from particle function evaluation
Jacques Lucke
noreply at git.blender.org
Mon Jul 29 17:57:23 CEST 2019
Commit: dbc453f414cc57f18e65ad623b2e525d397c2c70
Author: Jacques Lucke
Date: Mon Jul 29 12:30:59 2019 +0200
Branches: functions
https://developer.blender.org/rBdbc453f414cc57f18e65ad623b2e525d397c2c70
extract methods from particle function evaluation
===================================================================
M source/blender/simulations/bparticles/particle_function.cpp
M source/blender/simulations/bparticles/particle_function.hpp
===================================================================
diff --git a/source/blender/simulations/bparticles/particle_function.cpp b/source/blender/simulations/bparticles/particle_function.cpp
index da316f7f4e3..98f664d6957 100644
--- a/source/blender/simulations/bparticles/particle_function.cpp
+++ b/source/blender/simulations/bparticles/particle_function.cpp
@@ -2,6 +2,31 @@
namespace BParticles {
+ParticleFunction::ParticleFunction(SharedFunction fn_no_deps,
+ SharedFunction fn_with_deps,
+ Vector<bool> parameter_depends_on_particle)
+ : m_fn_no_deps(std::move(fn_no_deps)),
+ m_fn_with_deps(std::move(fn_with_deps)),
+ m_parameter_depends_on_particle(std::move(parameter_depends_on_particle))
+{
+ BLI_assert(m_fn_no_deps->output_amount() + m_fn_with_deps->output_amount() ==
+ m_parameter_depends_on_particle.size());
+ BLI_assert(m_fn_no_deps->input_amount() == 0);
+
+ uint no_deps_index = 0;
+ uint with_deps_index = 0;
+ for (uint i = 0; i < m_parameter_depends_on_particle.size(); i++) {
+ if (m_parameter_depends_on_particle[i]) {
+ m_output_indices.append(with_deps_index);
+ with_deps_index++;
+ }
+ else {
+ m_output_indices.append(no_deps_index);
+ no_deps_index++;
+ }
+ }
+}
+
std::unique_ptr<ParticleFunctionResult> ParticleFunction::compute(ActionInterface &interface)
{
return this->compute(interface.array_allocator(),
@@ -52,104 +77,124 @@ std::unique_ptr<ParticleFunctionResult> ParticleFunction::compute(ArrayAllocator
result->m_fn_with_deps = m_fn_with_deps.ptr();
result->m_output_indices = m_output_indices;
- if (m_fn_no_deps->output_amount() > 0) {
- TupleCallBody &body = m_fn_no_deps->body<TupleCallBody>();
+ this->init_without_deps(result, array_allocator);
+ this->init_with_deps(result, array_allocator, pindices, attributes, action_context);
- FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
- body.call__setup_execution_context(fn_in, fn_out);
+ return std::unique_ptr<ParticleFunctionResult>(result);
+}
- for (uint parameter_index = 0; parameter_index < parameter_amount; parameter_index++) {
- if (m_parameter_depends_on_particle[parameter_index]) {
- continue;
- }
- uint output_index = m_output_indices[parameter_index];
- CPPTypeInfo &type_info = m_fn_no_deps->output_type(output_index)->extension<CPPTypeInfo>();
+void ParticleFunction::init_without_deps(ParticleFunctionResult *result,
+ ArrayAllocator &array_allocator)
+{
+ if (m_fn_no_deps->output_amount() == 0) {
+ return;
+ }
- uint output_stride = type_info.size_of_type();
- void *output_buffer = array_allocator.allocate(output_stride);
+ uint parameter_amount = m_parameter_depends_on_particle.size();
+ TupleCallBody &body = m_fn_no_deps->body<TupleCallBody>();
- result->m_buffers[parameter_index] = output_buffer;
- result->m_strides[parameter_index] = output_stride;
- result->m_only_first[parameter_index] = true;
+ FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
+ body.call__setup_execution_context(fn_in, fn_out);
- fn_out.relocate_out__dynamic(output_index, output_buffer);
+ for (uint parameter_index = 0; parameter_index < parameter_amount; parameter_index++) {
+ if (m_parameter_depends_on_particle[parameter_index]) {
+ continue;
}
+ uint output_index = m_output_indices[parameter_index];
+ CPPTypeInfo &type_info = m_fn_no_deps->output_type(output_index)->extension<CPPTypeInfo>();
+
+ uint output_stride = type_info.size_of_type();
+ void *output_buffer = array_allocator.allocate(output_stride);
+
+ result->m_buffers[parameter_index] = output_buffer;
+ result->m_strides[parameter_index] = output_stride;
+ result->m_only_first[parameter_index] = true;
+
+ fn_out.relocate_out__dynamic(output_index, output_buffer);
}
+}
- if (m_fn_with_deps->output_amount() > 0) {
- TupleCallBody &body = m_fn_with_deps->body<TupleCallBody>();
-
- Vector<void *> input_buffers;
- Vector<uint> input_strides;
-
- for (uint i = 0; i < m_fn_with_deps->input_amount(); i++) {
- StringRef input_name = m_fn_with_deps->input_name(i);
- void *input_buffer = nullptr;
- uint input_stride = 0;
- if (input_name.startswith("Attribute")) {
- StringRef attribute_name = input_name.drop_prefix("Attribute: ");
- uint attribute_index = attributes.attribute_index(attribute_name);
- input_buffer = attributes.get_ptr(attribute_index);
- input_stride = attributes.attribute_stride(attribute_index);
- }
- else if (action_context != nullptr && input_name.startswith("Action Context")) {
- StringRef context_name = input_name.drop_prefix("Action Context: ");
- ActionContext::ContextArray array = action_context->get_context_array(context_name);
- input_buffer = array.buffer;
- input_stride = array.stride;
- }
- else {
- BLI_assert(false);
- }
- BLI_assert(input_buffer != nullptr);
-
- input_buffers.append(input_buffer);
- input_strides.append(input_stride);
+void ParticleFunction::init_with_deps(ParticleFunctionResult *result,
+ ArrayAllocator &array_allocator,
+ ArrayRef<uint> pindices,
+ AttributeArrays attributes,
+ ActionContext *action_context)
+{
+ if (m_fn_with_deps->output_amount() == 0) {
+ return;
+ }
+
+ uint parameter_amount = m_parameter_depends_on_particle.size();
+ TupleCallBody &body = m_fn_with_deps->body<TupleCallBody>();
+
+ Vector<void *> input_buffers;
+ Vector<uint> input_strides;
+
+ for (uint i = 0; i < m_fn_with_deps->input_amount(); i++) {
+ StringRef input_name = m_fn_with_deps->input_name(i);
+ void *input_buffer = nullptr;
+ uint input_stride = 0;
+ if (input_name.startswith("Attribute")) {
+ StringRef attribute_name = input_name.drop_prefix("Attribute: ");
+ uint attribute_index = attributes.attribute_index(attribute_name);
+ input_buffer = attributes.get_ptr(attribute_index);
+ input_stride = attributes.attribute_stride(attribute_index);
}
+ else if (action_context != nullptr && input_name.startswith("Action Context")) {
+ StringRef context_name = input_name.drop_prefix("Action Context: ");
+ ActionContext::ContextArray array = action_context->get_context_array(context_name);
+ input_buffer = array.buffer;
+ input_stride = array.stride;
+ }
+ else {
+ BLI_assert(false);
+ }
+ BLI_assert(input_buffer != nullptr);
+
+ input_buffers.append(input_buffer);
+ input_strides.append(input_stride);
+ }
- Vector<void *> output_buffers;
- Vector<uint> output_strides;
+ Vector<void *> output_buffers;
+ Vector<uint> output_strides;
- for (uint parameter_index = 0; parameter_index < parameter_amount; parameter_index++) {
- if (!m_parameter_depends_on_particle[parameter_index]) {
- continue;
- }
+ for (uint parameter_index = 0; parameter_index < parameter_amount; parameter_index++) {
+ if (!m_parameter_depends_on_particle[parameter_index]) {
+ continue;
+ }
- uint output_index = m_output_indices[parameter_index];
- CPPTypeInfo &type_info = m_fn_with_deps->output_type(output_index)->extension<CPPTypeInfo>();
+ uint output_index = m_output_indices[parameter_index];
+ CPPTypeInfo &type_info = m_fn_with_deps->output_type(output_index)->extension<CPPTypeInfo>();
- uint output_stride = type_info.size_of_type();
- void *output_buffer = array_allocator.allocate(output_stride);
+ uint output_stride = type_info.size_of_type();
+ void *output_buffer = array_allocator.allocate(output_stride);
- result->m_buffers[parameter_index] = output_buffer;
- result->m_strides[parameter_index] = output_stride;
- result->m_only_first[parameter_index] = false;
+ result->m_buffers[parameter_index] = output_buffer;
+ result->m_strides[parameter_index] = output_stride;
+ result->m_only_first[parameter_index] = false;
- output_buffers.append(output_buffer);
- output_strides.append(output_stride);
- }
+ output_buffers.append(output_buffer);
+ output_strides.append(output_stride);
+ }
- ExecutionStack stack;
- ExecutionContext execution_context(stack);
+ ExecutionStack stack;
+ ExecutionContext execution_context(stack);
- FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
+ FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
- for (uint pindex : 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);
- }
+ for (uint pindex : 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);
+ }
- body.call(fn_in, fn_out, execution_context);
+ body.call(fn_in, fn_out, execution_context);
- for (uint i = 0; i < output_buffers.size(); i++) {
- void *ptr = POINTER_OFFSET(output_buffers[i], pindex * output_strides[i]);
- fn_out.relocate_out__dynamic(i, ptr);
- }
+ for (uint i = 0; i < output_buffers.size(); i++) {
+ void *ptr = POINTER_OFFSET(output_buffers[i], pindex * output_strides[i]);
+ fn_out.relocate_out__dynamic(i, ptr);
}
}
-
- return std::unique_ptr<ParticleFunctionResult>(result);
}
} // namespace BParticles
diff --git a/source/blender/simulations/bparticles/particle_function.hpp b/source/blender/simulations/bparticles/particle_function.hpp
index 9b51602e13b..636c9df0413 100644
--- a/source/blender/simulations/bparticles/particle_function.hpp
+++ b/source/blender/simulations/bparticles/particle_function.hpp
@@ -78,28 +78,7 @@ class ParticleFunction {
public:
ParticleFunction(SharedFunction fn_no_deps,
SharedFunction fn_with_deps,
- Vector<bool> parameter_depends_on_particle)
- : m_fn_no_deps(std::move
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list