// Copyright (C) 2017 Jérôme Leclercq // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequisites.hpp #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef NDK_SERVER #include #include #include #include #include #endif namespace Nz { inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Color* color, TypeTag) { state.CheckType(index, Nz::LuaType_Table); color->r = state.CheckField("r", index); color->g = state.CheckField("g", index); color->b = state.CheckField("b", index); color->a = state.CheckField("a", 255, index); return 1; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, EulerAnglesd* angles, TypeTag) { switch (state.GetType(index)) { case Nz::LuaType_Table: angles->Set(state.CheckField("pitch", index), state.CheckField("yaw", index), state.CheckField("roll", index)); return 1; default: { if (state.IsOfType(index, "EulerAngles")) angles->Set(*static_cast(state.ToUserdata(index))); else angles->Set(*static_cast(state.CheckUserdata(index, "Quaternion"))); return 1; } } } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, EulerAnglesf* angles, TypeTag) { EulerAnglesd anglesDouble; unsigned int ret = LuaImplQueryArg(state, index, &anglesDouble, TypeTag()); angles->Set(anglesDouble); return ret; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, FontRef* fontRef, TypeTag) { *fontRef = *static_cast(state.CheckUserdata(index, "Font")); return 1; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, FontParams* params, TypeTag) { NazaraUnused(params); state.CheckType(index, Nz::LuaType_Table); // Structure is empty for now return 1; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, ImageParams* params, TypeTag) { state.CheckType(index, Nz::LuaType_Table); params->levelCount = state.CheckField("LevelCount"); params->loadFormat = state.CheckField("LoadFormat"); return 1; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, IpAddress* address, TypeTag) { switch (state.GetType(index)) { case Nz::LuaType_String: address->BuildFromAddress(state.CheckString(index)); return 1; default: *address = *static_cast(state.CheckUserdata(index, "IpAddress")); return 1; } } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Matrix4d* mat, TypeTag) { switch (state.GetType(index)) { case Nz::LuaType_Table: { double values[16]; for (std::size_t i = 0; i < 16; ++i) { state.PushInteger(i + 1); state.GetTable(); values[i] = state.CheckNumber(-1); state.Pop(); } *mat = Matrix4d(values); return 1; } default: { if (state.IsOfType(index, "Matrix4")) *mat = *static_cast(state.ToUserdata(index)); return 1; } } } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Matrix4f* mat, TypeTag) { Matrix4d matDouble = Matrix4d::Identity(); unsigned int ret = LuaImplQueryArg(state, index, &matDouble, TypeTag()); mat->Set(matDouble); return ret; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, MeshParams* params, TypeTag) { state.CheckType(index, Nz::LuaType_Table); params->animated = state.CheckField("Animated", params->animated); params->center = state.CheckField("Center", params->center); params->matrix = state.CheckField("Matrix", params->matrix); params->optimizeIndexBuffers = state.CheckField("OptimizeIndexBuffers", params->optimizeIndexBuffers); params->texCoordOffset = state.CheckField("TexCoordOffset", params->texCoordOffset); params->texCoordScale = state.CheckField("TexCoordScale", params->texCoordScale); return 1; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Quaterniond* quat, TypeTag) { switch (state.GetType(index)) { case Nz::LuaType_Table: quat->Set(state.CheckField("w", index), state.CheckField("x", index), state.CheckField("y", index), state.CheckField("z", index)); return 1; default: { if (state.IsOfType(index, "EulerAngles")) quat->Set(*static_cast(state.ToUserdata(index))); else quat->Set(*static_cast(state.CheckUserdata(index, "Quaternion"))); return 1; } } } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Quaternionf* quat, TypeTag) { Quaterniond quatDouble; unsigned int ret = LuaImplQueryArg(state, index, &quatDouble, TypeTag()); quat->Set(quatDouble); return ret; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Rectd* rect, TypeTag) { state.CheckType(index, LuaType_Table); rect->x = state.CheckField("x", index); rect->y = state.CheckField("y", index); rect->width = state.CheckField("width", index); rect->height = state.CheckField("height", index); return 1; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Rectf* rect, TypeTag) { Rectd rectDouble; unsigned int ret = LuaImplQueryArg(state, index, &rectDouble, TypeTag()); rect->Set(rectDouble); return ret; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Recti* rect, TypeTag) { Rectd rectDouble; unsigned int ret = LuaImplQueryArg(state, index, &rectDouble, TypeTag()); rect->Set(rectDouble); return ret; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Rectui* rect, TypeTag) { Rectd rectDouble; unsigned int ret = LuaImplQueryArg(state, index, &rectDouble, TypeTag()); rect->Set(rectDouble); return ret; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Vector2d* vec, TypeTag) { switch (state.GetType(index)) { case Nz::LuaType_Number: if (index < 0 && index > -2) state.Error("Vector2 expected, two numbers are required to convert it"); vec->Set(state.CheckNumber(index), state.CheckNumber(index + 1)); return 2; case Nz::LuaType_Table: vec->Set(state.CheckField("x", index), state.CheckField("y", index)); return 1; default: vec->Set(*static_cast(state.CheckUserdata(index, "Vector2"))); return 1; } } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Vector2f* vec, TypeTag) { Vector2d vecDouble; unsigned int ret = LuaImplQueryArg(state, index, &vecDouble, TypeTag()); vec->Set(vecDouble); return ret; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Vector2ui* vec, TypeTag) { Vector2d vecDouble; unsigned int ret = LuaImplQueryArg(state, index, &vecDouble, TypeTag()); vec->Set(vecDouble); return ret; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Vector2i* vec, TypeTag) { Vector2d vecDouble; unsigned int ret = LuaImplQueryArg(state, index, &vecDouble, TypeTag()); vec->Set(vecDouble); return ret; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Vector3d* vec, TypeTag) { switch (state.GetType(index)) { case Nz::LuaType_Number: if (index < 0 && index > -3) state.Error("Vector3 expected, three numbers are required to convert it"); vec->Set(state.CheckNumber(index), state.CheckNumber(index + 1), state.CheckNumber(index + 2, 0.0)); return 3; case Nz::LuaType_Table: vec->Set(state.CheckField("x", index), state.CheckField("y", index), state.CheckField("z", 0.0, index)); return 1; default: vec->Set(*static_cast(state.CheckUserdata(index, "Vector3"))); return 1; } } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Vector3f* vec, TypeTag) { Vector3d vecDouble; unsigned int ret = LuaImplQueryArg(state, index, &vecDouble, TypeTag()); vec->Set(vecDouble); return ret; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Vector3ui* vec, TypeTag) { Vector3d vecDouble; unsigned int ret = LuaImplQueryArg(state, index, &vecDouble, TypeTag()); vec->Set(vecDouble); return ret; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Vector3i* vec, TypeTag) { Vector3d vecDouble; unsigned int ret = LuaImplQueryArg(state, index, &vecDouble, TypeTag()); vec->Set(vecDouble); return ret; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Ndk::Entity** handle, TypeTag) { if (!state.IsOfType(index, LuaType_Nil)) *handle = *static_cast(state.CheckUserdata(index, "Entity")); else *handle = nullptr; return 1; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Ndk::EntityHandle* handle, TypeTag) { if (!state.IsOfType(index, LuaType_Nil)) *handle = *static_cast(state.CheckUserdata(index, "Entity")); else handle->Reset(); return 1; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Ndk::WorldHandle* handle, TypeTag) { *handle = *static_cast(state.CheckUserdata(index, "World")); return 1; } #ifndef NDK_SERVER inline unsigned int LuaImplQueryArg(const LuaState& state, int index, InstancedRenderableRef* renderable, TypeTag) { if (state.IsOfType(index, "InstancedRenderable") || state.IsOfType(index, "Model") || state.IsOfType(index, "Sprite")) { *renderable = *static_cast(state.ToUserdata(index)); } else state.ArgError(index, "is not a InstancedRenderable instance"); return 1; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, MaterialRef* materialRef, TypeTag) { *materialRef = *static_cast(state.CheckUserdata(index, "Material")); return 1; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, MaterialParams* params, TypeTag) { state.CheckType(index, Nz::LuaType_Table); params->loadAlphaMap = state.CheckField("LoadAlphaMap", params->loadAlphaMap); params->loadDiffuseMap = state.CheckField("LoadDiffuseMap", params->loadDiffuseMap); params->loadEmissiveMap = state.CheckField("LoadEmissiveMap", params->loadEmissiveMap); params->loadHeightMap = state.CheckField("LoadHeightMap", params->loadHeightMap); params->loadNormalMap = state.CheckField("LoadNormalMap", params->loadNormalMap); params->loadSpecularMap = state.CheckField("LoadSpecularMap", params->loadSpecularMap); params->shaderName = state.CheckField("ShaderName", params->shaderName); return 1; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, ModelParameters* params, TypeTag) { state.CheckType(index, Nz::LuaType_Table); params->loadMaterials = state.CheckField("LoadMaterials", params->loadMaterials); LuaImplQueryArg(state, -1, ¶ms->material, TypeTag()); LuaImplQueryArg(state, -1, ¶ms->mesh, TypeTag()); return 1; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, SoundBufferParams* params, TypeTag) { state.CheckType(index, Nz::LuaType_Table); params->forceMono = state.CheckField("ForceMono", params->forceMono); return 1; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, SoundStreamParams* params, TypeTag) { state.CheckType(index, Nz::LuaType_Table); params->forceMono = state.CheckField("ForceMono", params->forceMono); return 1; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, SpriteRef* spriteRef, TypeTag) { *spriteRef = *static_cast(state.CheckUserdata(index, "Sprite")); return 1; } inline unsigned int LuaImplQueryArg(const LuaState& state, int index, TextureRef* textureRef, TypeTag) { *textureRef = *static_cast(state.CheckUserdata(index, "Texture")); return 1; } #endif inline int LuaImplReplyVal(const LuaState& state, Color&& val, TypeTag) { state.PushTable(); state.PushField("r", val.r); state.PushField("g", val.g); state.PushField("b", val.b); state.PushField("a", val.a); return 1; } inline int LuaImplReplyVal(const LuaState& state, EulerAnglesd&& val, TypeTag) { state.PushInstance("EulerAngles", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, EulerAnglesf&& val, TypeTag) { state.PushInstance("EulerAngles", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, FontRef&& val, TypeTag) { state.PushInstance("Font", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Font::SizeInfo&& val, TypeTag) { state.PushTable(); state.PushField("LineHeight", val.lineHeight); state.PushField("SpaceAdvance", val.spaceAdvance); state.PushField("UnderlinePosition", val.underlinePosition); state.PushField("UnderlineThickness", val.underlineThickness); return 1; } inline int LuaImplReplyVal(const LuaState& state, ImageParams&& val, TypeTag) { state.PushTable(0, 2); state.PushField("LevelCount", val.levelCount); state.PushField("LoadFormat", val.loadFormat); return 1; } inline int LuaImplReplyVal(const LuaState& state, IpAddress&& val, TypeTag) { state.PushInstance("IpAddress", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Matrix4d&& val, TypeTag) { state.PushInstance("Matrix4", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Matrix4f&& val, TypeTag) { state.PushInstance("Matrix4", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Quaterniond&& val, TypeTag) { state.PushInstance("Quaternion", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Quaternionf&& val, TypeTag) { state.PushInstance("Quaternion", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Rectd&& val, TypeTag) { state.PushInstance("Rect", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Rectf&& val, TypeTag) { state.PushInstance("Rect", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Recti&& val, TypeTag) { state.PushInstance("Rect", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Rectui&& val, TypeTag) { state.PushInstance("Rect", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Vector2d&& val, TypeTag) { state.PushInstance("Vector2", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Vector2f&& val, TypeTag) { state.PushInstance("Vector2", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Vector2ui&& val, TypeTag) { state.PushInstance("Vector2", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Vector2i&& val, TypeTag) { state.PushInstance("Vector2", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Vector3d&& val, TypeTag) { state.PushInstance("Vector3", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Vector3f&& val, TypeTag) { state.PushInstance("Vector3", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Vector3ui&& val, TypeTag) { state.PushInstance("Vector3", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Vector3i&& val, TypeTag) { state.PushInstance("Vector3", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, Ndk::Entity* ptr, TypeTag) { state.PushInstance("Entity", ptr); return 1; } inline int LuaImplReplyVal(const LuaState& state, Ndk::Application* ptr, TypeTag) { state.PushInstance("Application", ptr); return 1; } inline int LuaImplReplyVal(const LuaState& state, Ndk::EntityHandle&& handle, TypeTag) { state.PushInstance("Entity", handle); return 1; } inline int LuaImplReplyVal(const LuaState& state, Ndk::NodeComponentHandle&& handle, TypeTag) { state.PushInstance("NodeComponent", handle); return 1; } inline int LuaImplReplyVal(const LuaState& state, Ndk::VelocityComponentHandle&& handle, TypeTag) { state.PushInstance("VelocityComponent", handle); return 1; } inline int LuaImplReplyVal(const LuaState& state, Ndk::World* ptr, TypeTag) { state.PushInstance("World", ptr); return 1; } inline int LuaImplReplyVal(const LuaState& state, Ndk::WorldHandle&& handle, TypeTag) { state.PushInstance("World", handle); return 1; } #ifndef NDK_SERVER inline int LuaImplReplyVal(const LuaState& state, MaterialRef&& handle, TypeTag) { state.PushInstance("Material", handle); return 1; } inline int LuaImplReplyVal(const LuaState& state, ModelRef&& handle, TypeTag) { state.PushInstance("Model", handle); return 1; } inline int LuaImplReplyVal(const LuaState& state, const SoundBuffer* val, TypeTag) { state.PushInstance("SoundBuffer", val); return 1; } inline int LuaImplReplyVal(const LuaState& state, SoundBufferRef&& handle, TypeTag) { state.PushInstance("SoundBuffer", handle); return 1; } inline int LuaImplReplyVal(const LuaState& state, SpriteRef&& handle, TypeTag) { state.PushInstance("Sprite", handle); return 1; } inline int LuaImplReplyVal(const LuaState& state, TextureRef&& handle, TypeTag) { state.PushInstance("Texture", handle); return 1; } inline int LuaImplReplyVal(const LuaState& state, Ndk::CameraComponentHandle&& handle, TypeTag) { state.PushInstance("CameraComponent", handle); return 1; } inline int LuaImplReplyVal(const LuaState& state, Ndk::ConsoleHandle&& handle, TypeTag) { state.PushInstance("Console", handle); return 1; } inline int LuaImplReplyVal(const LuaState& state, Ndk::GraphicsComponentHandle&& handle, TypeTag) { state.PushInstance("GraphicsComponent", handle); return 1; } #endif }