Changed how render settings are read/written

dev
shariq 8 years ago
parent a42954a764
commit 3ebb14202a
  1. 2
      build/linux/makefile
  2. 30
      src/editor.c
  3. 6
      src/game.c
  4. 14
      src/gui.c
  5. 2
      src/gui.h
  6. 4
      src/hashmap.c
  7. 5
      src/hashmap.h
  8. 9
      src/material.h
  9. 83
      src/model.c
  10. 62
      src/renderer.c
  11. 8
      src/renderer.h
  12. 13
      src/variant.c
  13. 5
      src/variant.h

@ -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

@ -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
{

@ -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)

@ -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;
@ -135,7 +138,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);
glEnable(GL_BLEND);
@ -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);

@ -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);

@ -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;

@ -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);

@ -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;
@ -31,8 +32,8 @@ struct Material
char* name;
int shader;
int* registered_models;
int active;
int lit; /* If material uses light information */
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 */
};

@ -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);
@ -140,6 +140,49 @@ void model_render_all(struct Entity* camera_entity, int draw_mode)
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++)
{
/* for each registered model, set up uniforms and render */
@ -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 */

@ -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);
}

@ -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_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(int enabled);
void renderer_debug_draw_enabled(bool enabled);
int renderer_check_glerror(const char* context);
#endif

@ -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,16 +199,15 @@ 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);
}
}

@ -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);

Loading…
Cancel
Save