More Guile integration
This commit is contained in:
@@ -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"))
|
||||
@@ -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")
|
||||
+79
-18
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 ());
|
||||
|
||||
@@ -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
|
||||
|
||||
+4
-1
@@ -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 ();
|
||||
|
||||
+45
-28
@@ -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);
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include <SDL3_image/SDL_image.h>
|
||||
#include <glib-2.0/glib.h>
|
||||
#include <cglm/cglm.h>
|
||||
#include <libguile.h>
|
||||
|
||||
#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 ();
|
||||
|
||||
+6
-3
@@ -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
|
||||
{
|
||||
|
||||
+2
-9
@@ -1,20 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#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:
|
||||
|
||||
Reference in New Issue
Block a user