Setup example shader.
This commit is contained in:
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
@ -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);
|
@ -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++) {
|
||||
|
@ -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[]
|
||||
);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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[]
|
||||
);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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[];
|
Reference in New Issue
Block a user