physics: add particle_link

This commit is contained in:
Zack Buhman 2025-07-19 01:29:12 -05:00
parent f7f109df28
commit a787ef1e09
2 changed files with 85 additions and 0 deletions

View File

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

View File

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