105 lines
3.1 KiB
C
105 lines
3.1 KiB
C
/**
|
|
* Copyright (c) 2026 Dominic Masters
|
|
*
|
|
* This software is released under the MIT License.
|
|
* https://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
#include "assetentry.h"
|
|
#include "assert/assert.h"
|
|
#include "util/memory.h"
|
|
#include "util/string.h"
|
|
|
|
void assetEntryInit(
|
|
assetentry_t *entry,
|
|
const char_t *name,
|
|
const assetloadertype_t type,
|
|
assetloaderinput_t *input
|
|
) {
|
|
assertNotNull(entry, "Entry cannot be NULL");
|
|
assertStrLenMin(name, 1, "Name cannot be empty");
|
|
assertStrLenMax(name, ASSET_FILE_NAME_MAX - 1, "Name too long");
|
|
assertTrue(type != ASSET_LOADER_TYPE_NULL, "Invalid loader type.");
|
|
assertTrue(type < ASSET_LOADER_TYPE_COUNT, "Invalid loader type.");
|
|
assertIsMainThread("Must be called from the main thread.");
|
|
|
|
memoryZero(entry, sizeof(assetentry_t));
|
|
stringCopy(entry->name, name, ASSET_FILE_NAME_MAX);
|
|
entry->type = type;
|
|
entry->state = ASSET_ENTRY_STATE_NOT_STARTED;
|
|
if(input) {
|
|
entry->inputData = *input;
|
|
entry->input = &entry->inputData;
|
|
} else {
|
|
memoryZero(&entry->inputData, sizeof(assetloaderinput_t));
|
|
entry->input = NULL;
|
|
}
|
|
refInit(&entry->refs, entry, NULL, NULL, NULL);
|
|
|
|
eventInit(
|
|
&entry->onLoaded,
|
|
entry->onLoadedCallbacks, entry->onLoadedUsers,
|
|
ASSET_ENTRY_EVENT_MAX
|
|
);
|
|
eventInit(
|
|
&entry->onUnloaded,
|
|
entry->onUnloadedCallbacks, entry->onUnloadedUsers,
|
|
ASSET_ENTRY_EVENT_MAX
|
|
);
|
|
eventInit(
|
|
&entry->onError,
|
|
entry->onErrorCallbacks, entry->onErrorUsers,
|
|
ASSET_ENTRY_EVENT_MAX
|
|
);
|
|
}
|
|
|
|
void assetEntryLock(assetentry_t *entry) {
|
|
assertNotNull(entry, "Entry cannot be NULL");
|
|
assertTrue(entry->type != ASSET_LOADER_TYPE_NULL, "Invalid loader type.");
|
|
|
|
refLock(&entry->refs);
|
|
}
|
|
|
|
void assetEntryUnlock(assetentry_t *entry) {
|
|
assertNotNull(entry, "Entry cannot be NULL");
|
|
assertTrue(entry->type != ASSET_LOADER_TYPE_NULL, "Invalid loader type.");
|
|
|
|
refUnlock(&entry->refs);
|
|
}
|
|
|
|
void assetEntryStartLoading(
|
|
assetentry_t *entry,
|
|
assetloading_t *loading
|
|
) {
|
|
assertNotNull(entry, "Entry cannot be NULL");
|
|
assertNotNull(loading, "Loading cannot be NULL");
|
|
assertTrue(entry->type != ASSET_LOADER_TYPE_NULL, "Invalid loader type.");
|
|
assertTrue(
|
|
entry->state == ASSET_ENTRY_STATE_NOT_STARTED,
|
|
"Can only start loading from NOT_STARTED state."
|
|
);
|
|
assertIsMainThread("Must be called from the main thread.");
|
|
|
|
entry->state = ASSET_ENTRY_STATE_PENDING_SYNC;
|
|
memoryZero(&loading->loading, sizeof(assetloaderloading_t));
|
|
loading->type = entry->type;
|
|
loading->entry = entry;
|
|
// At this point the asset manager will manage this thing's loading
|
|
}
|
|
|
|
errorret_t assetEntryDispose(assetentry_t *entry) {
|
|
assertNotNull(entry, "Entry cannot be NULL");
|
|
assertTrue(entry->type != ASSET_LOADER_TYPE_NULL, "Invalid loader type.");
|
|
assertTrue(entry->type < ASSET_LOADER_TYPE_COUNT, "Invalid loader type.");
|
|
assertIsMainThread("Must be called from the main thread.");
|
|
assertTrue(
|
|
entry->refs.count == 0,
|
|
"Asset entry still refed at dispose time."
|
|
);
|
|
|
|
eventInvoke(&entry->onUnloaded, entry);
|
|
errorChain(ASSET_LOADER_CALLBACKS[entry->type].dispose(entry));
|
|
memoryZero(entry, sizeof(assetentry_t));
|
|
errorOk();
|
|
}
|