diff --git a/src/dusk/overworld/entity.c b/src/dusk/overworld/entity.c index d6fb26a..a3bd148 100644 --- a/src/dusk/overworld/entity.c +++ b/src/dusk/overworld/entity.c @@ -9,7 +9,7 @@ #include "assert/assert.h" entitycallback_t ENTITY_CALLBACKS[ENTITY_TYPE_COUNT] = { - { NULL }, + { NULL, NULL }, { playerInit, playerUpdate } }; @@ -26,6 +26,7 @@ void entityInit( memset(ent, 0, sizeof(entity_t)); ent->type = type; + // Call init assertNotNull(ENTITY_CALLBACKS[type].init, "Entity type init callback err."); ENTITY_CALLBACKS[type].init(ent); } diff --git a/src/dusk/overworld/overworld.h b/src/dusk/overworld/overworld.h index 1b73533..09c02e8 100644 --- a/src/dusk/overworld/overworld.h +++ b/src/dusk/overworld/overworld.h @@ -17,7 +17,28 @@ typedef struct { extern overworld_t overworld; +/** + * Initializes the overworld. + */ void overworldInit(); + +/** + * Called by the scene system when the overworld scene is made to be the + * active scene. + */ void overworldSceneInit(); + +/** + * Called by the scene system when the overworld scene is made to be inactive. + */ void overworldSceneDeinit(); -void overworldUpdate(); \ No newline at end of file + +/** + * Called by the scene system when the overworld scene is to perform a tick. + */ +void overworldUpdate(); + +/** + * Platform level render method. Refer to sceneRender for information. + */ +void overworldRender(); \ No newline at end of file diff --git a/src/dusk/render/scene.c b/src/dusk/render/scene.c index 967e1f5..2456da3 100644 --- a/src/dusk/render/scene.c +++ b/src/dusk/render/scene.c @@ -10,8 +10,17 @@ #include "overworld/overworld.h" scenetypecallback_t SCENE_CALLBACKS[] = { - { NULL, NULL, NULL, NULL },// SCENE_TYPE_INITIAL - { overworldInit, overworldSceneInit, overworldSceneDeinit, overworldUpdate }, + // SCENE_TYPE_INITIAL + { NULL, NULL, NULL, NULL, NULL }, + + // SCENE_TYPE_OVERWORLD + { + overworldInit, + overworldSceneInit, + overworldSceneDeinit, + overworldUpdate, + overworldRender + }, }; scene_t SCENE; @@ -41,6 +50,14 @@ void sceneUpdate() { } } +void sceneRender() { + assertTrue(SCENE.current < SCENE_TYPE_COUNT, "Invalid Scene Type"); + + if(SCENE_CALLBACKS[SCENE.current].onRender) { + SCENE_CALLBACKS[SCENE.current].onRender(); + } +} + void sceneSet(const scenetype_t scene) { assertTrue(SCENE.next < SCENE_TYPE_COUNT, "Invalid Scene Type"); SCENE.next = scene; diff --git a/src/dusk/render/scene.h b/src/dusk/render/scene.h index dfd94fa..b277503 100644 --- a/src/dusk/render/scene.h +++ b/src/dusk/render/scene.h @@ -25,6 +25,7 @@ typedef struct { void (*onActive)(); void (*onInactive)(); void (*onUpdate)(); + void (*onRender)(); } scenetypecallback_t; extern scene_t SCENE; @@ -39,6 +40,16 @@ void sceneInit(); */ void sceneUpdate(); +/** + * Renders the scene system. + * + * Scene rendering is really just an abstraction meant to simplify things for + * the render host. It is not REQUIRED to be called at all and is not actually + * implemented in the dusk dir itself, it is overriden somewhere within the + * render host. + */ +void sceneRender(); + /** * Sets the current scene. This will happen at the start of the next tick. * diff --git a/src/duskgl/CMakeLists.txt b/src/duskgl/CMakeLists.txt index 7f4c067..c7f89d6 100644 --- a/src/duskgl/CMakeLists.txt +++ b/src/duskgl/CMakeLists.txt @@ -26,4 +26,5 @@ target_sources(${DUSK_TARGET_NAME} # Subdirs add_subdirectory(assert) -add_subdirectory(display) \ No newline at end of file +add_subdirectory(display) +add_subdirectory(overworld) \ No newline at end of file diff --git a/src/duskgl/display/render.c b/src/duskgl/display/render.c index bdb2493..1fbd4d2 100644 --- a/src/duskgl/display/render.c +++ b/src/duskgl/display/render.c @@ -7,6 +7,7 @@ #include "assert/assertgl.h" #include "render.h" +#include "render/scene.h" render_t RENDER; @@ -15,10 +16,10 @@ void renderInit() { } void renderUpdate() { -} - -void renderOverworld() { + // Hand off to the scene to do its rendering. + sceneRender(); } void renderDispose() { + } \ No newline at end of file diff --git a/src/duskgl/overworld/CMakeLists.txt b/src/duskgl/overworld/CMakeLists.txt new file mode 100644 index 0000000..be52542 --- /dev/null +++ b/src/duskgl/overworld/CMakeLists.txt @@ -0,0 +1,12 @@ +# 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 + overworld.c +) + +# Subdirs \ No newline at end of file diff --git a/src/duskgl/overworld/overworld.c b/src/duskgl/overworld/overworld.c new file mode 100644 index 0000000..e0cdd1e --- /dev/null +++ b/src/duskgl/overworld/overworld.c @@ -0,0 +1,12 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "overworld/overworld.h" + +void overworldRender() { + +} \ No newline at end of file