Setup example shader.
This commit is contained in:
@ -1,11 +1,10 @@
|
||||
# Copyright (c) 2021 Dominic Msters
|
||||
# Copyright (c) 2022 Dominic Msters
|
||||
#
|
||||
# This software is released under the MIT License.
|
||||
# https://opensource.org/licenses/MIT
|
||||
|
||||
# Sources
|
||||
# target_sources(${PROJECT_NAME}
|
||||
# PRIVATE
|
||||
# standardshader.c
|
||||
# shaderui.c
|
||||
# )
|
||||
target_sources(${PROJECT_NAME}
|
||||
PRIVATE
|
||||
standardshader.c
|
||||
)
|
@ -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) {
|
||||
|
||||
}
|
@ -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);
|
@ -7,5 +7,107 @@
|
||||
|
||||
#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);
|
||||
}
|
@ -7,7 +7,10 @@
|
||||
|
||||
#pragma once
|
||||
#include "../../libs.h"
|
||||
#include "../../assert/assert.h"
|
||||
#include "../../engine/event.h"
|
||||
#include "../shaderprogram.h"
|
||||
#include "../../file/assetmanager.h"
|
||||
|
||||
#define STANDARD_SHADER_UNIFORM_NAME_VIEW "u_View"
|
||||
#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_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 {
|
||||
shaderprogram_t shader;
|
||||
assetmanageritem_t *shaderProgram;
|
||||
assetmanagerholder_t holder;
|
||||
eventlistener_t *onItemLoaded;
|
||||
|
||||
shaderuniform_t uniformView;
|
||||
shaderuniform_t uniformProjection;
|
||||
@ -25,4 +35,10 @@ typedef struct {
|
||||
shaderuniform_t uniformColor;
|
||||
} 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);
|
Reference in New Issue
Block a user