diff --git a/src/physics/particle_link.cpp b/src/physics/particle_link.cpp new file mode 100644 index 0000000..1357d2d --- /dev/null +++ b/src/physics/particle_link.cpp @@ -0,0 +1,52 @@ +#include "particle_link.hpp" + +namespace physics { + + float particle_link::current_length() const + { + vec3 relative_position = particle[0]->position - particle[1]->position; + + return magnitude(relative_position); + } + + int particle_cable::fill_contact(particle_contact * contact, int contact_length) const + { + float cur_length = current_length(); + if (cur_length < max_length) + return 0; + + contact->particle[0] = particle[0]; + contact->particle[1] = particle[1]; + + vec3 normal = normalize(particle[1]->position - particle[0]->position); + contact->contact_normal = normal; + contact->penetration = cur_length - max_length; + contact->restitution = restitution; + + return 1; + } + + int particle_rod::fill_contact(particle_contact * contact, int contact_length) const + { + float cur_length = current_length(); + if (cur_length == length) + return 0; + + contact->particle[0] = particle[0]; + contact->particle[1] = particle[1]; + + vec3 normal = normalize(particle[1]->position - particle[0]->position); + + if (cur_length > length) { + contact->contact_normal = normal; + contact->penetration = cur_length - length; + } { + contact->contact_normal = -normal; + contact->penetration = length - cur_length; + } + + contact->restitution = 0; + + return 1; + } +} diff --git a/src/physics/particle_link.hpp b/src/physics/particle_link.hpp new file mode 100644 index 0000000..d6913e1 --- /dev/null +++ b/src/physics/particle_link.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include "particle.hpp" +#include "particle_contact.hpp" + +namespace physics { + + struct particle_link + { + physics::particle * particle[2]; + + float current_length() const; + + virtual int fill_contact(particle_contact * contact, int contact_length) const = 0; + }; + + struct particle_cable : particle_link + { + float max_length; + float restitution; + + int fill_contact(particle_contact * contact, int contact_length) const override; + }; + + struct particle_rod : particle_link + { + float length; + + float current_length() const; + + int fill_contact(particle_contact * contact, int contact_length) const override; + }; +}