[Bf-blender-cvs] [ee8f58eb66a] functions: move particle function input providers to separate file
Jacques Lucke
noreply at git.blender.org
Tue Sep 3 16:23:04 CEST 2019
Commit: ee8f58eb66aff00ea3cff167aa68d956e0928ea7
Author: Jacques Lucke
Date: Tue Sep 3 11:56:49 2019 +0200
Branches: functions
https://developer.blender.org/rBee8f58eb66aff00ea3cff167aa68d956e0928ea7
move particle function input providers to separate file
===================================================================
M source/blender/simulations/CMakeLists.txt
M source/blender/simulations/bparticles/action_contexts.hpp
M source/blender/simulations/bparticles/particle_function_builder.cpp
A source/blender/simulations/bparticles/particle_function_input_providers.cpp
A source/blender/simulations/bparticles/particle_function_input_providers.hpp
===================================================================
diff --git a/source/blender/simulations/CMakeLists.txt b/source/blender/simulations/CMakeLists.txt
index 94bc09a7715..fa36dbd9db2 100644
--- a/source/blender/simulations/CMakeLists.txt
+++ b/source/blender/simulations/CMakeLists.txt
@@ -60,6 +60,8 @@ set(SRC
bparticles/force_interface.cpp
bparticles/particle_function_builder.hpp
bparticles/particle_function_builder.cpp
+ bparticles/particle_function_input_providers.hpp
+ bparticles/particle_function_input_providers.cpp
)
set(LIB
diff --git a/source/blender/simulations/bparticles/action_contexts.hpp b/source/blender/simulations/bparticles/action_contexts.hpp
index 3eacb245ba7..f55a1c93d63 100644
--- a/source/blender/simulations/bparticles/action_contexts.hpp
+++ b/source/blender/simulations/bparticles/action_contexts.hpp
@@ -6,6 +6,8 @@ struct Object;
namespace BParticles {
+using BLI::float4x4;
+
class MeshSurfaceActionContext : public ActionContext {
public:
virtual const Object *object() const = 0;
diff --git a/source/blender/simulations/bparticles/particle_function_builder.cpp b/source/blender/simulations/bparticles/particle_function_builder.cpp
index b560fcdc159..75930efaaf2 100644
--- a/source/blender/simulations/bparticles/particle_function_builder.cpp
+++ b/source/blender/simulations/bparticles/particle_function_builder.cpp
@@ -1,13 +1,7 @@
#include "FN_llvm.hpp"
-#include "BKE_image.h"
-#include "DNA_mesh_types.h"
-#include "DNA_meshdata_types.h"
-#include "IMB_imbuf_types.h"
-#include "DNA_customdata_types.h"
-#include "BKE_customdata.h"
-#include "BKE_mesh_runtime.h"
#include "particle_function_builder.hpp"
+#include "particle_function_input_providers.hpp"
#include "events.hpp"
#include "action_contexts.hpp"
@@ -55,141 +49,6 @@ static SetVector<VirtualSocket *> find_particle_dependencies(
return combined_dependencies;
}
-class AttributeInputProvider : public ParticleFunctionInputProvider {
- private:
- std::string m_name;
-
- public:
- AttributeInputProvider(StringRef name) : m_name(name)
- {
- }
-
- ParticleFunctionInputArray get(InputProviderInterface &interface) override
- {
- AttributesRef attributes = interface.attributes();
- uint attribute_index = attributes.attribute_index(m_name);
- uint stride = attributes.attribute_stride(attribute_index);
- void *buffer = attributes.get_ptr(attribute_index);
- return {buffer, stride, false};
- }
-};
-
-class CollisionNormalInputProvider : public ParticleFunctionInputProvider {
- ParticleFunctionInputArray get(InputProviderInterface &interface) override
- {
- ActionContext *action_context = interface.action_context();
- BLI_assert(action_context != nullptr);
- auto *surface_info = dynamic_cast<MeshSurfaceActionContext *>(action_context);
- BLI_assert(surface_info != nullptr);
- return {surface_info->world_normals(), false};
- }
-};
-
-class AgeInputProvider : public ParticleFunctionInputProvider {
- ParticleFunctionInputArray get(InputProviderInterface &interface) override
- {
- auto birth_times = interface.attributes().get<float>("Birth Time");
- float *ages_buffer = (float *)BLI_temporary_allocate(sizeof(float) * birth_times.size());
- MutableArrayRef<float> ages(ages_buffer, birth_times.size());
-
- ParticleTimes × = interface.particle_times();
- if (times.type() == ParticleTimes::Type::Current) {
- auto current_times = times.current_times();
- for (uint pindex : interface.pindices()) {
- ages[pindex] = current_times[pindex] - birth_times[pindex];
- }
- }
- else if (times.type() == ParticleTimes::Type::DurationAndEnd) {
- auto remaining_durations = times.remaining_durations();
- float end_time = times.end_time();
- for (uint pindex : interface.pindices()) {
- ages[pindex] = end_time - remaining_durations[pindex] - birth_times[pindex];
- }
- }
- else {
- BLI_assert(false);
- }
- return {ArrayRef<float>(ages), true};
- }
-};
-
-class SurfaceImageInputProvider : public ParticleFunctionInputProvider {
- private:
- Image *m_image;
- ImageUser m_image_user;
- ImBuf *m_ibuf;
-
- public:
- SurfaceImageInputProvider(Image *image) : m_image(image)
- {
- memset(&m_image_user, 0, sizeof(ImageUser));
- m_image_user.ok = true;
- m_ibuf = BKE_image_acquire_ibuf(image, &m_image_user, NULL);
- BLI_assert(m_ibuf);
- }
-
- ~SurfaceImageInputProvider()
- {
- BKE_image_release_ibuf(m_image, m_ibuf, NULL);
- }
-
- ParticleFunctionInputArray get(InputProviderInterface &interface) override
- {
- ActionContext *action_context = interface.action_context();
- BLI_assert(action_context != nullptr);
- auto *surface_info = dynamic_cast<MeshSurfaceActionContext *>(action_context);
- BLI_assert(surface_info != nullptr);
-
- const Object *object = surface_info->object();
- Mesh *mesh = (Mesh *)object->data;
-
- const MLoopTri *triangles = BKE_mesh_runtime_looptri_ensure(mesh);
-
- int uv_layer_index = CustomData_get_active_layer(&mesh->ldata, CD_MLOOPUV);
- BLI_assert(uv_layer_index >= 0);
- MLoopUV *uv_layer = (MLoopUV *)CustomData_get(&mesh->ldata, uv_layer_index, CD_MLOOPUV);
- BLI_assert(uv_layer != nullptr);
-
- ArrayRef<float3> local_positions = surface_info->local_positions();
-
- rgba_b *pixel_buffer = (rgba_b *)m_ibuf->rect;
-
- rgba_f *colors_buffer = (rgba_f *)BLI_temporary_allocate(sizeof(rgba_f) *
- local_positions.size());
- MutableArrayRef<rgba_f> colors{colors_buffer, local_positions.size()};
-
- for (uint pindex : interface.pindices()) {
- float3 local_position = local_positions[pindex];
-
- uint triangle_index = surface_info->looptri_indices()[pindex];
- const MLoopTri &triangle = triangles[triangle_index];
-
- uint loop1 = triangle.tri[0];
- uint loop2 = triangle.tri[1];
- uint loop3 = triangle.tri[2];
-
- float3 v1 = mesh->mvert[mesh->mloop[loop1].v].co;
- float3 v2 = mesh->mvert[mesh->mloop[loop2].v].co;
- float3 v3 = mesh->mvert[mesh->mloop[loop3].v].co;
-
- float2 uv1 = uv_layer[loop1].uv;
- float2 uv2 = uv_layer[loop2].uv;
- float2 uv3 = uv_layer[loop3].uv;
-
- float3 vertex_weights;
- interp_weights_tri_v3(vertex_weights, v1, v2, v3, local_position);
-
- float2 uv;
- interp_v2_v2v2v2(uv, uv1, uv2, uv3, vertex_weights);
- uv = uv.clamped_01();
- uint x = uv.x * (m_ibuf->x - 1);
- uint y = uv.y * (m_ibuf->y - 1);
- colors[pindex] = pixel_buffer[y * m_ibuf->x + x];
- }
- return {ArrayRef<rgba_f>(colors), true};
- }
-};
-
static ParticleFunctionInputProvider *create_input_provider(VirtualSocket *vsocket)
{
VirtualNode *vnode = vsocket->vnode();
diff --git a/source/blender/simulations/bparticles/particle_function_input_providers.cpp b/source/blender/simulations/bparticles/particle_function_input_providers.cpp
new file mode 100644
index 00000000000..fb880168363
--- /dev/null
+++ b/source/blender/simulations/bparticles/particle_function_input_providers.cpp
@@ -0,0 +1,126 @@
+#include "DNA_object_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_customdata_types.h"
+#include "BKE_customdata.h"
+#include "BKE_mesh_runtime.h"
+
+#include "particle_function_input_providers.hpp"
+#include "action_contexts.hpp"
+
+namespace BParticles {
+
+ParticleFunctionInputArray AttributeInputProvider::get(InputProviderInterface &interface)
+{
+ AttributesRef attributes = interface.attributes();
+ uint attribute_index = attributes.attribute_index(m_name);
+ uint stride = attributes.attribute_stride(attribute_index);
+ void *buffer = attributes.get_ptr(attribute_index);
+ return {buffer, stride, false};
+}
+
+ParticleFunctionInputArray CollisionNormalInputProvider::get(InputProviderInterface &interface)
+{
+ ActionContext *action_context = interface.action_context();
+ BLI_assert(action_context != nullptr);
+ auto *surface_info = dynamic_cast<MeshSurfaceActionContext *>(action_context);
+ BLI_assert(surface_info != nullptr);
+ return {surface_info->world_normals(), false};
+}
+
+ParticleFunctionInputArray AgeInputProvider::get(InputProviderInterface &interface)
+{
+ auto birth_times = interface.attributes().get<float>("Birth Time");
+ float *ages_buffer = (float *)BLI_temporary_allocate(sizeof(float) * birth_times.size());
+ MutableArrayRef<float> ages(ages_buffer, birth_times.size());
+
+ ParticleTimes × = interface.particle_times();
+ if (times.type() == ParticleTimes::Type::Current) {
+ auto current_times = times.current_times();
+ for (uint pindex : interface.pindices()) {
+ ages[pindex] = current_times[pindex] - birth_times[pindex];
+ }
+ }
+ else if (times.type() == ParticleTimes::Type::DurationAndEnd) {
+ auto remaining_durations = times.remaining_durations();
+ float end_time = times.end_time();
+ for (uint pindex : interface.pindices()) {
+ ages[pindex] = end_time - remaining_durations[pindex] - birth_times[pindex];
+ }
+ }
+ else {
+ BLI_assert(false);
+ }
+ return {ArrayRef<float>(ages), true};
+}
+
+SurfaceImageInputProvider::SurfaceImageInputProvider(Image *image) : m_image(image)
+{
+ memset(&m_image_user, 0, sizeof(ImageUser));
+ m_image_user.ok = true;
+ m_ibuf = BKE_image_acquire_ibuf(image, &m_image_user, NULL);
+ BLI_assert(m_ibuf);
+}
+
+SurfaceImageInputProvider::~SurfaceImageInputProvider()
+{
+ BKE_image_release_ibuf(m_image, m_ibuf, NULL);
+}
+
+ParticleFunctionInputArray SurfaceImageInputProvider::get(InputProviderInterface &interface)
+{
+ ActionContext *action_context = interface.action_context();
+ BLI_assert(action_context != nullptr);
+ auto *surface_info = dynamic_cast<MeshSurfaceActionContext *>(action_context);
+ BLI_assert(surface_info != nullptr);
+
+ const Object *object = surface_info->object();
+ Mesh *mesh = (Mesh *)object->data;
+
+ const MLoopTri *triangles = BKE_mesh_runtime_looptri_ensure(mesh);
+
+ int uv_layer_index = CustomData_get_active_layer(&mesh->ldata, CD_MLOOPUV);
+ BLI_assert(uv_layer_index >= 0);
+ MLoopUV *uv_layer = (MLoopUV *)CustomData_get(&mesh->ldata, uv_layer_index, CD_MLOOPUV);
+ BLI_ass
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list