lua: change the way native functions are binded (#1543)

This commit is contained in:
Quentin
2023-06-27 20:13:05 +02:00
committed by GitHub
parent 5fc6ef8fb5
commit c3121de8e7
14 changed files with 6810 additions and 124885 deletions

View File

@ -1,78 +1,11 @@
#pragma once
#include "invoker.hpp"
#include "lua/lua_module.hpp"
#include "lua/natives/natives_data.hpp"
#include "memory.hpp"
#include "lua/sol.hpp"
#include "lua/natives/lua_native_binding.hpp"
namespace lua::native
{
template<typename T>
T invoke(sol::variadic_args args)
{
big::g_native_invoker.begin_call();
for (int i = 1; i < args.size(); i++)
{
if (args[i].is<memory::pointer>())
big::g_native_invoker.push_arg(args[i].get<memory::pointer>().get_address());
else if (args[i].is<int>())
big::g_native_invoker.push_arg(args[i].get<int>());
else if (args[i].is<float>())
big::g_native_invoker.push_arg(args[i].get<float>());
else if (args[i].is<bool>())
big::g_native_invoker.push_arg(args[i].get<bool>());
else if (args[i].is<const char*>())
big::g_native_invoker.push_arg(args[i].get<const char*>());
else if (args[i].is<rage::fvector3>())
{
auto vec = args[i].get<rage::fvector3>();
big::g_native_invoker.push_arg(vec.x);
big::g_native_invoker.push_arg(vec.y);
big::g_native_invoker.push_arg(vec.z);
}
else
{
LOG(FATAL) << "Unhandled parameter";
return T();
}
}
big::g_native_invoker.end_call(args[0].as<std::uint64_t>());
if constexpr (std::is_same_v<T, std::string>)
{
return std::string(big::g_native_invoker.get_return_value<const char*>());
}
else if constexpr (std::is_same_v<T, rage::fvector3>)
{
auto& vec = big::g_native_invoker.get_return_value<Vector3>();
return {vec.x, vec.y, vec.z};
}
else if constexpr (std::is_same_v<T, memory::pointer>)
{
return memory::pointer(big::g_native_invoker.get_return_value<std::uint64_t>());
}
else if constexpr (!std::is_void_v<T>)
{
return big::g_native_invoker.get_return_value<T>();
}
}
void bind(sol::state& state)
{
auto ns = state["_natives"].get_or_create<sol::table>();
ns["invoke_void"] = invoke<void>;
ns["invoke_int"] = invoke<int>;
ns["invoke_float"] = invoke<float>;
ns["invoke_bool"] = invoke<bool>;
ns["invoke_str"] = invoke<std::string>;
ns["invoke_vec3"] = invoke<rage::fvector3>;
ns["invoke_ptr"] = invoke<memory::pointer>;
auto result = state.load_buffer(natives_data, natives_size);
if (!result.valid())
LOG(FATAL) << "Failed to load natives data: " << result.get<sol::error>().what();
result();
init_native_binding(state);
}
}

View File

@ -1,15 +1,16 @@
#pragma once
#include "lua/sol.hpp"
namespace lua::vector
{
static void bind(sol::state& state)
{
// clang-format off
state.new_usertype<rage::fvector3>("vec3", sol::constructors<rage::fvector3(float, float, float)>(),
"x", &rage::fvector3::x,
"y", &rage::fvector3::y,
"z", &rage::fvector3::z
//clang-format off
state.new_usertype<Vector3>("vec3",
sol::constructors<Vector3(float, float, float)>(),
"x", &Vector3::x, "y", &Vector3::y, "z", &Vector3::z,
"__tostring", &Vector3::to_string
);
// clang-format on
//clang-format on
}
}