From e031d79d48cb4cb42ccb160d2894d078f835eb10 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Tue, 3 Apr 2018 23:00:37 +0100 Subject: add auxiliar functions float osVecMagSquare(a), float osVecDistSquare(vector a), float osAngleBetween(vector a, vector b) and float osRound(ffloat value, integer ndigits) --- .../Shared/Api/Implementation/OSSL_Api.cs | 28 ++++++++++++++++++++++ .../ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | 6 +++++ .../ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | 21 ++++++++++++++++ OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs | 5 ++++ 4 files changed, 60 insertions(+) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index e156582..51b289b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -4804,5 +4804,33 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return -1; return sog.GetLinkNumber(name); } + + // rounds to the nearest number with provided number of decimal places + public LSL_Float osRound(LSL_Float value, LSL_Integer ndigits) + { + if(ndigits <= 0) + return Math.Round(value, MidpointRounding.AwayFromZero); + if(ndigits > 15) + ndigits = 15; + return Math.Round(value, ndigits, MidpointRounding.AwayFromZero); + } + + public LSL_Float osVecMagSquare(LSL_Vector a) + { + return LSL_Vector.MagSquare(a); + } + + public LSL_Float osVecDistSquare(LSL_Vector a, LSL_Vector b) + { + return LSL_Vector.MagSquare(a - b); + } + + // returns the angle between 2 vectors -pi to pi + public LSL_Float osAngleBetween(LSL_Vector a, LSL_Vector b) + { + double dot = LSL_Vector.Dot(a,b); + double mcross = LSL_Vector.Mag(LSL_Vector.Cross(a,b)); + return Math.Atan2(mcross, dot); + } } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index ffb7ded..5cabf30 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -506,5 +506,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_Integer osTeleportObject(LSL_Key objectUUID, vector targetPos, rotation targetrotation, LSL_Integer flags); LSL_Integer osGetLinkNumber(LSL_String name); + + LSL_Float osRound(LSL_Float value, LSL_Integer digits); + + LSL_Float osVecMagSquare(vector a); + LSL_Float osVecDistSquare(vector a, vector b); + LSL_Float osAngleBetween(vector a, vector b); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 30ff764..16b368c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -1195,5 +1195,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase { return m_OSSL_Functions.osGetLinkNumber(name); } + + public LSL_Float osRound(LSL_Float value, LSL_Integer digits) + { + return m_OSSL_Functions.osRound(value, digits); + } + + public LSL_Float osVecMagSquare(vector a) + { + return m_OSSL_Functions.osVecMagSquare(a); + } + + public LSL_Float osVecDistSquare(vector a, vector b) + { + return m_OSSL_Functions.osVecDistSquare(a, b); + } + + public LSL_Float osAngleBetween(vector a, vector b) + { + return m_OSSL_Functions.osAngleBetween(a, b); + } + } } diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs index a65f71f..1c152be 100644 --- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs +++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs @@ -304,6 +304,11 @@ namespace OpenSim.Region.ScriptEngine.Shared ); } + public static double MagSquare(Vector3 v) + { + return v.x * v.x + v.y * v.y + v.z * v.z; + } + public static double Mag(Vector3 v) { return Math.Sqrt(v.x * v.x + v.y * v.y + v.z * v.z); -- cgit v1.1