power_play/src/space.h

137 lines
3.3 KiB
C

#ifndef SPACE_H
#define SPACE_H
struct space_cell_bin;
struct space_entry {
b32 valid;
struct space_entry_handle handle;
struct space_cell_node *first_node;
struct space_cell_node *last_node;
struct aabb aabb;
struct sim_ent_id ent;
struct space_entry *next_free;
};
/* Links a cell to a entry.
* Acts as both a node in the list of entries contained by the cell, and a node in the list of cells containing the entry. */
struct space_cell_node {
struct space_entry *entry;
struct space_cell *cell;
/* For list of all entries contained by cell */
struct space_cell_node *prev_in_cell;
struct space_cell_node *next_in_cell;
/* For list of all cells containing entry */
struct space_cell_node *prev_in_entry;
struct space_cell_node *next_in_entry;
struct space_cell_node *next_free;
};
struct space_cell {
b32 valid;
struct v2i32 pos;
struct space_cell_node *first_node;
struct space_cell_node *last_node;
struct space_cell_bin *bin;
struct space_cell *prev_in_bin;
struct space_cell *next_in_bin;
struct space_cell *next_free;
};
struct space_cell_bin {
struct space_cell *first_cell;
struct space_cell *last_cell;
};
struct space {
b32 valid;
f32 cell_size;
struct arena cell_arena;
struct space_cell_bin *bins;
i32 num_bins;
i32 num_bins_sqrt;
struct space_cell *first_free_cell;
struct space_cell_node *first_free_cell_node;
struct arena entry_arena;
u64 num_entries_reserved;
struct space_entry *entries;
struct space_entry *first_free_entry;
};
struct space_iter {
struct aabb aabb;
struct space *space;
struct v2i32 cell_start;
struct v2i32 cell_end;
struct v2i32 cell_cur;
struct space_cell_node *prev;
};
/* ========================== *
* Nil
* ========================== */
INLINE struct space_entry *space_entry_nil(void)
{
extern READONLY struct space_entry _g_space_entry_nil;
return &_g_space_entry_nil;
}
INLINE struct space_cell *space_cell_nil(void)
{
extern READONLY struct space_cell _g_space_cell_nil;
return &_g_space_cell_nil;
}
INLINE struct space *space_nil(void)
{
extern READONLY struct space _g_space_nil;
return &_g_space_nil;
}
/* ========================== *
* Space
* ========================== */
struct space *space_alloc(f32 cell_size, u32 num_bins_sqrt);
void space_release(struct space *space);
void space_reset(struct space *space);
struct space *space_from_entry(struct space_entry *entry);
/* ========================== *
* Cell
* ========================== */
struct space_cell *space_get_cell(struct space *space, struct v2i32 cell_pos);
/* ========================== *
* Entry
* ========================== */
struct space_entry *space_entry_from_handle(struct space *space, struct space_entry_handle handle);
struct space_entry *space_entry_alloc(struct space *space, struct sim_ent_id entity);
void space_entry_release(struct space_entry *entry);
void space_entry_update_aabb(struct space_entry *entry, struct aabb new_aabb);
/* ========================== *
* Iter
* ========================== */
struct space_iter space_iter_begin_aabb(struct space *space, struct aabb aabb);
struct space_entry *space_iter_next(struct space_iter *iter);
#define space_iter_end(i)
#endif