position LuaQuestScript::getPosition(const luabind::object &potentialPosition) { using namespace luabind; if (!potentialPosition.is_valid()) { throw std::logic_error("no position found"); } try { return object_cast<position>(potentialPosition); } catch (cast_failed &e) { } auto positionType = type(potentialPosition); if (positionType == LUA_TTABLE) { try { int16_t x = object_cast<int16_t>(potentialPosition[1]); int16_t y = object_cast<int16_t>(potentialPosition[2]); int16_t z = object_cast<int16_t>(potentialPosition[3]); return position(x, y, z); } catch (cast_failed &e) { } } throw std::logic_error("no position found"); }
void LuaProxy::Graphics::__setSimpleSpriteOverride(const std::string & name, const luabind::object & overrideImg, lua_State * L) { HDC mainHdc, maskHdc; if (name.find("hardcoded-") == 0) { // If non of the above applies, then try with the hardcoded ones: HardcodedGraphicsItem::GetHDCByName(name, &mainHdc, &maskHdc); } if (mainHdc == nullptr && maskHdc == nullptr) { luaL_error(L, "Failed to get hardcoded image!"); return; } SMBXMaskedImage* img = SMBXMaskedImage::get(mainHdc, maskHdc); if (!overrideImg.is_valid()) { img->UnsetOverride(); return; } boost::optional<SMBXMaskedImage*> maskImg = luabind::object_cast_nothrow<SMBXMaskedImage*>(overrideImg); if (maskImg != boost::none) { img->SetOverride(*maskImg); return; } boost::optional<LuaProxy::Graphics::LuaImageResource*> rgbaImg = luabind::object_cast_nothrow<LuaProxy::Graphics::LuaImageResource*>(overrideImg); if (rgbaImg != boost::none) { if (*rgbaImg != nullptr && (*rgbaImg)->img) { img->SetOverride((*rgbaImg)->img); } return; } luaL_error(L, "Invalid input for sprite override!"); }
//------------------------------------------------------------------------------ bool ofxLua::checkType(int type, luabind::object& object) { if(!object.is_valid()) return false; if(luabind::type(object) == type) return true; return false; }
bool ReadScriptDescriptor::_CheckDataType(int32 type, luabind::object& obj_check) { int32 object_type = luabind::type(obj_check); if (obj_check.is_valid() == false) return false; // When this type is passed to the function, we don't care what type the object is as long // as it was seen to be something if (type == LUA_TNIL) { return true; } // Simple type comparison is all that is needed for all non-numeric types else if (type == object_type) { return true; } // Because Lua only has a "number" type, we have to do perform a special cast // to examine integer versus floating point types else if (object_type == LUA_TNUMBER) { if (type == INTEGER_TYPE) { try { luabind::object_cast<int32>(obj_check); return true; } catch (...) { return false; } } else if (type == UINTEGER_TYPE) { try { luabind::object_cast<uint32>(obj_check); return true; } catch (...) { return false; } } else if (type == FLOAT_TYPE) { try { luabind::object_cast<float>(obj_check); return true; } catch (...) { return false; } } else { return false; } } else { return false; } } // bool ReadScriptDescriptor::_CheckDataType(int32 type, luabind::object& obj_check)
void WaypointList::addFromList(const luabind::object &list) { if (list.is_valid()) { if (luabind::type(list) == LUA_TTABLE) { for (luabind::iterator it(list), end; it != end; ++it) { position pos = luabind::object_cast<position>(*it); positions.push_back(pos); } } } }
bool ReadScriptDescriptor::RunScriptObject(const luabind::object& object) { // Don't log in that case because we might want to run invalid (empty) objects // to simplify the caller code. if (!object.is_valid()) return true; try { ScriptCallFunction<void>(object); } catch(luabind::error e) { PRINT_ERROR << "Error while loading script object." << std::endl; ScriptManager->HandleLuaError(e); return false; } return true; }
void WaypointList::addFromList(const luabind::object &list) { if (list.is_valid()) { if (luabind::type(list) == LUA_TTABLE) { for (luabind::iterator it(list), end; it != end; ++it) { try { position pos = luabind::object_cast<position>(*it); positions.push_back(pos); } catch (luabind::cast_failed &e) { std::string script = World::get()->getCurrentScript()->getFileName(); std::string err = "Invalid type in parameter list of WaypointList:addFromList in " + script + ":\n"; err += "Expected type position\n"; Logger::writeError("scripts", err); } } } } }
void setGeometryIndices( Geometry * pGeom, const luabind::object & indexTable ) { if ( indexTable.is_valid() && indexTable.type() == LUA_TTABLE ) { if ( !pGeom->m_indexBuffer ) pGeom->m_indexBuffer.reset( new vector<unsigned short> ); unsigned int uiNewIndices = 0; pGeom->m_indexBuffer->clear(); for( luabind::object::array_iterator iter = indexTable.abegin(); iter != indexTable.aend(); iter++, uiNewIndices++ ) { boost::optional<unsigned short> oindex = luabind::object_cast_nothrow<unsigned short>( *iter ); if ( oindex ) pGeom->m_indexBuffer->push_back( *oindex.get() ); } pGeom->m_indexCount = uiNewIndices; } }
void setGeometryTexture1( Geometry * pGeom, const luabind::object & texture1Table ) { if ( texture1Table.is_valid() && texture1Table.type() == LUA_TTABLE ) { if ( !pGeom->m_texture1Buffer ) pGeom->m_texture1Buffer.reset( new vector<float> ); pGeom->m_texture1Buffer->clear(); for( luabind::object::array_iterator iter = texture1Table.abegin(); iter != texture1Table.aend(); iter++ ) { boost::optional<Point2> opt = luabind::object_cast_nothrow<Point2>( *iter ); if ( opt ) { Point2 * pt = opt.get(); pGeom->m_texture1Buffer->push_back( pt->x ); pGeom->m_texture1Buffer->push_back( pt->y ); } } } }
void LuaProxy::Graphics::__setSpriteOverride(const std::string& t, int index, const luabind::object& overrideImg, lua_State* L) { SMBXMaskedImage* img = getMaskedImage(t, index); if (img == nullptr) { luaL_error(L, "Graphics.sprite.%s[%d] does not exist", t.c_str(), index); return; } if (!overrideImg.is_valid()) { img->UnsetOverride(); return; } //I found that 'object_cast_nothrow' sometimes casts between incompatible types without returning 'boost::none' //switch order to avoid invalid casting from LIR to SMBXMI boost::optional<LuaProxy::Graphics::LuaImageResource*> rgbaImg = luabind::object_cast_nothrow<LuaProxy::Graphics::LuaImageResource*>(overrideImg); if (rgbaImg != boost::none) { if (*rgbaImg != nullptr && (*rgbaImg)->img) { img->SetOverride((*rgbaImg)->img); } return; } boost::optional<SMBXMaskedImage*> maskImg = luabind::object_cast_nothrow<SMBXMaskedImage*>(overrideImg); if (maskImg != boost::none) { img->SetOverride(*maskImg); return; } luaL_error(L, "Cannot set Graphics.sprite.%s[%d], invalid input type", t.c_str(), index); }
void setGeometryColor( Geometry * pGeom, const luabind::object & colorTable ) { if ( colorTable.is_valid() && colorTable.type() == LUA_TTABLE ) { if ( !pGeom->m_colorBuffer ) pGeom->m_colorBuffer.reset( new vector<float> ); pGeom->m_colorBuffer->clear(); for( luabind::object::array_iterator iter = colorTable.abegin(); iter != colorTable.aend(); iter++ ) { boost::optional<ColorA> opt = luabind::object_cast_nothrow<ColorA>( *iter ); if ( opt ) { ColorA * pt = opt.get(); pGeom->m_colorBuffer->push_back( pt->r ); pGeom->m_colorBuffer->push_back( pt->g ); pGeom->m_colorBuffer->push_back( pt->b ); pGeom->m_colorBuffer->push_back( pt->a ); } } } }
// // Local Functions // void setGeometryVertices( Geometry * pGeom, const luabind::object & vertexTable ) { if ( vertexTable.is_valid() && vertexTable.type() == LUA_TTABLE ) { if ( !pGeom->m_vertexBuffer ) pGeom->m_vertexBuffer.reset( new vector<float> ); pGeom->m_vertexBuffer->clear(); unsigned uiNewVertices = 0; for( luabind::object::array_iterator iter = vertexTable.abegin(); iter != vertexTable.aend(); iter++, uiNewVertices++ ) { boost::optional<Point3> opt = luabind::object_cast_nothrow<Point3>( *iter ); if ( opt ) { Point3 * pt = opt.get(); pGeom->m_vertexBuffer->push_back( pt->x ); pGeom->m_vertexBuffer->push_back( pt->y ); pGeom->m_vertexBuffer->push_back( pt->z ); } } pGeom->m_vertexCount = uiNewVertices; } }