Procházet zdrojové kódy

Updated BB10 projects to work with Lua script support.
Minor fixes (in general and for compiling with Momentics/gcc).

Chris Culy před 13 roky
rodič
revize
bb658af28e

+ 5 - 1
gameplay-luagen/TODO.txt

@@ -25,10 +25,11 @@ Unsupported:
 
 Normal Priority List:
 =====================
+- Update project template.
+- Get all platforms working.
 - Fix memory leaks in gameplay-luagen and in generated code.
     - Add "@script{create}" to the appropriate gameplay functions.
     - Add "@script{own}" to array parameters that are owned by the function or class they are passed to?
-- Get all platforms working.
 - Add a global function that implements casting for use from Lua scripts (i.e. to downcast from a Control to a Button).
 
 Future Feature List:
@@ -37,6 +38,9 @@ Future Feature List:
 
 Lua Tips
 ========
+- On any function in gameplay that returns a pointer that is owned by the user calling that function (i.e. a create() function), add @script{create} as the last line of its doxygen comments.
+- On any function, variable, class, struct, enum, etc. that should not be accessible from Lua (except for things that are static to a .cpp file, which is already ignored), add @script{ignore} to its doxygen comments.
+- On any functions, variables, classes, structs, enums, etc. that are local to a .cpp file, declare them as static 1) because it is good practice and 2) so that Lua does not generate bindings for them.
 - To get printf/GP_WARN-like functionality using gameplay and Lua, use printError(string.format("...", ...)).
 - To do integer like comparisons or casts on a number variable x in Lua, use math.floor(x)
 - Make sure all your member function calls use ':' instead of '.'

+ 38 - 4
gameplay/.cproject

@@ -25,11 +25,15 @@
 									<listOptionValue builtIn="false" value="_FORTIFY_SOURCE=2"/>
 								</option>
 								<option id="com.qnx.qcc.option.compiler.includePath.2133604142" name="Include Directories (-I)" superClass="com.qnx.qcc.option.compiler.includePath" valueType="includePath">
+									<listOptionValue builtIn="false" value="&quot;../../external-deps/lua/include&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
 									<listOptionValue builtIn="false" value="&quot;../../external-deps/bullet/include&quot;"/>
 									<listOptionValue builtIn="false" value="&quot;../../external-deps/oggvorbis/include&quot;"/>
 									<listOptionValue builtIn="false" value="${QNX_TARGET}/../target-override/usr/include"/>
 								</option>
-								<option id="com.qnx.qcc.option.compiler.qccoptions.1968057343" name="QCC Options" superClass="com.qnx.qcc.option.compiler.qccoptions"/>
+								<option id="com.qnx.qcc.option.compiler.qccoptions.1968057343" name="QCC Options" superClass="com.qnx.qcc.option.compiler.qccoptions" valueType="stringList">
+									<listOptionValue builtIn="false" value="-Wno-psabi"/>
+								</option>
 								<option id="com.qnx.qcc.option.compiler.ccoptions.1078137668" name="Compiler Options (-Wc,)" superClass="com.qnx.qcc.option.compiler.ccoptions" valueType="stringList">
 									<listOptionValue builtIn="false" value="-mfpu=neon"/>
 								</option>
@@ -83,12 +87,17 @@
 								</option>
 								<option id="com.qnx.qcc.option.compiler.includePath.1670164593" name="Include Directories (-I)" superClass="com.qnx.qcc.option.compiler.includePath" valueType="includePath">
 									<listOptionValue builtIn="false" value="&quot;../../external-deps/bullet/include&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;../../external-deps/lua/include&quot;"/>
 									<listOptionValue builtIn="false" value="&quot;../../external-deps/oggvorbis/include&quot;"/>
 									<listOptionValue builtIn="false" value="${QNX_TARGET}/../target-override/usr/include"/>
 								</option>
 								<option id="com.qnx.qcc.option.compiler.ccoptions.1122311163" name="Compiler Options (-Wc,)" superClass="com.qnx.qcc.option.compiler.ccoptions" valueType="stringList">
 									<listOptionValue builtIn="false" value="-mfpu=neon"/>
 								</option>
+								<option id="com.qnx.qcc.option.compiler.qccoptions.1770609643" superClass="com.qnx.qcc.option.compiler.qccoptions" valueType="stringList">
+									<listOptionValue builtIn="false" value="-Wno-psabi"/>
+								</option>
 								<inputType id="com.qnx.qcc.inputType.compiler.1380846613" superClass="com.qnx.qcc.inputType.compiler"/>
 							</tool>
 							<tool id="com.qnx.qcc.tool.assembler.855139060" name="QCC Assembler" superClass="com.qnx.qcc.tool.assembler">
@@ -138,12 +147,17 @@
 								</option>
 								<option id="com.qnx.qcc.option.compiler.includePath.1503059677" name="Include Directories (-I)" superClass="com.qnx.qcc.option.compiler.includePath" valueType="includePath">
 									<listOptionValue builtIn="false" value="&quot;../../external-deps/bullet/include&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;../../external-deps/lua/include&quot;"/>
 									<listOptionValue builtIn="false" value="&quot;../../external-deps/oggvorbis/include&quot;"/>
 									<listOptionValue builtIn="false" value="${QNX_TARGET}/../target-override/usr/include"/>
 								</option>
 								<option id="com.qnx.qcc.option.compiler.ccoptions.1956270067" name="Compiler Options (-Wc,)" superClass="com.qnx.qcc.option.compiler.ccoptions" valueType="stringList">
 									<listOptionValue builtIn="false" value="-mfpu=neon"/>
 								</option>
+								<option id="com.qnx.qcc.option.compiler.qccoptions.1366354884" superClass="com.qnx.qcc.option.compiler.qccoptions" valueType="stringList">
+									<listOptionValue builtIn="false" value="-Wno-psabi"/>
+								</option>
 								<inputType id="com.qnx.qcc.inputType.compiler.81809638" superClass="com.qnx.qcc.inputType.compiler"/>
 							</tool>
 							<tool id="com.qnx.qcc.tool.assembler.2145279747" name="QCC Assembler" superClass="com.qnx.qcc.tool.assembler">
