// Copyright (C) 2015 Jérôme Leclercq // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequesites.hpp #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef NDK_SERVER #include #include #include #include #include #endif namespace Nz { /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param color Resulting color */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Color* color, TypeTag) { instance.CheckType(index, Nz::LuaType_Table); color->r = instance.CheckField("r", index); color->g = instance.CheckField("g", index); color->b = instance.CheckField("b", index); color->a = instance.CheckField("a", 255, index); return 1; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param angles Resulting euler angles */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, EulerAnglesd* angles, TypeTag) { switch (instance.GetType(index)) { case Nz::LuaType_Table: angles->Set(instance.CheckField("pitch", index), instance.CheckField("yaw", index), instance.CheckField("roll", index)); return 1; default: { if (instance.IsOfType(index, "EulerAngles")) angles->Set(*static_cast(instance.ToUserdata(index))); else angles->Set(*static_cast(instance.CheckUserdata(index, "Quaternion"))); return 1; } } } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param angles Resulting euler angles */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, EulerAnglesf* angles, TypeTag) { EulerAnglesd anglesDouble; unsigned int ret = LuaImplQueryArg(instance, index, &anglesDouble, TypeTag()); angles->Set(anglesDouble); return ret; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param fontRef Resulting reference to a font */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, FontRef* fontRef, TypeTag) { *fontRef = *static_cast(instance.CheckUserdata(index, "Font")); return 1; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param params Resulting parameters for a font */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, FontParams* params, TypeTag) { NazaraUnused(params); instance.CheckType(index, Nz::LuaType_Table); // Structure is empty for now return 1; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param params Resulting parameters for an image */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, ImageParams* params, TypeTag) { instance.CheckType(index, Nz::LuaType_Table); params->levelCount = instance.CheckField("LevelCount"); params->loadFormat = instance.CheckField("LoadFormat"); return 1; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param address Resulting IP address */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, IpAddress* address, TypeTag) { switch (instance.GetType(index)) { case Nz::LuaType_String: address->BuildFromAddress(instance.CheckString(index)); return 1; default: *address = *static_cast(instance.CheckUserdata(index, "IpAddress")); return 1; } } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param quat Resulting quaternion */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Matrix4d* mat, TypeTag) { switch (instance.GetType(index)) { case Nz::LuaType_Table: { double values[16]; for (std::size_t i = 0; i < 16; ++i) { instance.PushInteger(i + 1); instance.GetTable(); values[i] = instance.CheckNumber(-1); instance.Pop(); } mat->Set(values); return 1; } default: { if (instance.IsOfType(index, "Matrix4")) mat->Set(*static_cast(instance.ToUserdata(index))); return 1; } } } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param quat Resulting quaternion */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Matrix4f* mat, TypeTag) { Matrix4d matDouble; unsigned int ret = LuaImplQueryArg(instance, index, &matDouble, TypeTag()); mat->Set(matDouble); return ret; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param params Resulting parameters for a mesh */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, MeshParams* params, TypeTag) { instance.CheckType(index, Nz::LuaType_Table); params->animated = instance.CheckField("Animated", params->animated); params->center = instance.CheckField("Center", params->center); params->flipUVs = instance.CheckField("FlipUVs", params->flipUVs); //params->matrix = instance.CheckField("Matrix", params->matrix); params->optimizeIndexBuffers = instance.CheckField("OptimizeIndexBuffers", params->optimizeIndexBuffers); return 1; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param quat Resulting quaternion */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Quaterniond* quat, TypeTag) { switch (instance.GetType(index)) { case Nz::LuaType_Table: quat->Set(instance.CheckField("w", index), instance.CheckField("x", index), instance.CheckField("y", index), instance.CheckField("z", index)); return 1; default: { if (instance.IsOfType(index, "EulerAngles")) quat->Set(*static_cast(instance.ToUserdata(index))); else quat->Set(*static_cast(instance.CheckUserdata(index, "Quaternion"))); return 1; } } } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param quat Resulting quaternion */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Quaternionf* quat, TypeTag) { Quaterniond quatDouble; unsigned int ret = LuaImplQueryArg(instance, index, &quatDouble, TypeTag()); quat->Set(quatDouble); return ret; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param rect Resulting rectangle */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Rectd* rect, TypeTag) { instance.CheckType(index, LuaType_Table); rect->x = instance.CheckField("x", index); rect->y = instance.CheckField("y", index); rect->width = instance.CheckField("width", index); rect->height = instance.CheckField("height", index); return 1; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param rect Resulting rectangle */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Rectf* rect, TypeTag) { Rectd rectDouble; unsigned int ret = LuaImplQueryArg(instance, index, &rectDouble, TypeTag()); rect->Set(rectDouble); return ret; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param rect Resulting rectangle */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Rectui* rect, TypeTag) { Rectd rectDouble; unsigned int ret = LuaImplQueryArg(instance, index, &rectDouble, TypeTag()); rect->Set(rectDouble); return ret; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param vec Resulting vector2D */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Vector2d* vec, TypeTag) { switch (instance.GetType(index)) { case Nz::LuaType_Number: if (index < 0 && index > -2) instance.Error("Vector2 expected, two numbers are required to convert it"); vec->Set(instance.CheckNumber(index), instance.CheckNumber(index + 1)); return 2; case Nz::LuaType_Table: vec->Set(instance.CheckField("x", index), instance.CheckField("y", index)); return 1; default: vec->Set(*static_cast(instance.CheckUserdata(index, "Vector2"))); return 1; } } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param vec Resulting vector2D */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Vector2f* vec, TypeTag) { Vector2d vecDouble; unsigned int ret = LuaImplQueryArg(instance, index, &vecDouble, TypeTag()); vec->Set(vecDouble); return ret; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param vec Resulting vector2D */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Vector2ui* vec, TypeTag) { Vector2d vecDouble; unsigned int ret = LuaImplQueryArg(instance, index, &vecDouble, TypeTag()); vec->Set(vecDouble); return ret; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param vec Resulting vector3D */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Vector3d* vec, TypeTag) { switch (instance.GetType(index)) { case Nz::LuaType_Number: if (index < 0 && index > -3) instance.Error("Vector3 expected, three numbers are required to convert it"); vec->Set(instance.CheckNumber(index), instance.CheckNumber(index + 1), instance.CheckNumber(index + 2, 0.0)); return 3; case Nz::LuaType_Table: vec->Set(instance.CheckField("x", index), instance.CheckField("y", index), instance.CheckField("z", 0.0, index)); return 1; default: vec->Set(*static_cast(instance.CheckUserdata(index, "Vector3"))); return 1; } } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param vec Resulting vector3D */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Vector3f* vec, TypeTag) { Vector3d vecDouble; unsigned int ret = LuaImplQueryArg(instance, index, &vecDouble, TypeTag()); vec->Set(vecDouble); return ret; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param vec Resulting vector3D */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Vector3ui* vec, TypeTag) { Vector3d vecDouble; unsigned int ret = LuaImplQueryArg(instance, index, &vecDouble, TypeTag()); vec->Set(vecDouble); return ret; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param handle Resulting entity */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Ndk::EntityHandle* handle, TypeTag) { *handle = *static_cast(instance.CheckUserdata(index, "Entity")); return 1; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param handle Resulting world */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Ndk::WorldHandle* handle, TypeTag) { *handle = *static_cast(instance.CheckUserdata(index, "World")); return 1; } #ifndef NDK_SERVER /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param renderable Resulting reference to a instanced renderable */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, InstancedRenderableRef* renderable, TypeTag) { if (instance.IsOfType(index, "InstancedRenderable") || instance.IsOfType(index, "Model") || instance.IsOfType(index, "Sprite")) { *renderable = *static_cast(instance.ToUserdata(index)); } else instance.ArgError(index, "is not a InstancedRenderable instance"); return 1; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param params Resulting parameters for a material */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, MaterialParams* params, TypeTag) { instance.CheckType(index, Nz::LuaType_Table); params->loadAlphaMap = instance.CheckField("LoadAlphaMap", params->loadAlphaMap); params->loadDiffuseMap = instance.CheckField("LoadDiffuseMap", params->loadDiffuseMap); params->loadEmissiveMap = instance.CheckField("LoadEmissiveMap", params->loadEmissiveMap); params->loadHeightMap = instance.CheckField("LoadHeightMap", params->loadHeightMap); params->loadNormalMap = instance.CheckField("LoadNormalMap", params->loadNormalMap); params->loadSpecularMap = instance.CheckField("LoadSpecularMap", params->loadSpecularMap); return 1; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param params Resulting parameters for a model */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, ModelParameters* params, TypeTag) { instance.CheckType(index, Nz::LuaType_Table); params->loadMaterials = instance.CheckField("LoadMaterials", params->loadMaterials); LuaImplQueryArg(instance, -1, ¶ms->material, TypeTag()); LuaImplQueryArg(instance, -1, ¶ms->mesh, TypeTag()); return 1; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param params Resulting parameters for a music */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, MusicParams* params, TypeTag) { instance.CheckType(index, Nz::LuaType_Table); params->forceMono = instance.CheckField("ForceMono", params->forceMono); return 1; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param params Resulting parameters for a sound buffer */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, SoundBufferParams* params, TypeTag) { instance.CheckType(index, Nz::LuaType_Table); params->forceMono = instance.CheckField("ForceMono", params->forceMono); return 1; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param renderable Resulting reference to a sprite */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, SpriteRef* spriteRef, TypeTag) { *spriteRef = *static_cast(instance.CheckUserdata(index, "Sprite")); return 1; } /*! * \brief Queries arguments for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param index Index type * \param fontRef Resulting reference to a font */ inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, TextureRef* textureRef, TypeTag) { *textureRef = *static_cast(instance.CheckUserdata(index, "Texture")); return 1; } #endif /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting color */ inline int LuaImplReplyVal(const LuaInstance& instance, Color&& val, TypeTag) { instance.PushTable(); instance.PushField("r", val.r); instance.PushField("g", val.g); instance.PushField("b", val.b); instance.PushField("a", val.a); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting euler angles */ inline int LuaImplReplyVal(const LuaInstance& instance, EulerAnglesd&& val, TypeTag) { instance.PushInstance("EulerAngles", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting euler angles */ inline int LuaImplReplyVal(const LuaInstance& instance, EulerAnglesf&& val, TypeTag) { instance.PushInstance("EulerAngles", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting reference to a font */ inline int LuaImplReplyVal(const LuaInstance& instance, FontRef&& val, TypeTag) { instance.PushInstance("Font", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting size information for a font */ inline int LuaImplReplyVal(const LuaInstance& instance, Font::SizeInfo&& val, TypeTag) { instance.PushTable(); instance.PushField("LineHeight", val.lineHeight); instance.PushField("SpaceAdvance", val.spaceAdvance); instance.PushField("UnderlinePosition", val.underlinePosition); instance.PushField("UnderlineThickness", val.underlineThickness); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting IP address */ inline int LuaImplReplyVal(const LuaInstance& instance, IpAddress&& val, TypeTag) { instance.PushInstance("IpAddress", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting rectangle */ inline int LuaImplReplyVal(const LuaInstance& instance, Matrix4d&& val, TypeTag) { instance.PushInstance("Matrix4", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting rectangle */ inline int LuaImplReplyVal(const LuaInstance& instance, Matrix4f&& val, TypeTag) { instance.PushInstance("Matrix4", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting quaternion */ inline int LuaImplReplyVal(const LuaInstance& instance, Quaterniond&& val, TypeTag) { instance.PushInstance("Quaternion", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting quaternion */ inline int LuaImplReplyVal(const LuaInstance& instance, Quaternionf&& val, TypeTag) { instance.PushInstance("Quaternion", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting rectangle */ inline int LuaImplReplyVal(const LuaInstance& instance, Rectd&& val, TypeTag) { instance.PushInstance("Rect", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting rectangle */ inline int LuaImplReplyVal(const LuaInstance& instance, Rectf&& val, TypeTag) { instance.PushInstance("Rect", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting rectangle */ inline int LuaImplReplyVal(const LuaInstance& instance, Rectui&& val, TypeTag) { instance.PushInstance("Rect", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting vector2D */ inline int LuaImplReplyVal(const LuaInstance& instance, Vector2d&& val, TypeTag) { instance.PushInstance("Vector2", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting vector2D */ inline int LuaImplReplyVal(const LuaInstance& instance, Vector2f&& val, TypeTag) { instance.PushInstance("Vector2", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting vector2D */ inline int LuaImplReplyVal(const LuaInstance& instance, Vector2ui&& val, TypeTag) { instance.PushInstance("Vector2", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting vector3D */ inline int LuaImplReplyVal(const LuaInstance& instance, Vector3d&& val, TypeTag) { instance.PushInstance("Vector3", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting vector3D */ inline int LuaImplReplyVal(const LuaInstance& instance, Vector3f&& val, TypeTag) { instance.PushInstance("Vector3", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting vector3D */ inline int LuaImplReplyVal(const LuaInstance& instance, Vector3ui&& val, TypeTag) { instance.PushInstance("Vector3", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param ptr Resulting entity */ inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::Entity* ptr, TypeTag) { instance.PushInstance("Entity", ptr); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param ptr Resulting application */ inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::Application* ptr, TypeTag) { instance.PushInstance("Application", ptr); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param handle Resulting entity */ inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::EntityHandle&& handle, TypeTag) { instance.PushInstance("Entity", handle); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param handle Resulting node component */ inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::NodeComponentHandle&& handle, TypeTag) { instance.PushInstance("NodeComponent", handle); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param handle Resulting velocity component */ inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::VelocityComponentHandle&& handle, TypeTag) { instance.PushInstance("VelocityComponent", handle); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param ptr Resulting world */ inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::World* ptr, TypeTag) { instance.PushInstance("World", ptr); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param ptr Resulting world */ inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::WorldHandle&& handle, TypeTag) { instance.PushInstance("World", handle); return 1; } #ifndef NDK_SERVER /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param val Resulting sound buffer */ inline int LuaImplReplyVal(const LuaInstance& instance, const SoundBuffer* val, TypeTag) { instance.PushInstance("SoundBuffer", val); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param handle Resulting sprite */ inline int LuaImplReplyVal(const LuaInstance& instance, SpriteRef&& handle, TypeTag) { instance.PushInstance("Sprite", handle); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param handle Resulting texture */ inline int LuaImplReplyVal(const LuaInstance& instance, TextureRef&& handle, TypeTag) { instance.PushInstance("Texture", handle); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param handle Resulting console */ inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::ConsoleHandle&& handle, TypeTag) { instance.PushInstance("Console", handle); return 1; } /*! * \brief Replies by value for Lua * \return 1 in case of success * * \param instance Lua instance to interact with * \param handle Resulting graphics component */ inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::GraphicsComponentHandle&& handle, TypeTag) { instance.PushInstance("GraphicsComponent", handle); return 1; } #endif }