summaryrefslogtreecommitdiff
path: root/prge_texture.c
diff options
context:
space:
mode:
authorpryazha <pryadeiniv@mail.ru>2025-03-19 08:46:04 +0500
committerpryazha <pryadeiniv@mail.ru>2025-03-19 08:46:04 +0500
commitb1389bad67cccd3da6815c2d5a436c177f09594b (patch)
tree393dee77b5faef3cfd6e78eda8ac07273cdcc85e /prge_texture.c
parent34821e9fefb0d7cbf9e72a2457b2901edbbe03bb (diff)
window, texture, model, camera and gui (silly button)
Diffstat (limited to 'prge_texture.c')
-rw-r--r--prge_texture.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/prge_texture.c b/prge_texture.c
new file mode 100644
index 0000000..cce3374
--- /dev/null
+++ b/prge_texture.c
@@ -0,0 +1,69 @@
+Texture load_texture(Arena *arena, char *filename, B32 gamma_correction)
+{
+ U8 *data;
+
+ S32 nchannels;
+ GLenum internal_format;
+ GLenum data_format;
+
+ Texture texture;
+
+ Arena *temparena;
+
+ char *cfilename;
+ Str8 str;
+
+ Assert(arena);
+
+ MemoryZeroStruct(&texture);
+
+ temparena = arena_alloc(0);
+
+ cfilename = str8tocstr(arena, filename);
+
+ stbi_set_flip_vertically_on_load(1);
+ data = stbi_load(cfilename, &texture.width, &texture.height, &nchannels, 0);
+
+ if (!data) {
+ str = str8pushf(temparena, "[ERROR] : Texture : %s : Failed to load\n", cfilename);
+ goto end;
+ }
+
+ switch (nchannels) {
+ case 1:
+ texture.type = TextureType_R;
+ internal_format = data_format = GL_RED;
+ break;
+ case 3:
+ texture.type = TextureType_RGB;
+ internal_format = (gamma_correction) ? GL_SRGB : GL_RGB;
+ data_format = GL_RGB;
+ break;
+ case 4:
+ texture.type = TextureType_RGBA;
+ internal_format = (gamma_correction) ? GL_SRGB_ALPHA : GL_RGBA;
+ data_format = GL_RGBA;
+ break;
+ default:
+ str = str8pushf(temparena, "[ERROR] : Texture : %s : Unsupported type\n", cfilename);
+ goto end;
+ }
+
+ glGenTextures(1, &texture.id);
+ glBindTexture(GL_TEXTURE_2D, texture.id);
+ glTexImage2D(GL_TEXTURE_2D, 0, internal_format, texture.width, texture.height, 0, data_format, GL_UNSIGNED_BYTE, data);
+ glGenerateMipmap(GL_TEXTURE_2D);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glBindTexture(GL_TEXTURE_2D, 0);
+
+ str = str8pushf(temparena, "[INFO] : Texture : %s : Loaded successfully\n", cfilename);
+
+end:
+ str8print(str);
+ stbi_image_free(data);
+ arena_release(temparena);
+ return texture;
+}