@@ -196,12 +210,17 @@
 								</option>
 								<option id="com.qnx.qcc.option.compiler.includePath.1769677874" name="Include Directories (-I)" superClass="com.qnx.qcc.option.compiler.includePath" valueType="includePath">
 									<listOptionValue builtIn="false" value="&quot;../../external-deps/bullet/include&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;../../external-deps/lua/include&quot;"/>
 									<listOptionValue builtIn="false" value="&quot;../../external-deps/oggvorbis/include&quot;"/>
 									<listOptionValue builtIn="false" value="${QNX_TARGET}/../target-override/usr/include"/>
 								</option>
 								<option id="com.qnx.qcc.option.compiler.ccoptions.47607907" name="Compiler Options (-Wc,)" superClass="com.qnx.qcc.option.compiler.ccoptions" valueType="stringList">
 									<listOptionValue builtIn="false" value="-mfpu=neon"/>
 								</option>
+								<option id="com.qnx.qcc.option.compiler.qccoptions.146547607" superClass="com.qnx.qcc.option.compiler.qccoptions" valueType="stringList">
+									<listOptionValue builtIn="false" value="-Wno-psabi"/>
+								</option>
 								<inputType id="com.qnx.qcc.inputType.compiler.2007171407" superClass="com.qnx.qcc.inputType.compiler"/>
 							</tool>
 							<tool id="com.qnx.qcc.tool.assembler.1537562121" name="QCC Assembler" superClass="com.qnx.qcc.tool.assembler">
@@ -252,10 +271,15 @@
 								</option>
 								<option id="com.qnx.qcc.option.compiler.includePath.847642559" name="Include Directories (-I)" superClass="com.qnx.qcc.option.compiler.includePath" valueType="includePath">
 									<listOptionValue builtIn="false" value="&quot;../../external-deps/bullet/include&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;../../external-deps/lua/include&quot;"/>
 									<listOptionValue builtIn="false" value="&quot;../../external-deps/oggvorbis/include&quot;"/>
 									<listOptionValue builtIn="false" value="${QNX_TARGET}/../target-override/usr/include"/>
 								</option>
-								<option id="com.qnx.qcc.option.compiler.ccoptions.1432778691" name="Compiler Options (-Wc,)" superClass="com.qnx.qcc.option.compiler.ccoptions" valueType="stringList"/>
+								<option id="com.qnx.qcc.option.compiler.ccoptions.1432778691" name="Compiler Options (-Wc,)" superClass="com.qnx.qcc.option.compiler.ccoptions"/>
+								<option id="com.qnx.qcc.option.compiler.qccoptions.245518255" superClass="com.qnx.qcc.option.compiler.qccoptions" valueType="stringList">
+									<listOptionValue builtIn="false" value="-Wno-psabi"/>
+								</option>
 								<inputType id="com.qnx.qcc.inputType.compiler.1038720310" superClass="com.qnx.qcc.inputType.compiler"/>
 							</tool>
 							<tool id="com.qnx.qcc.tool.assembler.521146732" name="QCC Assembler" superClass="com.qnx.qcc.tool.assembler">
@@ -306,10 +330,15 @@
 								</option>
 								<option id="com.qnx.qcc.option.compiler.includePath.513622172" name="Include Directories (-I)" superClass="com.qnx.qcc.option.compiler.includePath" valueType="includePath">
 									<listOptionValue builtIn="false" value="&quot;../../external-deps/bullet/include&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;../../external-deps/lua/include&quot;"/>
 									<listOptionValue builtIn="false" value="&quot;../../external-deps/oggvorbis/include&quot;"/>
 									<listOptionValue builtIn="false" value="${QNX_TARGET}/../target-override/usr/include"/>
 								</option>
-								<option id="com.qnx.qcc.option.compiler.ccoptions.663337616" name="Compiler Options (-Wc,)" superClass="com.qnx.qcc.option.compiler.ccoptions" valueType="stringList"/>
+								<option id="com.qnx.qcc.option.compiler.ccoptions.663337616" name="Compiler Options (-Wc,)" superClass="com.qnx.qcc.option.compiler.ccoptions"/>
+								<option id="com.qnx.qcc.option.compiler.qccoptions.288926109" superClass="com.qnx.qcc.option.compiler.qccoptions" valueType="stringList">
+									<listOptionValue builtIn="false" value="-Wno-psabi"/>
+								</option>
 								<inputType id="com.qnx.qcc.inputType.compiler.1961855927" superClass="com.qnx.qcc.inputType.compiler"/>
 							</tool>
 							<tool id="com.qnx.qcc.tool.assembler.1089440729" name="QCC Assembler" superClass="com.qnx.qcc.tool.assembler">
@@ -361,10 +390,15 @@
 								</option>
 								<option id="com.qnx.qcc.option.compiler.includePath.1685994750" name="Include Directories (-I)" superClass="com.qnx.qcc.option.compiler.includePath" valueType="includePath">
 									<listOptionValue builtIn="false" value="&quot;../../external-deps/bullet/include&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;../../external-deps/lua/include&quot;"/>
 									<listOptionValue builtIn="false" value="&quot;../../external-deps/oggvorbis/include&quot;"/>
 									<listOptionValue builtIn="false" value="${QNX_TARGET}/../target-override/usr/include"/>
 								</option>
-								<option id="com.qnx.qcc.option.compiler.ccoptions.346770186" name="Compiler Options (-Wc,)" superClass="com.qnx.qcc.option.compiler.ccoptions" valueType="stringList"/>
+								<option id="com.qnx.qcc.option.compiler.ccoptions.346770186" name="Compiler Options (-Wc,)" superClass="com.qnx.qcc.option.compiler.ccoptions"/>
+								<option id="com.qnx.qcc.option.compiler.qccoptions.1085566269" superClass="com.qnx.qcc.option.compiler.qccoptions" valueType="stringList">
+									<listOptionValue builtIn="false" value="-Wno-psabi"/>
+								</option>
 								<inputType id="com.qnx.qcc.inputType.compiler.1658185881" superClass="com.qnx.qcc.inputType.compiler"/>
 							</tool>
 							<tool id="com.qnx.qcc.tool.assembler.746786008" name="QCC Assembler" superClass="com.qnx.qcc.tool.assembler">

