From 0651825aca44dc09b6aa4995280a65fed859cfc4 Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Tue, 13 Jan 2026 18:46:05 +0100 Subject: Handle collision --- lib/core/c++/particle/particle.hpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/core/c++/particle/particle.hpp b/lib/core/c++/particle/particle.hpp index 557707d..8a4ce5d 100644 --- a/lib/core/c++/particle/particle.hpp +++ b/lib/core/c++/particle/particle.hpp @@ -92,27 +92,37 @@ constexpr auto verlet_step_lambda = [](saw::data>& particle, }; template -constexpr auto handle_collision = [](saw::data>& left, saw::data>& right){ +constexpr auto handle_collision = [](saw::data>& left, saw::data>& right, saw::data> unit_pos_rel, saw::data> vel_rel) +{ auto& rb_l = left.template get<"rigid_body">(); - auto& rb_r = right.template get<"rigid_body">(); - auto& pos_l = rb_l.template get<"position">(); auto& pos_old_l = rb_l.template get<"position_old">(); auto vel_l = pos_l - pos_old_l; auto& mass_l = left.template get<"mass">(); + auto& rb_r = right.template get<"rigid_body">(); + auto& pos_r = rb_r.template get<"position">(); + auto& pos_old_r = rb_r.template get<"position_old">(); + auto vel_r = pos_r - pos_old_r; + auto& mass_r = left.template get<"mass">(); /** * E to 0 */ + constexpr saw::data> elasticity{0u}; + constexpr saw::data> one{1.0}; + + saw::data> j = (e - one) / ((one / mass_l) + (one / mass_r)); + vel_l = vel_l + vel_rel * j; + vel_r = vel_r - vel_rel * j; }; template -constexpr auto broadphase_collision_distance = [](saw::data>& left, saw::data>& right) -> std::pair>>{ +constexpr auto broadphase_collision_distance_squared = [](saw::data>& left, saw::data>& right) -> std::pair>>{ auto rad_l = left.template get<"collision">().template get<"radius">(); auto rad_r = right.template get<"collision">().template get<"radius">(); @@ -136,7 +146,7 @@ constexpr auto broadphase_collision_distance = [](saw::data>& */ template constexpr auto broadphase_collision_check = [](saw::data>& left, saw::data>& right) -> bool{ - return broadphase_collision_distance(left,right).first; + return broadphase_collision_distance_squared(left,right).first; }; } } -- cgit v1.2.3