diff --git a/build/linux/makefile b/build/linux/makefile index 8372560..53df51e 100644 --- a/build/linux/makefile +++ b/build/linux/makefile @@ -9,7 +9,7 @@ OBJS_RELEASE = $(patsubst %.c,.release/%.o,$(SRCS)) OBJS_DEBUG = $(patsubst %.c,.debug/%.o,$(SRCS)) CFLAGS = -Wall -I$(INCLUDE_DIR) -DUSE_GLAD -std=c99 $(shell pkg-config --cflags-only-other sdl2 openal) CFLAGS_DEBUG = -g -DGL_DEBUG_CONTEXT -DAL_DEBUG -CFLAGS_RELEASE = -O3 -ffast-math +CFLAGS_RELEASE = -O3 -ffast-math -g LFLAGS = $(shell pkg-config --libs sdl2 openal) -lm ITCH_BUTLER = ~/.config/itch/bin/butler diff --git a/src/editor.c b/src/editor.c index f576bba..d58d296 100644 --- a/src/editor.c +++ b/src/editor.c @@ -136,7 +136,6 @@ void editor_update(float dt) struct Game_State* game_state = game_state_get(); struct Gui_State* gui_state = gui_state_get(); struct nk_context* context = &gui_state->context; - struct Render_Settings* render_settings = renderer_settings_get(); int win_width = 0, win_height = 0; window_get_drawable_size(game_state->window, &win_width, &win_height); int half_width = win_width / 2, half_height = win_height / 2; @@ -179,20 +178,22 @@ void editor_update(float dt) { if(nk_begin_titled(context, "Renderer_Settings_Window", "Renderer Settings", nk_rect(half_width, half_height, 300, 350), default_window_flags)) { + static struct Render_Settings render_settings; + renderer_settings_get(&render_settings); if(nk_tree_push(context, NK_TREE_TAB, "Debug", NK_MAXIMIZED)) { static const char* draw_modes[] = {"Triangles", "Lines", "Points"}; nk_layout_row_dynamic(context, 25, 2); nk_label(context, "Debug Draw", NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE); - nk_checkbox_label(context, "", &render_settings->debug_draw_enabled); + nk_checkbox_label(context, "", &render_settings.debug_draw_enabled); nk_layout_row_dynamic(context, 25, 2); nk_label(context, "Debug Draw Mode", NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE); - render_settings->debug_draw_mode = nk_combo(context, draw_modes, 3, render_settings->debug_draw_mode, 20, nk_vec2(180, 100)); + render_settings.debug_draw_mode = nk_combo(context, draw_modes, 3, render_settings.debug_draw_mode, 20, nk_vec2(180, 100)); nk_layout_row_dynamic(context, 25, 2); nk_label(context, "Debug Color", NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE); - editor_color_combo(context, &render_settings->debug_draw_color, 200, 400); + editor_color_combo(context, &render_settings.debug_draw_color, 200, 400); nk_tree_pop(context); } @@ -202,27 +203,27 @@ void editor_update(float dt) nk_layout_row_dynamic(context, 25, 2); nk_label(context, "Color", NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE); static vec4 fog_color; - vec4_fill_vec3(&fog_color, &render_settings->fog.color, 1.f); + vec4_fill_vec3(&fog_color, &render_settings.fog.color, 1.f); editor_color_combo(context, &fog_color, 200, 400); - vec3_fill(&render_settings->fog.color, fog_color.x, fog_color.y, fog_color.z); + vec3_fill(&render_settings.fog.color, fog_color.x, fog_color.y, fog_color.z); nk_layout_row_dynamic(context, 25, 2); nk_label(context, "Fog Mode", NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE); - render_settings->fog.mode = nk_combo(context, + render_settings.fog.mode = nk_combo(context, fog_modes, 4, - render_settings->fog.mode, + render_settings.fog.mode, 20, nk_vec2(180, 100)); nk_layout_row_dynamic(context, 25, 2); nk_label(context, "Density", NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE); struct nk_rect bounds = nk_widget_bounds(context); - nk_slider_float(context, 0.f, &render_settings->fog.density, 1.f, 0.005); + nk_slider_float(context, 0.f, &render_settings.fog.density, 1.f, 0.005); if(nk_input_is_mouse_hovering_rect(&context->input, bounds)) { static char float_str[10] = {'\0'}; - snprintf(float_str, 6, "%.4f", render_settings->fog.density); + snprintf(float_str, 6, "%.4f", render_settings.fog.density); float_str[6] = '\0'; nk_tooltip(context, float_str); } @@ -231,20 +232,21 @@ void editor_update(float dt) nk_property_float(context, "Start Distance", 0.f, - &render_settings->fog.start_dist, - render_settings->fog.max_dist, + &render_settings.fog.start_dist, + render_settings.fog.max_dist, 5.f, 10.f); nk_layout_row_dynamic(context, 25, 1); nk_property_float(context, "Max Distance", - render_settings->fog.start_dist, - &render_settings->fog.max_dist, + render_settings.fog.start_dist, + &render_settings.fog.max_dist, 10000.f, 5.f, 10.f); nk_tree_pop(context); - } + } + renderer_settings_set(&render_settings); } else { diff --git a/src/game.c b/src/game.c index 4cd18fa..0107375 100644 --- a/src/game.c +++ b/src/game.c @@ -300,6 +300,12 @@ void debug(float dt) vec3 amount = {0, 0, 5 * dt}; transform_translate(model, &amount, TS_LOCAL); } + + struct Entity* model = scene_find("Model_Entity"); + vec3 x_axis = {1, 0, 0}; + transform_rotate(model, &x_axis, 25.f * dt, TS_WORLD); + vec3 amount = {0, 0, -5 * dt}; + transform_translate(model, &amount, TS_LOCAL); } int run(void) diff --git a/src/gui.c b/src/gui.c index cdadf3c..b8da890 100644 --- a/src/gui.c +++ b/src/gui.c @@ -20,6 +20,9 @@ struct Gui_Vertex nk_byte col[4]; }; +#define MAX_GUI_VERTEX_MEMORY 512 * 1024 +#define MAX_GUI_ELEMENT_MEMORY 128 * 1024 + static void gui_handle_clipbard_copy(nk_handle usr, const char *text, int len); static void gui_handle_clipbard_paste(nk_handle usr, struct nk_text_edit *edit); static void gui_handle_textinput_event(const char* text); @@ -119,7 +122,7 @@ void gui_cleanup(void) free(gui_state); } -void gui_render(enum nk_anti_aliasing AA, int max_vertex_buffer, int max_element_buffer) +void gui_render(enum nk_anti_aliasing AA) { int width, height; int display_width, display_height; @@ -134,7 +137,6 @@ void gui_render(enum nk_anti_aliasing AA, int max_vertex_buffer, int max_element scale.x = (float)display_width/(float)width; scale.y = (float)display_height/(float)height; - /* setup global state */ glViewport(0,0,display_width,display_height); @@ -160,8 +162,8 @@ void gui_render(enum nk_anti_aliasing AA, int max_vertex_buffer, int max_element glBindBuffer(GL_ARRAY_BUFFER, gui_state->vbo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gui_state->ebo); - glBufferData(GL_ARRAY_BUFFER, max_vertex_buffer, NULL, GL_STREAM_DRAW); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, max_element_buffer, NULL, GL_STREAM_DRAW); + glBufferData(GL_ARRAY_BUFFER, MAX_GUI_VERTEX_MEMORY, NULL, GL_STREAM_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, MAX_GUI_ELEMENT_MEMORY, NULL, GL_STREAM_DRAW); /* load vertices/elements directly into vertex/element buffer */ vertices = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); @@ -190,8 +192,8 @@ void gui_render(enum nk_anti_aliasing AA, int max_vertex_buffer, int max_element /* setup buffers to load vertices and elements */ struct nk_buffer vbuf, ebuf; - nk_buffer_init_fixed(&vbuf, vertices, (nk_size)max_vertex_buffer); - nk_buffer_init_fixed(&ebuf, elements, (nk_size)max_element_buffer); + nk_buffer_init_fixed(&vbuf, vertices, (nk_size)MAX_GUI_VERTEX_MEMORY); + nk_buffer_init_fixed(&ebuf, elements, (nk_size)MAX_GUI_ELEMENT_MEMORY); nk_convert(&gui_state->context, &gui_state->cmds, &vbuf, &ebuf, &config); } glUnmapBuffer(GL_ARRAY_BUFFER); diff --git a/src/gui.h b/src/gui.h index 703cd9a..a80cbd7 100644 --- a/src/gui.h +++ b/src/gui.h @@ -43,7 +43,7 @@ enum Gui_Theme int gui_init(void); void gui_cleanup(void); -void gui_render(enum nk_anti_aliasing AA, int max_vertex_buffer, int max_element_buffer); +void gui_render(enum nk_anti_aliasing AA); void gui_handle_mousewheel_event(int x, int y); void gui_handle_mousemotion_event(int x, int y, int xrel, int yrel); void gui_handle_mousebutton_event(int button, int state, int x, int y); diff --git a/src/hashmap.c b/src/hashmap.c index 2f904c3..e19fa6c 100644 --- a/src/hashmap.c +++ b/src/hashmap.c @@ -145,7 +145,7 @@ void hashmap_double_set(struct Hashmap* hashmap, const char* key, double value) variant_assign_double(&new_entry->value, value); } -void hashmap_bool_set(struct Hashmap* hashmap, const char* key, int value) +void hashmap_bool_set(struct Hashmap* hashmap, const char* key, const bool value) { struct Hashmap_Entry* new_entry = hashmap_entry_new(hashmap, key); variant_assign_bool(&new_entry->value, value); @@ -235,7 +235,7 @@ double hashmap_double_get(const struct Hashmap* hashmap, const char* key) return variant->val_double; } -int hashmap_bool_get(const struct Hashmap* hashmap, const char* key) +bool hashmap_bool_get(const struct Hashmap* hashmap, const char* key) { const struct Variant* variant = hashmap_value_get(hashmap, key); return variant->val_bool; diff --git a/src/hashmap.h b/src/hashmap.h index 891680b..079b3a4 100644 --- a/src/hashmap.h +++ b/src/hashmap.h @@ -2,6 +2,7 @@ #define HASHMAP_H #include "linmath.h" +#include "num_types.h" #include "array.h" #define HASH_MAP_NUM_BUCKETS 10 @@ -19,7 +20,7 @@ struct Variant* hashmap_value_get(const struct Hashmap* hashmap, const cha void hashmap_float_set(struct Hashmap* hashmap, const char* key, const float value); void hashmap_int_set(struct Hashmap* hashmap, const char* key, const int value); void hashmap_double_set(struct Hashmap* hashmap, const char* key, const double value); -void hashmap_bool_set(struct Hashmap* hashmap, const char* key, const int value); +void hashmap_bool_set(struct Hashmap* hashmap, const char* key, const bool value); void hashmap_vec2_set(struct Hashmap* hashmap, const char* key, const vec2* value); void hashmap_vec3_set(struct Hashmap* hashmap, const char* key, const vec3* value); void hashmap_vec4_set(struct Hashmap* hashmap, const char* key, const vec4* value); @@ -35,7 +36,7 @@ void hashmap_ptr_set(struct Hashmap* hashmap, const char* key, void* float hashmap_float_get(const struct Hashmap* hashmap, const char* key); int hashmap_int_get(const struct Hashmap* hashmap, const char* key); double hashmap_double_get(const struct Hashmap* hashmap, const char* key); -int hashmap_bool_get(const struct Hashmap* hashmap, const char* key); +bool hashmap_bool_get(const struct Hashmap* hashmap, const char* key); vec2 hashmap_vec2_get(const struct Hashmap* hashmap, const char* key); vec3 hashmap_vec3_get(const struct Hashmap* hashmap, const char* key); vec4 hashmap_vec4_get(const struct Hashmap* hashmap, const char* key); diff --git a/src/material.h b/src/material.h index 4a8ff79..c980a35 100644 --- a/src/material.h +++ b/src/material.h @@ -1,7 +1,8 @@ -#ifndef material_H -#define material_H +#ifndef MATERIAL_H +#define MATERIAL_H #include "linmath.h" +#include "num_types.h" struct Model; @@ -28,11 +29,11 @@ struct Material_Param struct Material { - char* name; - int shader; - int* registered_models; - int active; - int lit; /* If material uses light information */ + char* name; + int shader; + int* registered_models; + bool active; + bool lit; /* If material uses light information */ struct Uniform* model_params; /* uniforms related to models */ struct Uniform* pipeline_params; /* general uniforms like matrices etc */ }; diff --git a/src/model.c b/src/model.c index 4188073..2312429 100644 --- a/src/model.c +++ b/src/model.c @@ -70,7 +70,7 @@ void model_render_all(struct Entity* camera_entity, int draw_mode) { /* for each material, get all the registered models and render them */ struct Material* material = &material_list[i]; - if(!material->active) + if(!material->active || array_len(material->registered_models) == 0) continue; shader_bind(material->shader); @@ -139,6 +139,49 @@ void model_render_all(struct Entity* camera_entity, int draw_mode) transform_get_absolute_pos(camera_entity, &camera_pos); shader_set_uniform_vec3(material->shader, "camera_pos", &camera_pos); } + + /* Set material pipeline uniforms */ + static struct Render_Settings render_settings; + renderer_settings_get(&render_settings); + for(int k = 0; k < array_len(material->pipeline_params); k++) + { + struct Uniform* uniform = &material->pipeline_params[k]; + if(strcmp(uniform->name, "view_mat") == 0) + { + shader_set_uniform(uniform->type, uniform->location, &camera_entity->camera.view_mat); + renderer_check_glerror("model:render_all:material_pipeline"); + } + else if(strcmp(uniform->name, "fog.mode") == 0) + { + shader_set_uniform(uniform->type, uniform->location, &render_settings.fog.mode); + renderer_check_glerror("model:render_all:material_pipeline"); + } + else if(strcmp(uniform->name, "fog.density") == 0) + { + shader_set_uniform(uniform->type, uniform->location, &render_settings.fog.density); + renderer_check_glerror("model:render_all:material_pipeline"); + } + else if(strcmp(uniform->name, "fog.start_dist") == 0) + { + shader_set_uniform(uniform->type, uniform->location, &render_settings.fog.start_dist); + renderer_check_glerror("model:render_all:material_pipeline"); + } + else if(strcmp(uniform->name, "fog.max_dist") == 0) + { + shader_set_uniform(uniform->type, uniform->location, &render_settings.fog.max_dist); + renderer_check_glerror("model:render_all:material_pipeline"); + } + else if(strcmp(uniform->name, "fog.color") == 0) + { + shader_set_uniform(uniform->type, uniform->location, &render_settings.fog.color); + renderer_check_glerror("model:render_all:material_pipeline"); + } + else if(strcmp(uniform->name, "ambient_light") == 0) + { + shader_set_uniform(uniform->type, uniform->location, &render_settings.ambient_light); + renderer_check_glerror("model:render_all:material_pipeline"); + } + } for(int j = 0; j < array_len(material->registered_models); j++) { @@ -171,8 +214,7 @@ void model_render_all(struct Entity* camera_entity, int draw_mode) renderer_check_glerror("model:render_all:material_param"); } - /* Set pipeline uniforms */ - struct Render_Settings* render_settings = renderer_settings_get(); + /* Set pipeline uniforms that are derived per model */ for(int k = 0; k < array_len(material->pipeline_params); k++) { /* TODO: change this into something better */ @@ -189,11 +231,6 @@ void model_render_all(struct Entity* camera_entity, int draw_mode) shader_set_uniform(uniform->type, uniform->location, &transform->trans_mat); renderer_check_glerror("model:render_all:material_pipeline"); } - else if(strcmp(uniform->name, "view_mat") == 0) - { - shader_set_uniform(uniform->type, uniform->location, &camera_entity->camera.view_mat); - renderer_check_glerror("model:render_all:material_pipeline"); - } else if(strcmp(uniform->name, "inv_model_mat") == 0) { mat4 inv_mat; @@ -202,36 +239,6 @@ void model_render_all(struct Entity* camera_entity, int draw_mode) shader_set_uniform(uniform->type, uniform->location, &inv_mat); renderer_check_glerror("model:render_all:material_pipeline"); } - else if(strcmp(uniform->name, "fog.mode") == 0) - { - shader_set_uniform(uniform->type, uniform->location, &render_settings->fog.mode); - renderer_check_glerror("model:render_all:material_pipeline"); - } - else if(strcmp(uniform->name, "fog.density") == 0) - { - shader_set_uniform(uniform->type, uniform->location, &render_settings->fog.density); - renderer_check_glerror("model:render_all:material_pipeline"); - } - else if(strcmp(uniform->name, "fog.start_dist") == 0) - { - shader_set_uniform(uniform->type, uniform->location, &render_settings->fog.start_dist); - renderer_check_glerror("model:render_all:material_pipeline"); - } - else if(strcmp(uniform->name, "fog.max_dist") == 0) - { - shader_set_uniform(uniform->type, uniform->location, &render_settings->fog.max_dist); - renderer_check_glerror("model:render_all:material_pipeline"); - } - else if(strcmp(uniform->name, "fog.color") == 0) - { - shader_set_uniform(uniform->type, uniform->location, &render_settings->fog.color); - renderer_check_glerror("model:render_all:material_pipeline"); - } - else if(strcmp(uniform->name, "ambient_light") == 0) - { - shader_set_uniform(uniform->type, uniform->location, &render_settings->ambient_light); - renderer_check_glerror("model:render_all:material_pipeline"); - } } /* Render the geometry */ diff --git a/src/renderer.c b/src/renderer.c index bf5d92f..9099ba1 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -24,10 +24,6 @@ static int def_depth_tex = -1; static int quad_geo = -1; static int composition_shader = -1; static int debug_shader = -1; -static struct Render_Settings settings; - -#define MAX_GUI_VERTEX_MEMORY 512 * 1024 -#define MAX_GUI_ELEMENT_MEMORY 128 * 1024 void on_framebuffer_size_change(int width, int height); @@ -38,23 +34,6 @@ void renderer_init(void) glEnable(GL_CULL_FACE); glCullFace(GL_BACK); platform_windowresize_callback_set(on_framebuffer_size_change); - - struct Hashmap* cvars = config_vars_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_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"); - settings.max_gui_vertex_memory = MAX_GUI_VERTEX_MEMORY; - settings.max_gui_element_memory = MAX_GUI_ELEMENT_MEMORY; - /* vec3_fill(&settings.fog.color, 60.f/255.f, 60.f/255.f, 75.f/255.f); */ - /* vec3_fill(&settings.ambient_light, 0.1f, 0.1f, 0.12f); */ - /* vec4_fill(&settings.debug_draw_color, 0.f, 1.f, 0.f, 1.f); */ - gui_init(); /* Quad geometry for final render */ @@ -184,14 +163,18 @@ void renderer_draw(struct Entity* active_viewer) texture_unbind(final_render_tex); shader_unbind(); - if(settings.debug_draw_enabled) + struct Hashmap* cvars = config_vars_get(); + //if(settings.debug_draw_enabled) + if(hashmap_bool_get(cvars, "debug_draw_enabled")) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - model_render_all_debug(active_viewer, debug_shader, settings.debug_draw_mode, &settings.debug_draw_color); + //model_render_all_debug(active_viewer, debug_shader, settings.debug_draw_mode, &settings.debug_draw_color); + vec4 debug_draw_color = hashmap_vec4_get(cvars, "debug_draw_color"); + model_render_all_debug(active_viewer, debug_shader, hashmap_int_get(cvars, "debug_draw_mode"), &debug_draw_color); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } - gui_render(NK_ANTI_ALIASING_ON, settings.max_gui_vertex_memory, settings.max_gui_element_memory); + gui_render(NK_ANTI_ALIASING_ON); } void renderer_cleanup(void) @@ -247,12 +230,35 @@ int renderer_check_glerror(const char* context) return error; } -struct Render_Settings* renderer_settings_get(void) +void renderer_debug_draw_enabled(bool enabled) { - return &settings; + struct Hashmap* cvars = config_vars_get(); + hashmap_bool_set(cvars, "debug_draw_enabled", enabled); } -void renderer_debug_draw_enabled(int enabled) +void renderer_settings_get(struct Render_Settings* settings) { - settings.debug_draw_enabled = enabled; + struct Hashmap* cvars = config_vars_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_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 = config_vars_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_bool_set(cvars, "debug_draw_enabled", settings->debug_draw_enabled); + 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/renderer.h b/src/renderer.h index c2783a9..48dea8b 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -2,6 +2,7 @@ #define RENDERER_H #include "linmath.h" +#include "num_types.h" enum Fog_Mode { @@ -25,8 +26,6 @@ struct Render_Settings { struct Fog fog; vec3 ambient_light; - int max_gui_vertex_memory; - int max_gui_element_memory; int debug_draw_enabled; vec4 debug_draw_color; int debug_draw_mode; @@ -34,12 +33,13 @@ struct Render_Settings struct Entity; -struct Render_Settings* renderer_settings_get(void); -void renderer_init(void); -void renderer_draw(struct Entity* active_viewer); -void renderer_cleanup(void); -void renderer_clearcolor_set(float r, float g, float b, float a); -void renderer_debug_draw_enabled(int enabled); -int renderer_check_glerror(const char* context); +void renderer_settings_get(struct Render_Settings* settings); +void renderer_settings_set(const struct Render_Settings* settings); +void renderer_init(void); +void renderer_draw(struct Entity* active_viewer); +void renderer_cleanup(void); +void renderer_clearcolor_set(float r, float g, float b, float a); +void renderer_debug_draw_enabled(bool enabled); +int renderer_check_glerror(const char* context); #endif diff --git a/src/variant.c b/src/variant.c index 503d764..70e7102 100644 --- a/src/variant.c +++ b/src/variant.c @@ -36,7 +36,7 @@ void variant_assign_double(struct Variant* variant, double value) variant->val_double = value; } -void variant_assign_bool(struct Variant* variant, int value) +void variant_assign_bool(struct Variant* variant, bool value) { if(variant->type != VT_BOOL) variant_free(variant); variant->type = VT_BOOL; @@ -157,8 +157,8 @@ void variant_copy(struct Variant* to, const struct Variant* from) to->type = from->type; switch(from->type) { - case VT_BOOL: variant_assign_bool(to, from->val_int); break; - case VT_INT: variant_assign_int(to, from->val_bool); break; + case VT_BOOL: variant_assign_bool(to, from->val_bool); break; + case VT_INT: variant_assign_int(to, from->val_int); break; case VT_FLOAT: variant_assign_float(to, from->val_float); break; case VT_DOUBLE: variant_assign_double(to, from->val_double); break; case VT_VEC2: variant_assign_vec2(to, &from->val_vec2); break; @@ -199,17 +199,16 @@ void variant_from_str(struct Variant* variant, const char* str, int variant_type { case VT_BOOL: { - int boolean = -1; + bool boolean = false; memset(str_val, '\0', MAX_VARIANT_STR_LEN); if(sscanf(str, "%1024s", str_val) == 1) { if(strncmp("true", str_val, 5) == 0) - boolean = 1; + boolean = true; else if(strncmp("false", str_val, 5) == 0) - boolean = 0; + boolean = false; - if(boolean != -1) - variant_assign_bool(variant, boolean); + variant_assign_bool(variant, boolean); } } break; diff --git a/src/variant.h b/src/variant.h index add665e..d4bb9b4 100644 --- a/src/variant.h +++ b/src/variant.h @@ -2,6 +2,7 @@ #define VARIANT_H #include "linmath.h" +#include "num_types.h" #define MAX_VARIANT_STR_LEN 1024 @@ -28,7 +29,7 @@ struct Variant union { int val_int; - int val_bool; + bool val_bool; float val_float; double val_double; char* val_str; @@ -45,7 +46,7 @@ void variant_init_empty(struct Variant* variant); void variant_assign_float(struct Variant* variant, float value); void variant_assign_int(struct Variant* variant, int value); void variant_assign_double(struct Variant* variant, double value); -void variant_assign_bool(struct Variant* variant, int value); +void variant_assign_bool(struct Variant* variant, bool value); void variant_assign_str(struct Variant* variant, const char* value); void variant_assign_vec2(struct Variant* variant, const vec2* value); void variant_assign_vec3(struct Variant* variant, const vec3* value);