[Bf-blender-cvs] [89a8b1f4f5a] functions: cleanup events

Jacques Lucke noreply at git.blender.org
Mon Jul 15 18:12:51 CEST 2019


Commit: 89a8b1f4f5a02c482be42b35bb19e7903a978c29
Author: Jacques Lucke
Date:   Mon Jul 15 16:51:23 2019 +0200
Branches: functions
https://developer.blender.org/rB89a8b1f4f5a02c482be42b35bb19e7903a978c29

cleanup events

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

M	source/blender/simulations/bparticles/events.cpp
M	source/blender/simulations/bparticles/events.hpp
M	source/blender/simulations/bparticles/inserters.cpp

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

diff --git a/source/blender/simulations/bparticles/events.cpp b/source/blender/simulations/bparticles/events.cpp
index 9e45b2c56e7..4993ad158e5 100644
--- a/source/blender/simulations/bparticles/events.cpp
+++ b/source/blender/simulations/bparticles/events.cpp
@@ -1,223 +1,132 @@
 #include "events.hpp"
 
-#include "BLI_kdopbvh.h"
+namespace BParticles {
 
-#include "BKE_bvhutils.h"
+void AgeReachedEvent::attributes(AttributesInfoBuilder &builder)
+{
+  builder.use_byte(m_identifier, 0);
+}
 
-#include "DNA_object_types.h"
+void AgeReachedEvent::filter(EventFilterInterface &interface)
+{
+  ParticleSet particles = interface.particles();
+  auto birth_times = particles.attributes().get_float("Birth Time");
+  auto was_activated_before = particles.attributes().get_byte(m_identifier);
 
-namespace BParticles {
+  float end_time = interface.end_time();
 
-class AgeReachedEvent : public Event {
- private:
-  std::string m_identifier;
-  SharedFunction m_compute_age_fn;
-  TupleCallBody *m_compute_age_body;
-  std::unique_ptr<Action> m_action;
-
- public:
-  AgeReachedEvent(StringRef identifier,
-                  SharedFunction &compute_age_fn,
-                  std::unique_ptr<Action> action)
-      : m_identifier(identifier.to_std_string()),
-        m_compute_age_fn(compute_age_fn),
-        m_action(std::move(action))
-  {
-    m_compute_age_body = compute_age_fn->body<TupleCallBody>();
-  }
+  FN_TUPLE_CALL_ALLOC_TUPLES(m_compute_age_body, fn_in, fn_out);
+  FN::ExecutionStack stack;
+  FN::ExecutionContext execution_context(stack);
+  m_compute_age_body->call(fn_in, fn_out, execution_context);
+  float trigger_age = fn_out.get<float>(0);
 
-  void attributes(AttributesInfoBuilder &builder) override
-  {
-    builder.use_byte(m_identifier, 0);
-  }
-
-  void filter(EventFilterInterface &interface) override
-  {
-    ParticleSet particles = interface.particles();
-    auto birth_times = particles.attributes().get_float("Birth Time");
-    auto was_activated_before = particles.attributes().get_byte(m_identifier);
+  for (uint pindex : particles.pindices()) {
+    if (was_activated_before[pindex]) {
+      continue;
+    }
 
-    float end_time = interface.end_time();
+    float birth_time = birth_times[pindex];
+    float age_at_end = end_time - birth_time;
 
-    FN_TUPLE_CALL_ALLOC_TUPLES(m_compute_age_body, fn_in, fn_out);
-    FN::ExecutionStack stack;
-    FN::ExecutionContext execution_context(stack);
-    m_compute_age_body->call(fn_in, fn_out, execution_context);
-    float trigger_age = fn_out.get<float>(0);
+    if (age_at_end >= trigger_age) {
+      TimeSpan time_span = interface.time_span(pindex);
 
-    for (uint pindex : particles.pindices()) {
-      if (was_activated_before[pindex]) {
-        continue;
+      float age_at_start = age_at_end - time_span.duration();
+      if (trigger_age < age_at_start) {
+        interface.trigger_particle(pindex, 0.0f);
       }
-
-      float birth_time = birth_times[pindex];
-      float age_at_end = end_time - birth_time;
-
-      if (age_at_end >= trigger_age) {
-        TimeSpan time_span = interface.time_span(pindex);
-
-        float age_at_start = age_at_end - time_span.duration();
-        if (trigger_age < age_at_start) {
-          interface.trigger_particle(pindex, 0.0f);
-        }
-        else {
-          float time_factor = time_span.get_factor_safe(birth_time + trigger_age);
-          CLAMP(time_factor, 0.0f, 1.0f);
-          interface.trigger_particle(pindex, time_factor);
-        }
+      else {
+        float time_factor = time_span.get_factor_safe(birth_time + trigger_age);
+        CLAMP(time_factor, 0.0f, 1.0f);
+        interface.trigger_particle(pindex, time_factor);
       }
     }
   }
+}
 
-  void execute(EventExecuteInterface &interface) override
-  {
-    ParticleSet particles = interface.particles();
-
-    auto was_activated_before = particles.attributes().get_byte(m_identifier);
-    for (uint pindex : particles.pindices()) {
-      was_activated_before[pindex] = true;
-    }
-
-    ActionInterface::RunFromEvent(m_action, interface);
-  }
-};
-
-class CollisionEventInfo : public EventInfo {
- private:
-  ArrayRef<float3> m_normals;
-
- public:
-  CollisionEventInfo(ArrayRef<float3> normals) : m_normals(normals)
-  {
-  }
+void AgeReachedEvent::execute(EventExecuteInterface &interface)
+{
+  ParticleSet particles = interface.particles();
 
-  void *get_info_array(StringRef UNUSED(name)) override
-  {
-    return (void *)m_normals.begin();
-  }
-};
-
-class MeshCollisionEventFilter : public Event {
- private:
-  std::string m_identifier;
-  Object *m_object;
-  BVHTreeFromMesh m_bvhtree_data;
-  float4x4 m_local_to_world;
-  float4x4 m_world_to_local;
-  std::unique_ptr<Action> m_action;
-
-  struct RayCastResult {
-    bool success;
-    int index;
-    float3 normal;
-    float distance;
-  };
-
-  struct EventStorage {
-    float3 normal;
-  };
-
- public:
-  MeshCollisionEventFilter(StringRef identifier, Object *object, std::unique_ptr<Action> action)
-      : m_identifier(identifier.to_std_string()), m_object(object), m_action(std::move(action))
-  {
-    BLI_assert(object->type == OB_MESH);
-    m_local_to_world = m_object->obmat;
-    m_world_to_local = m_local_to_world.inverted__LocRotScale();
-
-    BKE_bvhtree_from_mesh_get(&m_bvhtree_data, (Mesh *)object->data, BVHTREE_FROM_LOOPTRI, 2);
+  auto was_activated_before = particles.attributes().get_byte(m_identifier);
+  for (uint pindex : particles.pindices()) {
+    was_activated_before[pindex] = true;
   }
 
-  ~MeshCollisionEventFilter()
-  {
-    free_bvhtree_from_mesh(&m_bvhtree_data);
-  }
+  ActionInterface::RunFromEvent(m_action, interface);
+}
 
-  void attributes(AttributesInfoBuilder &builder) override
-  {
-    builder.use_float(m_identifier, 0.0f);
-  }
+void MeshCollisionEvent::attributes(AttributesInfoBuilder &builder)
+{
+  builder.use_float(m_identifier, 0.0f);
+}
 
-  uint storage_size() override
-  {
-    return sizeof(EventStorage);
-  }
+uint MeshCollisionEvent::storage_size()
+{
+  return sizeof(EventStorage);
+}
 
-  void filter(EventFilterInterface &interface) override
-  {
-    ParticleSet &particles = interface.particles();
-    auto positions = particles.attributes().get_float3("Position");
-    auto last_collision_times = particles.attributes().get_float(m_identifier);
-    auto position_offsets = interface.attribute_offsets().get_float3("Position");
-
-    for (uint pindex : particles.pindices()) {
-      float3 ray_start = m_world_to_local.transform_position(positions[pindex]);
-      float3 ray_direction = m_world_to_local.transform_direction(position_offsets[pindex]);
-      float length = ray_direction.normalize_and_get_length();
-
-      auto result = this->ray_cast(ray_start, ray_direction, length);
-      if (result.success) {
-        float time_factor = result.distance / length;
-        float time = interface.time_span(pindex).interpolate(time_factor);
-        if (std::abs(last_collision_times[pindex] - time) < 0.0001f) {
-          continue;
-        }
-        auto &storage = interface.trigger_particle<EventStorage>(pindex, time_factor);
-        if (float3::dot(result.normal, ray_direction) > 0) {
-          result.normal = -result.normal;
-        }
-        storage.normal = m_local_to_world.transform_direction(result.normal).normalized();
+void MeshCollisionEvent::filter(EventFilterInterface &interface)
+{
+  ParticleSet &particles = interface.particles();
+  auto positions = particles.attributes().get_float3("Position");
+  auto last_collision_times = particles.attributes().get_float(m_identifier);
+  auto position_offsets = interface.attribute_offsets().get_float3("Position");
+
+  for (uint pindex : particles.pindices()) {
+    float3 ray_start = m_world_to_local.transform_position(positions[pindex]);
+    float3 ray_direction = m_world_to_local.transform_direction(position_offsets[pindex]);
+    float length = ray_direction.normalize_and_get_length();
+
+    auto result = this->ray_cast(ray_start, ray_direction, length);
+    if (result.success) {
+      float time_factor = result.distance / length;
+      float time = interface.time_span(pindex).interpolate(time_factor);
+      if (std::abs(last_collision_times[pindex] - time) < 0.0001f) {
+        continue;
       }
+      auto &storage = interface.trigger_particle<EventStorage>(pindex, time_factor);
+      if (float3::dot(result.normal, ray_direction) > 0) {
+        result.normal = -result.normal;
+      }
+      storage.normal = m_local_to_world.transform_direction(result.normal).normalized();
     }
   }
+}
 
-  RayCastResult ray_cast(float3 start, float3 normalized_direction, float max_distance)
-  {
-    BVHTreeRayHit hit;
-    hit.dist = max_distance;
-    hit.index = -1;
-    BLI_bvhtree_ray_cast(m_bvhtree_data.tree,
-                         start,
-                         normalized_direction,
-                         0.0f,
-                         &hit,
-                         m_bvhtree_data.raycast_callback,
-                         (void *)&m_bvhtree_data);
-
-    return {hit.index >= 0, hit.index, float3(hit.no), hit.dist};
-  }
-
-  void execute(EventExecuteInterface &interface) override
-  {
-    ParticleSet &particles = interface.particles();
-    SmallVector<float3> normals(particles.block().active_amount());
-    auto last_collision_times = particles.attributes().get_float(m_identifier);
-
-    for (uint pindex : particles.pindices()) {
-      auto storage = interface.get_storage<EventStorage>(pindex);
-      normals[pindex] = storage.normal;
-      last_collision_times[pindex] = interface.current_times()[pindex];
-    }
-
-    CollisionEventInfo event_info(normals);
-    ActionInterface::RunFromEvent(m_action, interface, &event_info);
-  }
-};
-
-std::unique_ptr<Event> EVENT_age_reached(StringRef identifier,
-                                         SharedFunction &compute_age_fn,
-                                         std::unique_ptr<Action> action)
+MeshCollisionEvent::RayCastResult MeshCollisionEvent::ray_cast(float3 start,
+                                                               float3 normalized_direction,
+                                                        

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list