diff options
Diffstat (limited to 'sources')
-rw-r--r-- | sources/main.c | 28 | ||||
-rw-r--r-- | sources/text.h | 12 | ||||
-rw-r--r-- | sources/texture.h | 48 |
3 files changed, 77 insertions, 11 deletions
diff --git a/sources/main.c b/sources/main.c index 9dcaad1..b9f702f 100644 --- a/sources/main.c +++ b/sources/main.c @@ -1,21 +1,17 @@ #include "raylib.h" +#include "text.h" +#include "texture.h" + #include <libguile.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <pthread.h> - -static SCM rl_draw_text(SCM text) -{ - scm_t_string_failed_conversion_handler handler; - char* str = scm_to_stringn(text, NULL, NULL, handler); - DrawText(str, 200, 80, 20, RED); -} - static void* game (void* data) { - scm_c_define_gsubr ("rl-draw-text", 1, 0, 0, &rl_draw_text); + //rl_text_define_methods(); + rl_texture_define_methods(); const int screen_width = 800; const int screen_height = 600; @@ -32,12 +28,22 @@ static void* game (void* data) while (!WindowShouldClose()) { - scm_call_0(guile_update); + scm_call_with_blocked_asyncs(guile_update); + //scm_call_0(guile_update); BeginDrawing(); ClearBackground(RAYWHITE); - scm_call_0(guile_draw); + scm_call_with_blocked_asyncs(guile_draw); + //scm_call_0(guile_draw); EndDrawing(); + + // This doesn't change anything + // SCM_TICK; + + // This line makes memory manageable - until it crashes again (takes more time to crash though) + // scm_run_finalizers(); + // This crashes after just a couple of frames + // scm_gc(); } CloseWindow(); diff --git a/sources/text.h b/sources/text.h new file mode 100644 index 0000000..2f2584a --- /dev/null +++ b/sources/text.h @@ -0,0 +1,12 @@ +#include "raylib.h" +#include <libguile.h> + +static void rl_draw_text(SCM text) { + scm_t_string_failed_conversion_handler handler; + char* str = scm_to_stringn(text, NULL, NULL, handler); + DrawText(str, 200, 80, 20, RED); +} + +static void rl_text_define_methods() { + scm_c_define_gsubr ("rl-draw-text", 1, 0, 0, rl_draw_text); +} diff --git a/sources/texture.h b/sources/texture.h new file mode 100644 index 0000000..f7bd3c3 --- /dev/null +++ b/sources/texture.h @@ -0,0 +1,48 @@ +#include "raylib.h" +#include <libguile.h> +#include <stdio.h> + +struct texture_2d { + Texture2D texture; +}; + +static SCM texture_2d_type; + +static void finalize_texture_2d(SCM texture_2d_scm) { + struct texture_2d *texture_2d; + texture_2d = scm_foreign_object_ref(texture_2d_scm, 0); + UnloadTexture(texture_2d->texture); +} + +static void init_texture_2d_type (void) { + SCM name, slots; + scm_t_struct_finalize finalizer; + + name = scm_from_utf8_symbol("texture_2d"); + slots = scm_list_1(scm_from_utf8_symbol("data")); + finalizer = finalize_texture_2d; + + texture_2d_type = scm_make_foreign_object_type(name, slots, finalizer); +} + +static SCM rl_load_texture(SCM file_name_scm) { + scm_t_string_failed_conversion_handler handler; + char* file_name = scm_to_stringn(file_name_scm, NULL, NULL, handler); + + struct texture_2d *new_texture_2d; + + // Tested different mallocs, didn't work + /* new_texture_2d = (struct texture_2d *) scm_malloc(sizeof (struct texture_2d)); */ + new_texture_2d = (struct texture_2d *) scm_gc_malloc(sizeof (struct texture_2d), "texture_2d"); + + new_texture_2d->texture = LoadTexture(file_name); + + return scm_make_foreign_object_1(texture_2d_type, new_texture_2d); +} + +static void rl_texture_define_methods() { + init_texture_2d_type(); + + scm_c_define_gsubr ("rl-load-texture", 1, 0, 0, rl_load_texture); +} + |