From 1d866268401a2341779aeed7b1ed97433550344d Mon Sep 17 00:00:00 2001 From: Shariq Shah Date: Sat, 20 Apr 2019 12:58:10 +1000 Subject: [PATCH] Changed how config files or cvars are used in the code --- src/game/editor.c | 12 ++- src/game/editor.h | 3 +- src/game/game.c | 3 +- src/game/game.h | 6 +- src/game/player.c | 4 +- src/game/renderer.c | 47 ++---------- src/game/scene.c | 3 +- src/system/config_vars.c | 154 ++++++++++++++++++--------------------- src/system/config_vars.h | 10 +-- src/system/main.c | 16 ++-- todo.txt | 3 +- 11 files changed, 112 insertions(+), 149 deletions(-) diff --git a/src/game/editor.c b/src/game/editor.c index 2ad2825..02c5c1b 100755 --- a/src/game/editor.c +++ b/src/game/editor.c @@ -86,14 +86,14 @@ void editor_init(struct Editor* editor) editor->camera_move_speed = 20.f; editor->camera_sprint_multiplier = 2.f; vec4_fill(&editor->selected_entity_colour, 0.f, 1.f, 0.f, 1.f); - debug_vars_list = array_new(struct Debug_Variable); - empty_indices = array_new(int); + debug_vars_list = array_new(struct Debug_Variable); + empty_indices = array_new(int); event_manager_subscribe(game_state_get()->event_manager, EVT_MOUSEBUTTON_PRESSED, &editor_on_mousebutton); event_manager_subscribe(game_state_get()->event_manager, EVT_MOUSEBUTTON_RELEASED, &editor_on_mousebutton); } -void editor_init_camera(struct Editor* editor) +void editor_init_camera(struct Editor* editor, struct Hashmap* cvars) { struct Camera* editor_camera = &game_state_get()->scene->cameras[CAM_EDITOR]; entity_rename(editor_camera, "Editor_Camera"); @@ -103,9 +103,8 @@ void editor_init_camera(struct Editor* editor) editor_camera->clear_color.z = 0.9f; editor_camera->clear_color.w = 1.f; - struct Hashmap* config = config_vars_get(); - int render_width = hashmap_int_get(config, "render_width"); - int render_height = hashmap_int_get(config, "render_height"); + int render_width = hashmap_int_get(cvars, "render_width"); + int render_height = hashmap_int_get(cvars, "render_height"); camera_attach_fbo(editor_camera, render_width, render_height, true, true, true); vec3 cam_pos = {5.f, 20.f, 50.f}; @@ -217,7 +216,6 @@ void editor_update(struct Editor* editor, float dt) window_get_drawable_size(game_state->window, &win_width, &win_height); int half_width = win_width / 2, half_height = win_height / 2; - /* Top Panel */ if(nk_begin(context, "Top Panel", nk_recti(0, 0, win_width, editor->top_panel_height), NK_WINDOW_NO_SCROLLBAR)) { diff --git a/src/game/editor.h b/src/game/editor.h index 7ed77fa..201fccd 100755 --- a/src/game/editor.h +++ b/src/game/editor.h @@ -6,6 +6,7 @@ struct Camera; struct Entity; +struct Hashmap; struct Editor { @@ -23,7 +24,7 @@ struct Editor }; void editor_init(struct Editor* editor_state); -void editor_init_camera(struct Editor* editor_state); +void editor_init_camera(struct Editor* editor_state, struct Hashmap* cvars); void editor_render(struct Editor* editor_state, struct Camera* active_camera); void editor_update(struct Editor* editor_state, float dt); void editor_cleanup(struct Editor* editor_state); diff --git a/src/game/game.c b/src/game/game.c index 454248a..a7d42b7 100755 --- a/src/game/game.c +++ b/src/game/game.c @@ -57,7 +57,7 @@ static void on_collision_test(struct Entity* this_ent, struct Entity* other_ent, static struct Game_State* game_state = NULL; -bool game_init(struct Window* window) +bool game_init(struct Window* window, struct Hashmap* cvars) { game_state = malloc(sizeof(*game_state)); if(!game_state) @@ -68,6 +68,7 @@ bool game_init(struct Window* window) else { game_state->window = window; + game_state->cvars = cvars; game_state->is_initialized = false; game_state->game_mode = GAME_MODE_GAME; game_state->renderer = calloc(1, sizeof(*game_state->renderer)); diff --git a/src/game/game.h b/src/game/game.h index d2622a7..f7c6477 100755 --- a/src/game/game.h +++ b/src/game/game.h @@ -12,6 +12,7 @@ struct Console; struct Gui; struct Event_Manager; struct Editor; +struct Hashmap; enum Game_Mode { @@ -27,14 +28,15 @@ struct Game_State struct Renderer* renderer; struct Scene* scene; struct Console* console; - struct Gui* gui; + struct Gui* gui; struct Event_Manager* event_manager; struct Editor* editor; + struct Hashmap* cvars; }; struct Game_State* game_state_get(void); -bool game_init(struct Window* window); +bool game_init(struct Window* window, struct Hashmap* cvars); bool game_run(void); void game_cleanup(void); diff --git a/src/game/player.c b/src/game/player.c index 518dc49..31d5cec 100755 --- a/src/game/player.c +++ b/src/game/player.c @@ -9,7 +9,7 @@ #include "../common/log.h" #include "entity.h" #include "../system/config_vars.h" - +#include "game.h" void player_init(struct Player* player, struct Scene* scene) { @@ -18,7 +18,7 @@ void player_init(struct Player* player, struct Scene* scene) player->base.id = 1; player->base.type = ET_PLAYER; - struct Hashmap* config = config_vars_get(); + struct Hashmap* config = game_state_get()->cvars; player->move_speed = hashmap_int_get(config, "player_move_speed"); player->move_speed_multiplier = hashmap_int_get(config, "player_move_speed_multiplier"); player->turn_speed = hashmap_int_get(config, "player_turn_speed"); diff --git a/src/game/renderer.c b/src/game/renderer.c index fd6e759..3a19419 100755 --- a/src/game/renderer.c +++ b/src/game/renderer.c @@ -41,9 +41,11 @@ void renderer_init(struct Renderer* renderer) glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); - event_manager_subscribe(game_state_get()->event_manager, EVT_WINDOW_RESIZED, &renderer_on_framebuffer_size_changed); - struct Hashmap* cvars = config_vars_get(); + struct Game_State* game_state = game_state_get(); + event_manager_subscribe(game_state->event_manager, EVT_WINDOW_RESIZED, &renderer_on_framebuffer_size_changed); + + struct Hashmap* cvars = game_state->cvars; renderer->settings.fog.mode = hashmap_int_get(cvars, "fog_mode"); renderer->settings.fog.density = hashmap_float_get(cvars, "fog_density"); renderer->settings.fog.start_dist = hashmap_float_get(cvars, "fog_start_dist"); @@ -86,7 +88,6 @@ void renderer_init(struct Renderer* renderer) array_free(indices); int width = -1, height = -1; - struct Game_State* game_state = game_state_get(); window_get_size(game_state->window, &width, &height); renderer->def_albedo_tex = texture_create("def_albedo_texture", TU_DIFFUSE, @@ -340,15 +341,13 @@ void renderer_draw(struct Renderer* renderer, struct Scene* scene) shader_unbind(); /* Debug Render */ - struct Hashmap* cvars = config_vars_get(); - if(hashmap_bool_get(cvars, "debug_draw_enabled")) + if(renderer->settings.debug_draw_enabled) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - vec4 debug_draw_color = hashmap_vec4_get(cvars, "debug_draw_color"); shader_bind(renderer->debug_shader); { static mat4 mvp; - shader_set_uniform_vec4(renderer->debug_shader, "debug_color", &debug_draw_color); + shader_set_uniform_vec4(renderer->debug_shader, "debug_color", &renderer->settings.debug_draw_color); for(int i = 0; i < MAX_STATIC_MESHES; i++) { struct Static_Mesh* mesh = &scene->static_meshes[i]; @@ -359,7 +358,7 @@ void renderer_draw(struct Renderer* renderer, struct Scene* scene) mat4_identity(&mvp); mat4_mul(&mvp, &active_camera->view_proj_mat, &transform->trans_mat); shader_set_uniform_mat4(renderer->debug_shader, "mvp", &mvp); - geom_render(geometry, hashmap_int_get(cvars, "debug_draw_mode")); + geom_render(geometry, renderer->settings.debug_draw_mode); } } shader_unbind(); @@ -367,7 +366,7 @@ void renderer_draw(struct Renderer* renderer, struct Scene* scene) } // Debug Physics render - if(hashmap_bool_get(cvars, "debug_draw_physics")) + if(renderer->settings.debug_draw_physics) { static vec4 physics_draw_color = { 0.f, 0.f, 1.f, 1.f }; for(int i = 0; i < MAX_STATIC_MESHES; i++) @@ -517,33 +516,3 @@ void renderer_debug_draw_enabled(struct Renderer* renderer, bool enabled) { renderer->settings.debug_draw_mode = enabled; } - -/* void renderer_settings_get(struct Render_Settings* settings) */ -/* { */ -/* struct Hashmap* cvars = platform->config.get(); */ -/* settings->fog.mode = hashmap_int_get(cvars, "fog_mode"); */ -/* settings->fog.density = hashmap_float_get(cvars, "fog_density"); */ -/* settings->fog.start_dist = hashmap_float_get(cvars, "fog_start_dist"); */ -/* settings->fog.max_dist = hashmap_float_get(cvars, "fog_max_dist"); */ -/* settings->fog.color = hashmap_vec3_get(cvars, "fog_color"); */ -/* settings->debug_draw_enabled = hashmap_bool_get(cvars, "debug_draw_enabled"); */ -/* settings->debug_draw_physics = hashmap_bool_get(cvars, "debug_draw_physics"); */ -/* settings->debug_draw_mode = hashmap_int_get(cvars, "debug_draw_mode"); */ -/* settings->debug_draw_color = hashmap_vec4_get(cvars, "debug_draw_color"); */ -/* settings->ambient_light = hashmap_vec3_get(cvars, "ambient_light"); */ -/* } */ - -/* void renderer_settings_set(const struct Render_Settings* settings) */ -/* { */ -/* struct Hashmap* cvars = platform->config.get(); */ -/* hashmap_int_set(cvars, "fog_mode", settings->fog.mode); */ -/* hashmap_float_set(cvars, "fog_density", settings->fog.density); */ -/* hashmap_float_set(cvars, "fog_start_dist", settings->fog.start_dist); */ -/* hashmap_float_set(cvars, "fog_max_dist", settings->fog.max_dist); */ -/* hashmap_vec3_set(cvars, "fog_color", &settings->fog.color); */ -/* hashmap_bool_set(cvars, "debug_draw_enabled", settings->debug_draw_enabled); */ -/* hashmap_bool_set(cvars, "debug_draw_physics", settings->debug_draw_physics); */ -/* hashmap_int_set(cvars, "debug_draw_mode", settings->debug_draw_mode); */ -/* hashmap_vec4_set(cvars, "debug_draw_color", &settings->debug_draw_color); */ -/* hashmap_vec3_set(cvars, "ambient_light", &settings->ambient_light); */ -/* } */ diff --git a/src/game/scene.c b/src/game/scene.c index 45158a4..5b8eac7 100755 --- a/src/game/scene.c +++ b/src/game/scene.c @@ -53,7 +53,8 @@ void scene_init(struct Scene* scene) } player_init(&scene->player, scene); - editor_init_camera(game_state_get()->editor); + struct Game_State* game_state = game_state_get(); + editor_init_camera(game_state->editor, game_state->cvars); scene->active_camera_index = game_state_get()->game_mode == GAME_MODE_GAME ? CAM_GAME : CAM_EDITOR; } diff --git a/src/system/config_vars.c b/src/system/config_vars.c index 5f23e33..ecb820a 100755 --- a/src/system/config_vars.c +++ b/src/system/config_vars.c @@ -10,13 +10,8 @@ #include #include -#define MAX_LINE_LEN 512 - -static struct Hashmap* cvars = NULL; - -void config_vars_init(void) +void config_vars_init(struct Hashmap* cvars) { - cvars = hashmap_new(); /* Initialize with default values incase there is no config file */ hashmap_int_set(cvars, "render_width", 1024); hashmap_int_set(cvars, "render_height", 768); @@ -38,100 +33,95 @@ void config_vars_init(void) hashmap_float_set(cvars, "player_turn_speed", 5.f); } -void config_vars_cleanup(void) +void config_vars_cleanup(struct Hashmap* cvars) { hashmap_free(cvars); } -struct Hashmap* config_vars_get(void) +bool config_vars_load(struct Hashmap* cvars, const char* filename, int directory_type) { - return cvars; -} - -bool config_vars_load(const char* filename, int directory_type) -{ - FILE* config_file = io_file_open(directory_type, filename, "rb"); - if(!config_file) - { - log_error("config:vars_load", "Could not open %s", filename); - return false; - } - - struct Parser* parser = parser_load_objects(config_file, filename); - if(!parser) - { - log_error("config_vars:load", "Failed to load config data from %s", filename); - fclose(config_file); - return false; - } - - bool config_loaded = false; - for(int i = 0; i < array_len(parser->objects); i++) - { - struct Parser_Object* object = &parser->objects[i]; - if(object->type != PO_CONFIG) + FILE* config_file = io_file_open(directory_type, filename, "rb"); + if(!config_file) { - log_warning("Unexpected config object type %s in %s", parser_object_type_to_str(object->type), filename); - continue; + log_error("config:vars_load", "Could not open %s", filename); + return false; } - config_loaded = true; - char* key = NULL; - struct Variant* value = NULL; - HASHMAP_FOREACH(object->data, key, value) + struct Parser* parser = parser_load_objects(config_file, filename); + if(!parser) { - struct Variant* existing_val = hashmap_value_get(cvars, key); - if(!existing_val) - { - log_warning("Unkown key '%s' in config file %s", key, filename); - continue; - } + log_error("config_vars:load", "Failed to load config data from %s", filename); + fclose(config_file); + return false; + } - variant_copy(existing_val, value); + bool config_loaded = false; + for(int i = 0; i < array_len(parser->objects); i++) + { + struct Parser_Object* object = &parser->objects[i]; + if(object->type != PO_CONFIG) + { + log_warning("Unexpected config object type %s in %s", parser_object_type_to_str(object->type), filename); + continue; + } + + config_loaded = true; + char* key = NULL; + struct Variant* value = NULL; + HASHMAP_FOREACH(object->data, key, value) + { + struct Variant* existing_val = hashmap_value_get(cvars, key); + if(!existing_val) + { + log_warning("Unkown key '%s' in config file %s", key, filename); + continue; + } + + variant_copy(existing_val, value); + } } - } - if(config_loaded) log_message("Loaded config from %s", filename); - fclose(config_file); - return config_loaded; + if(config_loaded) log_message("Loaded config from %s", filename); + fclose(config_file); + return config_loaded; } -bool config_vars_save(const char* filename, int directory_type) +bool config_vars_save(struct Hashmap* cvars, const char* filename, int directory_type) { - bool success = false; - FILE* config_file = io_file_open(directory_type, filename, "w"); - if(!config_file) - { - log_error("config:vars_save", "Failed to open config file %s for writing"); - return success; - } + bool success = false; + FILE* config_file = io_file_open(directory_type, filename, "w"); + if(!config_file) + { + log_error("config:vars_save", "Failed to open config file %s for writing"); + return success; + } - struct Parser* parser = parser_new(); - if(!parser) - { - log_error("config_vars:save", "Could not create Parser for %s", filename); - fclose(config_file); - return false; - } + struct Parser* parser = parser_new(); + if(!parser) + { + log_error("config_vars:save", "Could not create Parser for %s", filename); + fclose(config_file); + return false; + } - struct Parser_Object* object = parser_object_new(parser, PO_CONFIG); - if(!object) - { - log_error("config_vars:save", "Could not create Parser_Object for %s", filename); - parser_free(parser); - fclose(config_file); - return false; - } + struct Parser_Object* object = parser_object_new(parser, PO_CONFIG); + if(!object) + { + log_error("config_vars:save", "Could not create Parser_Object for %s", filename); + parser_free(parser); + fclose(config_file); + return false; + } - hashmap_copy(cvars, object->data); + hashmap_copy(cvars, object->data); - if(!parser_write_objects(parser, config_file, filename)) - { - log_error("config_vars:save", "Failed to write config to '%s'", filename); - success = false; - } + if(!parser_write_objects(parser, config_file, filename)) + { + log_error("config_vars:save", "Failed to write config to '%s'", filename); + success = false; + } - parser_free(parser); - fclose(config_file); - return success; + parser_free(parser); + fclose(config_file); + return success; } diff --git a/src/system/config_vars.h b/src/system/config_vars.h index 2bd4f2b..1236f2f 100755 --- a/src/system/config_vars.h +++ b/src/system/config_vars.h @@ -5,11 +5,9 @@ struct Hashmap; -void config_vars_init(void); -void config_vars_cleanup(void); -bool config_vars_load(const char* filename, int directory_type); -bool config_vars_save(const char* filename, int directory_types); -struct Hashmap* config_vars_get(void); - +void config_vars_init(struct Hashmap* cvars); +void config_vars_cleanup(struct Hashmap* cvars); +bool config_vars_load(struct Hashmap* cvars, const char* filename, int directory_type); +bool config_vars_save(struct Hashmap* cvars, const char* filename, int directory_types); #endif diff --git a/src/system/main.c b/src/system/main.c index 0fc1e61..51e90d6 100755 --- a/src/system/main.c +++ b/src/system/main.c @@ -11,7 +11,9 @@ #include "../game/game.h" struct Wndow; -static struct Window* window; + +static struct Window* window = NULL; +static struct Hashmap* cvars = NULL; bool init(void); void cleanup(void); @@ -27,7 +29,7 @@ int main(int argc, char** args) bool done = false; while(!done) { - bool game_init_status = game_init(window); + bool game_init_status = game_init(window, cvars); if(!game_init_status) { log_error("main", "Game init failed"); @@ -50,7 +52,8 @@ bool init(void) return false; } - config_vars_init(); + cvars = hashmap_new(); + config_vars_init(cvars); if(!platform_init()) return false; char* install_path = platform_install_directory_get(); @@ -59,10 +62,10 @@ bool init(void) io_file_init(install_path, user_path); free(install_path); free(user_path); - if(!config_vars_load("config.symtres", DIRT_USER)) + if(!config_vars_load(cvars, "config.symtres", DIRT_USER)) { log_error("main:init", "Could not load config, reverting to defaults"); - config_vars_save("config.symtres", DIRT_USER); + config_vars_save(cvars, "config.symtres", DIRT_USER); } if(!platform_init_video()) return false; @@ -73,7 +76,6 @@ bool init(void) return false; } - struct Hashmap* cvars = config_vars_get(); int width = hashmap_int_get(cvars, "render_width"); int height = hashmap_int_get(cvars, "render_height"); int msaa = hashmap_bool_get(cvars, "msaa_enabled"); @@ -102,7 +104,7 @@ void cleanup(void) sound_cleanup(); platform_unload_gl(); platform_cleanup(); - config_vars_cleanup(); + config_vars_cleanup(cvars); io_file_cleanup(); log_message("Program exiting!"); log_cleanup(); diff --git a/todo.txt b/todo.txt index 45b3b9c..3ecd98c 100644 --- a/todo.txt +++ b/todo.txt @@ -71,7 +71,7 @@ Bugs: - Fix lights type not being correctly saved/loaded from file - Fix culling - Fix bounding boxes not aligning in editor - - Investigate memory usage increase when window is maximized + - Investigate memory usage increase when window is minimized Done: * Input @@ -208,4 +208,5 @@ Done: * Prevented ray casting when clicking on editor window and buttons * Implemented handling drawing other entity types that can be selected in the editor but are not static meshes * Implemented proper topbar + * Changed config vars are used.