X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=src%2Fgacela_GL.c;h=541e4abea16e17d4e1ce7f1ec72e55a78abd46ad;hb=500b68bdf16918b05f859830cc83d5a429d5b447;hp=3bc341e6ee9a22c0c3f3c445289eb6e76574565a;hpb=b7c7d22dc3feba7710769fdb0fdc0a863718de4e;p=gacela.git diff --git a/src/gacela_GL.c b/src/gacela_GL.c index 3bc341e..541e4ab 100644 --- a/src/gacela_GL.c +++ b/src/gacela_GL.c @@ -24,6 +24,7 @@ struct glTexture { GLuint texture_id; + int width, height; }; static scm_t_bits glTexture_tag; @@ -55,6 +56,38 @@ get_glTexture_id (SCM glTexture_smob) return glTexture->texture_id; } +SCM +get_glTexture_width (SCM glTexture_smob) +{ + struct glTexture *glTexture; + + scm_assert_smob_type (glTexture_tag, glTexture_smob); + glTexture = (struct glTexture *) SCM_SMOB_DATA (glTexture_smob); + return scm_from_int (glTexture->width); +} + +SCM +get_glTexture_height (SCM glTexture_smob) +{ + struct glTexture *glTexture; + + scm_assert_smob_type (glTexture_tag, glTexture_smob); + glTexture = (struct glTexture *) SCM_SMOB_DATA (glTexture_smob); + return scm_from_int (glTexture->height); +} + +SCM +set_glTexture_size (SCM glTexture_smob, SCM width, SCM height) +{ + struct glTexture *glTexture; + + scm_assert_smob_type (glTexture_tag, glTexture_smob); + glTexture = (struct glTexture *) SCM_SMOB_DATA (glTexture_smob); + glTexture->width = scm_to_int (width); + glTexture->height = scm_to_int (height); + return SCM_UNSPECIFIED; +} + size_t free_glTexture (SCM glTexture_smob) { @@ -214,7 +247,7 @@ gacela_glGenTextures (SCM n) glGenTextures (nint, &text[0]); for (i = nint - 1; i >= 0; i--) { - textures = scm_cons (scm_from_int (text[i]), textures); + textures = scm_cons (make_glTexture (text[i]), textures); } return textures; @@ -238,7 +271,7 @@ gacela_glDeleteTextures (SCM n, SCM textures) SCM gacela_glBindTexture (SCM target, SCM texture) { - glBindTexture (scm_to_int (target), scm_to_int (texture)); + glBindTexture (scm_to_int (target), get_glTexture_id (texture)); return SCM_UNSPECIFIED; } @@ -346,6 +379,9 @@ GL_register_functions (void* data) { glTexture_tag = scm_make_smob_type ("glTexture", sizeof (struct glTexture)); scm_set_smob_free (glTexture_tag, free_glTexture); + scm_c_define_gsubr ("texture-w", 1, 0, 0, get_glTexture_width); + scm_c_define_gsubr ("texture-h", 1, 0, 0, get_glTexture_height); + scm_c_define_gsubr ("set-texture-size!", 3, 0, 0, set_glTexture_size); // Data types scm_c_define ("GL_UNSIGNED_BYTE", scm_from_int (GL_UNSIGNED_BYTE)); @@ -381,6 +417,7 @@ GL_register_functions (void* data) // Blending scm_c_define ("GL_BLEND", scm_from_int (GL_BLEND)); scm_c_define ("GL_ONE", scm_from_int (GL_ONE)); + scm_c_define ("GL_ONE_MINUS_SRC_ALPHA", scm_from_int (GL_ONE_MINUS_SRC_ALPHA)); scm_c_define ("GL_SRC_ALPHA", scm_from_int (GL_SRC_ALPHA)); // Fog