diff options
| author | pryazha <pryadeiniv@mail.ru> | 2025-10-12 15:25:23 +0500 |
|---|---|---|
| committer | pryazha <pryadeiniv@mail.ru> | 2025-10-12 15:25:23 +0500 |
| commit | 818f818f583881156eb279c71b1359bf2c4f3580 (patch) | |
| tree | 874e8d2fdc5334bc70925aa87923791f7662ddb8 /texture.c | |
| parent | 3cf987880e384140bf996c37f820ddeea38bc60e (diff) | |
change identation, maybe will change back, add own gl functions loading, and glx example
Diffstat (limited to 'texture.c')
| -rw-r--r-- | texture.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/texture.c b/texture.c new file mode 100644 index 0000000..6b63f5c --- /dev/null +++ b/texture.c @@ -0,0 +1,53 @@ +#include "texture.h" + +i32 +load_texture(struct arena *arena, struct texture *texture, const char *filename, i32 gamma) +{ + stbi_set_flip_vertically_on_load(1); + i32 nchannels; + u8 *data = stbi_load(filename, &texture->width, &texture->height, &nchannels, 0); + if (!data) { + info("failed to load \"%s\"", filename); + return 0; + } + u32 internal_format, data_format; + switch (nchannels) { + case 1: + texture->type = texture_r; + internal_format = data_format = gl_red; + break; + case 3: + texture->type = texture_rgb; + internal_format = gamma ? gl_srgb : gl_rgb; + data_format = gl_rgb; + break; + case 4: + texture->type = texture_rgba; + internal_format = gamma ? gl_srgb_alpha : gl_rgba; + data_format = gl_rgba; + break; + default: + printf("\"%s\" unsupported texture format %i", filename, nchannels); + return 0; + } + u64 size = texture->type * texture->width * texture->height; + texture->data = push_arena(arena, size); + memmove(texture->data, data, size); + stbi_image_free(data); + + gl_gen_textures(1, &texture->id); + gl_bind_texture(gl_texture_2d, texture->id); + gl_tex_image_2d(gl_texture_2d, 0, internal_format, texture->width, + texture->height, 0, data_format, gl_unsigned_byte, + texture->data); + gl_gen_mipmap(gl_texture_2d); + gl_tex_parami(gl_texture_2d, gl_texture_wrap_s, gl_repeat); + gl_tex_parami(gl_texture_2d, gl_texture_wrap_t, gl_repeat); + gl_tex_parami(gl_texture_2d, gl_texture_min_filter, gl_linear_mipmap_linear); + gl_tex_parami(gl_texture_2d, gl_texture_mag_filter, gl_linear); + gl_bind_texture(gl_texture_2d, 0); + + info("\"%s\" loaded successfully", filename); + + return texture->id; +} |
