[Bf-blender-cvs] [e45fb9e735c] functions: use more generic mesh surface action context

Jacques Lucke noreply at git.blender.org
Mon Sep 2 12:32:10 CEST 2019


Commit: e45fb9e735c461690aa6182e9a0c0d14d6e4de9d
Author: Jacques Lucke
Date:   Mon Sep 2 12:11:58 2019 +0200
Branches: functions
https://developer.blender.org/rBe45fb9e735c461690aa6182e9a0c0d14d6e4de9d

use more generic mesh surface action context

===================================================================

M	source/blender/simulations/CMakeLists.txt
A	source/blender/simulations/bparticles/action_contexts.hpp
M	source/blender/simulations/bparticles/events.cpp
M	source/blender/simulations/bparticles/events.hpp
M	source/blender/simulations/bparticles/particle_function_builder.cpp

===================================================================

diff --git a/source/blender/simulations/CMakeLists.txt b/source/blender/simulations/CMakeLists.txt
index fe4dd3e480d..c26d3ad2569 100644
--- a/source/blender/simulations/CMakeLists.txt
+++ b/source/blender/simulations/CMakeLists.txt
@@ -30,6 +30,7 @@ set(SRC
   bparticles/actions.cpp
   bparticles/action_interface.hpp
   bparticles/action_interface.cpp
+  bparticles/action_contexts.hpp
   bparticles/events.hpp
   bparticles/events.cpp
   bparticles/attributes.hpp
diff --git a/source/blender/simulations/bparticles/action_contexts.hpp b/source/blender/simulations/bparticles/action_contexts.hpp
new file mode 100644
index 00000000000..8c9dfbd3bb9
--- /dev/null
+++ b/source/blender/simulations/bparticles/action_contexts.hpp
@@ -0,0 +1,65 @@
+#pragma once
+
+#include "action_interface.hpp"
+
+struct Object;
+
+namespace BParticles {
+
+class MeshSurfaceActionContext : public ActionContext {
+ private:
+  Object *m_object;
+  ArrayRef<float4x4> m_world_transforms;
+  ArrayRef<float3> m_local_positions;
+  ArrayRef<float3> m_local_normals;
+  ArrayRef<float3> m_world_normals;
+  ArrayRef<uint> m_looptri_indices;
+
+ public:
+  MeshSurfaceActionContext(Object *object,
+                           ArrayRef<float4x4> world_transforms,
+                           ArrayRef<float3> local_positions,
+                           ArrayRef<float3> local_normals,
+                           ArrayRef<float3> world_normals,
+                           ArrayRef<uint> looptri_indices)
+      : m_object(object),
+        m_world_transforms(world_transforms),
+        m_local_positions(local_positions),
+        m_local_normals(local_normals),
+        m_world_normals(world_normals),
+        m_looptri_indices(looptri_indices)
+  {
+  }
+
+  const Object *object() const
+  {
+    return m_object;
+  }
+
+  ArrayRef<float4x4> world_transforms() const
+  {
+    return m_world_transforms;
+  }
+
+  ArrayRef<float3> local_positions() const
+  {
+    return m_local_positions;
+  }
+
+  ArrayRef<float3> local_normals() const
+  {
+    return m_local_normals;
+  }
+
+  ArrayRef<float3> world_normals() const
+  {
+    return m_world_normals;
+  }
+
+  ArrayRef<uint> looptri_indices() const
+  {
+    return m_looptri_indices;
+  }
+};
+
+};  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/events.cpp b/source/blender/simulations/bparticles/events.cpp
index 7f82080a81f..a4090600f6a 100644
--- a/source/blender/simulations/bparticles/events.cpp
+++ b/source/blender/simulations/bparticles/events.cpp
@@ -1,5 +1,7 @@
 #include "events.hpp"
 
+#include "action_contexts.hpp"
+
 namespace BParticles {
 
 /* Age Reached Event
@@ -94,7 +96,8 @@ void MeshCollisionEvent::filter(EventFilterInterface &interface)
       if (float3::dot(result.normal, ray_direction) > 0) {
         result.normal = -result.normal;
       }
-      storage.normal = m_local_to_world.transform_direction(result.normal).normalized();
+      storage.local_normal = result.normal;
+      storage.local_position = ray_start + ray_direction * result.distance;
       storage.looptri_index = result.index;
     }
   }
@@ -121,18 +124,31 @@ MeshCollisionEvent::RayCastResult MeshCollisionEvent::ray_cast(float3 start,
 void MeshCollisionEvent::execute(EventExecuteInterface &interface)
 {
   ParticleSet particles = interface.particles();
-  TemporaryArray<float3> normals(interface.array_size());
-  TemporaryArray<uint> looptri_indices(interface.array_size());
+
+  uint array_size = interface.array_size();
+  TemporaryArray<float3> local_positions(array_size);
+  TemporaryArray<float3> local_normals(array_size);
+  TemporaryArray<uint> looptri_indices(array_size);
+  TemporaryArray<float4x4> world_transforms(array_size);
+  TemporaryArray<float3> world_normals(array_size);
+
   auto last_collision_times = particles.attributes().get<float>(m_identifier);
 
   for (uint pindex : particles.pindices()) {
     auto storage = interface.get_storage<EventStorage>(pindex);
     looptri_indices[pindex] = storage.looptri_index;
-    normals[pindex] = storage.normal;
+    local_positions[pindex] = storage.local_position;
+    local_normals[pindex] = storage.local_normal;
+    world_transforms[pindex] = m_local_to_world;
+    world_normals[pindex] =
+        m_local_to_world.transform_direction(storage.local_normal).normalized();
+
     last_collision_times[pindex] = interface.current_times()[pindex];
   }
 
-  CollisionEventInfo action_context(m_object, looptri_indices, normals);
+  MeshSurfaceActionContext action_context(
+      m_object, world_transforms, local_positions, local_normals, world_normals, looptri_indices);
+
   m_action->execute_from_event(interface, &action_context);
 }
 
diff --git a/source/blender/simulations/bparticles/events.hpp b/source/blender/simulations/bparticles/events.hpp
index 137db54ee45..4d708a67c2b 100644
--- a/source/blender/simulations/bparticles/events.hpp
+++ b/source/blender/simulations/bparticles/events.hpp
@@ -37,34 +37,6 @@ class AgeReachedEvent : public Event {
   void execute(EventExecuteInterface &interface) override;
 };
 
-class CollisionEventInfo : public ActionContext {
- private:
-  Object *m_object;
-  ArrayRef<uint> m_loop_tri_indices;
-  ArrayRef<float3> m_normals;
-
- public:
-  CollisionEventInfo(Object *object, ArrayRef<uint> loop_tri_indices, ArrayRef<float3> normals)
-      : m_object(object), m_loop_tri_indices(loop_tri_indices), m_normals(normals)
-  {
-  }
-
-  Object *object()
-  {
-    return m_object;
-  }
-
-  ArrayRef<uint> loop_tri_indices()
-  {
-    return m_loop_tri_indices;
-  }
-
-  ArrayRef<float3> normals()
-  {
-    return m_normals;
-  }
-};
-
 class MeshCollisionEvent : public Event {
  private:
   std::string m_identifier;
@@ -83,7 +55,8 @@ class MeshCollisionEvent : public Event {
 
   struct EventStorage {
     uint looptri_index;
-    float3 normal;
+    float3 local_normal;
+    float3 local_position;
   };
 
  public:
diff --git a/source/blender/simulations/bparticles/particle_function_builder.cpp b/source/blender/simulations/bparticles/particle_function_builder.cpp
index a4fbff71832..b248c2bebbe 100644
--- a/source/blender/simulations/bparticles/particle_function_builder.cpp
+++ b/source/blender/simulations/bparticles/particle_function_builder.cpp
@@ -10,6 +10,7 @@
 #include "particle_function_builder.hpp"
 
 #include "events.hpp"
+#include "action_contexts.hpp"
 
 namespace BParticles {
 
@@ -78,9 +79,9 @@ class CollisionNormalInputProvider : public ParticleFunctionInputProvider {
   {
     ActionContext *action_context = interface.action_context();
     BLI_assert(action_context != nullptr);
-    CollisionEventInfo *collision_info = dynamic_cast<CollisionEventInfo *>(action_context);
-    BLI_assert(collision_info != nullptr);
-    return {collision_info->normals(), false};
+    auto *surface_info = dynamic_cast<MeshSurfaceActionContext *>(action_context);
+    BLI_assert(surface_info != nullptr);
+    return {surface_info->world_normals(), false};
   }
 };
 
@@ -136,11 +137,10 @@ class SurfaceImageInputProvider : public ParticleFunctionInputProvider {
   {
     ActionContext *action_context = interface.action_context();
     BLI_assert(action_context != nullptr);
-    CollisionEventInfo *collision_info = dynamic_cast<CollisionEventInfo *>(action_context);
-    BLI_assert(collision_info != nullptr);
+    auto *surface_info = dynamic_cast<MeshSurfaceActionContext *>(action_context);
+    BLI_assert(surface_info != nullptr);
 
-    Object *object = collision_info->object();
-    float4x4 ob_inverse = (float4x4)object->imat;
+    const Object *object = surface_info->object();
     Mesh *mesh = (Mesh *)object->data;
 
     const MLoopTri *triangles = BKE_mesh_runtime_looptri_ensure(mesh);
@@ -150,18 +150,18 @@ class SurfaceImageInputProvider : public ParticleFunctionInputProvider {
     MLoopUV *uv_layer = (MLoopUV *)CustomData_get(&mesh->ldata, uv_layer_index, CD_MLOOPUV);
     BLI_assert(uv_layer != nullptr);
 
-    ArrayRef<float3> positions = interface.particles().attributes().get<float3>("Position");
+    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) * positions.size());
-    MutableArrayRef<rgba_f> colors{colors_buffer, positions.size()};
+    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.particles().pindices()) {
-      float3 position_world = positions[pindex];
-      float3 position_local = ob_inverse.transform_position(position_world);
+      float3 local_position = local_positions[pindex];
 
-      uint triangle_index = collision_info->loop_tri_indices()[pindex];
+      uint triangle_index = surface_info->looptri_indices()[pindex];
       const MLoopTri &triangle = triangles[triangle_index];
 
       uint loop1 = triangle.tri[0];
@@ -177,7 +177,7 @@ class SurfaceImageInputProvider : public ParticleFunctionInputProvider {
       float2 uv3 = uv_layer[loop3].uv;
 
       float3 vertex_weights;
-      interp_weights_tri_v3(vertex_weights, v1, v2, v3, position_local);
+      interp_weights_tri_v3(vertex_weights, v1, v2, v3, local_position);
 
       float2 uv;
       interp_v2_v2v2v2(uv, uv1, uv2, uv3, vertex_weights);



More information about the Bf-blender-cvs mailing list