From 978293a57e196b3ecb7151ea3b106315937ac9f0 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Mon, 19 Oct 2009 18:58:46 +0000 Subject: [PATCH] restructured events a bit for efficiency git-svn-id: svn://anubis/anaglym/trunk@110 99a6e188-d820-4881-8870-2d33a10e2619 --- Engine.cc | 74 ++++++++++++++++++++++++++++++++++++++++++------------- Engine.h | 12 ++++++++- 2 files changed, 68 insertions(+), 18 deletions(-) diff --git a/Engine.cc b/Engine.cc index 9a1ed09..7c2fd4f 100644 --- a/Engine.cc +++ b/Engine.cc @@ -16,6 +16,10 @@ #include using namespace std; +#define checkForFunction(lua_name, event) \ + checkForFunctionFull(lua_name, #event, m_event_ ## event ## _present) +#define AG_EVENT_PREFIX "__ag_event_" + Engine * g_engine; SDL_Event Engine::userEvent; @@ -45,6 +49,13 @@ Engine::Engine(const string & path) /* setup redraw SDL event structure */ userEvent.type = SDL_USEREVENT; userEvent.user.code = 0; + + m_event_update_present = false; + m_event_key_pressed_present = false; + m_event_key_released_present = false; + m_event_mousebutton_pressed_present = false; + m_event_mousebutton_released_present = false; + m_event_mouse_motion_present = false; } Engine::~Engine() @@ -90,6 +101,13 @@ bool Engine::load(const char * program) return false; } + checkForFunction("update_event", update); + checkForFunction("key_pressed_event", key_pressed); + checkForFunction("key_released_event", key_released); + checkForFunction("mousebutton_pressed_event", mousebutton_pressed); + checkForFunction("mousebutton_released_event", mousebutton_released); + checkForFunction("mouse_motion_event", mouse_motion); + return true; } @@ -298,10 +316,10 @@ void Engine::run() { goto RET; } - key_event(event.key.keysym.sym, true); + key_pressed_event(event.key.keysym.sym); break; case SDL_KEYUP: - key_event(event.key.keysym.sym, false); + key_released_event(event.key.keysym.sym); break; case SDL_QUIT: goto RET; @@ -325,17 +343,14 @@ void Engine::update() doPhysics(); if (m_autoStartFrame) startFrame(); - lua_getfield(m_luaState, LUA_GLOBALSINDEX, "update_event"); - if (lua_type(m_luaState, -1) == LUA_TFUNCTION) + if (m_event_update_present) { + lua_getfield(m_luaState, LUA_GLOBALSINDEX, + AG_EVENT_PREFIX "update_event"); /* call the update function - pops the function ref from the stack */ int s = lua_pcall(m_luaState, 0, LUA_MULTRET, 0); reportErrors(s); } - else - { - lua_pop(m_luaState, 1); - } if (m_autoDrawObjects) drawObjects(); if (m_autoEndFrame) @@ -343,25 +358,50 @@ void Engine::update() m_drawing = false; } -void Engine::key_event(int keysym, bool pressed) +void Engine::key_pressed_event(int keysym) { - if (pressed) - m_keysDown[sdl_keymap[keysym]] = true; - else - m_keysDown.erase(sdl_keymap[keysym]); - lua_getfield(m_luaState, LUA_GLOBALSINDEX, - pressed ? "key_pressed_event" : "key_released_event"); - if (lua_type(m_luaState, -1) == LUA_TFUNCTION) + m_keysDown[sdl_keymap[keysym]] = true; + if (m_event_key_pressed_present) { + lua_getfield(m_luaState, LUA_GLOBALSINDEX, + AG_EVENT_PREFIX "key_pressed"); lua_pushstring(m_luaState, sdl_keymap[keysym]); - /* call the key_event function + /* call the key pressed event function * This pops the function ref and arguments from the stack */ int s = lua_pcall(m_luaState, 1, LUA_MULTRET, 0); reportErrors(s); } +} + +void Engine::key_released_event(int keysym) +{ + m_keysDown.erase(sdl_keymap[keysym]); + if (m_event_key_pressed_present) + { + lua_getfield(m_luaState, LUA_GLOBALSINDEX, + AG_EVENT_PREFIX "key_released"); + lua_pushstring(m_luaState, sdl_keymap[keysym]); + /* call the key released event function + * This pops the function ref and arguments from the stack */ + int s = lua_pcall(m_luaState, 1, LUA_MULTRET, 0); + reportErrors(s); + } +} + +void Engine::checkForFunctionFull(const std::string & lua_fn_name, + const std::string & event_name, bool & presentFlag) +{ + lua_getfield(m_luaState, LUA_GLOBALSINDEX, lua_fn_name.c_str()); + if (lua_isfunction(m_luaState, -1)) + { + lua_setfield(m_luaState, LUA_GLOBALSINDEX, + (AG_EVENT_PREFIX + event_name).c_str()); + presentFlag = true; + } else { lua_pop(m_luaState, 1); + presentFlag = false; } } diff --git a/Engine.h b/Engine.h index f69d5dd..a25a45b 100644 --- a/Engine.h +++ b/Engine.h @@ -117,12 +117,15 @@ class Engine void registerLibraries(); bool fileExists(const std::string & path); void update(); - void key_event(int keysym, bool pressed); + void key_pressed_event(int keysym); + void key_released_event(int keysym); Object * createObject(bool is_static, GLuint display_list, float scale = 1.0f) { return new Object(is_static, m_world, display_list, scale); } + void checkForFunctionFull(const std::string & lua_fn_name, + const std::string & event_name, bool & presentFlag); TextureCache m_textureCache; EngineFileLoader * m_fileLoader; @@ -141,6 +144,13 @@ class Engine bool m_autoEndFrame; bool m_autoDrawObjects; std::map m_keysDown; + + bool m_event_update_present; + bool m_event_key_pressed_present; + bool m_event_key_released_present; + bool m_event_mousebutton_pressed_present; + bool m_event_mousebutton_released_present; + bool m_event_mouse_motion_present; }; extern Engine * g_engine;