From 00d78ac18af9b8d47c2045689bc46f45c79e9bac Mon Sep 17 00:00:00 2001 From: Scott Doxey Date: Sun, 12 Oct 2025 16:38:21 -0400 Subject: [PATCH 1/2] Added start of Lua plugin. --- Documentation/API/Common/InverseLerp.md | 10 +++++++ Documentation/API/Common/Lerp.md | 10 +++++++ LuaPlugin/.gitignore | 1 + LuaPlugin/Makefile | 11 +++++++ LuaPlugin/build.sh | 13 +++++++++ LuaPlugin/compile_flags.txt | 3 ++ LuaPlugin/lua_bindings.cpp | 38 +++++++++++++++++++++++++ LuaPlugin/test.lua | 20 +++++++++++++ 8 files changed, 106 insertions(+) create mode 100644 LuaPlugin/.gitignore create mode 100644 LuaPlugin/Makefile create mode 100755 LuaPlugin/build.sh create mode 100644 LuaPlugin/compile_flags.txt create mode 100644 LuaPlugin/lua_bindings.cpp create mode 100644 LuaPlugin/test.lua diff --git a/Documentation/API/Common/InverseLerp.md b/Documentation/API/Common/InverseLerp.md index 638d53e..67f4da4 100644 --- a/Documentation/API/Common/InverseLerp.md +++ b/Documentation/API/Common/InverseLerp.md @@ -42,3 +42,13 @@ func _ready() -> void: print(value) # 0.5 ``` + +##### Lua + +```gdscript +local rhythmgameutilities = require("rhythmgameutilities") + +local value = rhythmgameutilities.inverse_lerp(0, 10, 5); + +print(value) -- 0.5 +``` diff --git a/Documentation/API/Common/Lerp.md b/Documentation/API/Common/Lerp.md index 6d001f7..796ad9d 100644 --- a/Documentation/API/Common/Lerp.md +++ b/Documentation/API/Common/Lerp.md @@ -42,3 +42,13 @@ func _ready() -> void: print(value) # 5 ``` + +##### Lua + +```gdscript +local rhythmgameutilities = require("rhythmgameutilities") + +local value = rhythmgameutilities.lerp(0, 10, 0.5); + +print(value) -- 5.0 +``` diff --git a/LuaPlugin/.gitignore b/LuaPlugin/.gitignore new file mode 100644 index 0000000..140f8cf --- /dev/null +++ b/LuaPlugin/.gitignore @@ -0,0 +1 @@ +*.so diff --git a/LuaPlugin/Makefile b/LuaPlugin/Makefile new file mode 100644 index 0000000..e0e8e0a --- /dev/null +++ b/LuaPlugin/Makefile @@ -0,0 +1,11 @@ +help: + @fgrep -h "##" $(MAKEFILE_LIST) | sed -e 's/##//' | tail -n +2 + +build: ## Build Lua plugin + ./build.sh + +test: build ## Test Lua plugin + lua test.lua + +install-dependencies: ## Install Dependencies + brew install lua diff --git a/LuaPlugin/build.sh b/LuaPlugin/build.sh new file mode 100755 index 0000000..b5349bf --- /dev/null +++ b/LuaPlugin/build.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) + +( + + cd "${SCRIPT_DIR}" || exit + + g++ -std=c++17 -shared -fPIC -arch arm64 -undefined dynamic_lookup -o rhythmgameutilities.so lua_bindings.cpp \ + -I../include \ + -I/opt/homebrew/Cellar/lua/5.4.8/include + +) diff --git a/LuaPlugin/compile_flags.txt b/LuaPlugin/compile_flags.txt new file mode 100644 index 0000000..a06eb52 --- /dev/null +++ b/LuaPlugin/compile_flags.txt @@ -0,0 +1,3 @@ +-std=c++17 +-I../include/ +-I/opt/homebrew/Cellar/lua/5.4.8/include diff --git a/LuaPlugin/lua_bindings.cpp b/LuaPlugin/lua_bindings.cpp new file mode 100644 index 0000000..d24c0b0 --- /dev/null +++ b/LuaPlugin/lua_bindings.cpp @@ -0,0 +1,38 @@ +#include "RhythmGameUtilities/Common.hpp" + +#include + +static auto lua_Lerp(lua_State *L) -> int +{ + float a = luaL_checknumber(L, 1); + float b = luaL_checknumber(L, 2); + float t = luaL_checknumber(L, 3); + + float result = RhythmGameUtilities::Lerp(a, b, t); + + lua_pushnumber(L, result); + + return 1; +} + +static auto lua_InverseLerp(lua_State *L) -> int +{ + float a = luaL_checknumber(L, 1); + float b = luaL_checknumber(L, 2); + float v = luaL_checknumber(L, 3); + + float result = RhythmGameUtilities::InverseLerp(a, b, v); + + lua_pushnumber(L, result); + + return 1; +} + +static const luaL_Reg rhythmgameutilities_functions[] = { + {"lerp", lua_Lerp}, {"inverse_lerp", lua_InverseLerp}}; + +extern "C" int luaopen_rhythmgameutilities(lua_State *L) +{ + luaL_newlib(L, rhythmgameutilities_functions); + return 1; +} diff --git a/LuaPlugin/test.lua b/LuaPlugin/test.lua new file mode 100644 index 0000000..c0e1ef4 --- /dev/null +++ b/LuaPlugin/test.lua @@ -0,0 +1,20 @@ +local rhythmgameutilities = require("rhythmgameutilities") + +local function lerp_test() + local value = rhythmgameutilities.lerp(0, 10, 0.5); + + print(value) -- 5.0 + + assert(value == 5) +end + +local function inverse_lerp_test() + local value = rhythmgameutilities.inverse_lerp(0, 10, 5); + + print(value) -- 0.5 + + assert(value == 0.5) +end + +lerp_test(); +inverse_lerp_test(); From 753460ce471e43803fb61942bfaf5c45c5891e9a Mon Sep 17 00:00:00 2001 From: Scott Doxey Date: Mon, 13 Oct 2025 02:13:39 -0400 Subject: [PATCH 2/2] Added new methods to plugin. --- LuaPlugin/lua_bindings.cpp | 79 ++++++++++++++++++++++++++++++++++---- LuaPlugin/test.lua | 50 +++++++++++++++++++++--- 2 files changed, 116 insertions(+), 13 deletions(-) diff --git a/LuaPlugin/lua_bindings.cpp b/LuaPlugin/lua_bindings.cpp index d24c0b0..1108a47 100644 --- a/LuaPlugin/lua_bindings.cpp +++ b/LuaPlugin/lua_bindings.cpp @@ -1,27 +1,84 @@ #include "RhythmGameUtilities/Common.hpp" +#include "RhythmGameUtilities/Utilities.hpp" #include -static auto lua_Lerp(lua_State *L) -> int +// Common + +static auto lua_inverse_lerp(lua_State *L) -> int { float a = luaL_checknumber(L, 1); float b = luaL_checknumber(L, 2); - float t = luaL_checknumber(L, 3); + float v = luaL_checknumber(L, 3); - float result = RhythmGameUtilities::Lerp(a, b, t); + float result = RhythmGameUtilities::InverseLerp(a, b, v); lua_pushnumber(L, result); return 1; } -static auto lua_InverseLerp(lua_State *L) -> int +static auto lua_lerp(lua_State *L) -> int { float a = luaL_checknumber(L, 1); float b = luaL_checknumber(L, 2); - float v = luaL_checknumber(L, 3); + float t = luaL_checknumber(L, 3); - float result = RhythmGameUtilities::InverseLerp(a, b, v); + float result = RhythmGameUtilities::Lerp(a, b, t); + + lua_pushnumber(L, result); + + return 1; +} + +// Utilities + +static auto lua_calculate_accuracy_ratio(lua_State *L) -> int +{ + int position = luaL_checknumber(L, 1); + int current_position = luaL_checknumber(L, 2); + int delta = luaL_checknumber(L, 3); + + float result = RhythmGameUtilities::CalculateAccuracyRatio( + position, current_position, delta); + + lua_pushnumber(L, result); + + return 1; +} + +static auto lua_convert_tick_to_position(lua_State *L) -> int +{ + int tick = luaL_checknumber(L, 1); + int resolution = luaL_checknumber(L, 2); + + float result = RhythmGameUtilities::ConvertTickToPosition(tick, resolution); + + lua_pushnumber(L, result); + + return 1; +} + +static auto lua_is_on_the_beat(lua_State *L) -> int +{ + int bpm = luaL_checknumber(L, 1); + float current_time = luaL_checknumber(L, 2); + float delta = luaL_checknumber(L, 3); + + bool result = RhythmGameUtilities::IsOnTheBeat(bpm, current_time, delta); + + lua_pushboolean(L, result); + + return 1; +} + +static auto lua_round_up_to_the_nearest_multiplier(lua_State *L) -> int +{ + int value = luaL_checknumber(L, 1); + int multiplier = luaL_checknumber(L, 2); + + int result = + RhythmGameUtilities::RoundUpToTheNearestMultiplier(value, multiplier); lua_pushnumber(L, result); @@ -29,9 +86,15 @@ static auto lua_InverseLerp(lua_State *L) -> int } static const luaL_Reg rhythmgameutilities_functions[] = { - {"lerp", lua_Lerp}, {"inverse_lerp", lua_InverseLerp}}; + {"inverse_lerp", lua_inverse_lerp}, + {"lerp", lua_lerp}, + {"calculate_accuracy_ratio", lua_calculate_accuracy_ratio}, + {"convert_tick_to_position", lua_convert_tick_to_position}, + {"is_on_the_beat", lua_is_on_the_beat}, + {"round_up_to_the_nearest_multiplier", + lua_round_up_to_the_nearest_multiplier}}; -extern "C" int luaopen_rhythmgameutilities(lua_State *L) +extern "C" auto luaopen_rhythmgameutilities(lua_State *L) -> int { luaL_newlib(L, rhythmgameutilities_functions); return 1; diff --git a/LuaPlugin/test.lua b/LuaPlugin/test.lua index c0e1ef4..0b5cffe 100644 --- a/LuaPlugin/test.lua +++ b/LuaPlugin/test.lua @@ -1,5 +1,13 @@ local rhythmgameutilities = require("rhythmgameutilities") +local function inverse_lerp_test() + local value = rhythmgameutilities.inverse_lerp(0, 10, 5); + + print(value) -- 0.5 + + assert(value == 0.5) +end + local function lerp_test() local value = rhythmgameutilities.lerp(0, 10, 0.5); @@ -8,13 +16,45 @@ local function lerp_test() assert(value == 5) end -local function inverse_lerp_test() - local value = rhythmgameutilities.inverse_lerp(0, 10, 5); +local function calculate_accuracy_ratio_test() + local value = rhythmgameutilities.calculate_accuracy_ratio(750, 768, 50); - print(value) -- 0.5 + value = tonumber(string.format("%.2f", value)); - assert(value == 0.5) + print(value) -- 0.64 + + assert(value == value) +end + +local function convert_tick_to_position_test() + local value = rhythmgameutilities.convert_tick_to_position(1056, 192); + + print(value) -- 5.5 + + assert(value == 5.5) +end + +local function is_on_the_beat_test() + local value = rhythmgameutilities.is_on_the_beat(120, 10, 0.05); + + print(value) -- true + + assert(value == true) +end + +local function round_up_to_the_nearest_multiplier_test() + local value = rhythmgameutilities.round_up_to_the_nearest_multiplier(12, 10); + + print(value) -- 20 + + assert(value == 20) end -lerp_test(); inverse_lerp_test(); +lerp_test(); + +calculate_accuracy_ratio_test(); +convert_tick_to_position_test(); + +is_on_the_beat_test(); +round_up_to_the_nearest_multiplier_test();