diff --git a/game/res/scripts/entity_templates.scm b/game/res/scripts/entity_templates.scm new file mode 100644 index 0000000..137da61 --- /dev/null +++ b/game/res/scripts/entity_templates.scm @@ -0,0 +1,18 @@ +(register-entity-template + "tree" + #:mesh-type 'quad-x + #:cull-distance 70 ;in % + #:wavy #t + #:scale '(3.0 8.0 3.0) + #:texture (get-texture "tree0") + #:program (get-program "default")) + +(register-entity-template + "grass" + #:mesh-type 'quad-1 + #:render-type 'billboard-y + #:cull-distance 20 ;in % + #:wavy #t + #:scale '(1.0 0.5 1.0) + #:texture (get-texture "grass0") + #:program (get-program "default")) diff --git a/game/res/scripts/resources.scm b/game/res/scripts/resources.scm new file mode 100644 index 0000000..2d65d0b --- /dev/null +++ b/game/res/scripts/resources.scm @@ -0,0 +1,19 @@ +(register-program "default" "res/shaders/default.vert" "res/shaders/default.frag") +(register-program "chunk" "res/shaders/chunk.vert" "res/shaders/chunk.frag") +(register-program "clouds" "res/shaders/clouds.vert" "res/shaders/clouds.frag") +(register-program "uiwidget" "res/shaders/uiwidget.vert" "res/shaders/uiwidget.frag") +(register-program "uitext" "res/shaders/uitext.vert" "res/shaders/uitext.frag") +(register-program "uidummy" "res/shaders/uidummy.vert" "res/shaders/uidummy.frag") + +(register-texture "terrain0" "res/textures/dirt.png") +(register-texture "terrain1" "res/textures/drygrass.png") +(register-texture "terrain2" "res/textures/grass.png") +(register-texture "terrain3" "res/textures/rock_cement.png") +(register-texture "terrain4" "res/textures/asphalt_gravel.png") + +(register-texture "tree0" "res/textures/tree.png") +(register-texture "grass0" "res/textures/grass0.png") +(register-texture "clouds" "res/textures/clouds.png") + +(register-texture "font0" "res/textures/font_9x20.png") +(register-texture "icons" "res/textures/icons.png") diff --git a/game/src/entity/templates.c b/game/src/entity/templates.c index 3100a6f..7fc4a34 100644 --- a/game/src/entity/templates.c +++ b/game/src/entity/templates.c @@ -8,6 +8,7 @@ ent_templates_add (char *key, Entity *entity) g_hash_table_insert (templates, key, entity); } + Entity * ent_templates_get (char *key) { @@ -24,23 +25,83 @@ void ent_templates_init () { templates = g_hash_table_new (g_str_hash, g_str_equal); + scm_c_primitive_load ("res/scripts/entity_templates.scm"); +} - Entity *tree = Entity_new (); - tree->mesh_type = MESH_QUAD_X; - tree->cull_distance = 70; - tree->wavy = true; - glm_vec3_copy ((vec3) { 3.0, 8.0, 3.0 }, tree->scale); - tree->texture = RESTEX ("tree0"); - tree->program = RESPRG ("default"); - ent_templates_add ("tree", tree); - - Entity *grass = Entity_new (); - grass->mesh_type = MESH_QUAD1; - grass->render_type = RENDER_BILLBOARD_Y; - grass->cull_distance = 20; - grass->wavy = true; - glm_vec3_copy ((vec3) { 1.0, 0.5, 1.0 }, tree->scale); - grass->texture = RESTEX ("grass0"); - grass->program = RESPRG ("default"); - ent_templates_add ("grass", grass); +static int +symbol_to_mesh_type (SCM sym) +{ + if (scm_is_eq (sym, scm_from_utf8_symbol ("quad-x"))) return MESH_QUAD_X; + if (scm_is_eq (sym, scm_from_utf8_symbol ("quad-1"))) return MESH_QUAD1; + return 0; +} + +static int +symbol_to_render_type (SCM sym) +{ + if (scm_is_eq (sym, scm_from_utf8_symbol ("billboard-y"))) return RENDER_BILLBOARD_Y; + return 0; +} + +static SCM +_scm_register_entity_template (SCM name_scm, SCM rest) +{ + Entity *e = Entity_new (); + const char *key = scm_to_utf8_string (name_scm); + + while (!scm_is_null (rest)) + { + SCM keyword = scm_car (rest); rest = scm_cdr (rest); + SCM value = scm_car (rest); rest = scm_cdr (rest); + + SCM sym = scm_keyword_to_symbol (keyword); + const char *kw = scm_to_utf8_string (scm_symbol_to_string (sym)); + + if (g_strcmp0 (kw, "mesh-type") == 0) + { + e->mesh_type = symbol_to_mesh_type (value); + } + + else if (g_strcmp0 (kw, "render-type") == 0) + { + e->render_type = symbol_to_render_type (value); + } + + else if (g_strcmp0 (kw, "cull-distance") == 0) + { + e->cull_distance = scm_to_int (value); + } + + else if (g_strcmp0 (kw, "wavy") == 0) + { + e->wavy = scm_is_true (value); + } + + else if (g_strcmp0 (kw, "scale") == 0) + { + for (int i = 0; i < 3; ++i) + { + e->scale[i] = scm_to_double (scm_list_ref (value, scm_from_int (i))); + } + } + + else if (g_strcmp0 (kw, "texture") == 0) + { + e->texture = scm_to_int (value); + } + + else if (g_strcmp0 (kw, "program") == 0) + { + e->program = scm_to_int (value); + } + } + + ent_templates_add ((char *) key, e); + return SCM_UNSPECIFIED; +} + +void +ent_templates_guile_register () +{ + scm_c_define_gsubr ("register-entity-template", 1, 0, 1, _scm_register_entity_template); } diff --git a/game/src/entity/templates.h b/game/src/entity/templates.h index b530442..43ac297 100644 --- a/game/src/entity/templates.h +++ b/game/src/entity/templates.h @@ -9,5 +9,7 @@ #include "../resources.h" void ent_templates_init (); +void ent_templates_guile_register (); + Entity *ent_templates_clone (char *key); Entity *ent_templates_get (char *key); diff --git a/game/src/graphics.c b/game/src/graphics.c index 267f29b..5f70d7e 100644 --- a/game/src/graphics.c +++ b/game/src/graphics.c @@ -12,10 +12,6 @@ static double avg_elapsed = 0; void graphics_init () { - gvar_set ("render_distance", 2); - gvar_set ("window_width", 800); - gvar_set ("window_height", 600); - if (!SDL_Init (SDL_INIT_VIDEO)) { g_error ("Couldn't initialize SDL: %s", SDL_GetError ()); diff --git a/game/src/gvar.c b/game/src/gvar.c index 4b65a99..11a9faa 100644 --- a/game/src/gvar.c +++ b/game/src/gvar.c @@ -6,6 +6,10 @@ void gvar_init () { gvars = g_hash_table_new (g_str_hash, g_str_equal); + + gvar_set ("render_distance", 2); + gvar_set ("window_width", 800); + gvar_set ("window_height", 600); } static SCM diff --git a/game/src/main.c b/game/src/main.c index b983fa9..5bff043 100644 --- a/game/src/main.c +++ b/game/src/main.c @@ -22,11 +22,14 @@ SDL_AppInit (void **appstate, int argc, char **argv) scm_init_guile (); gvar_guile_register (); + resources_guile_register (); widget_guile_register (); - + ent_templates_guile_register (); + gvar_init (); graphics_init (); resources_init (); + evtman_init (); uiman_init (); chunkman_init (); diff --git a/game/src/resources.c b/game/src/resources.c index f9534d1..7cdfe8f 100644 --- a/game/src/resources.c +++ b/game/src/resources.c @@ -141,34 +141,7 @@ resources_init () programs = g_hash_table_new (g_str_hash, g_str_equal); textures = g_hash_table_new (g_str_hash, g_str_equal); -#define RAP resources_add_program -#define RLP resources_load_program -#define RAT resources_add_texture -#define RLT resources_load_texture - - RAP ("default", RLP ("res/shaders/default.vert", "res/shaders/default.frag")); - RAP ("chunk", RLP ("res/shaders/chunk.vert", "res/shaders/chunk.frag")); - RAP ("clouds", RLP ("res/shaders/clouds.vert", "res/shaders/clouds.frag")); - RAP ("uiwidget", RLP ("res/shaders/uiwidget.vert", "res/shaders/uiwidget.frag")); - RAP ("uitext", RLP ("res/shaders/uitext.vert", "res/shaders/uitext.frag")); - RAP ("uidummy", RLP ("res/shaders/uidummy.vert", "res/shaders/uidummy.frag")); - - RAT ("terrain0", RLT ("res/textures/dirt.png")); - RAT ("terrain1", RLT ("res/textures/drygrass.png")); - RAT ("terrain2", RLT ("res/textures/grass.png")); - RAT ("terrain3", RLT ("res/textures/rock_cement.png")); - RAT ("terrain4", RLT ("res/textures/asphalt_gravel.png")); - RAT ("tree0", RLT ("res/textures/tree.png")); - RAT ("grass0", RLT ("res/textures/grass0.png")); - RAT ("clouds", RLT ("res/textures/clouds.png")); - - RAT ("font0", RLT ("res/textures/font_9x20.png")); - RAT ("icons", RLT ("res/textures/icons.png")); - -#undef RAP -#undef RLP -#undef RAT -#undef RLT + scm_c_primitive_load ("res/scripts/resources.scm"); program_use (RESPRG ("chunk")); program_set_int_array (RESPRG ("chunk"), "materials", 5, (int[5]) { 0, 1, 2, 3, 4 }); @@ -177,3 +150,47 @@ resources_init () program_set_int (RESPRG ("uiwidget"), "background_image", 0); program_set_int (RESPRG ("uiwidget"), "icons", 1); } + +static SCM +_scm_register_program (SCM key_scm, SCM vpath_scm, SCM fpath_scm) +{ + const char *key = scm_to_utf8_string (key_scm); + const char *vpath = scm_to_utf8_string (vpath_scm); + const char *fpath = scm_to_utf8_string (fpath_scm); + unsigned int prog = resources_load_program (vpath, fpath); + resources_add_program ((char *) key, prog); + return SCM_UNSPECIFIED; +} + +static SCM +_scm_register_texture (SCM key_scm, SCM path_scm) +{ + const char *key = scm_to_utf8_string (key_scm); + const char *path = scm_to_utf8_string (path_scm); + unsigned int tex = resources_load_texture (path); + resources_add_texture ((char *) key, tex); + return SCM_UNSPECIFIED; +} + +static SCM +_scm_get_program (SCM key_scm) +{ + const char *key = scm_to_utf8_string (key_scm); + return scm_from_int (resources_get_program ((char *) key)); +} + +static SCM +_scm_get_texture (SCM key_scm) +{ + const char *key = scm_to_utf8_string (key_scm); + return scm_from_int (resources_get_texture ((char *) key)); +} + +void +resources_guile_register () +{ + scm_c_define_gsubr ("register-program", 3, 0, 0, _scm_register_program); + scm_c_define_gsubr ("register-texture", 2, 0, 0, _scm_register_texture); + scm_c_define_gsubr ("get-program", 1, 0, 0, _scm_get_program); + scm_c_define_gsubr ("get-texture", 1, 0, 0, _scm_get_texture); +} diff --git a/game/src/resources.h b/game/src/resources.h index 647bca3..3a79850 100644 --- a/game/src/resources.h +++ b/game/src/resources.h @@ -3,6 +3,7 @@ #include #include #include +#include #include "gl/program.h" #include "gl/texture.h" @@ -16,3 +17,4 @@ void resources_programs_set_mat4 (const char *name, mat4 *mat); unsigned int resources_get_program (char *key); unsigned int resources_get_texture (char *key); void resources_init (); +void resources_guile_register (); diff --git a/game/src/ui/uiman.c b/game/src/ui/uiman.c index 02c6e0f..74d8eae 100644 --- a/game/src/ui/uiman.c +++ b/game/src/ui/uiman.c @@ -21,7 +21,8 @@ uiman_init () glm_ortho (0.0, gvar_get ("window_width"), gvar_get ("window_height"), 0.0, -1.0, 1.0, projection); ui_root = Widget_new (); - IVEC2_SETI (ui_root->size, gvar_get ("window_width"), gvar_get ("window_height")); + ui_root->size[0] = gvar_get ("window_width"); + ui_root->size[1] = gvar_get ("window_height"); scm_c_primitive_load ("res/scripts/global/ui_styles.scm"); scm_c_primitive_load ("res/scripts/global/ui_composites.scm"); @@ -120,7 +121,8 @@ uiman_cb_window_resize (SDL_Event *event, void *data) { UNUSED (event, data); glm_ortho (0.0, gvar_get ("window_width"), gvar_get ("window_height"), 0.0, -1.0, 1.0, projection); - IVEC2_SETI (ui_root->size, gvar_get ("window_width"), gvar_get ("window_height")); + ui_root->size[0] = gvar_get ("window_width"); + ui_root->size[1] = gvar_get ("window_height"); return FALSE; } @@ -179,7 +181,8 @@ uiman_cb_mouse_motion (SDL_Event *event, void *data) { g_string_overwrite (tooltip_text->multiline_text.text, 0, tooltip_source->tooltip->str); tooltip_widget->visible = TRUE; - IVEC2_SETI (tooltip_widget->position, pos[0] + 12, pos[1] + 12); + tooltip_widget->position[0] = pos[0] + 12; + tooltip_widget->position[1] = pos[1] + 12; } else { diff --git a/game/src/util.h b/game/src/util.h index 08a5a60..9c90c2a 100644 --- a/game/src/util.h +++ b/game/src/util.h @@ -1,20 +1,13 @@ #pragma once -#include -#include - -#define GAME_NAME "Wschód" -#define GAME_VERSION "0.2" +#define GAME_NAME "Wschód" +#define GAME_VERSION "0.3" #define UNUSED(...) (UNUSED_1 (__VA_ARGS__, 0)) #define UNUSED_1(arg, ...) (void) arg, UNUSED_2 (__VA_ARGS__, 0) #define UNUSED_2(arg, ...) (void) arg, UNUSED_3 (__VA_ARGS__, 0) #define UNUSED_3(arg, ...) (void) arg -#define VEC2_SETI(v, x, y) glm_vec2_copy((vec2) { x, y }, v) -#define IVEC2_SETI(v, x, y) glm_ivec2_copy((ivec2) { x, y }, v) -#define VEC4_SETI(v, r, g, b, a) glm_vec4_copy((vec4) { r, g, b, a }, v) - /* GLib log levels: