From 69a1be70badbae2ab03176a0edb1d246f0eb7c1b Mon Sep 17 00:00:00 2001 From: GigAnon Date: Thu, 21 Jan 2016 18:54:01 +0100 Subject: [PATCH] Lua Binding update - Added range check on various casts (ranged_cast routine needs to be moved somewhere else) - Added Nz::Vector3ui type to auto-bind system Former-commit-id: 3ec773b26d9cc85e40879c011cad0fb2a3d05571 --- SDK/include/NDK/LuaAPI.inl | 16 ++++++++++++++++ SDK/src/NDK/LuaAPI_Renderer.cpp | 33 +++++++++++++++++++++------------ 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/SDK/include/NDK/LuaAPI.inl b/SDK/include/NDK/LuaAPI.inl index 205f29440..79c1feb86 100644 --- a/SDK/include/NDK/LuaAPI.inl +++ b/SDK/include/NDK/LuaAPI.inl @@ -48,6 +48,16 @@ namespace Nz return ret; } + inline unsigned int LuaImplQueryArg(const LuaInstance& lua, int index, Vector3ui* vec, TypeTag) + { + Vector3d vecDouble; + unsigned int ret = LuaImplQueryArg(lua, index, &vecDouble, TypeTag()); + + vec->Set(vecDouble); + return ret; + } + + inline int LuaImplReplyVal(const LuaInstance& instance, const SoundBuffer* val, TypeTag) { instance.PushInstance("SoundBuffer", val); @@ -65,4 +75,10 @@ namespace Nz instance.PushInstance("Vector3", val); return 1; } + + inline int LuaImplReplyVal(const LuaInstance& instance, Vector3ui val, TypeTag) + { + instance.PushInstance("Vector3", val); + return 1; + } } diff --git a/SDK/src/NDK/LuaAPI_Renderer.cpp b/SDK/src/NDK/LuaAPI_Renderer.cpp index e61d10af1..c088a5151 100644 --- a/SDK/src/NDK/LuaAPI_Renderer.cpp +++ b/SDK/src/NDK/LuaAPI_Renderer.cpp @@ -1,3 +1,4 @@ +// Copyright (C) 2016 Jérôme Leclercq, Arnaud Cadot // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequesites.hpp @@ -6,6 +7,14 @@ #include #include +#include + +// WIP: I don't know where to put it... +template T ranged_cast(long long a, T high = std::numeric_limits::max(), T low = std::numeric_limits::min()) +{ + return static_cast(std::min(static_cast(high), std::max(a, static_cast(low)))); +} + namespace Ndk { void LuaAPI::Register_Renderer(Nz::LuaInstance& instance) @@ -19,7 +28,7 @@ namespace Ndk abstractImage.SetMethod("GetHeight", &Nz::AbstractImage::GetHeight, static_cast(0)); abstractImage.SetMethod("GetLevelCount", &Nz::AbstractImage::GetLevelCount); abstractImage.SetMethod("GetMaxLevel", &Nz::AbstractImage::GetMaxLevel); - /*abstractImage.SetMethod("GetSize", &Nz::AbstractImage::GetSize, static_cast(0));*/ // Need to add Nz::Vector3ui to auto binding mecanism, or do it by hand + abstractImage.SetMethod("GetSize", &Nz::AbstractImage::GetSize, static_cast(0)); abstractImage.SetMethod("GetType", &Nz::AbstractImage::GetType); abstractImage.SetMethod("GetWidth", &Nz::AbstractImage::GetWidth, static_cast(0)); abstractImage.SetMethod("IsCompressed", &Nz::AbstractImage::IsCompressed); @@ -32,7 +41,7 @@ namespace Ndk unsigned int argCount = std::min(lua.GetStackTop(), 2U); if (argCount == 1 && lua.IsOfType(1, Nz::LuaType_Number)) - memory = abstractImage->GetMemoryUsage(static_cast(lua.CheckInteger(1))); // Maybe do a range check instead of casting like a savage? + memory = abstractImage->GetMemoryUsage(ranged_cast(lua.CheckInteger(1))); else memory = abstractImage->GetMemoryUsage(); @@ -72,15 +81,15 @@ namespace Ndk virtual bool Update(const UInt8* pixels, unsigned int srcWidth = 0, unsigned int srcHeight = 0, UInt8 level = 0) */ - unsigned int srcWidth = static_cast(lua.CheckInteger(2)); // Range check? + unsigned int srcWidth = ranged_cast(lua.CheckInteger(2)); unsigned int srcHeight = 0; Nz::UInt8 level = 0; if (argCount >= 3) { - srcHeight = static_cast(lua.CheckInteger(3)); // Range check? + srcHeight = ranged_cast(lua.CheckInteger(3)); if (argCount >= 4) - level = static_cast(lua.CheckInteger(3)); // Range check? + level = ranged_cast(lua.CheckInteger(3)); } rValue = abstractImage->Update(pixels, srcWidth, srcHeight, level); @@ -98,12 +107,12 @@ namespace Ndk if (argCount >= 3) { - srcWidth = static_cast(lua.CheckInteger(3)); // Range check? + srcWidth = ranged_cast(lua.CheckInteger(3)); if (argCount >= 4) { - srcHeight = static_cast(lua.CheckInteger(4)); // Range check? + srcHeight = ranged_cast(lua.CheckInteger(4)); if (argCount >= 5) - level = static_cast(lua.CheckInteger(5)); // Range check? + level = ranged_cast(lua.CheckInteger(5)); } } rValue = abstractImage->Update(pixels, box, srcWidth, srcHeight, level); @@ -122,15 +131,15 @@ namespace Ndk if (argCount >= 3) { - z = static_cast(lua.CheckInteger(3)); // Range check? + z = ranged_cast(lua.CheckInteger(3)); if (argCount >= 4) { - srcWidth = static_cast(lua.CheckInteger(4)); // Range check? + srcWidth = ranged_cast(lua.CheckInteger(4)); if (argCount >= 5) { - srcHeight = static_cast(lua.CheckInteger(5)); // Range check? + srcHeight = ranged_cast(lua.CheckInteger(5)); if (argCount >= 6) - level = static_cast(lua.CheckInteger(6)); // Range check? + level = ranged_cast(lua.CheckInteger(6)); } } }