From 0efe4dc74ddf6341de2f9790755c4fa5b6342d5b Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Fri, 18 Jul 2025 00:46:50 -0500 Subject: [PATCH] physics: add particle_force_generator --- src/physics/particle_force_generator.cpp | 31 ++++++++++++++++++++++++ src/physics/particle_force_generator.hpp | 27 +++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/physics/particle_force_generator.cpp b/src/physics/particle_force_generator.cpp index 96b5ee4..97be818 100644 --- a/src/physics/particle_force_generator.cpp +++ b/src/physics/particle_force_generator.cpp @@ -29,4 +29,35 @@ namespace physics { particle->add_force(normalize(force) * drag_coeff); } + + void particle_spring::update_force(particle * particle, float duration) + { + vec3 force = particle->position - other->position; + + float intensity = abs(magnitude(force) - rest_length) * spring_constant; + + particle->add_force(normalize(force) * -intensity); + } + + void particle_anchored_spring::update_force(particle * particle, float duration) + { + vec3 force = particle->position - *anchor; + + float intensity = abs(magnitude(force) - rest_length) * spring_constant; + + particle->add_force(normalize(force) * -intensity); + } + + void particle_bungee::update_force(particle * particle, float duration) + { + vec3 force = particle->position - other->position; + + float _magnitude = magnitude(force); + if (_magnitude <= rest_length) + return; + + float intensity = spring_constant * (rest_length - _magnitude); + + particle->add_force(normalize(force) * -intensity); + } } diff --git a/src/physics/particle_force_generator.hpp b/src/physics/particle_force_generator.hpp index 6f2124d..ee2fe42 100644 --- a/src/physics/particle_force_generator.hpp +++ b/src/physics/particle_force_generator.hpp @@ -44,4 +44,31 @@ namespace physics { void update_force(particle * particle, float duration) override; }; + + struct particle_spring : particle_force_generator + { + physics::particle * other; + float spring_constant; + float rest_length; + + void update_force(particle * particle, float duration) override; + }; + + struct particle_anchored_spring : particle_force_generator + { + vec3 * anchor; + float spring_constant; + float rest_length; +kk + void update_force(particle * particle, float duration) override; + }; + + struct particle_bungee : particle_force_generator + { + physics::particle * other; + float spring_constant; + float rest_length; + + void update_force(particle * particle, float duration) override; + }; }