// 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;
+};
+
+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 );
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 );
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 );
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 );
+ }
+}