diff --git a/src/dusk/overworld/overworld.h b/src/dusk/overworld/overworld.h index 09c02e8..1b4b1c9 100644 --- a/src/dusk/overworld/overworld.h +++ b/src/dusk/overworld/overworld.h @@ -7,15 +7,14 @@ #pragma once #include "entity.h" - -#define OVERWORLD_ENTITY_COUNT_MAX 32 +#include "overworlddefs.h" typedef struct { entity_t entities[OVERWORLD_ENTITY_COUNT_MAX]; uint8_t entityCount; } overworld_t; -extern overworld_t overworld; +extern overworld_t OVERWORLD; /** * Initializes the overworld. diff --git a/src/dusk/overworld/overworlddefs.h b/src/dusk/overworld/overworlddefs.h new file mode 100644 index 0000000..fd98669 --- /dev/null +++ b/src/dusk/overworld/overworlddefs.h @@ -0,0 +1,8 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#define OVERWORLD_ENTITY_COUNT_MAX 32 \ No newline at end of file diff --git a/src/duskgl/display/shader/CMakeLists.txt b/src/duskgl/display/shader/CMakeLists.txt index aaf48bf..fc94c69 100644 --- a/src/duskgl/display/shader/CMakeLists.txt +++ b/src/duskgl/display/shader/CMakeLists.txt @@ -12,5 +12,6 @@ target_sources(${DUSK_TARGET_NAME} ) # Subdirs +add_subdirectory(data) add_subdirectory(entityshader) add_subdirectory(fragments) \ No newline at end of file diff --git a/src/duskgl/display/shader/data/CMakeLists.txt b/src/duskgl/display/shader/data/CMakeLists.txt new file mode 100644 index 0000000..b2a310b --- /dev/null +++ b/src/duskgl/display/shader/data/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright (c) 2025 Dominic Masters +# +# This software is released under the MIT License. +# https://opensource.org/licenses/MIT + +# Sources +target_sources(${DUSK_TARGET_NAME} + PRIVATE + transforms.c +) \ No newline at end of file diff --git a/src/duskgl/display/shader/data/entities.h b/src/duskgl/display/shader/data/entities.h new file mode 100644 index 0000000..6a297ea --- /dev/null +++ b/src/duskgl/display/shader/data/entities.h @@ -0,0 +1,7 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + diff --git a/src/duskgl/display/shader/fragments/transforms.c b/src/duskgl/display/shader/data/transforms.c similarity index 100% rename from src/duskgl/display/shader/fragments/transforms.c rename to src/duskgl/display/shader/data/transforms.c diff --git a/src/duskgl/display/shader/fragments/transforms.h b/src/duskgl/display/shader/data/transforms.h similarity index 100% rename from src/duskgl/display/shader/fragments/transforms.h rename to src/duskgl/display/shader/data/transforms.h diff --git a/src/duskgl/display/shader/entityshader/entity.glsl b/src/duskgl/display/shader/entityshader/entity.glsl new file mode 100644 index 0000000..51831d2 --- /dev/null +++ b/src/duskgl/display/shader/entityshader/entity.glsl @@ -0,0 +1,16 @@ +// Copyright (c) 2025 Dominic Masters +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT + +#include "../fragments/quad.glsl" +#include "../../../../dusk/overworld/overworlddefs.h" + +struct Entity { + vec2 position; +}; + +layout(std140) uniform b_Entities { + Entity entities[OVERWORLD_ENTITY_COUNT_MAX]; + uint entityCount; +}; \ No newline at end of file diff --git a/src/duskgl/display/shader/entityshader/entity_frag.glsl b/src/duskgl/display/shader/entityshader/entity_frag.glsl index 0f36b08..7d685e4 100644 --- a/src/duskgl/display/shader/entityshader/entity_frag.glsl +++ b/src/duskgl/display/shader/entityshader/entity_frag.glsl @@ -1,4 +1,10 @@ +// Copyright (c) 2025 Dominic Masters +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT + #include "../fragments/header.glsl" +#include "entity.glsl" // Inputs from vertex shader in vec2 v_TextureCoord; diff --git a/src/duskgl/display/shader/entityshader/entity_vert.glsl b/src/duskgl/display/shader/entityshader/entity_vert.glsl index 7d2c4fe..6b6df65 100644 --- a/src/duskgl/display/shader/entityshader/entity_vert.glsl +++ b/src/duskgl/display/shader/entityshader/entity_vert.glsl @@ -1,6 +1,12 @@ +// Copyright (c) 2025 Dominic Masters +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT + #include "../fragments/header.glsl" #include "../fragments/transforms.glsl" #include "../fragments/quad.glsl" +#include "entity.glsl" // Outputs to fragment shader out vec2 v_TextureCoord; diff --git a/src/duskgl/display/shader/entityshader/entityshader.c b/src/duskgl/display/shader/entityshader/entityshader.c index 2d70cfc..ad47aaa 100644 --- a/src/duskgl/display/shader/entityshader/entityshader.c +++ b/src/duskgl/display/shader/entityshader/entityshader.c @@ -10,7 +10,7 @@ #include "entityshader.h" #include "entity_vert.glsl.h" #include "entity_frag.glsl.h" -#include "display/shader/fragments/transforms.h" +#include "display/shader/data/transforms.h" entityshader_t ENTITY_SHADER; @@ -30,11 +30,13 @@ void entityShaderInit() { ); // Uniforms + + // Bind + shaderBufferBindToBlock(&TRANSFORMS_BUFFER, ENTITY_SHADER.transformsBlock); } void entityShaderUse() { shaderUse(&ENTITY_SHADER.shader); - shaderBufferBindToBlock(&TRANSFORMS_BUFFER, ENTITY_SHADER.transformsBlock); } void entityShaderDispose() { diff --git a/src/duskgl/display/shader/entityshader/entityshader.h b/src/duskgl/display/shader/entityshader/entityshader.h index 7b7af9c..97fa7ed 100644 --- a/src/duskgl/display/shader/entityshader/entityshader.h +++ b/src/duskgl/display/shader/entityshader/entityshader.h @@ -11,7 +11,7 @@ typedef struct { shader_t shader; - // GLuint dataBlock; + GLuint entitiesBlock; GLuint transformsBlock; // GLuint tilesetsBlock; diff --git a/src/duskgl/display/shader/fragments/CMakeLists.txt b/src/duskgl/display/shader/fragments/CMakeLists.txt index b2a310b..fb0e252 100644 --- a/src/duskgl/display/shader/fragments/CMakeLists.txt +++ b/src/duskgl/display/shader/fragments/CMakeLists.txt @@ -6,5 +6,4 @@ # Sources target_sources(${DUSK_TARGET_NAME} PRIVATE - transforms.c ) \ No newline at end of file diff --git a/src/duskgl/display/shader/fragments/header.glsl b/src/duskgl/display/shader/fragments/header.glsl index c866201..349a8a2 100644 --- a/src/duskgl/display/shader/fragments/header.glsl +++ b/src/duskgl/display/shader/fragments/header.glsl @@ -1,6 +1,6 @@ -#version 330 core - // Copyright (c) 2025 Dominic Masters // // This software is released under the MIT License. -// https://opensource.org/licenses/MIT \ No newline at end of file +// https://opensource.org/licenses/MIT + +#version 330 core \ No newline at end of file diff --git a/src/duskgl/display/shader/shadermanager.c b/src/duskgl/display/shader/shadermanager.c index ef20aec..11497fe 100644 --- a/src/duskgl/display/shader/shadermanager.c +++ b/src/duskgl/display/shader/shadermanager.c @@ -6,26 +6,81 @@ */ #include "shadermanager.h" -#include "display/shader/fragments/transforms.h" +#include "assert/assert.h" +#include "display/shader/data/transforms.h" #include "display/shader/entityshader/entityshader.h" -void shaderManagerInit() { - // Initialize the shader buffers - transformsInit(); +shadermanagerdatacallback_t SHADER_MANAGER_DATA_CALLBACKS[] = { + { transformsInit, transformsUpdate, transformsDispose } +}; - // Initialize the shaders - entityShaderInit(); + +shadermanagershadercallback_t SHADER_MANAGER_SHADER_CALLBACKS[] = { + { entityShaderInit, entityShaderDispose } +}; + +void shaderManagerInit() { + size_t i; + assertTrue( + SHADER_MANAGER_SHADER_CALLBACKS_SIZE > 0, + "No Shader Callbacks Defined" + ); + assertTrue( + SHADER_MANAGER_DATA_CALLBACKS_SIZE > 0, + "No Data Callbacks Defined" + ); + + i = 0; + do { + assertNotNull( + SHADER_MANAGER_DATA_CALLBACKS[i].init, + "Data Callback is NULL" + ); + SHADER_MANAGER_DATA_CALLBACKS[i++].init(); + } while(i < SHADER_MANAGER_DATA_CALLBACKS_SIZE); + + i = 0; + do { + assertNotNull( + SHADER_MANAGER_SHADER_CALLBACKS[i].init, + "Shader Callback is NULL" + ); + SHADER_MANAGER_SHADER_CALLBACKS[i++].init(); + } while(i < SHADER_MANAGER_SHADER_CALLBACKS_SIZE); } void shaderManagerUpdate() { - // Update shader buffers - transformsUpdate(); + assertTrue( + SHADER_MANAGER_DATA_CALLBACKS_SIZE > 0, + "No Data Callbacks Defined" + ); + + size_t i = 0; + do { + assertNotNull( + SHADER_MANAGER_DATA_CALLBACKS[i].update, + "Data Callback is NULL" + ); + SHADER_MANAGER_DATA_CALLBACKS[i++].update(); + } while(i < SHADER_MANAGER_DATA_CALLBACKS_SIZE); } void shaderManagerDispose() { - // Dispose the shaders - entityShaderDispose(); + assertTrue( + SHADER_MANAGER_SHADER_CALLBACKS_SIZE > 0, + "No Shader Callbacks Defined" + ); + assertTrue( + SHADER_MANAGER_DATA_CALLBACKS_SIZE > 0, + "No Data Callbacks Defined" + ); - // Dispose the shader buffers - transformsDispose(); + size_t i = 0; + do { + assertNotNull( + SHADER_MANAGER_SHADER_CALLBACKS[i].dispose, + "Shader Callback is NULL" + ); + SHADER_MANAGER_SHADER_CALLBACKS[i++].dispose(); + } while(i < SHADER_MANAGER_SHADER_CALLBACKS_SIZE); } \ No newline at end of file diff --git a/src/duskgl/display/shader/shadermanager.h b/src/duskgl/display/shader/shadermanager.h index 5669cf5..65d4329 100644 --- a/src/duskgl/display/shader/shadermanager.h +++ b/src/duskgl/display/shader/shadermanager.h @@ -6,6 +6,30 @@ */ #pragma once +#include "dusk.h" + +typedef struct { + void (*init)(); + void (*update)(); + void (*dispose)(); +} shadermanagerdatacallback_t; + +typedef struct { + void (*init)(); + void (*dispose)(); +} shadermanagershadercallback_t; + +extern shadermanagerdatacallback_t SHADER_MANAGER_DATA_CALLBACKS[]; +extern shadermanagershadercallback_t SHADER_MANAGER_SHADER_CALLBACKS[]; + +#define SHADER_MANAGER_DATA_CALLBACKS_SIZE ( \ + sizeof(SHADER_MANAGER_DATA_CALLBACKS) / sizeof(shadermanagerdatacallback_t) \ +) + +#define SHADER_MANAGER_SHADER_CALLBACKS_SIZE ( \ + sizeof(SHADER_MANAGER_SHADER_CALLBACKS) / \ + sizeof(shadermanagershadercallback_t) \ +) /** * Initializes the Shader Manager diff --git a/src/duskgl/overworld/overworld.c b/src/duskgl/overworld/overworld.c index a3eac72..87979f1 100644 --- a/src/duskgl/overworld/overworld.c +++ b/src/duskgl/overworld/overworld.c @@ -11,5 +11,7 @@ void overworldRender() { entityShaderUse(); + + // Set entity data. quadRender(1); } \ No newline at end of file