From e2c44a3ac39b229dfef93833828be697cf104bba Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Sun, 24 Dec 2023 22:54:52 +0100 Subject: only draw what is on screen --- build/data/maps/map1.dat | Bin 47208 -> 8034408 bytes build/zombies.exe | Bin 2100107 -> 2100630 bytes data/maps/map1.dat | Bin 47208 -> 8034408 bytes include/map.h | 6 +++--- include/objects.h | 2 +- src/map.c | 41 +++++++++++++++++++++++++++++++++++------ src/objects.c | 9 ++++----- 7 files changed, 43 insertions(+), 15 deletions(-) diff --git a/build/data/maps/map1.dat b/build/data/maps/map1.dat index d75d90b..654bb33 100644 Binary files a/build/data/maps/map1.dat and b/build/data/maps/map1.dat differ diff --git a/build/zombies.exe b/build/zombies.exe index f93e24b..f46e6a4 100644 Binary files a/build/zombies.exe and b/build/zombies.exe differ diff --git a/data/maps/map1.dat b/data/maps/map1.dat index d75d90b..654bb33 100644 Binary files a/data/maps/map1.dat and b/data/maps/map1.dat differ diff --git a/include/map.h b/include/map.h index ea5d619..ed8cbed 100644 --- a/include/map.h +++ b/include/map.h @@ -31,8 +31,8 @@ typedef struct t_tile { vec2f br; } tile; -#define MAP_SIZE_X 40 -#define MAP_SIZE_Y 40 +#define MAP_SIZE_X 1000 +#define MAP_SIZE_Y 1000 #define MAX_LIGHT_EMITTERS 100 typedef struct t_map_info { @@ -61,7 +61,7 @@ typedef struct t_light_data { typedef struct t_extracted_map_data { int width; int height; - tile heightmap[MAP_SIZE_Y][MAP_SIZE_X]; + tile heightmap[MAP_SIZE_Y][MAP_SIZE_X]; // tilemap object objects[MAX_OBJECTS]; light_data lightmap[MAP_SIZE_Y][MAP_SIZE_X]; light_emitter light_emitters[MAX_LIGHT_EMITTERS]; diff --git a/include/objects.h b/include/objects.h index d30a8f0..cc66ff0 100644 --- a/include/objects.h +++ b/include/objects.h @@ -46,7 +46,7 @@ typedef struct t_box { object get_object_at_tile(float x, float y); void create_objects(); -void draw_objects_at_row(platform_window* window, int row); +void draw_objects(platform_window* window); box get_box_of_object(platform_window* window, object o); void render_quad_with_outline(vec2f tl, vec2f tr, vec2f bl, vec2f br, color c); void render_box_with_outline(box box, color c); diff --git a/src/map.c b/src/map.c index e27026e..fd4092c 100644 --- a/src/map.c +++ b/src/map.c @@ -154,6 +154,10 @@ void load_mapdata_into_world() { float dist_bl = distance_between_3f(emitter.position, (vec3f){x, y, loaded_map.heightmap[y][x].bottomleft}); float dist_br = distance_between_3f(emitter.position, (vec3f){x, y, loaded_map.heightmap[y][x].bottomright}); + if (dist_tl > emitter.range) { + continue; + } + float p_tl = 1.0f - dist_tl / emitter.range; float p_tr = 1.0f - dist_tr / emitter.range; float p_bl = 1.0f - dist_bl / emitter.range; @@ -277,16 +281,27 @@ float get_height_of_tile_under_coords(float tocheckx, float tochecky) { return playerline; } +static int round_up(int numToRound, int multiple) +{ + if (multiple == 0) + return numToRound; + + int remainder = numToRound % multiple; + if (remainder == 0) + return numToRound; + + return numToRound + multiple - remainder; +} + inline int get_tile_width(platform_window* window) { int tile_width = window->height / 30; if (window->width > window->height) tile_width = window->width / 30; - return tile_width; + return round_up(tile_width, 8); } inline int get_tile_height(platform_window* window) { int tile_width = get_tile_width(window); - int tile_height = tile_width * 1; - return tile_height; + return tile_width; } bool is_in_bounds(float x, float y) { @@ -328,9 +343,23 @@ void draw_grid(platform_window* window) { map_info info = get_map_info(window); + int tilemap_render_min_y = (_global_camera.y / info.tile_height); + int tilemap_render_max_y = tilemap_render_min_y + (window->height/ info.tile_height) + 1; + + int tilemap_render_min_x = (_global_camera.x / info.tile_width); + int tilemap_render_max_x = tilemap_render_min_x + (window->width/ info.tile_width) + 1; + for (int y = 0; y < MAP_SIZE_Y; y++) { - for (int x = MAP_SIZE_X-1; x >= 0; x--) { + + if (y < tilemap_render_min_y) continue; + if (y > tilemap_render_max_y) continue; + + for (int x = 0; x < MAP_SIZE_X; x++) { MAP_RENDER_DEPTH; + + if (x < tilemap_render_min_x) continue; + if (x > tilemap_render_max_x) continue; + tile tile = loaded_map.heightmap[y][x]; float xdiff_between_bottom_and_top = info.px_incline; @@ -397,9 +426,9 @@ void draw_grid(platform_window* window) { loaded_map.heightmap[y][x].bl = bottomleft; loaded_map.heightmap[y][x].br = bottomright; } - - draw_objects_at_row(window, y); } + + draw_objects(window); } inline map_info get_map_info(platform_window* window) { diff --git a/src/objects.c b/src/objects.c index 46714a4..6715e0d 100644 --- a/src/objects.c +++ b/src/objects.c @@ -52,15 +52,14 @@ image* get_image_from_objecttype(object_type tile) { } } -void draw_objects_at_row(platform_window* window, int row) { +void draw_objects(platform_window* window) { map_info info = get_map_info(window); - for (int i = MAP_SIZE_X-1; i >= 0; i--) { - object o = get_object_at_tile(i, row); - + for (int i = 0; i < MAX_OBJECTS; i++) { + if (!loaded_map.objects[i].active) continue; + object o = loaded_map.objects[i]; OBJECT_RENDER_DEPTH((int)o.position.y); - if (!o.active) continue; box box = get_box_of_object(window, o); image* img = get_image_from_objecttype(o.type); -- cgit v1.2.3-70-g09d2