+ 1 - 0
gameplay/src/Base.h

@@ -168,6 +168,7 @@ extern void printError(const char* format, ...);
 #include <png.h>
 
 // Scripting
+using std::va_list;
 #include <lua.hpp>
 
 #define WINDOW_VSYNC        1

+ 5 - 2
gameplay/src/Game.cpp

@@ -41,8 +41,11 @@ Game::~Game()
         SAFE_DELETE(_scriptListeners);
     }
 
-    _scriptController->finalize();
-    SAFE_DELETE(_scriptController);
+    if (_scriptController)
+    {
+        _scriptController->finalize();
+        SAFE_DELETE(_scriptController);
+    }
 
     // Do not call any virtual functions from the destructor.
     // Finalization is done from outside this class.

+ 1 - 1
gameplay/src/Game.h

@@ -530,8 +530,8 @@ private:
     AnimationController* _animationController;  // Controls the scheduling and running of animations.
     AudioController* _audioController;          // Controls audio sources that are playing in the game.
     PhysicsController* _physicsController;      // Controls the simulation of a physics scene and entities.
-    ScriptController* _scriptController;        // Controls the scripting engine.
     AudioListener* _audioListener;              // The audio listener in 3D space.
+    ScriptController* _scriptController;        // Controls the scripting engine.
     std::vector<Gamepad*> _gamepads;            // The connected gamepads.
     std::priority_queue<TimeEvent, std::vector<TimeEvent>, std::less<TimeEvent> >* _timeEvents; // Contains the scheduled time events.
     std::vector<ScriptListener*>* _scriptListeners; // Lua script listeners.

+ 1 - 0
gameplay/src/Platform.h

@@ -29,6 +29,7 @@ public:
      * @param attachToWindow The native window handle to optionally attach to.
      * 
      * @return The created platform interface.
+     * @script{ignore}
      */
     static Platform* create(Game* game, void* attachToWindow = NULL);
 

+ 1 - 1
gameplay/src/SceneLoader.cpp

@@ -843,7 +843,7 @@ void SceneLoader::loadReferencedFiles()
             // Check if the referenced properties file has already been loaded.
             Properties* properties = NULL;
             std::map<std::string, Properties*>::iterator pffIter = _propertiesFromFile.find(fileString);
-            if (pffIter != _propertiesFromFile.end())
+            if (pffIter != _propertiesFromFile.end() && pffIter->second)
             {
                 properties = pffIter->second;
             }

+ 71 - 2
gameplay/src/ScriptController.cpp

@@ -462,7 +462,7 @@ void ScriptController::setGlobalHierarchy(std::map<std::string, std::vector<std:
     _hierarchy = hierarchy;
 }
 
-ScriptController::ScriptController()
+ScriptController::ScriptController() : _lua(NULL)
 {
     memset(_callbacks, 0, sizeof(std::string*) * CALLBACK_COUNT);
     __instance = this;
@@ -492,7 +492,8 @@ void ScriptController::initializeGame()
 
 void ScriptController::finalize()
 {
-    lua_close(_lua);
+    if (_lua)
+        lua_close(_lua);
 }
 
 void ScriptController::finalizeGame()
@@ -682,4 +683,72 @@ bool ScriptController::luaCheckBool(lua_State* state, int n)
     return (lua_toboolean(state, n) != 0);
 }
 
+template<> void ScriptController::executeFunction<void>(const char* func, const char* args, ...)
+{
+    va_list list;
+    va_start(list, args);
+    executeFunctionHelper(0, func, args, list);
+    va_end(list);
+}
+
+template<> bool ScriptController::executeFunction<bool>(const char* func, const char* args, ...)
+{
+    SCRIPT_EXECUTE_FUNCTION_PARAM(bool, luaCheckBool);
+}
+
+template<> char ScriptController::executeFunction<char>(const char* func, const char* args, ...)
+{
+    SCRIPT_EXECUTE_FUNCTION_PARAM(char, luaL_checkint);
+}
+
+template<> short ScriptController::executeFunction<short>(const char* func, const char* args, ...)
+{
+    SCRIPT_EXECUTE_FUNCTION_PARAM(short, luaL_checkint);
+}
+
+template<> int ScriptController::executeFunction<int>(const char* func, const char* args, ...)
+{
+    SCRIPT_EXECUTE_FUNCTION_PARAM(int, luaL_checkint);
+}
+
+template<> long ScriptController::executeFunction<long>(const char* func, const char* args, ...)
+{
+    SCRIPT_EXECUTE_FUNCTION_PARAM(long, luaL_checklong);
+}
+
+template<> unsigned char ScriptController::executeFunction<unsigned char>(const char* func, const char* args, ...)
+{
+    SCRIPT_EXECUTE_FUNCTION_PARAM(unsigned char, luaL_checkunsigned);
+}
+
+template<> unsigned short ScriptController::executeFunction<unsigned short>(const char* func, const char* args, ...)
+{
+    SCRIPT_EXECUTE_FUNCTION_PARAM(unsigned short, luaL_checkunsigned);
+}
+
+template<> unsigned int ScriptController::executeFunction<unsigned int>(const char* func, const char* args, ...)
+{
+    SCRIPT_EXECUTE_FUNCTION_PARAM(unsigned int, luaL_checkunsigned);
+}
+
+template<> unsigned long ScriptController::executeFunction<unsigned long>(const char* func, const char* args, ...)
+{
+    SCRIPT_EXECUTE_FUNCTION_PARAM(unsigned long, luaL_checkunsigned);
+}
+
+template<> float ScriptController::executeFunction<float>(const char* func, const char* args, ...)
+{
+    SCRIPT_EXECUTE_FUNCTION_PARAM(float, luaL_checknumber);
+}
+
+template<> double ScriptController::executeFunction<double>(const char* func, const char* args, ...)
+{
+    SCRIPT_EXECUTE_FUNCTION_PARAM(double, luaL_checknumber);
+}
+
+template<> std::string ScriptController::executeFunction<std::string>(const char* func, const char* args, ...)
+{
+    SCRIPT_EXECUTE_FUNCTION_PARAM(std::string, luaL_checkstring);
+}
+
 }

