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

@ -8,6 +8,7 @@
#include "matrix.h" #include "matrix.h"
void matrixIdentity(matrix_t *matrix) { void matrixIdentity(matrix_t *matrix) {
ASSERT_NOT_NULL(matrix);
glm_mat4_identity(matrix->internalMatrix); glm_mat4_identity(matrix->internalMatrix);
} }
@ -16,6 +17,7 @@ void matrixLookAt(matrix_t *matrix,
float tx,float ty, float tz, float tx,float ty, float tz,
float ux, float uy, float uz float ux, float uy, float uz
) { ) {
ASSERT_NOT_NULL(matrix);
glm_lookat( glm_lookat(
(vec3){ x, y, z }, (vec3){ x, y, z },
(vec3){ tx, ty, tz }, (vec3){ tx, ty, tz },
@ -29,6 +31,7 @@ void matrixLook(matrix_t *matrix,
float pitch, float yaw, float roll, float pitch, float yaw, float roll,
float ux, float uy, float uz float ux, float uy, float uz
) { ) {
ASSERT_NOT_NULL(matrix);
glm_look( glm_look(
(vec3){ x, y, z }, (vec3){ x, y, z },
(vec3){ pitch, yaw, roll }, (vec3){ pitch, yaw, roll },
@ -40,23 +43,48 @@ void matrixLook(matrix_t *matrix,
void matrixPerspective(matrix_t *matrix, void matrixPerspective(matrix_t *matrix,
float fov, float aspect, float camNear, float camFar float fov, float aspect, float camNear, float camFar
) { ) {
ASSERT_NOT_NULL(matrix);
glm_perspective(fov, aspect, camNear, camFar, matrix->internalMatrix); glm_perspective(fov, aspect, camNear, camFar, matrix->internalMatrix);
} }
void matrixOrtho(matrix_t *matrix, void matrixOrtho(matrix_t *matrix,
float left, float right, float bottom, float top, float camNear, float camFar float left, float right, float bottom, float top, float camNear, float camFar
) { ) {
ASSERT_NOT_NULL(matrix);
glm_ortho(left, right, bottom, top, camNear, camFar, matrix->internalMatrix); glm_ortho(left, right, bottom, top, camNear, camFar, matrix->internalMatrix);
} }
void matrixTranslate(matrix_t *matrix, float x, float y, float z) { void matrixTranslate(matrix_t *matrix, float x, float y, float z) {
ASSERT_NOT_NULL(matrix);
glm_translate(matrix->internalMatrix, (vec3){ x, y, z }); glm_translate(matrix->internalMatrix, (vec3){ x, y, z });
} }
void matrixRotate(matrix_t *matrix, float angle, float x, float y, float z) { void matrixRotate(matrix_t *matrix, float angle, float x, float y, float z) {
ASSERT_NOT_NULL(matrix);
glm_rotate(matrix->internalMatrix, angle, (vec3){ x, y, z }); glm_rotate(matrix->internalMatrix, angle, (vec3){ x, y, z });
} }
void matrixScale(matrix_t *matrix, float x, float y, float z) { void matrixScale(matrix_t *matrix, float x, float y, float z) {
ASSERT_NOT_NULL(matrix);
glm_scale(matrix->internalMatrix, (vec3){ x, y, z }); glm_scale(matrix->internalMatrix, (vec3){ x, y, z });
}
matrix_t matrixPositionAndScale(
float x, float y, float z,
float pitch, float yaw, float roll,
float scaleX, float scaleY, float scaleZ
) {
matrix_t matrix;
matrixIdentity(&matrix);
matrixTranslate(&matrix, x, y, z);
// Rotation (YZX order)
matrixRotate(&matrix, yaw, 0, 1, 0);
matrixRotate(&matrix, roll, 0, 0, 1);
matrixRotate(&matrix, pitch, 1, 0, 0);
matrixScale(&matrix, scaleX, scaleY, scaleZ);
return matrix;
} }

View File

@ -7,6 +7,7 @@
#pragma once #pragma once
#include "../libs.h" #include "../libs.h"
#include "../assert/assert.h"
/** /**
* Representation for a matrix. Used as a highlevel wrapper for the math * Representation for a matrix. Used as a highlevel wrapper for the math
@ -120,4 +121,25 @@ void matrixRotate(matrix_t *matrix, float angle, float x, float y, float z);
* @param y Y vector to scale. * @param y Y vector to scale.
* @param z Z vector to scale. * @param z Z vector to scale.
*/ */
void matrixScale(matrix_t *matrix, float x, float y, float z); void matrixScale(matrix_t *matrix, float x, float y, float z);
/**
* Calculates a fairly standard position and scale matrix. Note that the matrix
* is calculated in the order of Translate, Yaw, Pitch, Roll, Scale.
*
* @param x X translation to apply.
* @param y Y translation to apply.
* @param z Z translation to apply.
* @param pitch Pitch rotation to apply.
* @param yaw Yaw rotation to apply.
* @param roll Roll rotation to apply.
* @param scaleX X scale factor.
* @param scaleY Y scale factor.
* @param scaleZ Z scale factor.
* @return A specially created transformation matrix.
*/
matrix_t matrixPositionAndScale(
float x, float y, float z,
float pitch, float yaw, float roll,
float scaleX, float scaleY, float scaleZ
);

View File

@ -50,6 +50,7 @@ void renderListRender(renderlist_t *list, renderlistbackshader_t *backShader) {
camera_t camera; camera_t camera;
int32_t i; int32_t i;
renderpass_t *pass; renderpass_t *pass;
matrix_t matrix;
// Setup the camera // Setup the camera
cameraLookAt(&camera, 0,0,1, 0,0,0); cameraLookAt(&camera, 0,0,1, 0,0,0);
@ -64,9 +65,9 @@ void renderListRender(renderlist_t *list, renderlistbackshader_t *backShader) {
backShader->program, backShader->uniformView, backShader->program, backShader->uniformView,
backShader->uniformProjection, &camera backShader->uniformProjection, &camera
); );
shaderUsePosition(backShader->program, backShader->uniformPosition,
0,0,0, 0,0,0 matrix = matrixPositionAndScale(0,0,0, 0,0,0, 1,1,1);
); shaderUseMatrix(backShader->program, backShader->uniformPosition, &matrix);
// Render each pass. // Render each pass.
for(i = 0; i < list->passCount; i++) { for(i = 0; i < list->passCount; i++) {

View File

@ -103,42 +103,6 @@ void shaderUseMatrix(
glUniformMatrix4fv(uniform, 1, GL_FALSE, matrix->internalMatrix[0]); glUniformMatrix4fv(uniform, 1, GL_FALSE, matrix->internalMatrix[0]);
} }
void shaderUsePosition(shaderprogram_t *shader, shaderuniform_t uniform,
float x, float y, float z,
float pitch, float yaw, float roll
) {
matrix_t matrix;
matrixIdentity(&matrix);
matrixTranslate(&matrix, x, y, z);
// Rotation (YZX order)
matrixRotate(&matrix, yaw, 0, 1, 0);
matrixRotate(&matrix, roll, 0, 0, 1);
matrixRotate(&matrix, pitch, 1, 0, 0);
shaderUseMatrix(shader, uniform, &matrix);
}
void shaderUsePositionAndScale(shaderprogram_t *shader, shaderuniform_t uniform,
float x, float y, float z,
float pitch, float yaw, float roll,
float scaleX, float scaleY, float scaleZ
) {
matrix_t matrix;
matrixIdentity(&matrix);
matrixTranslate(&matrix, x, y, z);
// Rotation (YZX order)
matrixRotate(&matrix, yaw, 0, 1, 0);
matrixRotate(&matrix, roll, 0, 0, 1);
matrixRotate(&matrix, pitch, 1, 0, 0);
matrixScale(&matrix, scaleX, scaleY, scaleZ);
shaderUseMatrix(shader, uniform, &matrix);
}
void shaderUseColor( void shaderUseColor(
shaderprogram_t *shader, shaderuniform_t uniform, pixel_t color shaderprogram_t *shader, shaderuniform_t uniform, pixel_t color
) { ) {

View File

@ -89,46 +89,6 @@ void shaderUseMatrix(
shaderprogram_t *shader, shaderuniform_t uniform, matrix_t *matrix shaderprogram_t *shader, shaderuniform_t uniform, matrix_t *matrix
); );
/**
* Set's the current translation matrix onto the shader for the next
* render to use. Rotation order is set to YZX.
* @param shader Shader to attach to.
* @param uniform Uniform to set the position on to.
* @param x X coordinate (world space).
* @param y Y coordinate (world space).
* @param z Z coordinate (world space).
* @param pitch Pitch of the object (local space).
* @param yaw Yaw of the object (local space).
* @param roll Roll of the object (local space).
*/
void shaderUsePosition(shaderprogram_t *shader, shaderuniform_t uniform,
float x, float y, float z,
float pitch, float yaw, float roll
);
/**
* Set's the current translation matrix onto the shader for the next
* render to use. Also provides scaling controls.
*
* @param shader Shader to attach to.
* @param uniform Uniform to set the position on to.
* @param x X coordinate (world space).
* @param y Y coordinate (world space).
* @param z Z coordinate (world space).
* @param pitch Pitch of the object (local space).
* @param yaw Yaw of the object (local space).
* @param roll Roll of the object (local space).
* @param scaleX X scale of model (1 being 100% scaled).
* @param scaleY Y scale of model (1 being 100% scaled).
* @param scaleZ Z scale of model (1 being 100% scaled).
*/
void shaderUsePositionAndScale(shaderprogram_t *shader, shaderuniform_t uniform,
float x, float y, float z,
float pitch, float yaw, float roll,
float scaleX, float scaleY, float scaleZ
);
/** /**
* Set a color on to the shader. * Set a color on to the shader.
* *

View File

@ -1,11 +1,10 @@
# Copyright (c) 2021 Dominic Msters # Copyright (c) 2022 Dominic Msters
# #
# This software is released under the MIT License. # This software is released under the MIT License.
# https://opensource.org/licenses/MIT # https://opensource.org/licenses/MIT
# Sources # Sources
# target_sources(${PROJECT_NAME} target_sources(${PROJECT_NAME}
# PRIVATE PRIVATE
# standardshader.c standardshader.c
# shaderui.c )
# )

View File

@ -1,12 +0,0 @@
/**
* Copyright (c) 2021 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "shaderui.h"
void shaderUiInit(shaderprogram_t *program) {
}

View File

@ -1,22 +0,0 @@
/**
* Copyright (c) 2021 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#pragma once
#include "../shaderprogram.h"
#include "../texture.h"
typedef struct {
shaderprogram_t program;
texture_t texture;
shaderuniform_t uniProjection;
shaderuniform_t uniModel;
shaderuniform_t uniTexture;
shaderuniform_t uniColor;
} uishader_t;
void shaderUiInit(shaderprogram_t *program);

View File

@ -7,5 +7,107 @@
#include "standardshader.h" #include "standardshader.h"
void standardShaderInit(standardshader_t *stds, char *vert, char *frag) { void _standardShaderUpdateUniforms(standardshader_t *stds) {
shaderprogram_t *sp;
ASSERT_NOT_NULL(stds);
sp = STANDARD_SHADER_SHADER(stds);
stds->uniformView = shaderGetUniformByName(
sp, STANDARD_SHADER_UNIFORM_NAME_VIEW
);
stds->uniformProjection = shaderGetUniformByName(
sp, STANDARD_SHADER_UNIFORM_NAME_PROJ
);
stds->uniformTexture = shaderGetUniformByName(
sp, STANDARD_SHADER_UNIFORM_NAME_TEXT
);
stds->uniformColor = shaderGetUniformByName(
sp, STANDARD_SHADER_UNIFORM_NAME_COLOR
);
stds->uniformPosition = shaderGetUniformByName(
sp, STANDARD_SHADER_UNIFORM_NAME_MODEL
);
}
bool _standardShaderOnAssetItemLoaded(void *u, event_t e, void *s[], int32_t c){
standardshader_t *ss = (standardshader_t *)u;
ASSERT_NOT_NULL(ss);
ASSERT_EQUAL(e, ASSET_MANAGER_EVENT_ITEM_LOADED);
ASSERT_NOT_NULL(s);
ASSERT_EQUAL(c, 2);
if(s[1] != ss->shaderProgram) return true;
eventManagerUnsubscribe(&((assetmanager_t *)s[0])->events, ss->onItemLoaded);
_standardShaderUpdateUniforms(ss);
return true;
}
void standardShaderInit(standardshader_t *stds, assetmanager_t *assetManager) {
ASSERT_NOT_NULL(stds);
ASSERT_NOT_NULL(assetManager);
// Begin loading the shader.
stds->holder = assetManagerHolderCreate(assetManager);
stds->shaderProgram = assetManagerLoadShader(
assetManager, stds->holder,
STANDARD_SHARER_FILE_VERTEX, STANDARD_SHADER_FILE_FRAGMENT
);
// Update uniforms
if(assetManagerItemIsFinished(stds->shaderProgram)) {
_standardShaderUpdateUniforms(stds);
} else {
stds->onItemLoaded = eventManagerSubscribe(
&assetManager->events, ASSET_MANAGER_EVENT_ITEM_LOADED,
stds, &_standardShaderOnAssetItemLoaded
);
}
}
void standardShaderUse(standardshader_t *stds) {
ASSERT_NOT_NULL(stds);
if(!assetManagerItemIsFinished(stds->shaderProgram)) return;
shaderUse(STANDARD_SHADER_SHADER(stds));
}
void standardShaderSetCamera(standardshader_t *stds, camera_t *camera) {
ASSERT_NOT_NULL(stds);
ASSERT_NOT_NULL(camera);
if(!assetManagerItemIsFinished(stds->shaderProgram)) return;
shaderUseCamera(STANDARD_SHADER_SHADER(stds),
stds->uniformView, stds->uniformProjection, camera
);
}
void standardShaderSetTexture(standardshader_t *stds, texture_t *texture) {
ASSERT_NOT_NULL(stds);
ASSERT_NOT_NULL(texture);
if(!assetManagerItemIsFinished(stds->shaderProgram)) return;
shaderUseTexture(STANDARD_SHADER_SHADER(stds), stds->uniformTexture, 0);
}
void standardShaderSetColor(standardshader_t *stds, pixel_t color) {
ASSERT_NOT_NULL(stds);
if(!assetManagerItemIsFinished(stds->shaderProgram)) return;
shaderUseColor(STANDARD_SHADER_SHADER(stds), stds->uniformColor, color);
}
void standardShaderSetPosition(standardshader_t *stds, matrix_t *matrix) {
ASSERT_NOT_NULL(stds);
ASSERT_NOT_NULL(matrix);
if(!assetManagerItemIsFinished(stds->shaderProgram)) return;
shaderUseMatrix(STANDARD_SHADER_SHADER(stds), stds->uniformPosition, matrix);
}
void standardShaderDispose(standardshader_t *stds, assetmanager_t *assMan) {
ASSERT_NOT_NULL(stds);
ASSERT_NOT_NULL(assMan);
assetManagerHolderRelease(assMan, stds->holder);
} }

View File

@ -7,7 +7,10 @@
#pragma once #pragma once
#include "../../libs.h" #include "../../libs.h"
#include "../../assert/assert.h"
#include "../../engine/event.h"
#include "../shaderprogram.h" #include "../shaderprogram.h"
#include "../../file/assetmanager.h"
#define STANDARD_SHADER_UNIFORM_NAME_VIEW "u_View" #define STANDARD_SHADER_UNIFORM_NAME_VIEW "u_View"
#define STANDARD_SHADER_UNIFORM_NAME_PROJ "u_Proj" #define STANDARD_SHADER_UNIFORM_NAME_PROJ "u_Proj"
@ -15,8 +18,15 @@
#define STANDARD_SHADER_UNIFORM_NAME_MODEL "u_Model" #define STANDARD_SHADER_UNIFORM_NAME_MODEL "u_Model"
#define STANDARD_SHADER_UNIFORM_NAME_COLOR "u_Color" #define STANDARD_SHADER_UNIFORM_NAME_COLOR "u_Color"
#define STANDARD_SHARER_FILE_VERTEX "shaders/textured.vert"
#define STANDARD_SHADER_FILE_FRAGMENT "shaders/textured.frag"
#define STANDARD_SHADER_SHADER(ss) (&ss->shaderProgram->data.shader.shader)
typedef struct { typedef struct {
shaderprogram_t shader; assetmanageritem_t *shaderProgram;
assetmanagerholder_t holder;
eventlistener_t *onItemLoaded;
shaderuniform_t uniformView; shaderuniform_t uniformView;
shaderuniform_t uniformProjection; shaderuniform_t uniformProjection;
@ -25,4 +35,10 @@ typedef struct {
shaderuniform_t uniformColor; shaderuniform_t uniformColor;
} standardshader_t; } standardshader_t;
void standardShaderInit(standardshader_t *stds, char *vert, char *frag); void standardShaderInit(standardshader_t *stds, assetmanager_t *assetManager);
void standardShaderUse(standardshader_t *stds);
void standardShaderSetCamera(standardshader_t *stds, camera_t *camera);
void standardShaderSetTexture(standardshader_t *stds, texture_t *texture);
void standardShaderSetColor(standardshader_t *stds, pixel_t color);
void standardShaderSetPosition(standardshader_t *stds, matrix_t *matrix);
void standardShaderDispose(standardshader_t *stds, assetmanager_t *assMan);

View File

@ -11,38 +11,50 @@ assetmanagerloaderdefinition_t ASSET_MANAGER_LOADERS[] = {
{ {
&_assetManagerLoaderTextureAsync, &_assetManagerLoaderTextureAsync,
&_assetManagerLoaderTextureSync, &_assetManagerLoaderTextureSync,
&_assetManagerLoaderTextureDispose, &_assetManagerLoaderTextureDispose
NULL
}, },
{ {
&_assetManagerLoaderFontAsync, &_assetManagerLoaderFontAsync,
&_assetManagerLoaderFontSync, &_assetManagerLoaderFontSync,
&_assetManagerLoaderFontDispose, &_assetManagerLoaderFontDispose
NULL
}, },
{ {
&_assetManagerLoaderShaderAsync, &_assetManagerLoaderShaderAsync,
&_assetManagerLoaderShaderSync, &_assetManagerLoaderShaderSync,
&_assetManagerLoaderShaderDispose, &_assetManagerLoaderShaderDispose
NULL
}, },
{ {
&_assetManagerLoaderScaledTextureAsync, &_assetManagerLoaderScaledTextureAsync,
&_assetManagerLoaderScaledTextureSync, &_assetManagerLoaderScaledTextureSync,
&_assetManagerLoaderScaledTextureDispose, &_assetManagerLoaderScaledTextureDispose
NULL
} }
}; };
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) { void assetManagerInit(assetmanager_t *manager, savemanager_t *save) {
threadInit(&manager->thread, &_assetManagerThread); threadInit(&manager->thread, &_assetManagerThread);
eventManagerInit(&manager->events);
manager->thread.user = manager; manager->thread.user = manager;
manager->itemCount = 0; manager->itemCount = 0;
manager->finished = false; manager->finished = false;
manager->holderCount = 0; manager->holderCount = 0;
manager->running = false; manager->running = false;
manager->save = save; manager->save = save;
manager->listenerOnSaveValueChange = eventManagerSubscribe(
&save->events, SAVE_EVENT_VALUE_CHANGED,
manager, &_assetManagerOnSaveManagerValueChange
);
} }
float assetManagerProgressGet(assetmanager_t *manager) { float assetManagerProgressGet(assetmanager_t *manager) {
@ -53,15 +65,13 @@ float assetManagerProgressGet(assetmanager_t *manager) {
done = 0.0f; done = 0.0f;
for(i = 0; i < manager->itemCount; i++) { for(i = 0; i < manager->itemCount; i++) {
item = manager->items + i; item = manager->items + i;
done += assetManagerItemIsFinished( done += assetManagerItemIsFinished(item) ? 1 : 0;
item, ASSET_MANAGER_LOADERS + item->type
) ? 1 : 0;
} }
return done / ((float)manager->itemCount); return done / ((float)manager->itemCount);
} }
float assetManagerProgressGetForHolder( float assetManagerProgressGetForHolder(
assetmanager_t *manager, assetmanagerowner_t hold assetmanager_t *manager, assetmanagerholder_t hold
) { ) {
float done; float done;
uint8_t i, j, c; uint8_t i, j, c;
@ -75,9 +85,7 @@ float assetManagerProgressGetForHolder(
for(j = 0; j < item->holderCount; j++) { for(j = 0; j < item->holderCount; j++) {
if(item->holders[j] != hold) continue; if(item->holders[j] != hold) continue;
c++; c++;
done += assetManagerItemIsFinished( done += assetManagerItemIsFinished(item) ? 1 : 0;
item, ASSET_MANAGER_LOADERS + item->type
) ? 1 : 0;
break; break;
} }
} }
@ -86,13 +94,13 @@ float assetManagerProgressGetForHolder(
return done / (float)c; return done / (float)c;
} }
assetmanagerowner_t assetManagerHolderCreate(assetmanager_t *man) { assetmanagerholder_t assetManagerHolderCreate(assetmanager_t *man) {
uint8_t i; uint8_t i;
// Find first available number. // Find first available number.
for(i = 0; i < 0xFF; i++) { for(i = 0; i < 0xFF; i++) {
if(arrayFind( if(arrayFind(
sizeof(assetmanagerowner_t), man->holders, man->holderCount, &i sizeof(assetmanagerholder_t), man->holders, man->holderCount, &i
) == -1) break; ) == -1) break;
} }
@ -100,13 +108,13 @@ assetmanagerowner_t assetManagerHolderCreate(assetmanager_t *man) {
return i;// No slots left. return i;// No slots left.
} }
void assetManagerHolderRelease(assetmanager_t *man, assetmanagerowner_t hold) { void assetManagerHolderRelease(assetmanager_t *man, assetmanagerholder_t hold) {
int32_t i; int32_t i;
uint8_t j; uint8_t j;
assetmanageritem_t *item; assetmanageritem_t *item;
size_t s; size_t s;
s = sizeof(assetmanagerowner_t); s = sizeof(assetmanagerholder_t);
i = arrayFind(s, man->holders,man->holderCount,&hold); i = arrayFind(s, man->holders,man->holderCount,&hold);
if(i == -1) return; if(i == -1) return;
@ -142,6 +150,8 @@ void assetManagerDispose(assetmanager_t *man) {
assetmanagerloader_t *disp; assetmanagerloader_t *disp;
assetmanageritem_t *item; assetmanageritem_t *item;
eventManagerUnsubscribe(&man->save->events, man->listenerOnSaveValueChange);
for(i = 0; i < man->itemCount; i++) { for(i = 0; i < man->itemCount; i++) {
item = man->items + i; item = man->items + i;
disp = ASSET_MANAGER_LOADERS[item->type].dispose; disp = ASSET_MANAGER_LOADERS[item->type].dispose;
@ -201,8 +211,11 @@ void assetManagerUpdate(assetmanager_t *manager) {
uint8_t i; uint8_t i;
assetmanageritem_t *item; assetmanageritem_t *item;
assetmanagerloaderdefinition_t *definition; assetmanagerloaderdefinition_t *definition;
void *args[2];
bool result; bool result;
args[0] = manager;
// Autostart // Autostart
if(assetManagerProgressGet(manager) < 1.0f && !manager->running) { if(assetManagerProgressGet(manager) < 1.0f && !manager->running) {
assetManagerStart(manager); assetManagerStart(manager);
@ -233,11 +246,16 @@ void assetManagerUpdate(assetmanager_t *manager) {
item->state = ASSET_MANAGER_STATE_SYNC_LOADING; item->state = ASSET_MANAGER_STATE_SYNC_LOADING;
result = definition->loadSync(item); result = definition->loadSync(item);
// Finish loading // Finish loading, fire events
if(!result) { if(!result) {
item->state = ASSET_MANAGER_STATE_SYNC_ERROR; item->state = ASSET_MANAGER_STATE_SYNC_ERROR;
} else { } else {
item->state = ASSET_MANAGER_STATE_SYNC_DONE; 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 "loaders/texture.h"
#include "asset.h" #include "asset.h"
#include "../save/save.h" #include "../save/save.h"
#include "../engine/event.h"
// Constants /** Callback Listener for save manager value changes */
extern assetmanagerloaderdefinition_t ASSET_MANAGER_LOADERS[]; bool _assetManagerOnSaveManagerValueChange(
void *usr, event_t evt, void *args[], int32_t argc
);
/** /**
* Initialize the asset manager * Initialize the asset manager
@ -42,7 +45,7 @@ float assetManagerProgressGet(assetmanager_t *manager);
* @return The percentage (0-1) of the loaded assets. * @return The percentage (0-1) of the loaded assets.
*/ */
float assetManagerProgressGetForHolder( 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 * @param man Asset manager in question
* @return An asset manager owner ID. * @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 * 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 man Asset manager holder to release for.
* @param hold Holder to release. * @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 * Disposes all assets that are not currently held (released assets). This can

View File

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

View File

@ -19,7 +19,7 @@
* @return A pointer to the asset manager item for tracking. * @return A pointer to the asset manager item for tracking.
*/ */
assetmanageritem_t * assetManagerLoadFont( 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); bool _assetManagerLoaderFontAsync(assetmanageritem_t *item);

View File

@ -33,7 +33,7 @@ assetmanageritem_t * assetManagerItemAdd(
} }
uint8_t assetManagerItemGetOrAddHolder( uint8_t assetManagerItemGetOrAddHolder(
assetmanageritem_t *item, assetmanagerowner_t owner assetmanageritem_t *item, assetmanagerholder_t owner
) { ) {
uint8_t i, firstEmpty; uint8_t i, firstEmpty;
firstEmpty = 0xFF; firstEmpty = 0xFF;
@ -50,7 +50,13 @@ uint8_t assetManagerItemGetOrAddHolder(
return firstEmpty; 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 // Sync done is always done
if(item->state == ASSET_MANAGER_STATE_SYNC_DONE) return true; if(item->state == ASSET_MANAGER_STATE_SYNC_DONE) return true;
// Only check if ASYNC is done. // 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. * @return The index within the item that the owner is at.
*/ */
uint8_t assetManagerItemGetOrAddHolder( 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 item Item to check.
* @param def Item type definition used for loading.
* @return True if finished, otherwise false. * @return True if finished, otherwise false.
*/ */
bool assetManagerItemIsFinished( bool assetManagerItemIsFinished(assetmanageritem_t *item);
assetmanageritem_t *item, assetmanagerloaderdefinition_t *def
);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -19,7 +19,7 @@
* @return A pointer to the asset manager item for tracking. * @return A pointer to the asset manager item for tracking.
*/ */
assetmanageritem_t * assetManagerLoadTexture( 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); bool _assetManagerLoaderTextureAsync(assetmanageritem_t *item);

View File

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

View File

@ -17,10 +17,7 @@ bool gameInit(game_t *game) {
cameraPerspective(&game->camera, 45.0f, 16.0f/9.0f, 0.001f, 1000.0f); cameraPerspective(&game->camera, 45.0f, 16.0f/9.0f, 0.001f, 1000.0f);
quadInit(&game->quad, 0.0f, 0.0f,0.0f,0.0f,0.0f, 1.0f,1.0f,1.0f,1.0f); quadInit(&game->quad, 0.0f, 0.0f,0.0f,0.0f,0.0f, 1.0f,1.0f,1.0f,1.0f);
shaderInit(&game->shader, standardShaderInit(&game->shader, &game->engine.assetManager);
assetStringLoad("shaders/textured.vert"),
assetStringLoad("shaders/textured.frag")
);
game->owner = assetManagerHolderCreate(&game->engine.assetManager); game->owner = assetManagerHolderCreate(&game->engine.assetManager);
game->item = assetManagerLoadScaledTexture( game->item = assetManagerLoadScaledTexture(
@ -43,12 +40,17 @@ bool gameUpdate(game_t *game, float delta) {
doneResize = true; doneResize = true;
} }
matrix_t pos = matrixPositionAndScale(0,0,0, 0,0,0, 1,1,1);
standardShaderUse(&game->shader);
standardShaderSetCamera(&game->shader, &game->camera);
standardShaderSetPosition(&game->shader, &pos);
standardShaderSetColor(&game->shader, PIXEL_COLOR_WHITE);
if(game->item->state == ASSET_MANAGER_STATE_SYNC_DONE) { if(game->item->state == ASSET_MANAGER_STATE_SYNC_DONE) {
shaderUse(&game->shader); standardShaderSetTexture(
// shaderUseCamera(&game->shader, &game->camera); &game->shader, &game->item->data.scaledTexture.texture
// shaderUsePosition(&game->shader, 0,0,0, 0,0,0); );
// shaderUseTexture(&game->shader, &game->item->data.scaledTexture.texture); primitiveDraw(&game->quad, 0, -1);
// primitiveDraw(&game->quad, 0, -1);
} }

View File

@ -13,14 +13,14 @@
#include "../../display/primitive/primitive.h" #include "../../display/primitive/primitive.h"
#include "../../display/primitive/quad.h" #include "../../display/primitive/quad.h"
#include "../../display/primitive/cube.h" #include "../../display/primitive/cube.h"
#include "../../display/shaderprogram.h" #include "../../display/shaders/standardshader.h"
typedef struct { typedef struct {
engine_t engine; engine_t engine;
camera_t camera; camera_t camera;
shaderprogram_t shader; standardshader_t shader;
primitive_t quad; primitive_t quad;
assetmanagerowner_t owner; assetmanagerholder_t owner;
assetmanageritem_t *item; assetmanageritem_t *item;
} game_t; } game_t;

View File

@ -11,6 +11,7 @@ void saveManagerInit(savemanager_t *man) {
ASSERT_NOT_NULL(man); ASSERT_NOT_NULL(man);
man->count = 0; man->count = 0;
eventManagerInit(&man->events);
// Set up defaults // Set up defaults
saveManagerSetU8(man, SAVE_KEY_TEXTURE_SCALE, 0x00); saveManagerSetU8(man, SAVE_KEY_TEXTURE_SCALE, 0x00);
@ -20,8 +21,11 @@ savevalue_t * saveManagerAddOrGet(savemanager_t *man, const char key[]) {
uint8_t i, j; uint8_t i, j;
ASSERT_NOT_NULL(man); ASSERT_NOT_NULL(man);
ASSERT_NOT_NULL(key);
j = saveManagerGetKey(man, key); j = saveManagerGetKey(man, key);
ASSERT_IF(j >= SAVE_VALUES_MAX, 0xFF);
ASSERT_IF(j < SAVE_VALUES_MAX, ASSERT_LESS_THAN(j, SAVE_VALUES_MAX));
if(j != 0xFF) return man->values + j; if(j != 0xFF) return man->values + j;
// Find empty key // Find empty key
@ -38,14 +42,8 @@ savevalue_t * saveManagerAddOrGet(savemanager_t *man, const char key[]) {
} }
uint8_t saveManagerGetKey(savemanager_t *man, const char key[]) { uint8_t saveManagerGetKey(savemanager_t *man, const char key[]) {
uint8_t i;
ASSERT_NOT_NULL(man); ASSERT_NOT_NULL(man);
return (uint8_t) arrayFindString(man->keys, man->count, key);
for(i = 0; i < man->count; i++) {
if(strcmp(man->keys[i], key) == 0) return i;
}
return 0xFF;
} }
void saveManagerRemove(savemanager_t *man, const char key[]) { void saveManagerRemove(savemanager_t *man, const char key[]) {
@ -60,13 +58,17 @@ void saveManagerRemove(savemanager_t *man, const char key[]) {
man->keys[i] = NULL; man->keys[i] = NULL;
} }
/////////////////////////////////// Setters ////////////////////////////////////
// Setters
savevalue_t * saveManagerSetBool( savevalue_t * saveManagerSetBool(
savemanager_t *man, const char key[], bool val savemanager_t *man, const char key[], bool val
) { ) {
savevalue_t *v = saveManagerAddOrGet(man, key); savevalue_t *v = saveManagerAddOrGet(man, key);
v->b = val; v->b = val;
void *evtArgs[3] = { man, key, &val };
eventManagerTrigger(&man->events, SAVE_EVENT_VALUE_CHANGED, evtArgs, 3);
return v; return v;
} }
@ -75,10 +77,15 @@ savevalue_t * saveManagerSetU8(
) { ) {
savevalue_t *v = saveManagerAddOrGet(man, key); savevalue_t *v = saveManagerAddOrGet(man, key);
v->u8 = val; v->u8 = val;
void *evtArgs[3] = { man, key, &val };
eventManagerTrigger(&man->events, SAVE_EVENT_VALUE_CHANGED, evtArgs, 3);
return v; return v;
} }
// Getters /////////////////////////////////// Getters ////////////////////////////////////
bool saveManagerGetBool(savemanager_t *man, const char key[]) { bool saveManagerGetBool(savemanager_t *man, const char key[]) {
return saveManagerAddOrGet(man, key)->b; return saveManagerAddOrGet(man, key)->b;
} }

View File

@ -9,11 +9,14 @@
#include "../libs.h" #include "../libs.h"
#include "../assert/assert.h" #include "../assert/assert.h"
#include "../util/array.h" #include "../util/array.h"
#include "../engine/event.h"
#define SAVE_VALUES_MAX 200 #define SAVE_VALUES_MAX 200
#define SAVE_KEY_TEXTURE_SCALE "TEXTURE_SCALE" #define SAVE_KEY_TEXTURE_SCALE "TEXTURE_SCALE"
#define SAVE_EVENT_VALUE_CHANGED 0x00
typedef union { typedef union {
bool b; bool b;
uint8_t u8; uint8_t u8;
@ -26,19 +29,64 @@ typedef struct {
const char *keys[SAVE_VALUES_MAX]; const char *keys[SAVE_VALUES_MAX];
savevalue_t values[SAVE_VALUES_MAX]; savevalue_t values[SAVE_VALUES_MAX];
uint8_t count; uint8_t count;
eventmanager_t events;
} savemanager_t; } savemanager_t;
/**
* Initialize the save manager.
*
* @param man Save manager to initialize.
*/
void saveManagerInit(savemanager_t *man); void saveManagerInit(savemanager_t *man);
/**
* Either add, or return, a pointer to a specific save manager value.
*
* @param man Save manager instance.
* @param key Key to get (or add).
* @return A pointer to the save value.
*/
savevalue_t * saveManagerAddOrGet(savemanager_t *man, const char key[]); savevalue_t * saveManagerAddOrGet(savemanager_t *man, const char key[]);
/**
* Get the index within the save manager that the given key is at. Returns 0xFF
* if the key is not present within the save manager.
*
* @param man Save manager to check.
* @param key Key to check for.
* @return The index within the save manager that the key is at.
*/
uint8_t saveManagerGetKey(savemanager_t *man, const char key[]); uint8_t saveManagerGetKey(savemanager_t *man, const char key[]);
/**
* Remove a key from the save manager.
*
* @param man Save manager to remove the key from.
* @param key Key to remove.
*/
void saveManagerRemove(savemanager_t *man, const char key[]); void saveManagerRemove(savemanager_t *man, const char key[]);
savevalue_t * saveManagerSetBool(savemanager_t *man,const char key[],bool val); /////////////////////////////////// Setters ////////////////////////////////////
/**
* Setter for Save Manager.
*
* @param man Save Manager instance.
* @param key Key to set.
* @param val Value to set.
* @return The save value pointer.
*/
savevalue_t * saveManagerSetBool(savemanager_t *man,const char key[],bool val);
savevalue_t * saveManagerSetU8(savemanager_t *man,const char key[],uint8_t val); savevalue_t * saveManagerSetU8(savemanager_t *man,const char key[],uint8_t val);
bool saveManagerGetBool(savemanager_t *man, char *key); /////////////////////////////////// Getters ////////////////////////////////////
uint8_t saveManagerGetU8(savemanager_t *man, char *key);
/**
* Getter for the Save Manager.
*
* @param man Save Manager to get from.
* @param key Key to get.
* @return The value for that key, may be garbage if not previously set.
*/
bool saveManagerGetBool(savemanager_t *man, const char key[]);
uint8_t saveManagerGetU8(savemanager_t *man, const char key[]);

View File

@ -21,7 +21,7 @@ typedef void scenecallback_t(scene_t *scene);
// Scene Definition // Scene Definition
typedef struct _scene_t { typedef struct _scene_t {
engine_t *engine; engine_t *engine;
assetmanagerowner_t assetOwner; assetmanagerholder_t assetOwner;
void *user; void *user;
/** Whether or not the assets that this scene depends upon have loaded */ /** Whether or not the assets that this scene depends upon have loaded */