commit 4764785a956f5eb0469f2c98ce5267aa51e4e1a8
parent 7b5566daf81467b540d8d7b4280ce33400338ca7
Author: amin <dev@aminmesbah.com>
Date: Thu, 9 May 2019 05:16:11 +0000
Calculate chunk index mask correctly
Also init rooms in a chunk to a distinctive value.
FossilOrigin-Name: e746b095e377d00f0cbc3be745a50df17a8ff366c238afd1ae72522c5ab55d22
Diffstat:
7 files changed, 53 insertions(+), 6 deletions(-)
diff --git a/Makefile b/Makefile
@@ -12,7 +12,7 @@ LIB_NAME = game.so
DBGDIR = out/debug
DBGEXE = $(DBGDIR)/$(EXE_FILE)
-DBGCFLAGS = -g -O0 -Werror
+DBGCFLAGS = -g -O0
RELDIR = out/release
RELEXE = $(RELDIR)/$(EXE_FILE)
diff --git a/src/am_math.h b/src/am_math.h
@@ -576,6 +576,12 @@ internal inline bool math_v2_ge(v2 v, v2 compare)
return is_ge;
}
+internal inline i32 math_log2(u32 x)
+{
+ i32 result = sizeof(u32) * CHAR_BIT - intr_clz(x) - 1;
+ return result;
+}
+
#define math_is_pow_2(n) ((n) & ((n) - 1)) == 0
internal inline void math_v2_print(v2 v)
diff --git a/src/game.c b/src/game.c
@@ -61,8 +61,34 @@ internal void game_init(struct GameMemory *game_memory, v2u framebuffer)
},
};
- world_room_set(game_state->world, collision_test_zone, &game_state->world_allocator);
- world_room_set(game_state->world, knytt_hanging_fly_village, &game_state->world_allocator);
+ //world_room_set(game_state->world, collision_test_zone, &game_state->world_allocator);
+ //world_room_set(game_state->world, knytt_hanging_fly_village, &game_state->world_allocator);
+
+ i32 s = 0;
+ i32 f = 100;
+ for (i32 x = s; x < f; x++)
+ {
+ for (i32 y = s; y < f; y++)
+ {
+ struct Room r = {
+ .index = {x, y},
+ .tiles = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ },
+ };
+ world_room_set(game_state->world, r, &game_state->world_allocator);
+ }
+ }
// set up and load tiles
{
diff --git a/src/game.h b/src/game.h
@@ -1,4 +1,5 @@
#include <assert.h>
+#include <limits.h>
#include <math.h>
#include <stdalign.h>
#include <stdbool.h>
@@ -9,6 +10,7 @@
#include <glad/glad.h>
#include "types.h"
+#include "intrinsics.h"
#include "am_math.h"
#include "shader.h"
#include "memory.h"
diff --git a/src/intrinsics.h b/src/intrinsics.h
@@ -0,0 +1,7 @@
+// NOTE: __has_builtin is a clang-specific macro
+#ifndef __has_builtin
+#define __has_builtin(x) 0
+#endif
+
+static_assert(__has_builtin(__builtin_clz), "No builtin clz intrinsic");
+#define intr_clz(x) __builtin_clz((x))
diff --git a/src/world.c b/src/world.c
@@ -108,7 +108,10 @@ internal struct WorldChunk* world_chunk_get_or_create(struct World *world, v2i c
struct WorldChunk *prev_head_chunk = world->chunk_ht[hash_table_bucket];
struct WorldChunk *new_chunk = mem_st_alloc_struct(allocator, struct WorldChunk);
new_chunk->index = chunk_i;
- // TODO: Init rooms to 0?
+ for (size_t i = 0; i < CHUNK_NUM_ROOMS; i++)
+ {
+ new_chunk->rooms[i].index.y = ROOM_UNINITIALIZED_Y_VALUE;
+ }
new_chunk->next = prev_head_chunk;
world->chunk_ht[hash_table_bucket] = new_chunk;
result = new_chunk;
@@ -157,6 +160,7 @@ internal struct Room* world_room_set(struct World *world, struct Room room, stru
if (chunk)
{
size_t room_i_in_chunk = world_room_get_index_within_chunk(room.index);
+ assert(chunk->rooms[room_i_in_chunk].index.y == ROOM_UNINITIALIZED_Y_VALUE);
chunk->rooms[room_i_in_chunk] = room;
result = &chunk->rooms[room_i_in_chunk];
}
diff --git a/src/world.h b/src/world.h
@@ -13,13 +13,15 @@ static_assert(
);
// TODO: Tune chunk size
-#define CHUNK_ROOMS_PER_SIDE 4
+#define CHUNK_ROOMS_PER_SIDE 2
static_assert(
math_is_pow_2(CHUNK_ROOMS_PER_SIDE),
"Must be a power of 2 for the chunk mask to work"
);
#define CHUNK_NUM_ROOMS (CHUNK_ROOMS_PER_SIDE * CHUNK_ROOMS_PER_SIDE)
-#define CHUNK_MASK_FOR_INTERNAL_ROOM_INDEX ((1 << CHUNK_ROOMS_PER_SIDE) - 1)
+#define CHUNK_MASK_FOR_INTERNAL_ROOM_INDEX ((1 << math_log2(CHUNK_ROOMS_PER_SIDE)) - 1)
+
+#define ROOM_UNINITIALIZED_Y_VALUE INT32_MIN
struct Room
{