More Guile integration

This commit is contained in:
2025-07-20 20:58:16 +02:00
parent c86b8ef7bb
commit 7168bb8f1f
11 changed files with 181 additions and 63 deletions
+18
View File
@@ -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"))
+19
View File
@@ -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
View File
@@ -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);
}
+2
View File
@@ -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);
-4
View File
@@ -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 ());
+4
View File
@@ -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
View File
@@ -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
View File
@@ -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);
}
+2
View File
@@ -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
View File
@@ -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
View File
@@ -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: