Setup example shader.

This commit is contained in:
2022-01-02 22:30:41 -08:00
parent 79ba0faf97
commit 6e76d03d13
28 changed files with 343 additions and 199 deletions

View File

@ -11,38 +11,50 @@ assetmanagerloaderdefinition_t ASSET_MANAGER_LOADERS[] = {
{
&_assetManagerLoaderTextureAsync,
&_assetManagerLoaderTextureSync,
&_assetManagerLoaderTextureDispose,
NULL
&_assetManagerLoaderTextureDispose
},
{
&_assetManagerLoaderFontAsync,
&_assetManagerLoaderFontSync,
&_assetManagerLoaderFontDispose,
NULL
&_assetManagerLoaderFontDispose
},
{
&_assetManagerLoaderShaderAsync,
&_assetManagerLoaderShaderSync,
&_assetManagerLoaderShaderDispose,
NULL
&_assetManagerLoaderShaderDispose
},
{
&_assetManagerLoaderScaledTextureAsync,
&_assetManagerLoaderScaledTextureSync,
&_assetManagerLoaderScaledTextureDispose,
NULL
&_assetManagerLoaderScaledTextureDispose
}
};
bool _assetManagerOnSaveManagerValueChange(
void *usr, event_t evt, void *args[], int32_t argc
) {
ASSERT_EQUAL(argc, 3);
printf("Hello World\n");
return true;
}
void assetManagerInit(assetmanager_t *manager, savemanager_t *save) {
threadInit(&manager->thread, &_assetManagerThread);
eventManagerInit(&manager->events);
manager->thread.user = manager;
manager->itemCount = 0;
manager->finished = false;
manager->holderCount = 0;
manager->running = false;
manager->save = save;
manager->listenerOnSaveValueChange = eventManagerSubscribe(
&save->events, SAVE_EVENT_VALUE_CHANGED,
manager, &_assetManagerOnSaveManagerValueChange
);
}
float assetManagerProgressGet(assetmanager_t *manager) {
@ -53,15 +65,13 @@ float assetManagerProgressGet(assetmanager_t *manager) {
done = 0.0f;
for(i = 0; i < manager->itemCount; i++) {
item = manager->items + i;
done += assetManagerItemIsFinished(
item, ASSET_MANAGER_LOADERS + item->type
) ? 1 : 0;
done += assetManagerItemIsFinished(item) ? 1 : 0;
}
return done / ((float)manager->itemCount);
}
float assetManagerProgressGetForHolder(
assetmanager_t *manager, assetmanagerowner_t hold
assetmanager_t *manager, assetmanagerholder_t hold
) {
float done;
uint8_t i, j, c;
@ -75,9 +85,7 @@ float assetManagerProgressGetForHolder(
for(j = 0; j < item->holderCount; j++) {
if(item->holders[j] != hold) continue;
c++;
done += assetManagerItemIsFinished(
item, ASSET_MANAGER_LOADERS + item->type
) ? 1 : 0;
done += assetManagerItemIsFinished(item) ? 1 : 0;
break;
}
}
@ -86,13 +94,13 @@ float assetManagerProgressGetForHolder(
return done / (float)c;
}
assetmanagerowner_t assetManagerHolderCreate(assetmanager_t *man) {
assetmanagerholder_t assetManagerHolderCreate(assetmanager_t *man) {
uint8_t i;
// Find first available number.
for(i = 0; i < 0xFF; i++) {
if(arrayFind(
sizeof(assetmanagerowner_t), man->holders, man->holderCount, &i
sizeof(assetmanagerholder_t), man->holders, man->holderCount, &i
) == -1) break;
}
@ -100,13 +108,13 @@ assetmanagerowner_t assetManagerHolderCreate(assetmanager_t *man) {
return i;// No slots left.
}
void assetManagerHolderRelease(assetmanager_t *man, assetmanagerowner_t hold) {
void assetManagerHolderRelease(assetmanager_t *man, assetmanagerholder_t hold) {
int32_t i;
uint8_t j;
assetmanageritem_t *item;
size_t s;
s = sizeof(assetmanagerowner_t);
s = sizeof(assetmanagerholder_t);
i = arrayFind(s, man->holders,man->holderCount,&hold);
if(i == -1) return;
@ -142,6 +150,8 @@ void assetManagerDispose(assetmanager_t *man) {
assetmanagerloader_t *disp;
assetmanageritem_t *item;
eventManagerUnsubscribe(&man->save->events, man->listenerOnSaveValueChange);
for(i = 0; i < man->itemCount; i++) {
item = man->items + i;
disp = ASSET_MANAGER_LOADERS[item->type].dispose;
@ -201,8 +211,11 @@ void assetManagerUpdate(assetmanager_t *manager) {
uint8_t i;
assetmanageritem_t *item;
assetmanagerloaderdefinition_t *definition;
void *args[2];
bool result;
args[0] = manager;
// Autostart
if(assetManagerProgressGet(manager) < 1.0f && !manager->running) {
assetManagerStart(manager);
@ -233,11 +246,16 @@ void assetManagerUpdate(assetmanager_t *manager) {
item->state = ASSET_MANAGER_STATE_SYNC_LOADING;
result = definition->loadSync(item);
// Finish loading
// Finish loading, fire events
if(!result) {
item->state = ASSET_MANAGER_STATE_SYNC_ERROR;
} else {
item->state = ASSET_MANAGER_STATE_SYNC_DONE;
args[1] = item;
eventManagerTrigger(
&manager->events, ASSET_MANAGER_EVENT_ITEM_LOADED, args, 2
);
}
}

View File

@ -14,9 +14,12 @@
#include "loaders/texture.h"
#include "asset.h"
#include "../save/save.h"
#include "../engine/event.h"
// Constants
extern assetmanagerloaderdefinition_t ASSET_MANAGER_LOADERS[];
/** Callback Listener for save manager value changes */
bool _assetManagerOnSaveManagerValueChange(
void *usr, event_t evt, void *args[], int32_t argc
);
/**
* Initialize the asset manager
@ -42,7 +45,7 @@ float assetManagerProgressGet(assetmanager_t *manager);
* @return The percentage (0-1) of the loaded assets.
*/
float assetManagerProgressGetForHolder(
assetmanager_t *manager, assetmanagerowner_t hold
assetmanager_t *manager, assetmanagerholder_t hold
);
/**
@ -54,7 +57,7 @@ float assetManagerProgressGetForHolder(
* @param man Asset manager in question
* @return An asset manager owner ID.
*/
assetmanagerowner_t assetManagerHolderCreate(assetmanager_t *man);
assetmanagerholder_t assetManagerHolderCreate(assetmanager_t *man);
/**
* Release a previously reserved asset manager holder. This will (in turn) cause
@ -63,7 +66,7 @@ assetmanagerowner_t assetManagerHolderCreate(assetmanager_t *man);
* @param man Asset manager holder to release for.
* @param hold Holder to release.
*/
void assetManagerHolderRelease(assetmanager_t *man, assetmanagerowner_t hold);
void assetManagerHolderRelease(assetmanager_t *man, assetmanagerholder_t hold);
/**
* Disposes all assets that are not currently held (released assets). This can

View File

@ -8,7 +8,7 @@
#include "font.h"
assetmanageritem_t * assetManagerLoadFont(
assetmanager_t *manager, assetmanagerowner_t owner, const char fileName[]
assetmanager_t *manager, assetmanagerholder_t owner, const char fileName[]
) {
assetmanageritem_t *item;
item = assetManagerItemGet(manager, fileName);

View File

@ -19,7 +19,7 @@
* @return A pointer to the asset manager item for tracking.
*/
assetmanageritem_t * assetManagerLoadFont(
assetmanager_t *manager, assetmanagerowner_t owner, const char fileName[]
assetmanager_t *manager, assetmanagerholder_t owner, const char fileName[]
);
bool _assetManagerLoaderFontAsync(assetmanageritem_t *item);

View File

@ -33,7 +33,7 @@ assetmanageritem_t * assetManagerItemAdd(
}
uint8_t assetManagerItemGetOrAddHolder(
assetmanageritem_t *item, assetmanagerowner_t owner
assetmanageritem_t *item, assetmanagerholder_t owner
) {
uint8_t i, firstEmpty;
firstEmpty = 0xFF;
@ -50,7 +50,13 @@ uint8_t assetManagerItemGetOrAddHolder(
return firstEmpty;
}
bool assetManagerItemIsFinished(assetmanageritem_t *item, assetmanagerloaderdefinition_t *def) {
bool assetManagerItemIsFinished(assetmanageritem_t *item) {
assetmanagerloaderdefinition_t *def;
ASSERT_NOT_NULL(item);
def = ASSET_MANAGER_LOADERS +item->type;
// Sync done is always done
if(item->state == ASSET_MANAGER_STATE_SYNC_DONE) return true;
// Only check if ASYNC is done.

View File

@ -36,16 +36,13 @@ assetmanageritem_t * assetManagerItemAdd(
* @return The index within the item that the owner is at.
*/
uint8_t assetManagerItemGetOrAddHolder(
assetmanageritem_t *i, assetmanagerowner_t o
assetmanageritem_t *i, assetmanagerholder_t o
);
/**
* Checks if a given asset item is finished or not.
* Checks if a given asset item is finished loading or not.
*
* @param item Item to check.
* @param def Item type definition used for loading.
* @return True if finished, otherwise false.
*/
bool assetManagerItemIsFinished(
assetmanageritem_t *item, assetmanagerloaderdefinition_t *def
);
bool assetManagerItemIsFinished(assetmanageritem_t *item);

View File

@ -8,7 +8,7 @@
#include "scaledtexture.h"
assetmanageritem_t * assetManagerLoadScaledTexture(
assetmanager_t *manager, assetmanagerowner_t owner,
assetmanager_t *manager, assetmanagerholder_t owner,
const char path[], const char file[]
) {
assetmanageritem_t *item;
@ -17,7 +17,7 @@ assetmanageritem_t * assetManagerLoadScaledTexture(
char buffer[ASSET_MANAGER_ITEM_NAME_MAX];
// Get the scale
scale = saveManagerGetUint8(manager->save, SAVE_KEY_TEXTURE_SCALE);
scale = saveManagerGetU8(manager->save, SAVE_KEY_TEXTURE_SCALE);
// Generate a key
sprintf(buffer, "%s/%s", path, file);
@ -167,7 +167,7 @@ void assetManagerScaledTextureRescaleAll(assetmanager_t *manager) {
uint8_t i, scale;
// Get the new scale
scale = saveManagerGetUint8(manager->save, SAVE_KEY_TEXTURE_SCALE);
scale = saveManagerGetU8(manager->save, SAVE_KEY_TEXTURE_SCALE);
// Rescale each texture. This is, unfortunately, blocking for now.
for(i = 0; i < manager->itemCount; i++) {

View File

@ -21,7 +21,7 @@
* @return A pointer to the asset manager item for tracking.
*/
assetmanageritem_t * assetManagerLoadScaledTexture(
assetmanager_t *manager, assetmanagerowner_t owner,
assetmanager_t *manager, assetmanagerholder_t owner,
const char path[], const char file[]
);

View File

@ -8,7 +8,7 @@
#include "shader.h"
assetmanageritem_t * assetManagerLoadShader(
assetmanager_t *manager, assetmanagerowner_t owner,
assetmanager_t *manager, assetmanagerholder_t owner,
const char fileVert[], const char fileFrag[]
) {
assetmanageritem_t *item;

View File

@ -20,7 +20,7 @@
* @return A pointer to the asset manager item for tracking.
*/
assetmanageritem_t * assetManagerLoadShader(
assetmanager_t *manager, assetmanagerowner_t owner,
assetmanager_t *manager, assetmanagerholder_t owner,
const char fileVert[], const char fileFrag[]
);

View File

@ -8,7 +8,7 @@
#include "texture.h"
assetmanageritem_t * assetManagerLoadTexture(
assetmanager_t *manager, assetmanagerowner_t owner, const char fileName[]
assetmanager_t *manager, assetmanagerholder_t owner, const char fileName[]
) {
assetmanageritem_t *item;
item = assetManagerItemGet(manager, fileName);

View File

@ -19,7 +19,7 @@
* @return A pointer to the asset manager item for tracking.
*/
assetmanageritem_t * assetManagerLoadTexture(
assetmanager_t *manager, assetmanagerowner_t owner, const char fileName[]
assetmanager_t *manager, assetmanagerholder_t owner, const char fileName[]
);
bool _assetManagerLoaderTextureAsync(assetmanageritem_t *item);

View File

@ -8,13 +8,13 @@
#pragma once
#include "../../libs.h"
#include "../../engine/thread.h"
#include "../../engine/event.h"
#include "../../save/save.h"
#include "texture.h"
#include "font.h"
#include "shader.h"
#include "scaledtexture.h"
#define ASSET_MANAGER_ITEMS_MAX 64
#define ASSET_MANAGER_ITEM_NAME_MAX 96
#define ASSET_MANAGER_HOLDERS_MAX 8
@ -35,8 +35,11 @@
#define ASSET_MANAGER_TYPE_SHADER 0x02
#define ASSET_MANAGER_TYPE_SCALED_TEXTURE 0x03
/** Events */
#define ASSET_MANAGER_EVENT_ITEM_LOADED 0x00
// Owner
typedef uint8_t assetmanagerowner_t;
typedef uint8_t assetmanagerholder_t;
// Union of all the manager types
typedef union {
@ -52,7 +55,7 @@ typedef struct {
uint8_t state;
const char *key;
assetmanagerassetdata_t data;
assetmanagerowner_t holders[ASSET_MANAGER_HOLDERS_MAX];
assetmanagerholder_t holders[ASSET_MANAGER_HOLDERS_MAX];
uint8_t holderCount;
} assetmanageritem_t;
@ -64,15 +67,14 @@ typedef struct {
assetmanagerloader_t *loadAsync;
assetmanagerloader_t *loadSync;
assetmanagerloader_t *dispose;
assetmanagerloader_t *update;
} assetmanagerloaderdefinition_t;
// Manager
typedef struct {
thread_t thread;
savemanager_t *save;
eventlistener_t *listenerOnSaveValueChange;
eventmanager_t events;
bool finished;
bool running;
@ -80,6 +82,9 @@ typedef struct {
assetmanageritem_t items[ASSET_MANAGER_ITEMS_MAX];
uint8_t itemCount;
assetmanagerowner_t holders[ASSET_MANAGER_HOLDERS_MAX];
assetmanagerholder_t holders[ASSET_MANAGER_HOLDERS_MAX];
uint8_t holderCount;
} assetmanager_t;
} assetmanager_t;
// Constants
extern assetmanagerloaderdefinition_t ASSET_MANAGER_LOADERS[];