X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgacela_GL.c;h=a031dbae69bd7f6ab1edcfc0a32654b11a555940;hb=34606554273af331e082fc09331ee5c52909650a;hp=c261fa2a1d9e4a8238da59da12f973061544ff20;hpb=9fef3eaa3b432926d3af475fb2a673c76131c779;p=gacela.git diff --git a/src/gacela_GL.c b/src/gacela_GL.c index c261fa2..a031dba 100644 --- a/src/gacela_GL.c +++ b/src/gacela_GL.c @@ -20,6 +20,76 @@ #include #include "gacela_GL.h" + +struct glTexture +{ + GLuint texture_id; + int width, height; +}; + +static scm_t_bits glTexture_tag; + +SCM +make_glTexture (GLuint texture_id) +{ + SCM smob; + struct glTexture *glTexture; + + glTexture = (struct glTexture *) scm_gc_malloc (sizeof (struct glTexture), "glTexture"); + + glTexture->texture_id = 0; + + SCM_NEWSMOB (smob, glTexture_tag, glTexture); + + glTexture->texture_id = texture_id; + + return smob; +} + +GLuint +get_glTexture_id (SCM glTexture_smob) +{ + struct glTexture *glTexture; + + scm_assert_smob_type (glTexture_tag, glTexture_smob); + glTexture = (struct glTexture *) SCM_SMOB_DATA (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); +} + +size_t +free_glTexture (SCM glTexture_smob) +{ + struct glTexture *glTexture = (struct glTexture *) SCM_SMOB_DATA (glTexture_smob); + GLuint text[1]; + + text[0] = glTexture->texture_id; + glDeleteTextures (1, &text[0]); + scm_gc_free (glTexture, sizeof (struct glTexture), "glTexture"); + + return 0; +} + + SCM gacela_glBegin (SCM mode) { @@ -189,7 +259,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; } @@ -295,6 +365,11 @@ gacela_gluLookAt (SCM eyeX, SCM eyeY, SCM eyeZ, SCM centerX, SCM centerY, SCM ce void* 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); + // Data types scm_c_define ("GL_UNSIGNED_BYTE", scm_from_int (GL_UNSIGNED_BYTE));