added rigidbody struct defining an object's physical properties
This commit is contained in:
parent
aa7f76e8a2
commit
a00ad5f022
68
src/rigidbody.c
Normal file
68
src/rigidbody.c
Normal 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
27
src/rigidbody.h
Normal 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
|
Loading…
Reference in a new issue