summaryrefslogtreecommitdiff
path: root/src/resources
diff options
context:
space:
mode:
author0scar <qgt268@alumni.ku.dk>2024-02-19 07:14:06 +0000
committer0scar <qgt268@alumni.ku.dk>2024-02-19 07:18:45 +0000
commitb0bfd3cf610fdf243503447f6ad9fa19de502365 (patch)
treea519569bb12219f685c32427972da67ee345ff82 /src/resources
parentbfe5cc29b1f31fe4921264a96a58607c836ee516 (diff)
Add texture loading
Diffstat (limited to 'src/resources')
-rw-r--r--src/resources/include/engine/resources.h16
-rw-r--r--src/resources/include/engine/resources/texture.h10
-rw-r--r--src/resources/src/resources.c10
-rw-r--r--src/resources/src/textures.c41
4 files changed, 49 insertions, 28 deletions
diff --git a/src/resources/include/engine/resources.h b/src/resources/include/engine/resources.h
index fe78a7d..707bbde 100644
--- a/src/resources/include/engine/resources.h
+++ b/src/resources/include/engine/resources.h
@@ -65,8 +65,8 @@ typedef struct {
typedef struct {
enum Asset type;
const char* path;
- i32 width;
- i32 height;
+ /* Bits per component, set to zero if you don't want to change the format. */
+ i32 bpc;
} Asset_TextureSpec;
typedef union {
@@ -90,21 +90,25 @@ typedef struct {
/* Loaded assets */
usize shader_len;
Shader* shader;
+
+ usize texture_len;
+ Texture* texture;
} Resources;
#define TextureDefinition(_path, ...) unimplemented
#define Resource_AudioDefinition(_path, ...) unimplemented
-#define Declare_Shader(_path) (const asset_t){.shader = {.type = Asset_shader, .path=_path}}
+#define Declare_Shader(PATH) (const asset_t){.shader = {.type = Asset_shader, .path=PATH}}
#define Declare_ShaderProgram(SHADERS, NUMSHADERS) (const asset_t){.shaderprog = {.type = Asset_shaderprog, .shader=SHADERS, .shader_len=NUMSHADERS}}
+#define Declare_Texture(PATH) (const asset_t){.texture = {.type = Asset_texture, .path=PATH, .bpc=0}}
void* get_asset(Resources* r, u32 idx);
/* Each of resource_load_font, resource_load_texture, and resource_load_audio
* loads a given resource into the engines memory and returns an identifier.
*/
-isize resource_load_font(Asset_FontSpec font_def);
-isize resource_load_texture(Asset_TextureSpec texture_def);
-isize resource_load_audio(Asset_AudioSpec audio_def);
+//isize resource_load_font(Asset_FontSpec font_def);
+//isize resource_load_texture(Asset_TextureSpec texture_def);
+//isize resource_load_audio(Asset_AudioSpec audio_def);
// Loads all resources specified in `assets` and populates corresponding
// resources members.
diff --git a/src/resources/include/engine/resources/texture.h b/src/resources/include/engine/resources/texture.h
index 979dd25..9f533d6 100644
--- a/src/resources/include/engine/resources/texture.h
+++ b/src/resources/include/engine/resources/texture.h
@@ -6,14 +6,10 @@ extern "C" {
#endif
#include <engine/core/types.h>
+#include <engine/resources.h>
+#include <engine/rendering/rendering.h>
-typedef struct {
- const i32 tilesize;
- const i32 width;
- const i32 height;
-} Texture;
-
-Texture* load_texture(void* render, const Asset_TextureSpec* ts);
+Texture load_texture(const Asset_TextureSpec *restrict ts);
#ifdef __cplusplus
}
diff --git a/src/resources/src/resources.c b/src/resources/src/resources.c
index 99f6f99..a42a864 100644
--- a/src/resources/src/resources.c
+++ b/src/resources/src/resources.c
@@ -42,6 +42,7 @@ i32 resources_load(Resources *resources) {
isize i = 0;
+ // Count each type of resource so we can allocate appropriate sizes.
for (i = 0; i < resources->assets_len; i++) {
isize idx = 0;
@@ -50,7 +51,7 @@ i32 resources_load(Resources *resources) {
case Asset_font: idx = font_len++; WARN("Font resource type not implemented!"); break;
case Asset_shader: idx = shader_len++; break;
case Asset_shaderprog: idx = shaderprog_len++; break;
- case Asset_texture: idx = texture_len++; WARN("Texture resource type not implemented!");break;
+ case Asset_texture: idx = texture_len++; break;
case Asset_error:
default:
@@ -59,13 +60,14 @@ i32 resources_load(Resources *resources) {
break;
}
+ // Update index translation table.
resources->get[i] = idx;
}
//resources->audio = calloc(audio_len, sizeof());
//resources->font = calloc(font_len, sizeof());
resources->shader = calloc(shaderprog_len, sizeof(Shader));
- //resources->texture = calloc(texture_len, sizeof());
+ resources->texture = calloc(texture_len, sizeof(Texture));
Shader* imm_shader = calloc(shader_len, sizeof(Shader));
@@ -110,8 +112,8 @@ i32 resources_load(Resources *resources) {
resources->shader[resources->shader_len++] = s;
} break;
case Asset_texture:
- texture_len++;
- WARN("Texture resource type not implemented!");
+ resources->texture[resources->texture_len++] = load_texture(&resources->assets[i].texture);
+ resources->texture_len++;
break;
case Asset_error:
diff --git a/src/resources/src/textures.c b/src/resources/src/textures.c
index cde56b7..7c205ef 100644
--- a/src/resources/src/textures.c
+++ b/src/resources/src/textures.c
@@ -1,22 +1,41 @@
#include <engine/core/logging.h>
#include <engine/resources.h>
+#include <stb/stb_image.h>
-// Use the engine/render.h backend to create a renderer-specific texture
-
-Texture* load_texture(void* render, const Asset_TextureSpec* ts) {
- Texture* t = NULL;
+/* Uses stb_image to load an image, and passes it to the renderer for
+ * backend-specific texture creation. */
+Texture load_texture(const Asset_TextureSpec *restrict ts) {
+ int width;
+ int height;
+ int components_per_pixel;
+ unsigned char* img;
+ Texture t;
+ const Texture err = (Texture){.id = 0, .width = 0, .height = 0};
if (ts == NULL) {
ERROR("Invalid Asset_TextureSpec\n");
- return NULL;
+ return err;
+ }
+
+ if (ts->path == NULL) {
+ ERROR("Missing path in Asset_TextureSpec\n");
+ return err;
}
- //t = (Texture*)malloc(sizeof(Texture));
- //t->texture = new_texture;
- ///* Assigning const value */
- //*(i32*)&t->tilesize = tw;
- //*(i32*)&t->width = ts->width;
- //*(i32*)&t->height = ts->height;
+ img = stbi_load(ts->path, &width, &height, &components_per_pixel, 0);
+
+ if (img == NULL) {
+ ERROR("Failed to load image %s", ts->path);
+ return err;
+ } else {
+ t = createTextureFromImageData(img, width, height);
+ stbi_image_free(img);
+ }
+
+ if (t.id == 0) {
+ ERROR("Failed to create texture %s!", ts->path);
+ return err;
+ }
return t;
}