/** * Copyright (c) 2021 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "texture.h" assetmanageritem_t * assetManagerLoadTexture( assetmanager_t *manager, assetmanagerowner_t owner, char *fileName ) { assetmanageritem_t *item; item = assetManagerItemGet(manager, fileName); if(item == NULL) { item = assetManagerItemAdd(manager, fileName); item->type = ASSET_MANAGER_TYPE_TEXTURE; item->data.texture.fileName = fileName; } assetManagerItemGetOrAddHolder(item, owner); return item; } bool _assetManagerLoaderTextureAsync(assetmanageritem_t *item) { assetbuffer_t *buffer; int channels; stbi_io_callbacks OPENGL_STBI_CALLBACKS; buffer = assetBufferOpen(item->data.texture.fileName); if(buffer == NULL) return false; // Setup the interface for STBI OPENGL_STBI_CALLBACKS.read = &assetBufferRead; OPENGL_STBI_CALLBACKS.skip = &assetBufferSkip; OPENGL_STBI_CALLBACKS.eof = &assetBufferEnd; // Buffer the image channels = 0; item->data.texture.data = (pixel_t *)stbi_load_from_callbacks( &OPENGL_STBI_CALLBACKS, buffer, &item->data.texture.width, &item->data.texture.height, &channels, STBI_rgb_alpha ); // Close the buffer assetBufferClose(buffer); if(item->data.texture.data == NULL) return false; return true; } bool _assetManagerLoaderTextureSync(assetmanageritem_t *item) { // Turn into a texture. textureInit( &item->data.texture.texture, item->data.texture.width, item->data.texture.height, item->data.texture.data ); // Cleanup stbi_image_free(item->data.texture.data); return true; } bool _assetManagerLoaderTextureDispose(assetmanageritem_t *item) { textureDispose(&item->data.texture.texture); return true; }