skip space cells at 0
This commit is contained in:
parent
70e2d4a935
commit
dbd16ccd67
20
src/space.c
20
src/space.c
@ -15,6 +15,9 @@ READONLY struct space _g_space_nil = { .valid = false };
|
|||||||
* Space alloc
|
* Space alloc
|
||||||
* ========================== */
|
* ========================== */
|
||||||
|
|
||||||
|
/* NOTE:
|
||||||
|
* The number of buckets determines how often tiles will collide in the spatial hash.
|
||||||
|
* For example, at `num_buckets_sqrt` = 256 (65536 buckets), tiles <1, 1>, <1, 257>, and <257, 257> will collide. */
|
||||||
struct space *space_alloc(f32 cell_size, u32 num_buckets_sqrt)
|
struct space *space_alloc(f32 cell_size, u32 num_buckets_sqrt)
|
||||||
{
|
{
|
||||||
struct arena arena = arena_alloc(GIGABYTE(64));
|
struct arena arena = arena_alloc(GIGABYTE(64));
|
||||||
@ -68,6 +71,9 @@ INTERNAL i32 cell_coords_to_bucket_index(struct space *space, struct v2i32 cell_
|
|||||||
{
|
{
|
||||||
i32 num_buckets_sqrt = space->num_buckets_sqrt;
|
i32 num_buckets_sqrt = space->num_buckets_sqrt;
|
||||||
|
|
||||||
|
/* Cell pos of 0 is not valid and will be converted to -1 */
|
||||||
|
ASSERT(cell_pos.x != 0 && cell_pos.y != 0);
|
||||||
|
|
||||||
i32 index_x = cell_pos.x;
|
i32 index_x = cell_pos.x;
|
||||||
i32 index_y = cell_pos.y;
|
i32 index_y = cell_pos.y;
|
||||||
/* Offset cell index by -1 since cell pos of 0 is invalid */
|
/* Offset cell index by -1 since cell pos of 0 is invalid */
|
||||||
@ -291,13 +297,17 @@ void space_client_release(struct space_client *client)
|
|||||||
|
|
||||||
void space_client_update_aabb(struct space_client *client, struct aabb new_aabb)
|
void space_client_update_aabb(struct space_client *client, struct aabb new_aabb)
|
||||||
{
|
{
|
||||||
|
|
||||||
struct space *space = space_from_client(client);
|
struct space *space = space_from_client(client);
|
||||||
f32 cell_size = space->cell_size;
|
f32 cell_size = space->cell_size;
|
||||||
|
|
||||||
|
struct v2i32 old_cell_p0 = V2I32(0, 0);
|
||||||
|
struct v2i32 old_cell_p1 = V2I32(0, 0);
|
||||||
|
if (client->first_node) {
|
||||||
struct aabb old_aabb = client->aabb;
|
struct aabb old_aabb = client->aabb;
|
||||||
struct v2i32 old_cell_p0 = world_to_cell_coords(cell_size, old_aabb.p0);
|
old_cell_p0 = world_to_cell_coords(cell_size, old_aabb.p0);
|
||||||
struct v2i32 old_cell_p1 = world_to_cell_coords(cell_size, old_aabb.p1);
|
old_cell_p1 = world_to_cell_coords(cell_size, old_aabb.p1);
|
||||||
|
}
|
||||||
|
|
||||||
struct v2i32 new_cell_p0 = world_to_cell_coords(cell_size, new_aabb.p0);
|
struct v2i32 new_cell_p0 = world_to_cell_coords(cell_size, new_aabb.p0);
|
||||||
struct v2i32 new_cell_p1 = world_to_cell_coords(cell_size, new_aabb.p1);
|
struct v2i32 new_cell_p1 = world_to_cell_coords(cell_size, new_aabb.p1);
|
||||||
|
|
||||||
@ -319,7 +329,7 @@ void space_client_update_aabb(struct space_client *client, struct aabb new_aabb)
|
|||||||
/* Insert new nodes */
|
/* Insert new nodes */
|
||||||
for (i32 y = new_cell_p0.y; y <= new_cell_p1.y; ++y) {
|
for (i32 y = new_cell_p0.y; y <= new_cell_p1.y; ++y) {
|
||||||
for (i32 x = new_cell_p0.x; x <= new_cell_p1.x; ++x) {
|
for (i32 x = new_cell_p0.x; x <= new_cell_p1.x; ++x) {
|
||||||
if (x < old_cell_p0.x || x > old_cell_p1.x || y < old_cell_p0.y || y > old_cell_p1.y) {
|
if (x != 0 && y != 0 && (x < old_cell_p0.x || x > old_cell_p1.x || y < old_cell_p0.y || y > old_cell_p1.y)) {
|
||||||
/* Cell is outside of old AABB */
|
/* Cell is outside of old AABB */
|
||||||
space_cell_node_alloc(V2I32(x, y), client);
|
space_cell_node_alloc(V2I32(x, y), client);
|
||||||
}
|
}
|
||||||
@ -396,6 +406,8 @@ struct space_client *space_iter_next(struct space_iter *iter)
|
|||||||
if (nextx || nexty) {
|
if (nextx || nexty) {
|
||||||
cell_cur.x += nextx - (span * nexty);
|
cell_cur.x += nextx - (span * nexty);
|
||||||
cell_cur.y += nexty;
|
cell_cur.y += nexty;
|
||||||
|
cell_cur.x += (cell_cur.x == 0);
|
||||||
|
cell_cur.y += (cell_cur.y == 0);
|
||||||
iter->cell_cur = cell_cur;
|
iter->cell_cur = cell_cur;
|
||||||
struct space_cell *cell = space_get_cell(space, cell_cur);
|
struct space_cell *cell = space_get_cell(space, cell_cur);
|
||||||
next_node = cell->first_node;
|
next_node = cell->first_node;
|
||||||
|
|||||||
@ -374,7 +374,7 @@ INTERNAL void queue_game_cmd(struct arena *arena, struct game_cmd_list *list, st
|
|||||||
{
|
{
|
||||||
struct game_cmd_node *node = arena_push_zero(arena, struct game_cmd_node);
|
struct game_cmd_node *node = arena_push_zero(arena, struct game_cmd_node);
|
||||||
node->cmd = cmd;
|
node->cmd = cmd;
|
||||||
if (list->first) {
|
if (list->last) {
|
||||||
list->last->next = node;
|
list->last->next = node;
|
||||||
} else {
|
} else {
|
||||||
list->first = node;
|
list->first = node;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user