scriptobject.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // scriptobject.cpp
  2. // 
  3. // Copyright (C) 2006, Chris Laurel <claurel@shatters.net>
  4. //
  5. // Helper functions for Celestia's interface to Lua scripts.
  6. //
  7. // This program is free software; you can redistribute it and/or
  8. // modify it under the terms of the GNU General Public License
  9. // as published by the Free Software Foundation; either version 2
  10. // of the License, or (at your option) any later version.
  11. #include "scriptobject.h"
  12. using namespace std;
  13. // global script context for scripted orbits and rotations
  14. static lua_State* scriptObjectLuaState = NULL;
  15. static const char* ScriptedObjectNamePrefix = "cel_script_object_";
  16. static unsigned int ScriptedObjectNameIndex = 1;
  17. /*! Set the script context for ScriptedOrbits and ScriptRotations
  18.  *  Should be called just once at initialization.
  19.  */
  20. void
  21. SetScriptedObjectContext(lua_State* l)
  22. {
  23.     scriptObjectLuaState = l;
  24. }
  25. /*! Get the global script context for ScriptedOrbits.
  26.  */
  27. lua_State*
  28. GetScriptedObjectContext()
  29. {
  30.     return scriptObjectLuaState;
  31. }
  32. /*! Generate a unique name for this script orbit object so that
  33.  * we can refer to it later.
  34.  */
  35. string
  36. GenerateScriptObjectName()
  37. {
  38.     char buf[64];
  39.     sprintf(buf, "%s%u", ScriptedObjectNamePrefix, ScriptedObjectNameIndex);
  40.     ScriptedObjectNameIndex++;
  41.     return string(buf);
  42. }
  43. /*! Helper function to retrieve an entry from a table and leave
  44.  *  it on the top of the stack.
  45.  */
  46. void
  47. GetLuaTableEntry(lua_State* state,
  48.                  int tableIndex,
  49.                  const string& key)
  50. {
  51.     lua_pushvalue(state, tableIndex);
  52.     lua_pushstring(state, key.c_str());
  53.     lua_gettable(state, -2);
  54.     lua_remove(state, -2);
  55. }
  56. /*! Helper function to retrieve a number value from a table; returns
  57.  *  the specified default value if the key doesn't exist in the table.
  58.  */
  59. double
  60. SafeGetLuaNumber(lua_State* state,
  61.                  int tableIndex,
  62.                  const string& key,
  63.                  double defaultValue)
  64. {
  65.     double v = defaultValue;
  66.     GetLuaTableEntry(state, tableIndex, key);
  67.     if (lua_isnumber(state, -1))
  68.         v = lua_tonumber(state, -1);
  69.     lua_pop(state, 1);
  70.     return v;
  71. }
  72. /*! Convert all the parameters in an AssociativeArray to their equivalent Lua
  73.  *  types and insert them into the table on the top of the stack. Presently,
  74.  *  only number, string, and boolean values are converted.
  75.  */
  76. void
  77. SetLuaVariables(lua_State* state, Hash* parameters)
  78. {
  79.     for (HashIterator iter = parameters->begin(); iter != parameters->end();
  80.          iter++)
  81.     {
  82.         switch (iter->second->getType())
  83.         {
  84.         case Value::NumberType:
  85.             lua_pushstring(state, iter->first.c_str());
  86.             lua_pushnumber(state, iter->second->getNumber());
  87.             lua_settable(state, -3);
  88.             break;
  89.         case Value::StringType:
  90.             lua_pushstring(state, iter->first.c_str());
  91.             lua_pushstring(state, iter->second->getString().c_str());
  92.             lua_settable(state, -3);
  93.             break;
  94.         case Value::BooleanType:
  95.             lua_pushstring(state, iter->first.c_str());
  96.             lua_pushboolean(state, iter->second->getBoolean());
  97.             lua_settable(state, -3);
  98.             break;
  99.         default:
  100.             break;
  101.         }
  102.     }
  103. }