summaryrefslogtreecommitdiff
path: root/phys.h
diff options
context:
space:
mode:
authorpryazha <pryadeiniv@mail.ru>2025-06-15 16:07:54 +0500
committerpryazha <pryadeiniv@mail.ru>2025-06-15 16:07:54 +0500
commitf30a4eba44c77d5c743fe9308dc697a3225e8dd8 (patch)
treec171da2e8d1127409e2ffe9e56e2e027bac48e28 /phys.h
parent92a8eb610f40c9770569ca63ca1bd705a6d3497d (diff)
i don't even know
Diffstat (limited to 'phys.h')
-rw-r--r--phys.h95
1 files changed, 95 insertions, 0 deletions
diff --git a/phys.h b/phys.h
new file mode 100644
index 0000000..d7b3a76
--- /dev/null
+++ b/phys.h
@@ -0,0 +1,95 @@
+i32 add_entity(entity_t entity, elist_t *list)
+{
+ assert(list);
+ i32 i;
+ for (i = 0; i < MAX_ENTITIES; ++i)
+ if (!list->nodes[i].id)
+ break;
+ if (i == MAX_ENTITIES) {
+ printf("error: failed to add entity\n");
+ return 0;
+ }
+ ++list->count;
+ enode_t *node = list->nodes+i;
+ node->id = list->count;
+ node->entity = entity;
+ dllpushback(list->first, list->last, node);
+ return node->id;
+}
+
+void delete_entity(i32 id, elist_t *list)
+{
+ assert(list);
+ for (enode_t *node = list->first; node; node = node->next) {
+ if (node->id == id) {
+ dllremove(list->first, list->last, node);
+ memzero_struct(node);
+ list->count--;
+ printf("info: entity %d deleted\n", id);
+ return;
+ }
+ }
+ printf("error: entity %d failed to delete\n", id);
+}
+
+entity_t *get_entity(elist_t list, i32 id)
+{
+ for (enode_t *node = list.first; node; node = node->next)
+ if (node->id == id)
+ return &node->entity;
+ return 0;
+}
+
+i32 aabb3d(bbox_t a, bbox_t b)
+{
+ i32 result = ((b.start.x <= a.end.x) && (b.end.x >= a.start.x)) &&
+ ((b.start.y <= a.end.y) && (b.end.y >= a.start.y)) &&
+ ((b.start.z <= a.end.z) && (b.end.z >= a.start.z));
+ return result;
+}
+
+i32 check_collision(entity_t *a, entity_t *b)
+{
+ if (!(a->flags & ENTITY_COLLIDE) || !(b->flags & ENTITY_COLLIDE))
+ return 0;
+
+ bbox_t bboxa = {
+ v3_add(a->bbox.start, a->position),
+ v3_add(a->bbox.end, a->position)
+ };
+
+ bbox_t bboxb = {
+ v3_add(b->bbox.start, b->position),
+ v3_add(b->bbox.end, b->position)
+ };
+
+ i32 result = aabb3d(bboxa, bboxb);
+
+ return result;
+}
+
+entity_t move_entity(entity_t old, v3 acceleration, float dt)
+{
+ entity_t new = old;
+ new.position = v3_add(old.position, v3_scalef(old.velocity, dt));
+ new.velocity = v3_add(old.velocity, v3_scalef(acceleration, dt*dt));
+ new.velocity = v3_sub(new.velocity, v3_scalef(V3_UP, dt));
+ return new;
+}
+
+/*
+void update_entities(elist_t list)
+{
+ for (enode_t *node = list.first; node; node = node->next) {
+ if (node->entity.flags & ENTITY_MOVE)
+ move_entity(node->entity, );
+ if (node->entity.flags & ENTITY_COLLIDE) {
+ for (enode_t *test = list.first; test; test = test->next) {
+ if (check_collision(node->entity, test->entity)) {
+
+ }
+ }
+ }
+ }
+}
+*/