|
|
@@ -24,35 +24,50 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
|
OTHER DEALINGS IN THE SOFTWARE.
|
|
|
*/
|
|
|
|
|
|
-
|
|
|
-#include "Device.h"
|
|
|
-#include "OS.h"
|
|
|
+#include <stdarg.h>
|
|
|
#include "Assert.h"
|
|
|
-#include "Log.h"
|
|
|
#include "LuaEnvironment.h"
|
|
|
-#include "StringSetting.h"
|
|
|
-#include "Filesystem.h"
|
|
|
+#include "StringUtils.h"
|
|
|
+#include "LuaStack.h"
|
|
|
+#include "Device.h"
|
|
|
+#include "LuaResource.h"
|
|
|
|
|
|
namespace crown
|
|
|
{
|
|
|
|
|
|
-extern StringSetting g_default_mountpoint;
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
+CE_EXPORT int luaopen_libcrown(lua_State* /*L*/)
|
|
|
+{
|
|
|
+ LuaEnvironment* env = device()->lua_environment();
|
|
|
|
|
|
-StringSetting g_boot("boot_file", "lua main file", "lua/game.raw");
|
|
|
+ load_int_setting(*env);
|
|
|
+ load_float_setting(*env);
|
|
|
+ load_string_setting(*env);
|
|
|
|
|
|
-/*
|
|
|
-*N.B: Lua garbage collection is actually disabled
|
|
|
-*/
|
|
|
+ load_vec2(*env);
|
|
|
+ load_vec3(*env);
|
|
|
+ load_mat4(*env);
|
|
|
+ load_quat(*env);
|
|
|
+ load_math(*env);
|
|
|
+
|
|
|
+ load_mouse(*env);
|
|
|
+ load_keyboard(*env);
|
|
|
+ load_accelerometer(*env);
|
|
|
+
|
|
|
+ load_device(*env);
|
|
|
+
|
|
|
+ load_window(*env);
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
LuaEnvironment::LuaEnvironment() :
|
|
|
m_state(luaL_newstate()),
|
|
|
m_is_used(false)
|
|
|
- //m_thread(LuaEnvironment::background_thread, (void*)this, "lua-environment-thread")
|
|
|
{
|
|
|
// Open Lua default libraries
|
|
|
string::strncpy(m_error_buffer, "", 1024);
|
|
|
-
|
|
|
string::strncpy(m_tmp_buffer, "", 1024);
|
|
|
}
|
|
|
|
|
|
@@ -64,16 +79,16 @@ void LuaEnvironment::init()
|
|
|
// Open Crown library
|
|
|
lua_cpcall(m_state, luaopen_libcrown, NULL);
|
|
|
|
|
|
- load_buffer(class_system, string::strlen(class_system));
|
|
|
- execute(0, 0);
|
|
|
- load_buffer(commands_list, string::strlen(commands_list));
|
|
|
- execute(0, 0);
|
|
|
- load_buffer(get_cmd_by_name, string::strlen(get_cmd_by_name));
|
|
|
- execute(0, 0);
|
|
|
- load_buffer(tmp_print_table, string::strlen(tmp_print_table));
|
|
|
- execute(0, 0);
|
|
|
- load_buffer(count_all, string::strlen(count_all));
|
|
|
- execute(0, 0);
|
|
|
+ // load_buffer(class_system, string::strlen(class_system));
|
|
|
+ // execute(0, 0);
|
|
|
+ // load_buffer(commands_list, string::strlen(commands_list));
|
|
|
+ // execute(0, 0);
|
|
|
+ // load_buffer(get_cmd_by_name, string::strlen(get_cmd_by_name));
|
|
|
+ // execute(0, 0);
|
|
|
+ // load_buffer(tmp_print_table, string::strlen(tmp_print_table));
|
|
|
+ // execute(0, 0);
|
|
|
+ // load_buffer(count_all, string::strlen(count_all));
|
|
|
+ // execute(0, 0);
|
|
|
|
|
|
m_is_used = true;
|
|
|
}
|
|
|
@@ -86,123 +101,73 @@ void LuaEnvironment::shutdown()
|
|
|
m_is_used = false;
|
|
|
}
|
|
|
|
|
|
-//-----------------------------------------------------------------------------
|
|
|
-lua_State* LuaEnvironment::state()
|
|
|
-{
|
|
|
- return m_state;
|
|
|
-}
|
|
|
-
|
|
|
//-----------------------------------------------------------------------------
|
|
|
const char* LuaEnvironment::error()
|
|
|
{
|
|
|
string::strncpy(m_tmp_buffer, m_error_buffer, 1024);
|
|
|
-
|
|
|
string::strncpy(m_error_buffer, "", 1024);
|
|
|
|
|
|
return m_tmp_buffer;
|
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-void LuaEnvironment::load_buffer(const char* buffer, size_t len)
|
|
|
+void LuaEnvironment::load(const LuaResource* lr)
|
|
|
{
|
|
|
- int32_t loaded = luaL_loadbuffer(m_state, buffer, len, "");
|
|
|
+ CE_ASSERT_NOT_NULL(lr);
|
|
|
|
|
|
- if (loaded != 0)
|
|
|
+ if (luaL_loadbuffer(m_state, (const char*) lr->code(), lr->size(), "") != 0)
|
|
|
{
|
|
|
- lua_error();
|
|
|
+ lua_error();
|
|
|
}
|
|
|
-}
|
|
|
-
|
|
|
-//-----------------------------------------------------------------------------
|
|
|
-void LuaEnvironment::load_file(const char* file)
|
|
|
-{
|
|
|
- int32_t loaded = luaL_loadfile(m_state, file);
|
|
|
|
|
|
- if (loaded != 0)
|
|
|
+ if (lua_pcall(m_state, 0, 0, 0) != 0)
|
|
|
{
|
|
|
lua_error();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-void LuaEnvironment::load_string(const char* str)
|
|
|
+void LuaEnvironment::call_global(const char* func, uint8_t argc, ...)
|
|
|
{
|
|
|
- int32_t loaded = luaL_loadstring(m_state, str);
|
|
|
+ CE_ASSERT_NOT_NULL(func);
|
|
|
|
|
|
- if (loaded != 0)
|
|
|
- {
|
|
|
- lua_error();
|
|
|
- }
|
|
|
-}
|
|
|
+ LuaStack stack(m_state);
|
|
|
|
|
|
-//-----------------------------------------------------------------------------
|
|
|
-void LuaEnvironment::get_global_symbol(const char* symbol)
|
|
|
-{
|
|
|
- lua_getglobal(m_state, symbol);
|
|
|
-}
|
|
|
+ va_list vl;
|
|
|
+ va_start(vl, argc);
|
|
|
|
|
|
-//-----------------------------------------------------------------------------
|
|
|
-void LuaEnvironment::execute(int32_t args, int32_t results)
|
|
|
-{
|
|
|
- int32_t executed = lua_pcall(m_state, args, results, 0);
|
|
|
+ lua_getglobal(m_state, func);
|
|
|
|
|
|
- if (executed != 0)
|
|
|
+ for (uint8_t i = 0; i < argc; i++)
|
|
|
{
|
|
|
- lua_error();
|
|
|
+ const int type = va_arg(vl, int);
|
|
|
+ switch (type)
|
|
|
+ {
|
|
|
+ case ARGUMENT_FLOAT:
|
|
|
+ {
|
|
|
+ stack.push_float(va_arg(vl, double));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ {
|
|
|
+ CE_ASSERT(false, "Oops, lua argument unknown");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
-}
|
|
|
-
|
|
|
-// //-----------------------------------------------------------------------------
|
|
|
-// void LuaEnvironment::collect_garbage()
|
|
|
-// {
|
|
|
-// uint64_t start = os::milliseconds();
|
|
|
-
|
|
|
-// while ((os::milliseconds() - start) < device()->last_delta_time() && !m_is_used)
|
|
|
-// {
|
|
|
-// lua_gc(m_state, LUA_GCSTEP, 0);
|
|
|
-// }
|
|
|
-// }
|
|
|
-
|
|
|
-// //-----------------------------------------------------------------------------
|
|
|
-// void* LuaEnvironment::background_thread(void* thiz)
|
|
|
-// {
|
|
|
-// ((LuaEnvironment*)thiz)->collect_garbage();
|
|
|
-// }
|
|
|
-
|
|
|
-//-----------------------------------------------------------------------------
|
|
|
-void LuaEnvironment::game_init()
|
|
|
-{
|
|
|
- const char* path = device()->filesystem()->os_path(g_default_mountpoint.value(), g_boot.value());
|
|
|
-
|
|
|
- load_file(path);
|
|
|
- execute(0, 0);
|
|
|
|
|
|
- get_global_symbol("init");
|
|
|
- execute(0, 0);
|
|
|
-}
|
|
|
-
|
|
|
-//-----------------------------------------------------------------------------
|
|
|
-void LuaEnvironment::game_shutdown()
|
|
|
-{
|
|
|
- get_global_symbol("shutdown");
|
|
|
- execute(0, 0);
|
|
|
-}
|
|
|
+ va_end(vl);
|
|
|
|
|
|
-//-----------------------------------------------------------------------------
|
|
|
-void LuaEnvironment::game_frame(float dt)
|
|
|
-{
|
|
|
- LuaStack stack(m_state);
|
|
|
-
|
|
|
- get_global_symbol("frame");
|
|
|
- stack.push_float(dt);
|
|
|
- execute(1, 0);
|
|
|
+ if (lua_pcall(m_state, argc, 0, 0) != 0)
|
|
|
+ {
|
|
|
+ lua_error();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
void LuaEnvironment::lua_error()
|
|
|
{
|
|
|
string::strncpy(m_error_buffer, "", 1024);
|
|
|
-
|
|
|
string::strncpy(m_error_buffer, lua_tostring(m_state, -1), 1024);
|
|
|
}
|
|
|
|
|
|
@@ -213,7 +178,6 @@ void LuaEnvironment::load_module_function(const char* module, const char* name,
|
|
|
|
|
|
entry[0].name = name;
|
|
|
entry[0].func = func;
|
|
|
-
|
|
|
entry[1].name = NULL;
|
|
|
entry[1].func = NULL;
|
|
|
|
|
|
@@ -227,32 +191,6 @@ void LuaEnvironment::load_module_enum(const char* /*module*/, const char* name,
|
|
|
lua_setfield(m_state, -2, name);
|
|
|
}
|
|
|
|
|
|
-//-----------------------------------------------------------------------------
|
|
|
-CE_EXPORT int32_t luaopen_libcrown(lua_State* /*L*/)
|
|
|
-{
|
|
|
- LuaEnvironment* env = device()->lua_environment();
|
|
|
-
|
|
|
- load_int_setting(*env);
|
|
|
- load_float_setting(*env);
|
|
|
- load_string_setting(*env);
|
|
|
-
|
|
|
- load_vec2(*env);
|
|
|
- load_vec3(*env);
|
|
|
- load_mat4(*env);
|
|
|
- load_quat(*env);
|
|
|
- load_math(*env);
|
|
|
-
|
|
|
- load_mouse(*env);
|
|
|
- load_keyboard(*env);
|
|
|
- load_accelerometer(*env);
|
|
|
-
|
|
|
- load_device(*env);
|
|
|
-
|
|
|
- load_window(*env);
|
|
|
-
|
|
|
- return 1;
|
|
|
-}
|
|
|
-
|
|
|
const char* LuaEnvironment::class_system = "function class(klass, super) "
|
|
|
" if not klass then "
|
|
|
" klass = {} "
|