diff --git a/assets/scene/minesweeper.lua b/assets/scene/minesweeper.lua index a6fa2ec..61c14bf 100644 --- a/assets/scene/minesweeper.lua +++ b/assets/scene/minesweeper.lua @@ -9,6 +9,7 @@ module('text') module('tileset') module('texture') module('input') +module('shader') CELL_STATE_DEFAULT = 0 CELL_STATE_HOVER = 1 @@ -179,19 +180,23 @@ end function sceneUpdate() x = x + inputAxis(INPUT_ACTION_LEFT, INPUT_ACTION_RIGHT) - y = y + inputAxis(INPUT_ACTION_UP, INPUT_ACTION_DOWN) + y = y - inputAxis(INPUT_ACTION_UP, INPUT_ACTION_DOWN) end - function sceneRender() -- Update camera - cameraPushMatrix(camera) camera.bottom = screenGetHeight() camera.right = screenGetWidth() + shaderBind(SHADER_UNLIT) + proj = cameraGetProjectionMatrix(camera) + shaderSetMatrix(SHADER_UNLIT, SHADER_UNLIT_PROJECTION, proj) + view = cameraGetViewMatrix(camera) + shaderSetMatrix(SHADER_UNLIT, SHADER_UNLIT_VIEW, view) + spriteBatchPush( - nil, - x, y, x + 32, y + 32, + x, y, + x + 32, y + 32, colorWhite() ) @@ -251,6 +256,4 @@ function sceneRender() -- end -- end spriteBatchFlush() - - cameraPopMatrix() end \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8a88a46..f29a221 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,6 +4,7 @@ # https://opensource.org/licenses/MIT add_subdirectory(dusk) +add_subdirectory(duskrpg) if(DUSK_TARGET_SYSTEM STREQUAL "linux" OR DUSK_TARGET_SYSTEM STREQUAL "knulli") add_subdirectory(dusklinux) diff --git a/src/dusk/CMakeLists.txt b/src/dusk/CMakeLists.txt index 047d6c7..834eb1e 100644 --- a/src/dusk/CMakeLists.txt +++ b/src/dusk/CMakeLists.txt @@ -52,12 +52,9 @@ add_subdirectory(engine) add_subdirectory(error) add_subdirectory(event) add_subdirectory(input) -add_subdirectory(item) add_subdirectory(locale) -add_subdirectory(map) add_subdirectory(scene) add_subdirectory(script) -add_subdirectory(story) add_subdirectory(time) add_subdirectory(ui) add_subdirectory(util) diff --git a/src/dusk/display/display.c b/src/dusk/display/display.c index 1b2b24e..b5d39f6 100644 --- a/src/dusk/display/display.c +++ b/src/dusk/display/display.c @@ -20,11 +20,9 @@ #include "display/shader/shaderunlit.h" #include "time/time.h" -display_t DISPLAY = { 0 }; +#include "script/module/display/moduleshader.h" -texture_t PALETTE_TEXTURE; -texture_t UNCOMPRESSED_TEXTURE; -texture_t COMPRESSED_TEXTURE; +display_t DISPLAY = { 0 }; errorret_t displayInit(void) { memoryZero(&DISPLAY, sizeof(DISPLAY)); @@ -33,68 +31,33 @@ errorret_t displayInit(void) { errorChain(displayPlatformInit()); #endif + // Setup initial shader with default values errorChain(shaderInit(&SHADER_UNLIT, &SHADER_UNLIT_DEFINITION)); + camera_t cam; + cameraInit(&cam); + mat4 mat; + cameraGetProjectionMatrix(&cam, mat); + errorChain(shaderBind(&SHADER_UNLIT)); + errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_PROJECTION, mat)); + cameraGetViewMatrix(&cam, mat); + errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_VIEW, mat)); + glm_mat4_identity(mat); + errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_MODEL, mat)); + errorChain(shaderSetTexture(&SHADER_UNLIT, SHADER_UNLIT_TEXTURE, NULL)); + errorChain(quadInit()); errorChain(frameBufferInitBackBuffer()); errorChain(spriteBatchInit()); errorChain(textInit()); errorChain(screenInit()); - // PALETTES[0].colors[0] = COLOR_RED; - // PALETTES[0].colors[1] = COLOR_GREEN; - // PALETTES[0].colors[2] = COLOR_BLUE; - // PALETTES[0].colors[3] = COLOR_WHITE; - // PALETTES[0].colors[4] = COLOR_MAGENTA; - // PALETTES[0].colors[5] = COLOR_CYAN; - // PALETTES[0].colors[6] = COLOR_YELLOW; - // PALETTES[0].colors[7] = COLOR_BLACK; - // PALETTES[0].count = 8; - - // uint8_t indices[64] = { - // 0,0,0,0,0,0,0,0, - // 1,1,1,1,1,1,1,1, - // 2,2,2,2,2,2,2,2, - // 3,3,3,3,3,3,3,3, - // 4,4,4,4,4,4,4,4, - // 5,5,5,5,5,5,5,5, - // 6,6,6,6,6,6,6,6, - // 7,7,7,7,7,7,7,7 - // }; - - // errorChain(textureInit( - // &PALETTE_TEXTURE, - // 8, 8, - // TEXTURE_FORMAT_PALETTE, - // (texturedata_t){ - // .paletted = { - // .indices = indices, - // .palette = &PALETTES[0] - // } - // } - // )); - - errorChain(textureInit( - &UNCOMPRESSED_TEXTURE, - 8, 8, - TEXTURE_FORMAT_RGBA, - (texturedata_t){ - .rgbaColors = (color_t[]){ - COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_WHITE, COLOR_MAGENTA, COLOR_CYAN, COLOR_YELLOW, COLOR_BLACK, - COLOR_GREEN, COLOR_BLUE, COLOR_WHITE, COLOR_MAGENTA, COLOR_CYAN, COLOR_YELLOW, COLOR_BLACK, COLOR_RED, - COLOR_BLUE, COLOR_WHITE, COLOR_MAGENTA, COLOR_CYAN, COLOR_YELLOW, COLOR_BLACK, COLOR_RED, COLOR_GREEN, - COLOR_WHITE, COLOR_MAGENTA, COLOR_CYAN, COLOR_YELLOW, COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_BLUE, - COLOR_MAGENTA, COLOR_CYAN, COLOR_YELLOW, COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_WHITE, - COLOR_CYAN, COLOR_YELLOW, COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_WHITE, COLOR_MAGENTA, - COLOR_YELLOW, COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_WHITE, COLOR_MAGENTA, COLOR_CYAN, - COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_WHITE, COLOR_MAGENTA, COLOR_CYAN, COLOR_YELLOW - } - } - )); + assertTrue(SHADER_UNLIT.shaderProgramId != 0, "Unlit shader must be initialized before display init."); errorOk(); } errorret_t displayUpdate(void) { + assertTrue(SHADER_UNLIT.shaderProgramId != 0, "Unlit shader must be initialized before display update."); #ifdef displayPlatformUpdate errorChain(displayPlatformUpdate()); #endif @@ -110,38 +73,7 @@ errorret_t displayUpdate(void) { SCREEN.background ); - camera_t camera; - // cameraInitOrthographic(&camera); - // camera.orthographic.left = 0.0f; - // camera.orthographic.right = SCREEN.width; - // camera.orthographic.top = SCREEN.height; - // camera.orthographic.bottom = 0.0f; - cameraInitPerspective(&camera); - camera.lookat.position[0] = 3.0f; - camera.lookat.position[1] = 3.0f; - camera.lookat.position[2] = 3.0f; - - mat4 proj, view, model; - cameraGetProjectionMatrix(&camera, proj); - cameraGetViewMatrix(&camera, view); - glm_mat4_identity(model); - - errorChain(shaderBind(&SHADER_UNLIT)); - errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_PROJECTION, proj)); - errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_VIEW, view)); - errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_MODEL, model)); - // errorChain(shaderSetTexture(&SHADER_UNLIT, SHADER_UNLIT_TEXTURE, &PALETTE_TEXTURE)); - errorChain(shaderSetTexture(&SHADER_UNLIT, SHADER_UNLIT_TEXTURE, &UNCOMPRESSED_TEXTURE)); - errorChain(spriteBatchPush( - 0.0f, 0.0f, - 1.0f, 1.0f, - COLOR_WHITE, - 0.0f, 0.0f, - 1.0f, 1.0f - )); - errorChain(spriteBatchFlush()); - - // errorCatch(errorPrint(sceneRender())); + errorChain(sceneRender()); // Render UI // uiRender(); diff --git a/src/dusk/display/shader/CMakeLists.txt b/src/dusk/display/shader/CMakeLists.txt index 32debd1..5ebe3ca 100644 --- a/src/dusk/display/shader/CMakeLists.txt +++ b/src/dusk/display/shader/CMakeLists.txt @@ -7,4 +7,5 @@ target_sources(${DUSK_LIBRARY_TARGET_NAME} PUBLIC shader.c + shaderunlit.c ) \ No newline at end of file diff --git a/src/dusk/display/shader/shader.c b/src/dusk/display/shader/shader.c index ace2c9e..359e82f 100644 --- a/src/dusk/display/shader/shader.c +++ b/src/dusk/display/shader/shader.c @@ -8,15 +8,19 @@ #include "shader.h" #include "assert/assert.h" +shader_t *bound = NULL; + errorret_t shaderInit(shader_t *shader, const shaderdefinition_t *def) { assertNotNull(shader, "Shader cannot be null"); errorChain(shaderInitPlatform(shader, def)); + bound = NULL; errorOk(); } errorret_t shaderBind(shader_t *shader) { assertNotNull(shader, "Shader cannot be null"); errorChain(shaderBindPlatform(shader)); + bound = shader; errorOk(); } @@ -28,6 +32,7 @@ errorret_t shaderSetMatrix( assertNotNull(shader, "Shader cannot be null"); assertStrLenMin(name, 1, "Uniform name cannot be empty"); assertNotNull(matrix, "Matrix cannot be null"); + assertTrue(bound == shader, "Shader must be bound."); errorChain(shaderSetMatrixPlatform(shader, name, matrix)); errorOk(); } @@ -39,6 +44,7 @@ errorret_t shaderSetTexture( ) { assertNotNull(shader, "Shader cannot be null"); assertStrLenMin(name, 1, "Uniform name cannot be empty"); + assertTrue(bound == shader, "Shader must be bound."); errorChain(shaderSetTexturePlatform(shader, name, texture)); errorOk(); } @@ -56,6 +62,7 @@ errorret_t shaderSetTexture( errorret_t shaderDispose(shader_t *shader) { assertNotNull(shader, "Shader cannot be null"); + bound = NULL; errorChain(shaderDisposePlatform(shader)); errorOk(); } \ No newline at end of file diff --git a/src/dusk/display/shader/shaderunlit.c b/src/dusk/display/shader/shaderunlit.c new file mode 100644 index 0000000..f6c0c64 --- /dev/null +++ b/src/dusk/display/shader/shaderunlit.c @@ -0,0 +1,10 @@ +/** + * Copyright (c) 2026 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "shaderunlit.h" + +shader_t SHADER_UNLIT = { 0 }; \ No newline at end of file diff --git a/src/dusk/display/shader/shaderunlit.h b/src/dusk/display/shader/shaderunlit.h index cd82b99..56dbf89 100644 --- a/src/dusk/display/shader/shaderunlit.h +++ b/src/dusk/display/shader/shaderunlit.h @@ -15,4 +15,4 @@ // #define SHADER_UNLIT_COLOR "u_Color" extern shaderdefinition_t SHADER_UNLIT_DEFINITION; -static shader_t SHADER_UNLIT; \ No newline at end of file +extern shader_t SHADER_UNLIT; \ No newline at end of file diff --git a/src/dusk/script/module/CMakeLists.txt b/src/dusk/script/module/CMakeLists.txt index f3086ae..d171e67 100644 --- a/src/dusk/script/module/CMakeLists.txt +++ b/src/dusk/script/module/CMakeLists.txt @@ -7,11 +7,8 @@ add_subdirectory(display) add_subdirectory(event) add_subdirectory(input) -add_subdirectory(item) add_subdirectory(locale) -add_subdirectory(map) add_subdirectory(system) add_subdirectory(scene) -add_subdirectory(story) add_subdirectory(time) add_subdirectory(ui) \ No newline at end of file diff --git a/src/dusk/script/module/display/CMakeLists.txt b/src/dusk/script/module/display/CMakeLists.txt index 60a7877..6cdb8e4 100644 --- a/src/dusk/script/module/display/CMakeLists.txt +++ b/src/dusk/script/module/display/CMakeLists.txt @@ -15,4 +15,5 @@ target_sources(${DUSK_LIBRARY_TARGET_NAME} modulescreen.c moduletileset.c moduletexture.c + moduleshader.c ) \ No newline at end of file diff --git a/src/dusk/script/module/display/modulecamera.c b/src/dusk/script/module/display/modulecamera.c index 737df9d..7930206 100644 --- a/src/dusk/script/module/display/modulecamera.c +++ b/src/dusk/script/module/display/modulecamera.c @@ -69,6 +69,16 @@ void moduleCamera(scriptcontext_t *context) { // Methods lua_register(context->luaState, "cameraCreate", moduleCameraCreate); + lua_register( + context->luaState, + "cameraGetProjectionMatrix", + moduleCameraGetProjectionMatrix + ); + lua_register( + context->luaState, + "cameraGetViewMatrix", + moduleCameraGetViewMatrix + ); } int moduleCameraCreate(lua_State *L) { @@ -116,7 +126,7 @@ int moduleCameraCreate(lua_State *L) { return 1; } - int moduleCameraIndex(lua_State *l) { +int moduleCameraIndex(lua_State *l) { assertNotNull(l, "Lua state cannot be NULL."); const char_t *key = luaL_checkstring(l, 2); @@ -288,4 +298,36 @@ int moduleCameraNewIndex(lua_State *l) { } return 0; +} + +int moduleCameraGetProjectionMatrix(lua_State *L) { + assertNotNull(L, "Lua state cannot be NULL."); + + camera_t *cam = (camera_t *)luaL_checkudata(L, 1, "camera_mt"); + assertNotNull(cam, "Camera pointer cannot be NULL."); + + // Create mat4 + mat4 test; + cameraGetProjectionMatrix(cam, test); + + // Lua needs to own this matrix now + mat4 *m = (mat4 *)lua_newuserdata(L, sizeof(mat4)); + memoryCopy(m, test, sizeof(mat4)); + return 1; +} + +int moduleCameraGetViewMatrix(lua_State *L) { + assertNotNull(L, "Lua state cannot be NULL."); + + camera_t *cam = (camera_t *)luaL_checkudata(L, 1, "camera_mt"); + assertNotNull(cam, "Camera pointer cannot be NULL."); + + // Create mat4 + mat4 test; + cameraGetViewMatrix(cam, test); + + // Lua needs to own this matrix now + mat4 *m = (mat4 *)lua_newuserdata(L, sizeof(mat4)); + memoryCopy(m, test, sizeof(mat4)); + return 1; } \ No newline at end of file diff --git a/src/dusk/script/module/display/modulecamera.h b/src/dusk/script/module/display/modulecamera.h index 2931d3c..01ddc9b 100644 --- a/src/dusk/script/module/display/modulecamera.h +++ b/src/dusk/script/module/display/modulecamera.h @@ -35,4 +35,20 @@ int moduleCameraIndex(lua_State *l); * * @param l The Lua state. */ -int moduleCameraNewIndex(lua_State *l); \ No newline at end of file +int moduleCameraNewIndex(lua_State *l); + +/** + * Script binding for getting a camera's projection matrix. + * + * @param L The Lua state. + * @return Number of return values on the Lua stack. + */ +int moduleCameraGetProjectionMatrix(lua_State *L); + +/** + * Script binding for getting a camera's view matrix. + * + * @param L The Lua state. + * @return Number of return values on the Lua stack. + */ +int moduleCameraGetViewMatrix(lua_State *L); \ No newline at end of file diff --git a/src/dusk/script/module/display/moduleshader.c b/src/dusk/script/module/display/moduleshader.c new file mode 100644 index 0000000..57768b8 --- /dev/null +++ b/src/dusk/script/module/display/moduleshader.c @@ -0,0 +1,94 @@ +/** + * Copyright (c) 2026 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "moduleshader.h" +#include "assert/assert.h" +#include "display/shader/shader.h" +#include "display/shader/shaderunlit.h" +#include "display/camera/camera.h" + +void moduleShader(scriptcontext_t *context) { + assertNotNull(context, "Context cannot be NULL."); + + // Shader unlit defs + lua_pushlightuserdata(context->luaState, &SHADER_UNLIT); + lua_setglobal(context->luaState, "SHADER_UNLIT"); + + lua_pushstring(context->luaState, SHADER_UNLIT_PROJECTION); + lua_setglobal(context->luaState, "SHADER_UNLIT_PROJECTION"); + lua_pushstring(context->luaState, SHADER_UNLIT_VIEW); + lua_setglobal(context->luaState, "SHADER_UNLIT_VIEW"); + lua_pushstring(context->luaState, SHADER_UNLIT_MODEL); + lua_setglobal(context->luaState, "SHADER_UNLIT_MODEL"); + lua_pushstring(context->luaState, SHADER_UNLIT_TEXTURE); + lua_setglobal(context->luaState, "SHADER_UNLIT_TEXTURE"); + + // Shader methods + lua_register(context->luaState, "shaderBind", moduleShaderBind); + lua_register(context->luaState, "shaderSetMatrix", moduleShaderSetMatrix); + lua_register(context->luaState, "shaderSetTexture", moduleShaderSetTexture); +} + +int moduleShaderBind(lua_State *l) { + assertNotNull(l, "Lua state cannot be NULL."); + + // Should be passed a shader userdata pointer only. + shader_t *shader = (shader_t *)lua_touserdata(l, 1); + assertNotNull(shader, "Shader pointer cannot be NULL."); + + errorret_t ret = shaderBind(shader); + if(ret.code != ERROR_OK) { + luaL_error(l, "Failed to bind shader: %s", ret.state->message); + errorCatch(errorPrint(ret)); + return 0; + } + + return 0; +} + +int moduleShaderSetMatrix(lua_State *l) { + assertNotNull(l, "Lua state cannot be NULL."); + + // Expect shader, string and matrix. + if(!lua_isuserdata(l, 1)) { + luaL_error(l, "First argument must be a shader_mt userdata."); + return 0; + } + + if(!lua_isstring(l, 2)) { + luaL_error(l, "Second argument must be a string."); + return 0; + } + + if(!lua_isuserdata(l, 3)) { + luaL_error(l, "Third argument must be a mat4_mt userdata."); + return 0; + } + + shader_t *shader = (shader_t *)lua_touserdata(l, 1); + assertNotNull(shader, "Shader pointer cannot be NULL."); + + const char_t *uniformName = luaL_checkstring(l, 2); + assertStrLenMin(uniformName, 1, "Uniform name cannot be empty."); + + mat4 *mat = (mat4 *)lua_touserdata(l, 3); + assertNotNull(mat, "Matrix pointer cannot be NULL."); + + errorret_t ret = shaderSetMatrix(shader, uniformName, *mat); + if(ret.code != ERROR_OK) { + luaL_error(l, "Failed to set shader matrix: %s", ret.state->message); + errorCatch(errorPrint(ret)); + return 0; + } + + return 0; +} + +int moduleShaderSetTexture(lua_State *l) { + assertNotNull(l, "Lua state cannot be NULL."); + return 0; +} \ No newline at end of file diff --git a/src/dusk/script/module/display/moduleshader.h b/src/dusk/script/module/display/moduleshader.h new file mode 100644 index 0000000..d50e33c --- /dev/null +++ b/src/dusk/script/module/display/moduleshader.h @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2026 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "script/scriptcontext.h" + +/** + * Register shader functions to the given script context. + * + * @param context The script context to register shader functions to. + */ +void moduleShader(scriptcontext_t *context); + +/** + * Script binding for binding a shader. + * + * @param l The Lua state. + * @return Number of return values on the Lua stack. + */ +int moduleShaderBind(lua_State *l); + +/** + * Script binding for setting a matrix uniform in a shader. + * + * @param l The Lua state. + * @return Number of return values on the Lua stack. + */ +int moduleShaderSetMatrix(lua_State *l); + +/** + * Script binding for setting a texture uniform in a shader. + * + * @param l The Lua state. + * @return Number of return values on the Lua stack. + */ +int moduleShaderSetTexture(lua_State *l); + +errorret_t doThing(); \ No newline at end of file diff --git a/src/dusk/script/scriptmodule.c b/src/dusk/script/scriptmodule.c index a4df4ea..2845161 100644 --- a/src/dusk/script/scriptmodule.c +++ b/src/dusk/script/scriptmodule.c @@ -10,7 +10,6 @@ #include "script/module/input/moduleinput.h" #include "script/module/moduleplatform.h" #include "script/module/scene/modulescene.h" -#include "script/module/item/moduleitem.h" #include "script/module/locale/modulelocale.h" #include "script/module/time/moduletime.h" #include "script/module/event/moduleevent.h" @@ -18,13 +17,13 @@ #include "script/module/display/modulespritebatch.h" #include "script/module/display/modulecamera.h" #include "script/module/display/moduleglm.h" +#include "script/module/display/moduleshader.h" #include "script/module/ui/moduleui.h" #include "script/module/display/moduletext.h" #include "script/module/display/modulescreen.h" -#include "script/module/story/modulestoryflag.h" -#include "script/module/map/modulemap.h" #include "script/module/display/moduletexture.h" #include "script/module/display/moduletileset.h" +#include "script/scriptgame.h" #include "util/string.h" const scriptmodule_t SCRIPT_MODULE_LIST[] = { @@ -33,7 +32,6 @@ const scriptmodule_t SCRIPT_MODULE_LIST[] = { { .name = "platform", .callback = modulePlatform }, { .name = "color", .callback = moduleColor }, { .name = "scene", .callback = moduleScene }, - { .name = "item", .callback = moduleItem }, { .name = "locale", .callback = moduleLocale }, { .name = "time", .callback = moduleTime }, { .name = "event", .callback = moduleEvent }, @@ -43,10 +41,13 @@ const scriptmodule_t SCRIPT_MODULE_LIST[] = { { .name = "ui", .callback = moduleUi }, { .name = "text", .callback = moduleText }, { .name = "screen", .callback = moduleScreen }, - { .name = "storyflag", .callback = moduleStoryFlag }, - { .name = "map", .callback = moduleMap }, { .name = "texture", .callback = moduleTexture }, { .name = "tileset", .callback = moduleTileset }, + { .name = "shader", .callback = moduleShader }, + + #ifdef SCRIPT_GAME_LIST + SCRIPT_GAME_LIST + #endif }; #define SCRIPT_MODULE_COUNT ( \ diff --git a/src/duskgl/display/shader/shadergl.c b/src/duskgl/display/shader/shadergl.c index 36bf70a..933321e 100644 --- a/src/duskgl/display/shader/shadergl.c +++ b/src/duskgl/display/shader/shadergl.c @@ -157,11 +157,10 @@ errorret_t shaderParamGetLocationGL( #ifdef DUSK_OPENGL_LEGACY assertUnreachable("Cannot get uniform locations on legacy opengl."); #else - shadergl_t *shaderGL = (shadergl_t *)shader; - *location = glGetUniformLocation(shaderGL->shaderProgramId, name); - errorret_t err = errorGLCheck(); - if(err.code != ERROR_OK) { - errorChain(err); + *location = glGetUniformLocation(shader->shaderProgramId, name); + errorChain(errorGLCheck()); + if(*location == -1) { + errorThrow("Uniform '%s' not found in shader.", name); } #endif @@ -174,8 +173,8 @@ errorret_t shaderSetMatrixGL( mat4 mat ) { assertNotNull(shader, "Shader cannot be null"); - assertNotNull(mat, "Matrix data cannot be null"); assertStrLenMin(name, 1, "Uniform name cannot be empty"); + assertNotNull(mat, "Matrix data cannot be null"); #ifdef DUSK_OPENGL_LEGACY assertTrue( diff --git a/src/duskrpg/CMakeLists.txt b/src/duskrpg/CMakeLists.txt new file mode 100644 index 0000000..4e447bc --- /dev/null +++ b/src/duskrpg/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2026 Dominic Masters +# +# This software is released under the MIT License. +# https://opensource.org/licenses/MIT + +# Includes +target_include_directories(${DUSK_LIBRARY_TARGET_NAME} + PUBLIC + ${CMAKE_CURRENT_LIST_DIR} +) + +# Subdirs +add_subdirectory(item) +add_subdirectory(map) +add_subdirectory(story) +add_subdirectory(script) \ No newline at end of file diff --git a/src/dusk/item/CMakeLists.txt b/src/duskrpg/item/CMakeLists.txt similarity index 100% rename from src/dusk/item/CMakeLists.txt rename to src/duskrpg/item/CMakeLists.txt diff --git a/src/dusk/item/backpack.c b/src/duskrpg/item/backpack.c similarity index 100% rename from src/dusk/item/backpack.c rename to src/duskrpg/item/backpack.c diff --git a/src/dusk/item/backpack.h b/src/duskrpg/item/backpack.h similarity index 100% rename from src/dusk/item/backpack.h rename to src/duskrpg/item/backpack.h diff --git a/src/dusk/item/inventory.c b/src/duskrpg/item/inventory.c similarity index 100% rename from src/dusk/item/inventory.c rename to src/duskrpg/item/inventory.c diff --git a/src/dusk/item/inventory.h b/src/duskrpg/item/inventory.h similarity index 100% rename from src/dusk/item/inventory.h rename to src/duskrpg/item/inventory.h diff --git a/src/dusk/item/item.csv b/src/duskrpg/item/item.csv similarity index 100% rename from src/dusk/item/item.csv rename to src/duskrpg/item/item.csv diff --git a/src/dusk/map/CMakeLists.txt b/src/duskrpg/map/CMakeLists.txt similarity index 100% rename from src/dusk/map/CMakeLists.txt rename to src/duskrpg/map/CMakeLists.txt diff --git a/src/dusk/map/map.c b/src/duskrpg/map/map.c similarity index 100% rename from src/dusk/map/map.c rename to src/duskrpg/map/map.c diff --git a/src/dusk/map/map.h b/src/duskrpg/map/map.h similarity index 100% rename from src/dusk/map/map.h rename to src/duskrpg/map/map.h diff --git a/src/dusk/map/mapchunk.c b/src/duskrpg/map/mapchunk.c similarity index 100% rename from src/dusk/map/mapchunk.c rename to src/duskrpg/map/mapchunk.c diff --git a/src/dusk/map/mapchunk.h b/src/duskrpg/map/mapchunk.h similarity index 100% rename from src/dusk/map/mapchunk.h rename to src/duskrpg/map/mapchunk.h diff --git a/src/dusk/map/maptile.c b/src/duskrpg/map/maptile.c similarity index 100% rename from src/dusk/map/maptile.c rename to src/duskrpg/map/maptile.c diff --git a/src/dusk/map/maptile.h b/src/duskrpg/map/maptile.h similarity index 100% rename from src/dusk/map/maptile.h rename to src/duskrpg/map/maptile.h diff --git a/src/dusk/map/worldpos.c b/src/duskrpg/map/worldpos.c similarity index 100% rename from src/dusk/map/worldpos.c rename to src/duskrpg/map/worldpos.c diff --git a/src/dusk/map/worldpos.h b/src/duskrpg/map/worldpos.h similarity index 100% rename from src/dusk/map/worldpos.h rename to src/duskrpg/map/worldpos.h diff --git a/src/duskrpg/script/CMakeLists.txt b/src/duskrpg/script/CMakeLists.txt new file mode 100644 index 0000000..26438bb --- /dev/null +++ b/src/duskrpg/script/CMakeLists.txt @@ -0,0 +1,7 @@ +# Copyright (c) 2026 Dominic Masters +# +# This software is released under the MIT License. +# https://opensource.org/licenses/MIT + +# Subdirs +add_subdirectory(module) \ No newline at end of file diff --git a/src/duskrpg/script/module/CMakeLists.txt b/src/duskrpg/script/module/CMakeLists.txt new file mode 100644 index 0000000..ad8bff2 --- /dev/null +++ b/src/duskrpg/script/module/CMakeLists.txt @@ -0,0 +1,9 @@ +# Copyright (c) 2026 Dominic Masters +# +# This software is released under the MIT License. +# https://opensource.org/licenses/MIT + +# Subdirectories +add_subdirectory(item) +add_subdirectory(map) +add_subdirectory(story) \ No newline at end of file diff --git a/src/dusk/script/module/item/CMakeLists.txt b/src/duskrpg/script/module/item/CMakeLists.txt similarity index 100% rename from src/dusk/script/module/item/CMakeLists.txt rename to src/duskrpg/script/module/item/CMakeLists.txt diff --git a/src/dusk/script/module/item/moduleitem.c b/src/duskrpg/script/module/item/moduleitem.c similarity index 100% rename from src/dusk/script/module/item/moduleitem.c rename to src/duskrpg/script/module/item/moduleitem.c diff --git a/src/dusk/script/module/item/moduleitem.h b/src/duskrpg/script/module/item/moduleitem.h similarity index 100% rename from src/dusk/script/module/item/moduleitem.h rename to src/duskrpg/script/module/item/moduleitem.h diff --git a/src/dusk/script/module/map/CMakeLists.txt b/src/duskrpg/script/module/map/CMakeLists.txt similarity index 100% rename from src/dusk/script/module/map/CMakeLists.txt rename to src/duskrpg/script/module/map/CMakeLists.txt diff --git a/src/dusk/script/module/map/modulemap.c b/src/duskrpg/script/module/map/modulemap.c similarity index 100% rename from src/dusk/script/module/map/modulemap.c rename to src/duskrpg/script/module/map/modulemap.c diff --git a/src/dusk/script/module/map/modulemap.h b/src/duskrpg/script/module/map/modulemap.h similarity index 100% rename from src/dusk/script/module/map/modulemap.h rename to src/duskrpg/script/module/map/modulemap.h diff --git a/src/dusk/script/module/story/CMakeLists.txt b/src/duskrpg/script/module/story/CMakeLists.txt similarity index 100% rename from src/dusk/script/module/story/CMakeLists.txt rename to src/duskrpg/script/module/story/CMakeLists.txt diff --git a/src/dusk/script/module/story/modulestoryflag.c b/src/duskrpg/script/module/story/modulestoryflag.c similarity index 100% rename from src/dusk/script/module/story/modulestoryflag.c rename to src/duskrpg/script/module/story/modulestoryflag.c diff --git a/src/dusk/script/module/story/modulestoryflag.h b/src/duskrpg/script/module/story/modulestoryflag.h similarity index 100% rename from src/dusk/script/module/story/modulestoryflag.h rename to src/duskrpg/script/module/story/modulestoryflag.h diff --git a/src/duskrpg/script/scriptgame.h b/src/duskrpg/script/scriptgame.h new file mode 100644 index 0000000..3e460b4 --- /dev/null +++ b/src/duskrpg/script/scriptgame.h @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2026 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "script/module/item/moduleitem.h" +#include "script/module/story/modulestoryflag.h" +#include "script/module/map/modulemap.h" + +#define SCRIPT_GAME_LIST \ + { .name = "item", .callback = moduleItem }, \ + { .name = "storyflag", .callback = moduleStoryFlag }, \ + { .name = "map", .callback = moduleMap }, \ No newline at end of file diff --git a/src/dusk/story/CMakeLists.txt b/src/duskrpg/story/CMakeLists.txt similarity index 100% rename from src/dusk/story/CMakeLists.txt rename to src/duskrpg/story/CMakeLists.txt diff --git a/src/dusk/story/storyflag.c b/src/duskrpg/story/storyflag.c similarity index 100% rename from src/dusk/story/storyflag.c rename to src/duskrpg/story/storyflag.c diff --git a/src/dusk/story/storyflag.csv b/src/duskrpg/story/storyflag.csv similarity index 100% rename from src/dusk/story/storyflag.csv rename to src/duskrpg/story/storyflag.csv diff --git a/src/dusk/story/storyflag.h b/src/duskrpg/story/storyflag.h similarity index 100% rename from src/dusk/story/storyflag.h rename to src/duskrpg/story/storyflag.h diff --git a/src/dusk/story/storyflagdefs.h b/src/duskrpg/story/storyflagdefs.h similarity index 100% rename from src/dusk/story/storyflagdefs.h rename to src/duskrpg/story/storyflagdefs.h