// 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 #ifndef NDK_SERVER #include #include #include #include #endif namespace Ndk { inline LuaBinding* LuaAPI::GetBinding() { return s_binding; } } namespace Nz { 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; } 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; } } } 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; } inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, FontRef* fontRef, TypeTag) { *fontRef = *static_cast(instance.CheckUserdata(index, "Font")); return 1; } 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; } 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; } 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; } 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; } 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; } 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; } } } 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; } 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; } } 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; } } 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; } 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; } 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; } } 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; } 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; } inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Ndk::EntityHandle* handle, TypeTag) { *handle = *static_cast(instance.CheckUserdata(index, "Entity")); return 1; } 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 inline unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, InstancedRenderableRef* renderable, TypeTag) { if (instance.IsOfType(index, "InstancedRenderable")) *renderable = *static_cast(instance.CheckUserdata(index, "InstancedRenderable")); else *renderable = *static_cast(instance.CheckUserdata(index, "Model")); return 1; } 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; } 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; } 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; } 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; } #endif inline int LuaImplReplyVal(const LuaInstance& instance, EulerAnglesd&& val, TypeTag) { instance.PushInstance("EulerAngles", val); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, EulerAnglesf&& val, TypeTag) { instance.PushInstance("EulerAngles", val); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, FontRef&& val, TypeTag) { instance.PushInstance("Font", val); return 1; } 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; } inline int LuaImplReplyVal(const LuaInstance& instance, Quaterniond&& val, TypeTag) { instance.PushInstance("Quaternion", val); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Quaternionf&& val, TypeTag) { instance.PushInstance("Quaternion", val); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, IpAddress&& val, TypeTag) { instance.PushInstance("IpAddress", val); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Rectd&& val, TypeTag) { instance.PushInstance("Rect", val); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Rectf&& val, TypeTag) { instance.PushInstance("Rect", val); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Rectui&& val, TypeTag) { instance.PushInstance("Rect", val); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Vector2d&& val, TypeTag) { instance.PushInstance("Vector2", val); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Vector2f&& val, TypeTag) { instance.PushInstance("Vector2", val); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Vector2ui&& val, TypeTag) { instance.PushInstance("Vector2", val); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Vector3d&& val, TypeTag) { instance.PushInstance("Vector3", val); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Vector3f&& val, TypeTag) { instance.PushInstance("Vector3", val); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Vector3ui&& val, TypeTag) { instance.PushInstance("Vector3", val); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::Entity* ptr, TypeTag) { instance.PushInstance("Entity", ptr); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::Application* ptr, TypeTag) { instance.PushInstance("Application", ptr); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::EntityHandle&& handle, TypeTag) { instance.PushInstance("Entity", handle); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::NodeComponentHandle&& handle, TypeTag) { instance.PushInstance("NodeComponent", handle); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::VelocityComponentHandle&& handle, TypeTag) { instance.PushInstance("VelocityComponent", handle); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::World* ptr, TypeTag) { instance.PushInstance("World", ptr); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::WorldHandle&& handle, TypeTag) { instance.PushInstance("World", handle); return 1; } #ifndef NDK_SERVER inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::ConsoleHandle&& handle, TypeTag) { instance.PushInstance("Console", handle); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, Ndk::GraphicsComponentHandle&& handle, TypeTag) { instance.PushInstance("GraphicsComponent", handle); return 1; } inline int LuaImplReplyVal(const LuaInstance& instance, const SoundBuffer* val, TypeTag) { instance.PushInstance("SoundBuffer", val); return 1; } #endif }