+ 27 - 27
gameplay/src/ScriptController.h

@@ -53,33 +53,6 @@ public:
      */
     template<typename T> T executeFunction(const char* func, const char* args, ...);
 
-    /** Template specialization. */
-    template<> void executeFunction<void>(const char* func, const char* args, ...);
-    /** Template specialization. */
-    template<> bool executeFunction<bool>(const char* func, const char* args, ...);
-    /** Template specialization. */
-    template<> char executeFunction<char>(const char* func, const char* args, ...);
-    /** Template specialization. */
-    template<> short executeFunction<short>(const char* func, const char* args, ...);
-    /** Template specialization. */
-    template<> int executeFunction<int>(const char* func, const char* args, ...);
-    /** Template specialization. */
-    template<> long executeFunction<long>(const char* func, const char* args, ...);
-    /** Template specialization. */
-    template<> unsigned char executeFunction<unsigned char>(const char* func, const char* args, ...);
-    /** Template specialization. */
-    template<> unsigned short executeFunction<unsigned short>(const char* func, const char* args, ...);
-    /** Template specialization. */
-    template<> unsigned int executeFunction<unsigned int>(const char* func, const char* args, ...);
-    /** Template specialization. */
-    template<> unsigned long executeFunction<unsigned long>(const char* func, const char* args, ...);
-    /** Template specialization. */
-    template<> float executeFunction<float>(const char* func, const char* args, ...);
-    /** Template specialization. */
-    template<> double executeFunction<double>(const char* func, const char* args, ...);
-    /** Template specialization. */
-    template<> std::string executeFunction<std::string>(const char* func, const char* args, ...);
-
     /**
      * Used to specify the pointer type for executing Lua functions that return pointers.
      * @script{ignore}
@@ -703,6 +676,33 @@ private:
     std::string* _callbacks[CALLBACK_COUNT];
 };
 
+/** Template specialization. */
+template<> void ScriptController::executeFunction<void>(const char* func, const char* args, ...);
+/** Template specialization. */
+template<> bool ScriptController::executeFunction<bool>(const char* func, const char* args, ...);
+/** Template specialization. */
+template<> char ScriptController::executeFunction<char>(const char* func, const char* args, ...);
+/** Template specialization. */
+template<> short ScriptController::executeFunction<short>(const char* func, const char* args, ...);
+/** Template specialization. */
+template<> int ScriptController::executeFunction<int>(const char* func, const char* args, ...);
+/** Template specialization. */
+template<> long ScriptController::executeFunction<long>(const char* func, const char* args, ...);
+/** Template specialization. */
+template<> unsigned char ScriptController::executeFunction<unsigned char>(const char* func, const char* args, ...);
+/** Template specialization. */
+template<> unsigned short ScriptController::executeFunction<unsigned short>(const char* func, const char* args, ...);
+/** Template specialization. */
+template<> unsigned int ScriptController::executeFunction<unsigned int>(const char* func, const char* args, ...);
+/** Template specialization. */
+template<> unsigned long ScriptController::executeFunction<unsigned long>(const char* func, const char* args, ...);
+/** Template specialization. */
+template<> float ScriptController::executeFunction<float>(const char* func, const char* args, ...);
+/** Template specialization. */
+template<> double ScriptController::executeFunction<double>(const char* func, const char* args, ...);
+/** Template specialization. */
+template<> std::string ScriptController::executeFunction<std::string>(const char* func, const char* args, ...);
+
 }
 
 #include "ScriptController.inl"

+ 3 - 71
gameplay/src/ScriptController.inl

@@ -18,74 +18,6 @@ template<typename T> T ScriptController::executeFunction(const char* func, const
     GP_ERROR("Unsupported type!");
 }
 
