[Bf-blender-cvs] [fcd6a9ddcb3] functions: allow only one collision per time step

Jacques Lucke noreply at git.blender.org
Sun Sep 22 13:55:07 CEST 2019


Commit: fcd6a9ddcb393de69a4ebd581a101c911d4be29f
Author: Jacques Lucke
Date:   Sun Sep 22 13:54:48 2019 +0200
Branches: functions
https://developer.blender.org/rBfcd6a9ddcb393de69a4ebd581a101c911d4be29f

allow only one collision per time step

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

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

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

diff --git a/source/blender/simulations/bparticles/events.cpp b/source/blender/simulations/bparticles/events.cpp
index 82e658c1627..21fda074c98 100644
--- a/source/blender/simulations/bparticles/events.cpp
+++ b/source/blender/simulations/bparticles/events.cpp
@@ -120,7 +120,7 @@ void CustomEvent::execute(EventExecuteInterface &interface)
 
 void MeshCollisionEvent::attributes(AttributesDeclaration &builder)
 {
-  builder.add<float>(m_identifier, 0.0f);
+  builder.add<int32_t>(m_identifier, -1);
 }
 
 uint MeshCollisionEvent::storage_size()
@@ -132,10 +132,16 @@ void MeshCollisionEvent::filter(EventFilterInterface &interface)
 {
   AttributesRef attributes = interface.attributes();
   auto positions = attributes.get<float3>("Position");
-  auto last_collision_times = attributes.get<float>(m_identifier);
+  auto last_collision_step = attributes.get<int32_t>(m_identifier);
   auto position_offsets = interface.attribute_offsets().get<float3>("Position");
 
+  uint current_update_index = interface.simulation_state().time().current_update_index();
+
   for (uint pindex : interface.pindices()) {
+    if (last_collision_step[pindex] == current_update_index) {
+      continue;
+    }
+
     float3 world_ray_start = positions[pindex];
     float3 world_ray_direction = position_offsets[pindex];
     float3 world_ray_end = world_ray_start + world_ray_direction;
@@ -148,10 +154,6 @@ void MeshCollisionEvent::filter(EventFilterInterface &interface)
     auto result = this->ray_cast(local_ray_start, local_ray_direction, local_ray_length);
     if (result.success) {
       float time_factor = result.distance / local_ray_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, local_ray_direction) > 0) {
         result.normal = -result.normal;
@@ -188,14 +190,15 @@ void MeshCollisionEvent::execute(EventExecuteInterface &interface)
   TemporaryArray<float3> local_normals(array_size);
   TemporaryArray<uint> looptri_indices(array_size);
 
-  auto last_collision_times = interface.attributes().get<float>(m_identifier);
+  auto last_collision_step = interface.attributes().get<int32_t>(m_identifier);
+  uint current_update_index = interface.simulation_state().time().current_update_index();
 
   for (uint pindex : interface.pindices()) {
     auto storage = interface.get_storage<EventStorage>(pindex);
     looptri_indices[pindex] = storage.looptri_index;
     local_positions[pindex] = storage.local_position;
     local_normals[pindex] = storage.local_normal;
-    last_collision_times[pindex] = interface.current_times()[pindex];
+    last_collision_step[pindex] = current_update_index;
   }
 
   MeshSurfaceContext surface_context(m_object,



More information about the Bf-blender-cvs mailing list