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..1108a47 --- /dev/null +++ b/LuaPlugin/lua_bindings.cpp @@ -0,0 +1,101 @@ +#include "RhythmGameUtilities/Common.hpp" +#include "RhythmGameUtilities/Utilities.hpp" + +#include + +// Common + +static auto lua_inverse_lerp(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 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; +} + +// 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); + + return 1; +} + +static const luaL_Reg rhythmgameutilities_functions[] = { + {"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" auto luaopen_rhythmgameutilities(lua_State *L) -> int +{ + luaL_newlib(L, rhythmgameutilities_functions); + return 1; +} diff --git a/LuaPlugin/test.lua b/LuaPlugin/test.lua new file mode 100644 index 0000000..0b5cffe --- /dev/null +++ b/LuaPlugin/test.lua @@ -0,0 +1,60 @@ +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); + + print(value) -- 5.0 + + assert(value == 5) +end + +local function calculate_accuracy_ratio_test() + local value = rhythmgameutilities.calculate_accuracy_ratio(750, 768, 50); + + value = tonumber(string.format("%.2f", value)); + + 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 + +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();