diff --git a/src/rigidbody.c b/src/rigidbody.c new file mode 100644 index 0000000..e7aaf6e --- /dev/null +++ b/src/rigidbody.c @@ -0,0 +1,68 @@ +#include "rigidbody.h" +#include "program.h" + +struct RigidBody { + Transformable transformable; + + float mass; + + Vector linear_velocity; + Vector linear_force; + + int is_static; +}; + +RigidBody* rigidbody_make(Transformable transform) { + RigidBody* self = malloc(sizeof(RigidBody)); + *self = (RigidBody){ + .transformable = transform, + .mass = 0.0f, + .linear_velocity = ZeroVector, + .linear_force = ZeroVector, + .is_static = 0 + }; + return self; +} + +void rigidbody_destroy(RigidBody* self) { + free(self); +} + +void rigidbody_apply_physics(RigidBody* self) { + Vector velocity = vmulff(self->linear_velocity, delta_time()); + Vector* position = (self->transformable.tc->get_position(self->transformable.self)); + *position = vaddf(*position, velocity); +} + +float rigidbody_get_mass(const RigidBody* self) { + return self->mass; +} + +void rigidbody_set_mass(RigidBody* self, float mass) { + self->mass = mass; +} + +void rigidbody_add_impulse(RigidBody* self, Vector force) { + self->linear_force = vaddf(self->linear_force, force); +} + +void rigidbody_accelerate(RigidBody* self, Vector force) { + force = vmulff(force, delta_time()); + self->linear_force = vaddf(self->linear_force, force); +} + +int rigidbody_is_static(const RigidBody* self) { + return self->is_static; +} + +void rigidbody_set_static(RigidBody* self, int is_static) { + self->is_static = is_static; +} + +Vector rigidbody_get_velocity(const RigidBody* self) { + return self->linear_velocity; +} + +void rigidbody_set_velocity(RigidBody* self, Vector velocity) { + self->linear_velocity = velocity; +} diff --git a/src/rigidbody.h b/src/rigidbody.h new file mode 100644 index 0000000..749d55e --- /dev/null +++ b/src/rigidbody.h @@ -0,0 +1,27 @@ +#ifndef _fencer_rigidbody_h +#define _fencer_rigidbody_h + +#include "shape.h" +#include "transformable.h" + +typedef struct RigidBody RigidBody; + +// Referenced transform is stored but not owned by the rigidbody. +RigidBody* rigidbody_make(Transformable transform); +void rigidbody_destroy(RigidBody* self); + +void rigidbody_apply_physics(RigidBody* self); + +float rigidbody_get_mass(const RigidBody* self); +void rigidbody_set_mass(RigidBody* self, float mass); + +void rigidbody_add_impulse(RigidBody* self, Vector force); +void rigidbody_accelerate(RigidBody* self, Vector force); + +int rigidbody_is_static(const RigidBody* self); +void rigidbody_set_static(RigidBody* self, int is_static); + +Vector rigidbody_get_velocity(const RigidBody* self); +void rigidbody_set_velocity(RigidBody* self, Vector velocity); + +#endif // !_fencer_rigidbody_h