From f548bc79d44a025ef57696ef10204174b84cc4d9 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 23 Oct 2013 16:17:26 +0000 Subject: [PATCH] Added support for Group::addChild/setChild/getChild/getNumChildren. --- src/osgPlugins/lua/LuaScriptEngine.cpp | 268 ++++++++++++++++++++++--- src/osgPlugins/lua/ReaderWriterLua.cpp | 8 +- 2 files changed, 246 insertions(+), 30 deletions(-) diff --git a/src/osgPlugins/lua/LuaScriptEngine.cpp b/src/osgPlugins/lua/LuaScriptEngine.cpp index ca3c4ea28..56c689b91 100644 --- a/src/osgPlugins/lua/LuaScriptEngine.cpp +++ b/src/osgPlugins/lua/LuaScriptEngine.cpp @@ -81,6 +81,213 @@ static int setProperty(lua_State* _lua) return 0; } +static int getChild(lua_State * _lua) +{ + const LuaScriptEngine* lse = reinterpret_cast(lua_topointer(_lua, lua_upvalueindex(1))); + + int n = lua_gettop(_lua); /* number of arguments */ + if (n==2) + { + if (lua_type(_lua, 1)==LUA_TTABLE && + lua_type(_lua, 2)==LUA_TNUMBER) + { + std::string propertyName = lua_tostring(_lua, 2); + + osg::Object* object = 0; + lua_pushstring(_lua, "object_ptr"); + lua_rawget(_lua, 1); + + if (lua_type(_lua, -1)==LUA_TUSERDATA) + { + object = *const_cast(reinterpret_cast(lua_touserdata(_lua,-1))); + } + + lua_pop(_lua,1); + + int index = static_cast(lua_tonumber(_lua, 2)); + + osg::Group* group = dynamic_cast(object); + if (group) + { + if (index>=0 && index(group->getNumChildren())) + { + lse->pushObject(group->getChild(index)); + return 1; + } + else + { + OSG_NOTICE<<"Warning: child index out of range "<(reinterpret_cast(lua_touserdata(_lua,-1))); + } + + lua_pop(_lua,1); + } + + osg::Group* group = dynamic_cast(object); + if (!group) + { + OSG_NOTICE<<"Warning: cannot set child to non osg::Group object. "<(lua_tonumber(_lua, 2)); + + // get the child node + { + lua_pushstring(_lua, "object_ptr"); + lua_rawget(_lua, 3); + + if (lua_type(_lua, -1)==LUA_TUSERDATA) + { + object = *const_cast(reinterpret_cast(lua_touserdata(_lua,-1))); + } + + lua_pop(_lua,1); + } + + osg::Node* child = dynamic_cast(object); + if (!child) + { + OSG_NOTICE<<"Warning: cannot set non osg::Node child to osg::Group. Child passed is of type: "<className()<=0 && index(group->getNumChildren())) + { + group->setChild(index, child); + return 1; + } + else + { + OSG_NOTICE<<"Warning: child index out of range "<(reinterpret_cast(lua_touserdata(_lua,-1))); + } + + lua_pop(_lua,1); + + osg::Object* child_obj = 0; + lua_pushstring(_lua, "object_ptr"); + lua_rawget(_lua, 2); + + if (lua_type(_lua, -1)==LUA_TUSERDATA) + { + child_obj = *const_cast(reinterpret_cast(lua_touserdata(_lua,-1))); + } + + lua_pop(_lua,1); + + + osg::Group* group = dynamic_cast(object); + osg::Node* child = dynamic_cast(child_obj); + if (group && child) + { + OSG_NOTICE<<"Group "<addChild(child); + return 0; + } + } + } + + OSG_NOTICE<<"Warning: Lua Group::addChild() parameters not matched"<(reinterpret_cast(lua_touserdata(_lua,-1))); + } + + lua_pop(_lua,1); + + osg::Group* group = dynamic_cast(object); + if (group) + { + lua_pushinteger(_lua, group->getNumChildren()); + return 1; + } + else + { + OSG_NOTICE<<"Warning: cannot get child from non osg::Group object. "<second; - OSG_NOTICE<<"Stack before pcall "<className()<<" to to object "<className()<<"::"<libraryName()); lua_settable(_lua, -3); lua_pushstring(_lua, "className"); lua_pushstring(_lua, object->className()); lua_settable(_lua, -3); - luaL_getmetatable(_lua, "LuaScriptEngine.Object"); - lua_setmetatable(_lua, -2); + + osg::Group* group = dynamic_cast(object); + if (group) + { + lua_pushstring(_lua, "getChild"); + lua_pushlightuserdata(_lua, const_cast(this)); + lua_pushcclosure(_lua, getChild, 1); + lua_settable(_lua, -3); + + lua_pushstring(_lua, "setChild"); + lua_pushlightuserdata(_lua, const_cast(this)); + lua_pushcclosure(_lua, setChild, 1); + lua_settable(_lua, -3); + + lua_pushstring(_lua, "addChild"); + lua_pushlightuserdata(_lua, const_cast(this)); + lua_pushcclosure(_lua, addChild, 1); + lua_settable(_lua, -3); + + lua_pushstring(_lua, "getNumChildren"); + lua_pushlightuserdata(_lua, const_cast(this)); + lua_pushcclosure(_lua, getNumChildren, 1); + lua_settable(_lua, -3); + + luaL_getmetatable(_lua, "LuaScriptEngine.Object"); + lua_setmetatable(_lua, -2); + } + else + { + luaL_getmetatable(_lua, "LuaScriptEngine.Object"); + lua_setmetatable(_lua, -2); + } } else { diff --git a/src/osgPlugins/lua/ReaderWriterLua.cpp b/src/osgPlugins/lua/ReaderWriterLua.cpp index a1af94c1a..a1c66a8a8 100644 --- a/src/osgPlugins/lua/ReaderWriterLua.cpp +++ b/src/osgPlugins/lua/ReaderWriterLua.cpp @@ -94,7 +94,13 @@ class ReaderWriterLua : public osgDB::ReaderWriter if (objects.empty()) return 0; - if (objects.size()==1) return objects[0].get(); + if (objects.size()==1) + { + osg::Group* group = dynamic_cast(objects[0].get()); + OSG_NOTICE<<"readObject form script, have one object "<className()<<" "<