[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 &times = 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 &times = 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