From c8abdcb82e68f98288f83da73bb9a0fa2e870693 Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Sun, 2 Mar 2025 12:57:20 -0600 Subject: [PATCH] Entity positions. --- src/dusk/overworld/overworlddefs.h | 3 ++ src/dusk/overworld/player.c | 11 +++++ src/duskgl/display/shader/data/CMakeLists.txt | 1 + src/duskgl/display/shader/data/entities.c | 40 ++++++++++++++++++ src/duskgl/display/shader/data/entities.glsl | 41 +++++++++++++++++++ src/duskgl/display/shader/data/entities.h | 32 +++++++++++++++ src/duskgl/display/shader/data/transforms.c | 6 +-- .../{fragments => data}/transforms.glsl | 0 .../display/shader/entityshader/entity.glsl | 16 -------- .../shader/entityshader/entity_frag.glsl | 2 +- .../shader/entityshader/entity_vert.glsl | 7 ++-- .../shader/entityshader/entityshader.c | 7 ++++ .../shader/entityshader/entityshader.h | 4 -- .../display/shader/fragments/packed.glsl | 8 ++++ src/duskgl/display/shader/shadermanager.c | 21 +++++++++- src/duskgl/duskgl.h | 7 +++- 16 files changed, 175 insertions(+), 31 deletions(-) create mode 100644 src/duskgl/display/shader/data/entities.c create mode 100644 src/duskgl/display/shader/data/entities.glsl rename src/duskgl/display/shader/{fragments => data}/transforms.glsl (100%) delete mode 100644 src/duskgl/display/shader/entityshader/entity.glsl create mode 100644 src/duskgl/display/shader/fragments/packed.glsl diff --git a/src/dusk/overworld/overworlddefs.h b/src/dusk/overworld/overworlddefs.h index fd98669..dc27e3a 100644 --- a/src/dusk/overworld/overworlddefs.h +++ b/src/dusk/overworld/overworlddefs.h @@ -5,4 +5,7 @@ * https://opensource.org/licenses/MIT */ +#define OVERWORLD_ENTITY_WIDTH 32 +#define OVERWORLD_ENTITY_HEIGHT 32 + #define OVERWORLD_ENTITY_COUNT_MAX 32 \ No newline at end of file diff --git a/src/dusk/overworld/player.c b/src/dusk/overworld/player.c index 6edae3f..2ff8905 100644 --- a/src/dusk/overworld/player.c +++ b/src/dusk/overworld/player.c @@ -7,6 +7,7 @@ #include "entity.h" #include "assert/assert.h" +#include "input.h" void playerInit(entity_t *ent) { assertNotNull(ent, "Entity cannot be NULL"); @@ -16,4 +17,14 @@ void playerInit(entity_t *ent) { void playerUpdate(entity_t *ent) { assertNotNull(ent, "Entity cannot be NULL"); + + if(inputWasPressed(INPUT_RIGHT)) { + ent->x++; + } else if(inputWasPressed(INPUT_LEFT)) { + ent->x--; + } else if(inputWasPressed(INPUT_UP)) { + ent->y--; + } else if(inputWasPressed(INPUT_DOWN)) { + ent->y++; + } } \ No newline at end of file diff --git a/src/duskgl/display/shader/data/CMakeLists.txt b/src/duskgl/display/shader/data/CMakeLists.txt index b2a310b..2f0ccee 100644 --- a/src/duskgl/display/shader/data/CMakeLists.txt +++ b/src/duskgl/display/shader/data/CMakeLists.txt @@ -7,4 +7,5 @@ target_sources(${DUSK_TARGET_NAME} PRIVATE transforms.c + entities.c ) \ No newline at end of file diff --git a/src/duskgl/display/shader/data/entities.c b/src/duskgl/display/shader/data/entities.c new file mode 100644 index 0000000..1a2f7ec --- /dev/null +++ b/src/duskgl/display/shader/data/entities.c @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "entities.h" +#include "overworld/overworld.h" +#include "assert/assert.h" + +shaderbuffer_t ENTITIES_BUFFER; +entitiesdata_t ENTITIES_DATA; + +void entitiesInit() { + memset(&ENTITIES_DATA, 0, sizeof(entitiesdata_t)); + shaderBufferInit(&ENTITIES_BUFFER, sizeof(overworld_t)); +} + +void entitiesUpdate() { + shaderBufferBind(&ENTITIES_BUFFER); + shaderBufferSetData(&ENTITIES_BUFFER, &OVERWORLD); + + for(uint8_t i = 0; i < OVERWORLD.entityCount; i++) { + // Pack the entity data into the buffer + entity_t *src = &OVERWORLD.entities[i]; + entitiesdataent_t *dst = &ENTITIES_DATA.entities[i]; + + // Copy position data. + assertTrue( + (&src->subY - &src->x) + sizeof(uint8_t) == sizeof(uint_t), + "Entity data is not packed correctly any more." + ); + memcpy(&dst->position, &src->x, sizeof(uint_t)); + } +} + +void entitiesDispose() { + shaderBufferDispose(&ENTITIES_BUFFER); +} \ No newline at end of file diff --git a/src/duskgl/display/shader/data/entities.glsl b/src/duskgl/display/shader/data/entities.glsl new file mode 100644 index 0000000..91c731b --- /dev/null +++ b/src/duskgl/display/shader/data/entities.glsl @@ -0,0 +1,41 @@ +// Copyright (c) 2025 Dominic Masters +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT + +#include "../../../../dusk/overworld/overworlddefs.h" +#include "../fragments/packed.glsl" +#include "../fragments/quad.glsl" + +struct Entity { + uint position; + uvec3 _padding0; +}; + +layout(std140) uniform b_Entities { + Entity entities[OVERWORLD_ENTITY_COUNT_MAX]; +}; + +vec2 entityGetSize() { + return vec2(float(OVERWORLD_ENTITY_WIDTH), float(OVERWORLD_ENTITY_HEIGHT)); +} + +vec2 entityGetVertice(uint instanceIndex, uint indiceIndex) { + // Get base quad vertice + vec2 vert = quadGetVertice(indiceIndex); + + uint x = packedGetU8(0u, entities[instanceIndex].position); + uint y = packedGetU8(1u, entities[instanceIndex].position); + uint subX = packedGetU8(2u, entities[instanceIndex].position); + uint subY = packedGetU8(3u, entities[instanceIndex].position); + + vert.x += float(x); + vert.y += float(y); + + vert *= entityGetSize(); + + vert.x += float(subX); + vert.y += float(subY); + + return vert; +} \ No newline at end of file diff --git a/src/duskgl/display/shader/data/entities.h b/src/duskgl/display/shader/data/entities.h index 6a297ea..51eb16b 100644 --- a/src/duskgl/display/shader/data/entities.h +++ b/src/duskgl/display/shader/data/entities.h @@ -5,3 +5,35 @@ * https://opensource.org/licenses/MIT */ +#pragma once +#include "display/shader/shaderbuffer.h" +#include "overworld/overworld.h" + +#define ENTITIES_BLOCK_NAME "b_Entities" + +typedef struct { + uint_t position; + uvec3_t _padding0; +} entitiesdataent_t; + +typedef struct { + entitiesdataent_t entities[OVERWORLD_ENTITY_COUNT_MAX]; +} entitiesdata_t; + +extern shaderbuffer_t ENTITIES_BUFFER; +extern entitiesdata_t ENTITIES_DATA; + +/** + * Initializes the entities buffer and data. + */ +void entitiesInit(); + +/** + * Updates the entities buffer with the current data. + */ +void entitiesUpdate(); + +/** + * Destroys the entities buffer. + */ +void entitiesDispose(); \ No newline at end of file diff --git a/src/duskgl/display/shader/data/transforms.c b/src/duskgl/display/shader/data/transforms.c index 1e35ad2..eac1b1a 100644 --- a/src/duskgl/display/shader/data/transforms.c +++ b/src/duskgl/display/shader/data/transforms.c @@ -29,13 +29,13 @@ void transformsUpdate() { glm_perspective( glm_rad(45.0f), TRANSFORMS_DATA.resolution[0] / TRANSFORMS_DATA.resolution[1], - 1.0f, - 100.0f, + 0.5f, + 1000.0f, TRANSFORMS_DATA.projection ); glm_lookat( - (vec3){ 3, 3, 3 }, + (vec3){ 300, 300, 300 }, (vec3){ 0, 0, 0 }, (vec3){ 0, 1, 0 }, TRANSFORMS_DATA.view diff --git a/src/duskgl/display/shader/fragments/transforms.glsl b/src/duskgl/display/shader/data/transforms.glsl similarity index 100% rename from src/duskgl/display/shader/fragments/transforms.glsl rename to src/duskgl/display/shader/data/transforms.glsl diff --git a/src/duskgl/display/shader/entityshader/entity.glsl b/src/duskgl/display/shader/entityshader/entity.glsl deleted file mode 100644 index 51831d2..0000000 --- a/src/duskgl/display/shader/entityshader/entity.glsl +++ /dev/null @@ -1,16 +0,0 @@ -// 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 7d685e4..201a9a8 100644 --- a/src/duskgl/display/shader/entityshader/entity_frag.glsl +++ b/src/duskgl/display/shader/entityshader/entity_frag.glsl @@ -4,7 +4,7 @@ // https://opensource.org/licenses/MIT #include "../fragments/header.glsl" -#include "entity.glsl" +#include "../data/entities.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 6b6df65..825e29d 100644 --- a/src/duskgl/display/shader/entityshader/entity_vert.glsl +++ b/src/duskgl/display/shader/entityshader/entity_vert.glsl @@ -4,9 +4,8 @@ // https://opensource.org/licenses/MIT #include "../fragments/header.glsl" -#include "../fragments/transforms.glsl" -#include "../fragments/quad.glsl" -#include "entity.glsl" +#include "../data/transforms.glsl" +#include "../data/entities.glsl" // Outputs to fragment shader out vec2 v_TextureCoord; @@ -15,7 +14,7 @@ void main() { uint instanceIndex = uint(gl_InstanceID); uint indiceIndex = uint(gl_VertexID % 6); - vec2 vert = quadGetVertice(indiceIndex); + vec2 vert = entityGetVertice(instanceIndex, indiceIndex); vec2 uv = quadGetTextureCoordinate(indiceIndex); gl_Position = transforms.projection * transforms.view * vec4(vert, 0.0, 1.0); diff --git a/src/duskgl/display/shader/entityshader/entityshader.c b/src/duskgl/display/shader/entityshader/entityshader.c index ad47aaa..78578bb 100644 --- a/src/duskgl/display/shader/entityshader/entityshader.c +++ b/src/duskgl/display/shader/entityshader/entityshader.c @@ -11,6 +11,7 @@ #include "entity_vert.glsl.h" #include "entity_frag.glsl.h" #include "display/shader/data/transforms.h" +#include "display/shader/data/entities.h" entityshader_t ENTITY_SHADER; @@ -29,10 +30,16 @@ void entityShaderInit() { TRANSFORMS_BLOCK_NAME ); + ENTITY_SHADER.entitiesBlock = shaderGetBlock( + &ENTITY_SHADER.shader, + ENTITIES_BLOCK_NAME + ); + // Uniforms // Bind shaderBufferBindToBlock(&TRANSFORMS_BUFFER, ENTITY_SHADER.transformsBlock); + shaderBufferBindToBlock(&ENTITIES_BUFFER, ENTITY_SHADER.entitiesBlock); } void entityShaderUse() { diff --git a/src/duskgl/display/shader/entityshader/entityshader.h b/src/duskgl/display/shader/entityshader/entityshader.h index 97fa7ed..1662317 100644 --- a/src/duskgl/display/shader/entityshader/entityshader.h +++ b/src/duskgl/display/shader/entityshader/entityshader.h @@ -10,12 +10,8 @@ typedef struct { shader_t shader; - GLuint entitiesBlock; GLuint transformsBlock; - // GLuint tilesetsBlock; - - // GLuint uniformTilesetTextures; } entityshader_t; extern entityshader_t ENTITY_SHADER; diff --git a/src/duskgl/display/shader/fragments/packed.glsl b/src/duskgl/display/shader/fragments/packed.glsl new file mode 100644 index 0000000..ff71d4a --- /dev/null +++ b/src/duskgl/display/shader/fragments/packed.glsl @@ -0,0 +1,8 @@ +// Copyright (c) 2025 Dominic Masters +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT + +uint packedGetU8(uint position, uint data) { + return (data >> (position * 8u)) & 0xFFu; +} \ No newline at end of file diff --git a/src/duskgl/display/shader/shadermanager.c b/src/duskgl/display/shader/shadermanager.c index 11497fe..0cfd479 100644 --- a/src/duskgl/display/shader/shadermanager.c +++ b/src/duskgl/display/shader/shadermanager.c @@ -8,10 +8,12 @@ #include "shadermanager.h" #include "assert/assert.h" #include "display/shader/data/transforms.h" +#include "display/shader/data/entities.h" #include "display/shader/entityshader/entityshader.h" shadermanagerdatacallback_t SHADER_MANAGER_DATA_CALLBACKS[] = { - { transformsInit, transformsUpdate, transformsDispose } + { transformsInit, transformsUpdate, transformsDispose }, + { entitiesInit, entitiesUpdate, entitiesDispose } }; @@ -30,6 +32,7 @@ void shaderManagerInit() { "No Data Callbacks Defined" ); + // Init Shader Datas (before the shaders) i = 0; do { assertNotNull( @@ -39,6 +42,7 @@ void shaderManagerInit() { SHADER_MANAGER_DATA_CALLBACKS[i++].init(); } while(i < SHADER_MANAGER_DATA_CALLBACKS_SIZE); + // Init the shaders i = 0; do { assertNotNull( @@ -54,7 +58,9 @@ void shaderManagerUpdate() { SHADER_MANAGER_DATA_CALLBACKS_SIZE > 0, "No Data Callbacks Defined" ); - + + + // Update all the data size_t i = 0; do { assertNotNull( @@ -75,6 +81,7 @@ void shaderManagerDispose() { "No Data Callbacks Defined" ); + // Cleanup the shaders size_t i = 0; do { assertNotNull( @@ -83,4 +90,14 @@ void shaderManagerDispose() { ); SHADER_MANAGER_SHADER_CALLBACKS[i++].dispose(); } while(i < SHADER_MANAGER_SHADER_CALLBACKS_SIZE); + + // Cleanup the data + i = 0; + do { + assertNotNull( + SHADER_MANAGER_DATA_CALLBACKS[i].dispose, + "Data Callback is NULL" + ); + SHADER_MANAGER_DATA_CALLBACKS[i++].dispose(); + } while(i < SHADER_MANAGER_DATA_CALLBACKS_SIZE); } \ No newline at end of file diff --git a/src/duskgl/duskgl.h b/src/duskgl/duskgl.h index 742042c..8289ac2 100644 --- a/src/duskgl/duskgl.h +++ b/src/duskgl/duskgl.h @@ -19,4 +19,9 @@ typedef float float_t; typedef double double_t; extern char_t EXECUTABLE_PATH[]; -extern char_t EXECUTABLE_DIRECTORY[]; \ No newline at end of file +extern char_t EXECUTABLE_DIRECTORY[]; + +typedef uint32_t uvec4_t[4]; +typedef uint32_t uvec3_t[3]; +typedef uint32_t uvec2_t[2]; +typedef uint32_t uint_t; \ No newline at end of file