// 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 #ifndef NDK_SERVER #include #include #include #include #endif 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) { instance.CheckType(index, Nz::LuaType_Table); 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->optimizeIndexBuffers = instance.CheckField("OptimizeIndexBuffers", params->optimizeIndexBuffers); params->scale = instance.CheckField("Scale", params->scale); return 1; } 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; } #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, 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 }