-template<> void ScriptController::executeFunction<void>(const char* func, const char* args, ...)
-{
-    va_list list;
-    va_start(list, args);
-    executeFunctionHelper(0, func, args, list);
-    va_end(list);
-}
-
-template<> bool ScriptController::executeFunction<bool>(const char* func, const char* args, ...)
-{
-    SCRIPT_EXECUTE_FUNCTION_PARAM(bool, luaCheckBool);
-}
-
-template<> char ScriptController::executeFunction<char>(const char* func, const char* args, ...)
-{
-    SCRIPT_EXECUTE_FUNCTION_PARAM(char, luaL_checkint);
-}
-
-template<> short ScriptController::executeFunction<short>(const char* func, const char* args, ...)
-{
-    SCRIPT_EXECUTE_FUNCTION_PARAM(short, luaL_checkint);
-}
-
-template<> int ScriptController::executeFunction<int>(const char* func, const char* args, ...)
-{
-    SCRIPT_EXECUTE_FUNCTION_PARAM(int, luaL_checkint);
-}
-
-template<> long ScriptController::executeFunction<long>(const char* func, const char* args, ...)
-{
-    SCRIPT_EXECUTE_FUNCTION_PARAM(long, luaL_checklong);
-}
-
-template<> unsigned char ScriptController::executeFunction<unsigned char>(const char* func, const char* args, ...)
-{
-    SCRIPT_EXECUTE_FUNCTION_PARAM(unsigned char, luaL_checkunsigned);
-}
-
-template<> unsigned short ScriptController::executeFunction<unsigned short>(const char* func, const char* args, ...)
-{
-    SCRIPT_EXECUTE_FUNCTION_PARAM(unsigned short, luaL_checkunsigned);
-}
-
-template<> unsigned int ScriptController::executeFunction<unsigned int>(const char* func, const char* args, ...)
-{
-    SCRIPT_EXECUTE_FUNCTION_PARAM(unsigned int, luaL_checkunsigned);
-}
-
-template<> unsigned long ScriptController::executeFunction<unsigned long>(const char* func, const char* args, ...)
-{
-    SCRIPT_EXECUTE_FUNCTION_PARAM(unsigned long, luaL_checkunsigned);
-}
-
-template<> float ScriptController::executeFunction<float>(const char* func, const char* args, ...)
-{
-    SCRIPT_EXECUTE_FUNCTION_PARAM(float, luaL_checknumber);
-}
-
-template<> double ScriptController::executeFunction<double>(const char* func, const char* args, ...)
-{
-    SCRIPT_EXECUTE_FUNCTION_PARAM(double, luaL_checknumber);
-}
-
-template<> std::string ScriptController::executeFunction<std::string>(const char* func, const char* args, ...)
-{
-    SCRIPT_EXECUTE_FUNCTION_PARAM(std::string, luaL_checkstring);
-}
-
 template<typename T> T* ScriptController::executeFunction(const Type& type, const char* func, const char* args, ...)
 {
     va_list list;
@@ -235,11 +167,11 @@ template<typename T>T* ScriptController::getObjectPointer(const char* type, cons
 
 template<typename T>void ScriptController::setObjectPointer(const char* type, const char* name, T* v)
 {
-    ScriptController::LuaObject* object = (ScriptController::LuaObject*)lua_newuserdata(state, sizeof(ScriptController::LuaObject));
+    ScriptController::LuaObject* object = (ScriptController::LuaObject*)lua_newuserdata(_lua, sizeof(ScriptController::LuaObject));
     object->instance = (void*)v;
     object->owns = false;
-    luaL_getmetatable(state, type);
-    lua_setmetatable(state, -2);
+    luaL_getmetatable(_lua, type);
+    lua_setmetatable(_lua, -2);
     lua_setglobal(_lua, name);
 }
 

+ 235 - 33
gameplay/src/lua/lua_Game.cpp

@@ -43,14 +43,20 @@ void luaRegister_Game()
         {"getState", lua_Game_getState},
         {"getViewport", lua_Game_getViewport},
         {"getWidth", lua_Game_getWidth},
+        {"hasMouse", lua_Game_hasMouse},
+        {"isCursorVisible", lua_Game_isCursorVisible},
+        {"isInitialized", lua_Game_isInitialized},
+        {"isMouseCaptured", lua_Game_isMouseCaptured},
         {"isMultiTouch", lua_Game_isMultiTouch},
         {"keyEvent", lua_Game_keyEvent},
-        {"menu", lua_Game_menu},
+        {"menuEvent", lua_Game_menuEvent},
         {"mouseEvent", lua_Game_mouseEvent},
         {"pause", lua_Game_pause},
         {"resume", lua_Game_resume},
         {"run", lua_Game_run},
         {"schedule", lua_Game_schedule},
+        {"setCursorVisible", lua_Game_setCursorVisible},
+        {"setMouseCaptured", lua_Game_setMouseCaptured},
         {"setMultiTouch", lua_Game_setMultiTouch},
         {"setViewport", lua_Game_setViewport},
         {"touchEvent", lua_Game_touchEvent},
@@ -586,34 +592,6 @@ int lua_Game_getGamepad(lua_State* state)
     // Attempt to match the parameters to a valid binding.
     switch (paramCount)
     {
-        case 1:
-        {
-            if ((lua_type(state, 1) == LUA_TUSERDATA))
-            {
-                Game* instance = getInstance(state);
-                void* returnPtr = (void*)instance->getGamepad();
-                if (returnPtr)
-                {
-                    ScriptController::LuaObject* object = (ScriptController::LuaObject*)lua_newuserdata(state, sizeof(ScriptController::LuaObject));
-                    object->instance = returnPtr;
-                    object->owns = false;
-                    luaL_getmetatable(state, "Gamepad");
-                    lua_setmetatable(state, -2);
-                }
-                else
-                {
-                    lua_pushnil(state);
-                }
-
-                return 1;
-            }
-            else
-            {
-                lua_pushstring(state, "lua_Game_getGamepad - Failed to match the given parameters to a valid function signature.");
-                lua_error(state);
-            }
-            break;
-        }
         case 2:
         {
             if ((lua_type(state, 1) == LUA_TUSERDATA) &&
@@ -648,7 +626,7 @@ int lua_Game_getGamepad(lua_State* state)
         }
         default:
         {
-            lua_pushstring(state, "Invalid number of parameters (expected 1 or 2).");
+            lua_pushstring(state, "Invalid number of parameters (expected 2).");
             lua_error(state);
             break;
         }
@@ -896,6 +874,154 @@ int lua_Game_getWidth(lua_State* state)
     return 0;
 }
 
+int lua_Game_hasMouse(lua_State* state)
+{
+    // Get the number of parameters.
+    int paramCount = lua_gettop(state);
+
+    // Attempt to match the parameters to a valid binding.
+    switch (paramCount)
+    {
+        case 1:
+        {
+            if ((lua_type(state, 1) == LUA_TUSERDATA))
+            {
+                Game* instance = getInstance(state);
+                bool result = instance->hasMouse();
+
+                // Push the return value onto the stack.
+                lua_pushboolean(state, result);
+
+                return 1;
+            }
+            else
+            {
+                lua_pushstring(state, "lua_Game_hasMouse - Failed to match the given parameters to a valid function signature.");
+                lua_error(state);
+            }
+            break;
+        }
+        default:
+        {
+            lua_pushstring(state, "Invalid number of parameters (expected 1).");
+            lua_error(state);
+            break;
+        }
+    }
+    return 0;
+}
+
+int lua_Game_isCursorVisible(lua_State* state)
+{
+    // Get the number of parameters.
+    int paramCount = lua_gettop(state);
+
+    // Attempt to match the parameters to a valid binding.
+    switch (paramCount)
+    {
+        case 1:
+        {
+            if ((lua_type(state, 1) == LUA_TUSERDATA))
+            {
+                Game* instance = getInstance(state);
+                bool result = instance->isCursorVisible();
+
+                // Push the return value onto the stack.
+                lua_pushboolean(state, result);
+
+                return 1;
+            }
+            else
+            {
+                lua_pushstring(state, "lua_Game_isCursorVisible - Failed to match the given parameters to a valid function signature.");
+                lua_error(state);
+            }
+            break;
+        }
+        default:
+        {
+            lua_pushstring(state, "Invalid number of parameters (expected 1).");
+            lua_error(state);
+            break;
+        }
+    }
+    return 0;
+}
+
+int lua_Game_isInitialized(lua_State* state)
+{
+    // Get the number of parameters.
+    int paramCount = lua_gettop(state);
+
+    // Attempt to match the parameters to a valid binding.
+    switch (paramCount)
+    {
+        case 1:
+        {
+            if ((lua_type(state, 1) == LUA_TUSERDATA))
+            {
+                Game* instance = getInstance(state);
+                bool result = instance->isInitialized();
+
+                // Push the return value onto the stack.
+                lua_pushboolean(state, result);
+
+                return 1;
+            }
+            else
+            {
+                lua_pushstring(state, "lua_Game_isInitialized - Failed to match the given parameters to a valid function signature.");
+                lua_error(state);
+            }
+            break;
+        }
+        default:
+        {
+            lua_pushstring(state, "Invalid number of parameters (expected 1).");
+            lua_error(state);
+            break;
+        }
+    }
+    return 0;
+}
+
+int lua_Game_isMouseCaptured(lua_State* state)
+{
+    // Get the number of parameters.
+    int paramCount = lua_gettop(state);
+
+    // Attempt to match the parameters to a valid binding.
+    switch (paramCount)
+    {
+        case 1:
+        {
+            if ((lua_type(state, 1) == LUA_TUSERDATA))
+            {
+                Game* instance = getInstance(state);
+                bool result = instance->isMouseCaptured();
+
+                // Push the return value onto the stack.
+                lua_pushboolean(state, result);
+
+                return 1;
+            }
+            else
+            {
+                lua_pushstring(state, "lua_Game_isMouseCaptured - Failed to match the given parameters to a valid function signature.");
+                lua_error(state);
+            }
+            break;
+        }
+        default:
+        {
+            lua_pushstring(state, "Invalid number of parameters (expected 1).");
+            lua_error(state);
+            break;
+        }
+    }
+    return 0;
+}
+
 int lua_Game_isMultiTouch(lua_State* state)
 {
     // Get the number of parameters.
@@ -975,7 +1101,7 @@ int lua_Game_keyEvent(lua_State* state)
     return 0;
 }
 
-int lua_Game_menu(lua_State* state)
+int lua_Game_menuEvent(lua_State* state)
 {
     // Get the number of parameters.
     int paramCount = lua_gettop(state);
@@ -988,13 +1114,13 @@ int lua_Game_menu(lua_State* state)
             if ((lua_type(state, 1) == LUA_TUSERDATA))
             {
                 Game* instance = getInstance(state);
-                instance->menu();
+                instance->menuEvent();
                 
                 return 0;
             }
             else
             {
-                lua_pushstring(state, "lua_Game_menu - Failed to match the given parameters to a valid function signature.");
+                lua_pushstring(state, "lua_Game_menuEvent - Failed to match the given parameters to a valid function signature.");
                 lua_error(state);
             }
             break;
@@ -1209,6 +1335,82 @@ int lua_Game_schedule(lua_State* state)
     return 0;
 }
 
+int lua_Game_setCursorVisible(lua_State* state)
+{
+    // Get the number of parameters.
+    int paramCount = lua_gettop(state);
+
+    // Attempt to match the parameters to a valid binding.
+    switch (paramCount)
+    {
+        case 2:
+        {
+            if ((lua_type(state, 1) == LUA_TUSERDATA) &&
+                lua_type(state, 2) == LUA_TBOOLEAN)
+            {
+                // Get parameter 1 off the stack.
+                bool param1 = ScriptController::luaCheckBool(state, 2);
+
+                Game* instance = getInstance(state);
+                instance->setCursorVisible(param1);
+                
+                return 0;
+            }
+            else
+            {
+                lua_pushstring(state, "lua_Game_setCursorVisible - Failed to match the given parameters to a valid function signature.");
+                lua_error(state);
+            }
+            break;
+        }
+        default:
+        {
+            lua_pushstring(state, "Invalid number of parameters (expected 2).");
+            lua_error(state);
+            break;
+        }
+    }
+    return 0;
+}
+
+int lua_Game_setMouseCaptured(lua_State* state)
+{
+    // Get the number of parameters.
+    int paramCount = lua_gettop(state);
+
+    // Attempt to match the parameters to a valid binding.
+    switch (paramCount)
+    {
+        case 2:
+        {
+            if ((lua_type(state, 1) == LUA_TUSERDATA) &&
+                lua_type(state, 2) == LUA_TBOOLEAN)
+            {
+                // Get parameter 1 off the stack.
+                bool param1 = ScriptController::luaCheckBool(state, 2);
+
+                Game* instance = getInstance(state);
+                instance->setMouseCaptured(param1);
+                
+                return 0;
+            }
+            else
+            {
+                lua_pushstring(state, "lua_Game_setMouseCaptured - Failed to match the given parameters to a valid function signature.");
+                lua_error(state);
+            }
+            break;
+        }
+        default:
+        {
+            lua_pushstring(state, "Invalid number of parameters (expected 2).");
+            lua_error(state);
+            break;
+        }
+    }
+    return 0;
+}
+
 int lua_Game_setMultiTouch(lua_State* state)
 {
     // Get the number of parameters.

+ 7 - 1
gameplay/src/lua/lua_Game.h

@@ -24,14 +24,20 @@ int lua_Game_getPhysicsController(lua_State* state);
 int lua_Game_getState(lua_State* state);
 int lua_Game_getViewport(lua_State* state);
 int lua_Game_getWidth(lua_State* state);
+int lua_Game_hasMouse(lua_State* state);
+int lua_Game_isCursorVisible(lua_State* state);
+int lua_Game_isInitialized(lua_State* state);
+int lua_Game_isMouseCaptured(lua_State* state);
 int lua_Game_isMultiTouch(lua_State* state);
 int lua_Game_keyEvent(lua_State* state);
-int lua_Game_menu(lua_State* state);
+int lua_Game_menuEvent(lua_State* state);
 int lua_Game_mouseEvent(lua_State* state);
 int lua_Game_pause(lua_State* state);
 int lua_Game_resume(lua_State* state);
 int lua_Game_run(lua_State* state);
 int lua_Game_schedule(lua_State* state);
+int lua_Game_setCursorVisible(lua_State* state);
+int lua_Game_setMouseCaptured(lua_State* state);
 int lua_Game_setMultiTouch(lua_State* state);
 int lua_Game_setViewport(lua_State* state);
 int lua_Game_static_getAbsoluteTime(lua_State* state);

+ 4 - 4
gameplay/src/lua/lua_ParticleEmitter.cpp

@@ -22,7 +22,7 @@ void luaRegister_ParticleEmitter()
     {
         {"addRef", lua_ParticleEmitter_addRef},
         {"draw", lua_ParticleEmitter_draw},
-        {"emit", lua_ParticleEmitter_emit},
+        {"emitOnce", lua_ParticleEmitter_emitOnce},
         {"getAcceleration", lua_ParticleEmitter_getAcceleration},
         {"getAccelerationVariance", lua_ParticleEmitter_getAccelerationVariance},
         {"getColorEnd", lua_ParticleEmitter_getColorEnd},
@@ -206,7 +206,7 @@ int lua_ParticleEmitter_draw(lua_State* state)
     return 0;
 }
 
-int lua_ParticleEmitter_emit(lua_State* state)
+int lua_ParticleEmitter_emitOnce(lua_State* state)
 {
     // Get the number of parameters.
     int paramCount = lua_gettop(state);
@@ -223,13 +223,13 @@ int lua_ParticleEmitter_emit(lua_State* state)
                 unsigned int param1 = (unsigned int)luaL_checkunsigned(state, 2);
 
                 ParticleEmitter* instance = getInstance(state);
-                instance->emit(param1);
+                instance->emitOnce(param1);
                 
                 return 0;
             }
             else
             {
-                lua_pushstring(state, "lua_ParticleEmitter_emit - Failed to match the given parameters to a valid function signature.");
+                lua_pushstring(state, "lua_ParticleEmitter_emitOnce - Failed to match the given parameters to a valid function signature.");
                 lua_error(state);
             }
             break;

+ 1 - 1
gameplay/src/lua/lua_ParticleEmitter.h

@@ -8,7 +8,7 @@ namespace gameplay
 int lua_ParticleEmitter__gc(lua_State* state);
 int lua_ParticleEmitter_addRef(lua_State* state);
 int lua_ParticleEmitter_draw(lua_State* state);
-int lua_ParticleEmitter_emit(lua_State* state);
+int lua_ParticleEmitter_emitOnce(lua_State* state);
 int lua_ParticleEmitter_getAcceleration(lua_State* state);
 int lua_ParticleEmitter_getAccelerationVariance(lua_State* state);
 int lua_ParticleEmitter_getColorEnd(lua_State* state);

+ 161 - 49
gameplay/src/lua/lua_Platform.cpp

@@ -20,17 +20,21 @@ void luaRegister_Platform()
     };
     const luaL_Reg lua_statics[] = 
     {
-        {"create", lua_Platform_static_create},
         {"displayKeyboard", lua_Platform_static_displayKeyboard},
         {"getAbsoluteTime", lua_Platform_static_getAbsoluteTime},
         {"getAccelerometerValues", lua_Platform_static_getAccelerometerValues},
         {"getDisplayHeight", lua_Platform_static_getDisplayHeight},
         {"getDisplayWidth", lua_Platform_static_getDisplayWidth},
+        {"hasMouse", lua_Platform_static_hasMouse},
+        {"isCursorVisible", lua_Platform_static_isCursorVisible},
+        {"isMouseCaptured", lua_Platform_static_isMouseCaptured},
         {"isMultiTouch", lua_Platform_static_isMultiTouch},
         {"isVsync", lua_Platform_static_isVsync},
         {"keyEventInternal", lua_Platform_static_keyEventInternal},
         {"mouseEventInternal", lua_Platform_static_mouseEventInternal},
         {"setAbsoluteTime", lua_Platform_static_setAbsoluteTime},
+        {"setCursorVisible", lua_Platform_static_setCursorVisible},
+        {"setMouseCaptured", lua_Platform_static_setMouseCaptured},
         {"setMultiTouch", lua_Platform_static_setMultiTouch},
         {"setVsync", lua_Platform_static_setVsync},
         {"signalShutdown", lua_Platform_static_signalShutdown},
@@ -128,54 +132,6 @@ int lua_Platform_enterMessagePump(lua_State* state)
     return 0;
 }
 
-int lua_Platform_static_create(lua_State* state)
-{
-    // Get the number of parameters.
-    int paramCount = lua_gettop(state);
-
-    // Attempt to match the parameters to a valid binding.
-    switch (paramCount)
-    {
-        case 1:
-        {
-            if ((lua_type(state, 1) == LUA_TUSERDATA || lua_type(state, 1) == LUA_TTABLE || lua_type(state, 1) == LUA_TNIL))
-            {
-                // Get parameter 1 off the stack.
-                Game* param1 = ScriptController::getInstance()->getObjectPointer<Game>(1, "Game", false);
-
-                void* returnPtr = (void*)Platform::create(param1);
-                if (returnPtr)
-                {
-                    ScriptController::LuaObject* object = (ScriptController::LuaObject*)lua_newuserdata(state, sizeof(ScriptController::LuaObject));
-                    object->instance = returnPtr;
-                    object->owns = false;
-                    luaL_getmetatable(state, "Platform");
-                    lua_setmetatable(state, -2);
-                }
-                else
-                {
-                    lua_pushnil(state);
-                }
-
-                return 1;
-            }
-            else
-            {
-                lua_pushstring(state, "lua_Platform_static_create - Failed to match the given parameters to a valid function signature.");
-                lua_error(state);
-            }
-            break;
-        }
-        default:
-        {
-            lua_pushstring(state, "Invalid number of parameters (expected 1).");
-            lua_error(state);
-            break;
-        }
-    }
-    return 0;
-}
-
 int lua_Platform_static_displayKeyboard(lua_State* state)
 {
     // Get the number of parameters.
@@ -336,6 +292,90 @@ int lua_Platform_static_getDisplayWidth(lua_State* state)
     return 0;
 }
 
+int lua_Platform_static_hasMouse(lua_State* state)
+{
+    // Get the number of parameters.
+    int paramCount = lua_gettop(state);
+
+    // Attempt to match the parameters to a valid binding.
+    switch (paramCount)
+    {
+        case 0:
+        {
+            bool result = Platform::hasMouse();
+
+            // Push the return value onto the stack.
+            lua_pushboolean(state, result);
+
+            return 1;
+            break;
+        }
+        default:
+        {
+            lua_pushstring(state, "Invalid number of parameters (expected 0).");
+            lua_error(state);
+            break;
+        }
+    }
+    return 0;
+}
+
+int lua_Platform_static_isCursorVisible(lua_State* state)
+{
+    // Get the number of parameters.
+    int paramCount = lua_gettop(state);
+
+    // Attempt to match the parameters to a valid binding.
+    switch (paramCount)
+    {
+        case 0:
+        {
+            bool result = Platform::isCursorVisible();
+
+            // Push the return value onto the stack.
+            lua_pushboolean(state, result);
+
+            return 1;
+            break;
+        }
+        default:
+        {
+            lua_pushstring(state, "Invalid number of parameters (expected 0).");
+            lua_error(state);
+            break;
+        }
+    }
+    return 0;
+}
+
+int lua_Platform_static_isMouseCaptured(lua_State* state)
+{
+    // Get the number of parameters.
+    int paramCount = lua_gettop(state);
+
+    // Attempt to match the parameters to a valid binding.
+    switch (paramCount)
+    {
+        case 0:
+        {
+            bool result = Platform::isMouseCaptured();
+
+            // Push the return value onto the stack.
+            lua_pushboolean(state, result);
+
+            return 1;
+            break;
+        }
+        default:
+        {
+            lua_pushstring(state, "Invalid number of parameters (expected 0).");
+            lua_error(state);
+            break;
+        }
+    }
+    return 0;
+}
+
 int lua_Platform_static_isMultiTouch(lua_State* state)
 {
     // Get the number of parameters.
@@ -519,6 +559,78 @@ int lua_Platform_static_setAbsoluteTime(lua_State* state)
     return 0;
 }
 
+int lua_Platform_static_setCursorVisible(lua_State* state)
+{
+    // Get the number of parameters.
+    int paramCount = lua_gettop(state);
+
+    // Attempt to match the parameters to a valid binding.
+    switch (paramCount)
+    {
+        case 1:
+        {
+            if (lua_type(state, 1) == LUA_TBOOLEAN)
+            {
+                // Get parameter 1 off the stack.
+                bool param1 = ScriptController::luaCheckBool(state, 1);
+
+                Platform::setCursorVisible(param1);
+                
+                return 0;
+            }
+            else
+            {
+                lua_pushstring(state, "lua_Platform_static_setCursorVisible - Failed to match the given parameters to a valid function signature.");
+                lua_error(state);
+            }
+            break;
+        }
+        default:
+        {
+            lua_pushstring(state, "Invalid number of parameters (expected 1).");
+            lua_error(state);
+            break;
+        }
+    }
+    return 0;
+}
+
+int lua_Platform_static_setMouseCaptured(lua_State* state)
+{
+    // Get the number of parameters.
+    int paramCount = lua_gettop(state);
+
+    // Attempt to match the parameters to a valid binding.
+    switch (paramCount)
+    {
+        case 1:
+        {
+            if (lua_type(state, 1) == LUA_TBOOLEAN)
+            {
+                // Get parameter 1 off the stack.
+                bool param1 = ScriptController::luaCheckBool(state, 1);
+
+                Platform::setMouseCaptured(param1);
+                
+                return 0;
+            }
+            else
+            {
+                lua_pushstring(state, "lua_Platform_static_setMouseCaptured - Failed to match the given parameters to a valid function signature.");
+                lua_error(state);
+            }
+            break;
+        }
+        default:
+        {
+            lua_pushstring(state, "Invalid number of parameters (expected 1).");
+            lua_error(state);
+            break;
+        }
+    }
+    return 0;
+}
+
 int lua_Platform_static_setMultiTouch(lua_State* state)
 {
     // Get the number of parameters.

+ 5 - 1
gameplay/src/lua/lua_Platform.h

@@ -7,17 +7,21 @@ namespace gameplay
 // Lua bindings for Platform.
 int lua_Platform__gc(lua_State* state);
 int lua_Platform_enterMessagePump(lua_State* state);
-int lua_Platform_static_create(lua_State* state);
 int lua_Platform_static_displayKeyboard(lua_State* state);
 int lua_Platform_static_getAbsoluteTime(lua_State* state);
 int lua_Platform_static_getAccelerometerValues(lua_State* state);
 int lua_Platform_static_getDisplayHeight(lua_State* state);
 int lua_Platform_static_getDisplayWidth(lua_State* state);
+int lua_Platform_static_hasMouse(lua_State* state);
+int lua_Platform_static_isCursorVisible(lua_State* state);
+int lua_Platform_static_isMouseCaptured(lua_State* state);
 int lua_Platform_static_isMultiTouch(lua_State* state);
 int lua_Platform_static_isVsync(lua_State* state);
 int lua_Platform_static_keyEventInternal(lua_State* state);
 int lua_Platform_static_mouseEventInternal(lua_State* state);
 int lua_Platform_static_setAbsoluteTime(lua_State* state);
+int lua_Platform_static_setCursorVisible(lua_State* state);
+int lua_Platform_static_setMouseCaptured(lua_State* state);
 int lua_Platform_static_setMultiTouch(lua_State* state);
 int lua_Platform_static_setVsync(lua_State* state);
 int lua_Platform_static_signalShutdown(lua_State* state);