added rigidbody struct defining an object's physical properties

This commit is contained in:
Sara 2023-10-06 23:45:12 +02:00
parent aa7f76e8a2
commit a00ad5f022
2 changed files with 95 additions and 0 deletions

68
src/rigidbody.c Normal file
View file

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

27
src/rigidbody.h Normal file
View file

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