From a00ad5f0223df4225b1ce97b6979d5dc5a92e419 Mon Sep 17 00:00:00 2001
From: Sara <sara@saragerretsen.nl>
Date: Fri, 6 Oct 2023 23:45:12 +0200
Subject: [PATCH] added rigidbody struct defining an object's physical
 properties

---
 src/rigidbody.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/rigidbody.h | 27 ++++++++++++++++++++
 2 files changed, 95 insertions(+)
 create mode 100644 src/rigidbody.c
 create mode 100644 src/rigidbody.h

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