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. 15
      src/material.h
  9. 83
      src/model.c
  10. 62
      src/renderer.c
  11. 18
      src/renderer.h
  12. 15
      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)) 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 = -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_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 LFLAGS = $(shell pkg-config --libs sdl2 openal) -lm
ITCH_BUTLER = ~/.config/itch/bin/butler ITCH_BUTLER = ~/.config/itch/bin/butler

@ -136,7 +136,6 @@ void editor_update(float dt)
struct Game_State* game_state = game_state_get(); struct Game_State* game_state = game_state_get();
struct Gui_State* gui_state = gui_state_get(); struct Gui_State* gui_state = gui_state_get();
struct nk_context* context = &gui_state->context; struct nk_context* context = &gui_state->context;
struct Render_Settings* render_settings = renderer_settings_get();
int win_width = 0, win_height = 0; int win_width = 0, win_height = 0;
window_get_drawable_size(game_state->window, &win_width, &win_height); window_get_drawable_size(game_state->window, &win_width, &win_height);
int half_width = win_width / 2, half_height = win_height / 2; 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)) 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)) if(nk_tree_push(context, NK_TREE_TAB, "Debug", NK_MAXIMIZED))
{ {
static const char* draw_modes[] = {"Triangles", "Lines", "Points"}; static const char* draw_modes[] = {"Triangles", "Lines", "Points"};
nk_layout_row_dynamic(context, 25, 2); nk_layout_row_dynamic(context, 25, 2);
nk_label(context, "Debug Draw", NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE); 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_layout_row_dynamic(context, 25, 2);
nk_label(context, "Debug Draw Mode", NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE); 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_layout_row_dynamic(context, 25, 2);
nk_label(context, "Debug Color", NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE); 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); nk_tree_pop(context);
} }
@ -202,27 +203,27 @@ void editor_update(float dt)
nk_layout_row_dynamic(context, 25, 2); nk_layout_row_dynamic(context, 25, 2);
nk_label(context, "Color", NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE); nk_label(context, "Color", NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE);
static vec4 fog_color; 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); 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_layout_row_dynamic(context, 25, 2);
nk_label(context, "Fog Mode", NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE); 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, fog_modes,
4, 4,
render_settings->fog.mode, render_settings.fog.mode,
20, 20,
nk_vec2(180, 100)); nk_vec2(180, 100));
nk_layout_row_dynamic(context, 25, 2); nk_layout_row_dynamic(context, 25, 2);
nk_label(context, "Density", NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE); nk_label(context, "Density", NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE);
struct nk_rect bounds = nk_widget_bounds(context); 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)) if(nk_input_is_mouse_hovering_rect(&context->input, bounds))
{ {
static char float_str[10] = {'\0'}; 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'; float_str[6] = '\0';
nk_tooltip(context, float_str); nk_tooltip(context, float_str);
} }
@ -231,20 +232,21 @@ void editor_update(float dt)
nk_property_float(context, nk_property_float(context,
"Start Distance", "Start Distance",
0.f, 0.f,
&render_settings->fog.start_dist, &render_settings.fog.start_dist,
render_settings->fog.max_dist, render_settings.fog.max_dist,
5.f, 10.f); 5.f, 10.f);
nk_layout_row_dynamic(context, 25, 1); nk_layout_row_dynamic(context, 25, 1);
nk_property_float(context, nk_property_float(context,
"Max Distance", "Max Distance",
render_settings->fog.start_dist, render_settings.fog.start_dist,
&render_settings->fog.max_dist, &render_settings.fog.max_dist,
10000.f, 10000.f,
5.f, 10.f); 5.f, 10.f);
nk_tree_pop(context); nk_tree_pop(context);
} }
renderer_settings_set(&render_settings);
} }
else else
{ {

@ -300,6 +300,12 @@ void debug(float dt)
vec3 amount = {0, 0, 5 * dt}; vec3 amount = {0, 0, 5 * dt};
transform_translate(model, &amount, TS_LOCAL); 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) int run(void)

@ -20,6 +20,9 @@ struct Gui_Vertex
nk_byte col[4]; 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_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_clipbard_paste(nk_handle usr, struct nk_text_edit *edit);
static void gui_handle_textinput_event(const char* text); static void gui_handle_textinput_event(const char* text);
@ -119,7 +122,7 @@ void gui_cleanup(void)
free(gui_state); 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 width, height;
int display_width, display_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.x = (float)display_width/(float)width;
scale.y = (float)display_height/(float)height; scale.y = (float)display_height/(float)height;
/* setup global state */ /* setup global state */
glViewport(0,0,display_width,display_height); glViewport(0,0,display_width,display_height);
glEnable(GL_BLEND); 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_ARRAY_BUFFER, gui_state->vbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gui_state->ebo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gui_state->ebo);
glBufferData(GL_ARRAY_BUFFER, max_vertex_buffer, NULL, GL_STREAM_DRAW); glBufferData(GL_ARRAY_BUFFER, MAX_GUI_VERTEX_MEMORY, NULL, GL_STREAM_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, max_element_buffer, 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 */ /* load vertices/elements directly into vertex/element buffer */
vertices = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); 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 */ /* setup buffers to load vertices and elements */
struct nk_buffer vbuf, ebuf; struct nk_buffer vbuf, ebuf;
nk_buffer_init_fixed(&vbuf, vertices, (nk_size)max_vertex_buffer); nk_buffer_init_fixed(&vbuf, vertices, (nk_size)MAX_GUI_VERTEX_MEMORY);
nk_buffer_init_fixed(&ebuf, elements, (nk_size)max_element_buffer); nk_buffer_init_fixed(&ebuf, elements, (nk_size)MAX_GUI_ELEMENT_MEMORY);
nk_convert(&gui_state->context, &gui_state->cmds, &vbuf, &ebuf, &config); nk_convert(&gui_state->context, &gui_state->cmds, &vbuf, &ebuf, &config);
} }
glUnmapBuffer(GL_ARRAY_BUFFER); glUnmapBuffer(GL_ARRAY_BUFFER);

