[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