+++ /dev/null
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "system/stacktrace.h"
-#include "system/nth_alloc.h"
-#include "dynarray.h"
-
-#define DYNARRAY_INIT_CAPACITY 64
-
-struct DynArrayMeta
-{
- size_t size;
- size_t count;
- size_t capacity;
-};
-
-struct DynArray
-{
- struct DynArrayMeta meta;
- char data[];
-};
-
-static inline struct DynArray *dynarray_from_data(void *data)
-{
- return (struct DynArray*)((char*) data - sizeof(struct DynArrayMeta));
-}
-
-void *create_dynarray(size_t size)
-{
- struct DynArray *dynarray =
- nth_alloc(sizeof(struct DynArray) + size * DYNARRAY_INIT_CAPACITY);
-
- dynarray->meta.size = size;
- dynarray->meta.count = 0;
- dynarray->meta.capacity = DYNARRAY_INIT_CAPACITY;
-
- return dynarray->data;
-}
-
-void destroy_dynarray(void *data)
-{
- trace_assert(data);
- struct DynArray *dynarray = dynarray_from_data(data);
- free(dynarray);
-}
-
-size_t dynarray_count(void *data)
-{
- trace_assert(data);
- struct DynArray *dynarray = dynarray_from_data(data);
- return dynarray->meta.count;
-}
-
-void *dynarray_push(void *data, void *elem)
-{
- trace_assert(data);
- trace_assert(elem);
-
- struct DynArray *dynarray = dynarray_from_data(data);
-
- if (dynarray->meta.count >= dynarray->meta.capacity) {
- const size_t new_capacity = dynarray->meta.capacity * 2;
- struct DynArray * const new_dynarray =
- nth_realloc(dynarray, sizeof(struct DynArray) + dynarray->meta.size * new_capacity);
-
- if (new_dynarray == NULL) {
- return NULL;
- }
-
- dynarray = new_dynarray;
- dynarray->meta.capacity = new_capacity;
- }
-
- memcpy(
- dynarray->data + dynarray->meta.count * dynarray->meta.size,
- elem,
- dynarray->meta.size);
- dynarray->meta.count++;
-
- return dynarray->data;
-}
#include <stdlib.h>
+#include <stdbool.h>
#include "system/lt.h"
#include "system/nth_alloc.h"
#include "system/stacktrace.h"
#include "game/camera.h"
-#include "algo/dynarray.h"
#include "./rigid_bodies.h"
struct RigidBodies
{
+ Lt *lt;
+ size_t capacity;
+ size_t count;
+
+ bool *removed;
+ RigidBodyId *ids;
+
Vec *positions;
Vec *velocities;
Vec *movements;
Vec *sizes;
Color *colors;
- int *ground_touches;
+ bool *grounded;
Vec *forces;
};
-RigidBodies *create_rigid_bodies(void)
+RigidBodies *create_rigid_bodies(size_t capacity)
{
- RigidBodies *rigid_bodies = nth_calloc(1, sizeof(RigidBodies));
+ Lt *lt = create_lt();
+ if (lt == NULL) {
+ return NULL;
+ }
+
+ RigidBodies *rigid_bodies = PUSH_LT(lt, nth_calloc(1, sizeof(RigidBodies)), free);
if (rigid_bodies == NULL) {
- goto fail;
+ RETURN_LT(lt, NULL);
}
+ rigid_bodies->lt = lt;
- rigid_bodies->positions = create_dynarray(sizeof(Vec));
+ rigid_bodies->capacity = capacity;
+ rigid_bodies->count = 0;
+
+ rigid_bodies->removed = PUSH_LT(lt, nth_calloc(capacity, sizeof(bool)), free);
+ if (rigid_bodies->removed == NULL) {
+ RETURN_LT(lt, NULL);
+ }
+
+ rigid_bodies->ids = PUSH_LT(lt, nth_calloc(capacity, sizeof(RigidBodyId)), free);
+ if (rigid_bodies->ids == NULL) {
+ RETURN_LT(lt, NULL);
+ }
+
+ for (size_t i = 0; i < capacity; ++i) {
+ rigid_bodies->ids[i] = i;
+ }
+
+ rigid_bodies->positions = PUSH_LT(lt, nth_calloc(capacity, sizeof(Vec)), free);
if (rigid_bodies->positions == NULL) {
- goto fail;
+ RETURN_LT(lt, NULL);
}
- rigid_bodies->velocities = create_dynarray(sizeof(Vec));
+ rigid_bodies->velocities = PUSH_LT(lt, nth_calloc(capacity, sizeof(Vec)), free);
if (rigid_bodies->velocities == NULL) {
- goto fail;
+ RETURN_LT(lt, NULL);
}
- rigid_bodies->movements = create_dynarray(sizeof(Vec));
+ rigid_bodies->movements = PUSH_LT(lt, nth_calloc(capacity, sizeof(Vec)), free);
if (rigid_bodies->movements == NULL) {
- goto fail;
+ RETURN_LT(lt, NULL);
}
- rigid_bodies->sizes = create_dynarray(sizeof(Vec));
+ rigid_bodies->sizes = PUSH_LT(lt, nth_calloc(capacity, sizeof(Vec)), free);
if (rigid_bodies->sizes == NULL) {
- goto fail;
+ RETURN_LT(lt, NULL);
}
- rigid_bodies->colors = create_dynarray(sizeof(Color));
+ rigid_bodies->colors = PUSH_LT(lt, nth_calloc(capacity, sizeof(Color)), free);
if (rigid_bodies->colors == NULL) {
- goto fail;
+ RETURN_LT(lt, NULL);
}
- rigid_bodies->ground_touches = create_dynarray(sizeof(int));
- if (rigid_bodies->ground_touches == NULL) {
- goto fail;
+ rigid_bodies->grounded = PUSH_LT(lt, nth_calloc(capacity, sizeof(bool)), free);
+ if (rigid_bodies->grounded == NULL) {
+ RETURN_LT(lt, NULL);
}
- rigid_bodies->forces = create_dynarray(sizeof(Vec));
+ rigid_bodies->forces = PUSH_LT(lt, nth_calloc(capacity, sizeof(Vec)), free);
if (rigid_bodies->forces == NULL) {
- goto fail;
+ RETURN_LT(lt, NULL);
}
return rigid_bodies;
-
-fail:
- destroy_rigid_bodies(rigid_bodies);
- return NULL;
}
void destroy_rigid_bodies(RigidBodies *rigid_bodies)
{
- if (rigid_bodies == NULL) {
- return;
- }
-
- if (rigid_bodies->positions != NULL) {
- destroy_dynarray(rigid_bodies->positions);
- }
-
- if (rigid_bodies->velocities != NULL) {
- destroy_dynarray(rigid_bodies->velocities);
- }
-
- if (rigid_bodies->movements != NULL) {
- destroy_dynarray(rigid_bodies->movements);
- }
-
- if (rigid_bodies->sizes != NULL) {
- destroy_dynarray(rigid_bodies->sizes);
- }
-
- if (rigid_bodies->colors != NULL) {
- destroy_dynarray(rigid_bodies->colors);
- }
-
- if (rigid_bodies->ground_touches != NULL) {
- destroy_dynarray(rigid_bodies->ground_touches);
- }
-
- if (rigid_bodies->forces != NULL) {
- destroy_dynarray(rigid_bodies->forces);
- }
-
- free(rigid_bodies);
+ trace_assert(rigid_bodies);
+ RETURN_LT0(rigid_bodies->lt);
}
int rigid_bodies_update(RigidBodies *rigid_bodies,
trace_assert(rigid_bodies);
trace_assert(camera);
- const size_t n = dynarray_count(rigid_bodies->positions);
- for (size_t i = 0; i < n; ++i) {
+ for (size_t i = 0; i < rigid_bodies->count; ++i) {
if (camera_fill_rect(
camera,
rect_from_vecs(