@ -43,7 +43,7 @@ enum Gui_Theme
int gui_init(void); int gui_init(void);
void gui_cleanup(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_mousewheel_event(int x, int y);
void gui_handle_mousemotion_event(int x, int y, int xrel, int yrel); 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); 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); 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); struct Hashmap_Entry* new_entry = hashmap_entry_new(hashmap, key);
variant_assign_bool(&new_entry->value, value); 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; 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); const struct Variant* variant = hashmap_value_get(hashmap, key);
return variant->val_bool; return variant->val_bool;

@ -2,6 +2,7 @@
#define HASHMAP_H #define HASHMAP_H
#include "linmath.h" #include "linmath.h"
#include "num_types.h"
#include "array.h" #include "array.h"
#define HASH_MAP_NUM_BUCKETS 10 #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_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_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_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_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_vec3_set(struct Hashmap* hashmap, const char* key, const vec3* value);
void hashmap_vec4_set(struct Hashmap* hashmap, const char* key, const vec4* 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); float hashmap_float_get(const struct Hashmap* hashmap, const char* key);
int hashmap_int_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); 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); vec2 hashmap_vec2_get(const struct Hashmap* hashmap, const char* key);
vec3 hashmap_vec3_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); vec4 hashmap_vec4_get(const struct Hashmap* hashmap, const char* key);

