1 /* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */
8 #define VG_TEXTURE_NO_MIP 0x1
9 #define VG_TEXTURE_REPEAT 0x2
10 #define VG_TEXTURE_CLAMP 0x4
11 #define VG_TEXTURE_NEAREST 0x8
12 #define VG_TEXTURE_ALLOCATED_INTERNAL 0x10
14 #define QOI_IMPLEMENTATION
15 #define QOI_MALLOC vg_alloc
16 #define QOI_FREE vg_free
18 #include "phoboslab/qoi.h"
32 static void vg_tex2d_bind( vg_tex2d
*tex
, u32 id
)
34 if( !(tex
->flags
& VG_TEXTURE_ALLOCATED_INTERNAL
) )
36 vg_error( "Tried to use '%s' while unloaded!\n", tex
->path
);
40 glActiveTexture( GL_TEXTURE0
+ id
);
41 glBindTexture( GL_TEXTURE_2D
, tex
->name
);
44 static inline void vg_tex2d_mipmap(void)
46 glGenerateMipmap( GL_TEXTURE_2D
);
49 static inline void vg_tex2d_linear(void)
51 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
52 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
55 static inline void vg_tex2d_nearest(void)
57 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
58 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
61 static inline void vg_tex2d_linear_mipmap(void)
63 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
,
64 GL_LINEAR_MIPMAP_LINEAR
);
65 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
68 static inline void vg_tex2d_repeat(void)
70 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_REPEAT
);
71 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_REPEAT
);
74 static inline void vg_tex2d_clamp(void)
76 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
);
77 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
);
80 static GLuint
vg_tex2d_rgba( const char *path
)
83 u8
*src_data
= vg_asset_read_s( path
, &length
);
86 glGenTextures( 1, &texture_name
);
87 glBindTexture( GL_TEXTURE_2D
, texture_name
);
92 u8
*tex_buffer
= qoi_decode( src_data
, length
, &info
, 4 );
94 glTexImage2D( GL_TEXTURE_2D
, 0, GL_RGBA
, info
.width
, info
.height
,
95 0, GL_RGBA
, GL_UNSIGNED_BYTE
, tex_buffer
);
97 vg_free( tex_buffer
);
110 vg_error( "Loading texture failed (%s)\n", path
);
111 glTexImage2D( GL_TEXTURE_2D
, 0, GL_RGBA
, 2, 2,
112 0, GL_RGBA
, GL_UNSIGNED_BYTE
, tex_err
);
118 static void vg_tex2d_init( vg_tex2d
*textures
[], int num
)
120 for( int i
=0; i
<num
; i
++ )
122 vg_tex2d
*tex
= textures
[i
];
123 tex
->name
= vg_tex2d_rgba( tex
->path
);
124 if( !(tex
->flags
& VG_TEXTURE_NO_MIP
) )
127 if( tex
->flags
& VG_TEXTURE_NEAREST
)
129 if( tex
->flags
& VG_TEXTURE_NO_MIP
)
130 vg_error( "Invalid texture settings\n" );
136 if( tex
->flags
& VG_TEXTURE_NO_MIP
)
139 vg_tex2d_linear_mipmap();
142 if( tex
->flags
& VG_TEXTURE_CLAMP
)
147 tex
->flags
|= VG_TEXTURE_ALLOCATED_INTERNAL
;
151 static void vg_tex2d_free( vg_tex2d
*textures
[], int num
)
153 for( int i
= 0; i
< num
; i
++ )
155 glDeleteTextures( 1, &textures
[i
]->name
);
159 #endif /* VG_TEX_H */