X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=vg%2Fvg_tex.h;h=4c14540ca431a4b5404534dc5d44f27938e04467;hb=3363633178b1eea582304742ad1202487af0feb1;hp=742493b5720d8bfc4a873f864c9b209deb3ecee8;hpb=e6e0d50ffefea539f10e392d7ca4a95cd6abdfb8;p=fishladder.git diff --git a/vg/vg_tex.h b/vg/vg_tex.h index 742493b..4c14540 100644 --- a/vg/vg_tex.h +++ b/vg/vg_tex.h @@ -1,5 +1,28 @@ // Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved +#define VG_TEXTURE_NO_MIP 0x1 +#define VG_TEXTURE_REPEAT 0x2 +#define VG_TEXTURE_CLAMP 0x4 +#define VG_TEXTURE_NEAREST 0x8 + +struct vg_tex2d +{ + const char *path; + u32 flags; + GLuint name; +}; + +struct vg_sprite +{ + v4f uv_xywh; +}; + +static void vg_tex2d_bind( vg_tex2d *tex, u32 id ) +{ + glActiveTexture( GL_TEXTURE0 + id ); + glBindTexture( GL_TEXTURE_2D, tex->name ); +} + static inline void vg_tex2d_mipmap(void) { glGenerateMipmap( GL_TEXTURE_2D ); @@ -37,9 +60,6 @@ static inline void vg_tex2d_clamp(void) static GLuint vg_tex2d_rgba( const char *path ) { - int x,y,nc; - stbi_set_flip_vertically_on_load( 1 ); - i64 length; u8 *src_data = vg_asset_read_s( path, &length ); @@ -49,8 +69,10 @@ static GLuint vg_tex2d_rgba( const char *path ) if( src_data ) { - u8 *tex_buffer = stbi_load_from_memory( src_data, length, &x, &y, &nc, 4 ); - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex_buffer ); + qoi_desc info; + u8 *tex_buffer = qoi_decode( src_data, length, &info, 4 ); + + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, info.width, info.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex_buffer ); free( tex_buffer ); free( src_data ); @@ -71,3 +93,42 @@ static GLuint vg_tex2d_rgba( const char *path ) return texture_name; } + +static void vg_tex2d_init( vg_tex2d *textures[], int num ) +{ + for( int i = 0; i < num; i ++ ) + { + vg_tex2d *tex = textures[i]; + tex->name = vg_tex2d_rgba( tex->path ); + if( !(tex->flags & VG_TEXTURE_NO_MIP) ) + vg_tex2d_mipmap(); + + if( tex->flags & VG_TEXTURE_NEAREST ) + { + if( tex->flags & VG_TEXTURE_NO_MIP ) + vg_error( "Invalid texture settings\n" ); + else + vg_tex2d_nearest(); + } + else + { + if( tex->flags & VG_TEXTURE_NO_MIP ) + vg_tex2d_linear(); + else + vg_tex2d_linear_mipmap(); + } + + if( tex->flags & VG_TEXTURE_CLAMP ) + vg_tex2d_clamp(); + else + vg_tex2d_repeat(); + } +} + +static void vg_tex2d_free( vg_tex2d *textures[], int num ) +{ + for( int i = 0; i < num; i ++ ) + { + glDeleteTextures( 1, &textures[i]->name ); + } +}