@ -1,7 +1,8 @@
#ifndef material_H #ifndef MATERIAL_H
#define material_H #define MATERIAL_H
#include "linmath.h" #include "linmath.h"
#include "num_types.h"
struct Model; struct Model;
@ -28,11 +29,11 @@ struct Material_Param
struct Material struct Material
{ {
char* name; char* name;
int shader; int shader;
int* registered_models; int* registered_models;
int active; bool active;
int lit; /* If material uses light information */ bool lit; /* If material uses light information */
struct Uniform* model_params; /* uniforms related to models */ struct Uniform* model_params; /* uniforms related to models */
struct Uniform* pipeline_params; /* general uniforms like matrices etc */ 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 */ /* for each material, get all the registered models and render them */
struct Material* material = &material_list[i]; struct Material* material = &material_list[i];
if(!material->active) if(!material->active || array_len(material->registered_models) == 0)
continue; continue;
shader_bind(material->shader); 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); 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(int j = 0; j < array_len(material->registered_models); j++)
{ {
/* for each registered model, set up uniforms and render */ /* 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"); renderer_check_glerror("model:render_all:material_param");
} }
/* Set pipeline uniforms */ /* Set pipeline uniforms that are derived per model */
struct Render_Settings* render_settings = renderer_settings_get();
for(int k = 0; k < array_len(material->pipeline_params); k++) for(int k = 0; k < array_len(material->pipeline_params); k++)
{ {
/* TODO: change this into something better */ /* 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); shader_set_uniform(uniform->type, uniform->location, &transform->trans_mat);
renderer_check_glerror("model:render_all:material_pipeline"); 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) else if(strcmp(uniform->name, "inv_model_mat") == 0)
{ {
mat4 inv_mat; 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); shader_set_uniform(uniform->type, uniform->location, &inv_mat);
renderer_check_glerror("model:render_all:material_pipeline"); 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 */ /* Render the geometry */

@ -24,10 +24,6 @@ static int def_depth_tex = -1;
static int quad_geo = -1; static int quad_geo = -1;
static int composition_shader = -1; static int composition_shader = -1;
static int debug_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); void on_framebuffer_size_change(int width, int height);
@ -38,23 +34,6 @@ void renderer_init(void)
glEnable(GL_CULL_FACE); glEnable(GL_CULL_FACE);
glCullFace(GL_BACK); glCullFace(GL_BACK);
platform_windowresize_callback_set(on_framebuffer_size_change); 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(); gui_init();
/* Quad geometry for final render */ /* Quad geometry for final render */
@ -184,14 +163,18 @@ void renderer_draw(struct Entity* active_viewer)
texture_unbind(final_render_tex); texture_unbind(final_render_tex);
shader_unbind(); 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); 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); 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) void renderer_cleanup(void)
@ -247,12 +230,35 @@ int renderer_check_glerror(const char* context)
return error; 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 #define RENDERER_H
#include "linmath.h" #include "linmath.h"
#include "num_types.h"
enum Fog_Mode enum Fog_Mode
{ {
@ -25,8 +26,6 @@ struct Render_Settings
{ {
struct Fog fog; struct Fog fog;
vec3 ambient_light; vec3 ambient_light;
int max_gui_vertex_memory;
int max_gui_element_memory;
int debug_draw_enabled; int debug_draw_enabled;
vec4 debug_draw_color; vec4 debug_draw_color;
int debug_draw_mode; int debug_draw_mode;
@ -34,12 +33,13 @@ struct Render_Settings
struct Entity; struct Entity;
struct Render_Settings* renderer_settings_get(void); void renderer_settings_get(struct Render_Settings* settings);
void renderer_init(void); void renderer_settings_set(const struct Render_Settings* settings);
void renderer_draw(struct Entity* active_viewer); void renderer_init(void);
void renderer_cleanup(void); void renderer_draw(struct Entity* active_viewer);
void renderer_clearcolor_set(float r, float g, float b, float a); void renderer_cleanup(void);
void renderer_debug_draw_enabled(int enabled); void renderer_clearcolor_set(float r, float g, float b, float a);
int renderer_check_glerror(const char* context); void renderer_debug_draw_enabled(bool enabled);
int renderer_check_glerror(const char* context);
#endif #endif

@ -36,7 +36,7 @@ void variant_assign_double(struct Variant* variant, double value)
variant->val_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); if(variant->type != VT_BOOL) variant_free(variant);
variant->type = VT_BOOL; variant->type = VT_BOOL;
@ -157,8 +157,8 @@ void variant_copy(struct Variant* to, const struct Variant* from)
to->type = from->type; to->type = from->type;
switch(from->type) switch(from->type)
{ {
case VT_BOOL: variant_assign_bool(to, from->val_int); break; case VT_BOOL: variant_assign_bool(to, from->val_bool); break;
case VT_INT: variant_assign_int(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_FLOAT: variant_assign_float(to, from->val_float); break;
case VT_DOUBLE: variant_assign_double(to, from->val_double); break; case VT_DOUBLE: variant_assign_double(to, from->val_double); break;
case VT_VEC2: variant_assign_vec2(to, &from->val_vec2); 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: case VT_BOOL:
{ {
int boolean = -1; bool boolean = false;
memset(str_val, '\0', MAX_VARIANT_STR_LEN); memset(str_val, '\0', MAX_VARIANT_STR_LEN);
if(sscanf(str, "%1024s", str_val) == 1) if(sscanf(str, "%1024s", str_val) == 1)
{ {
if(strncmp("true", str_val, 5) == 0) if(strncmp("true", str_val, 5) == 0)
boolean = 1; boolean = true;
else if(strncmp("false", str_val, 5) == 0) 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; break;

@ -2,6 +2,7 @@
#define VARIANT_H #define VARIANT_H
#include "linmath.h" #include "linmath.h"
#include "num_types.h"
#define MAX_VARIANT_STR_LEN 1024 #define MAX_VARIANT_STR_LEN 1024
@ -28,7 +29,7 @@ struct Variant
union union
{ {
int val_int; int val_int;
int val_bool; bool val_bool;
float val_float; float val_float;
double val_double; double val_double;
char* val_str; 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_float(struct Variant* variant, float value);
void variant_assign_int(struct Variant* variant, int value); void variant_assign_int(struct Variant* variant, int value);
void variant_assign_double(struct Variant* variant, double 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_str(struct Variant* variant, const char* value);
void variant_assign_vec2(struct Variant* variant, const vec2* value); void variant_assign_vec2(struct Variant* variant, const vec2* value);
void variant_assign_vec3(struct Variant* variant, const vec3* value); void variant_assign_vec3(struct Variant* variant, const vec3* value);

Loading…
Cancel
Save