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; + }; }