From cb1ebd1604315226e67012cc202c8845d05ddce4 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Tue, 20 Nov 2018 18:12:18 +0000 Subject: add osApproxEquals for float, vector and rotation, note that default margin is 1e-6 to match strings rounding --- .../Shared/Api/Implementation/OSSL_Api.cs | 98 ++++++++++++++++++++++ .../ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | 7 ++ .../ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | 30 +++++++ 3 files changed, 135 insertions(+) (limited to 'OpenSim') diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index f0177db..7b56b90 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -5305,5 +5305,103 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return ((string)src).Replace(oldvalue, newvalue); } + + public LSL_Integer osApproxEquals(LSL_Float a, LSL_Float b) + { + if (a > b + 1.0e-6 || a < b - 1.0e-6) + return 0; + return 1; + } + + public LSL_Integer osApproxEquals(LSL_Float a, LSL_Float b, LSL_Float margin) + { + double e = Math.Abs(margin); + if (a > b + e || a < b - e) + return 0; + return 1; + } + + public LSL_Integer osApproxEquals(LSL_Vector va, LSL_Vector vb) + { + double a = va.x; + double b = vb.x; + if (a > b + 1.0e-6 || a < b - 1.0e-6) + return 0; + a = va.y; + b = vb.y; + if (a > b + 1.0e-6 || a < b - 1.0e-6) + return 0; + a = va.z; + b = vb.z; + if (a > b + 1.0e-6 || a < b - 1.0e-6) + return 0; + + return 1; + } + + public LSL_Integer osApproxEquals(LSL_Vector va, LSL_Vector vb, LSL_Float margin) + { + double e = Math.Abs(margin); + double a = va.x; + double b = vb.x; + if (a > b + e || a < b - e) + return 0; + a = va.y; + b = vb.y; + if (a > b + e || a < b - e) + return 0; + a = va.z; + b = vb.z; + if (a > b + e || a < b - e) + return 0; + + return 1; + } + + public LSL_Integer osApproxEquals(LSL_Rotation ra, LSL_Rotation rb) + { + double a = ra.x; + double b = rb.x; + if (a > b + 1.0e-6 || a < b - 1.0e-6) + return 0; + a = ra.y; + b = rb.y; + if (a > b + 1.0e-6 || a < b - 1.0e-6) + return 0; + a = ra.z; + b = rb.z; + if (a > b + 1.0e-6 || a < b - 1.0e-6) + return 0; + a = ra.s; + b = rb.s; + if (a > b + 1.0e-6 || a < b - 1.0e-6) + return 0; + + return 1; + } + + public LSL_Integer osApproxEquals(LSL_Rotation ra, LSL_Rotation rb, LSL_Float margin) + { + double e = Math.Abs(margin); + double a = ra.x; + double b = rb.x; + if (a > b + e || a < b - e) + return 0; + a = ra.y; + b = rb.y; + if (a > b + e || a < b - e) + return 0; + a = ra.z; + b = rb.z; + if (a > b + e || a < b - e) + return 0; + a = ra.s; + b = rb.s; + if (a > b + e || a < b - e) + return 0; + + return 1; + } + } } \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 2ab1fff..5bb7670 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -540,5 +540,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_Integer osStringLastIndexOf(LSL_String src, LSL_String value, LSL_Integer start, LSL_Integer count, LSL_Integer ignorecase); LSL_String osStringRemove(LSL_String src, LSL_Integer start, LSL_Integer count); LSL_String osStringReplace(LSL_String src, LSL_String oldvalue, LSL_String newvalue); + + LSL_Integer osApproxEquals(LSL_Float a, LSL_Float b); + LSL_Integer osApproxEquals(LSL_Float a, LSL_Float b, LSL_Float margin); + LSL_Integer osApproxEquals(vector va, vector vb); + LSL_Integer osApproxEquals(vector va, vector vb, LSL_Float margin); + LSL_Integer osApproxEquals(rotation ra, rotation rb); + LSL_Integer osApproxEquals(rotation ra, rotation rb, LSL_Float margin); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 1c003a0..29ada83 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -1337,5 +1337,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase { return m_OSSL_Functions.osStringReplace(src, oldvalue, newvalue); } + + public LSL_Integer osApproxEquals(LSL_Float a, LSL_Float b) + { + return m_OSSL_Functions.osApproxEquals(a, b); + } + + public LSL_Integer osApproxEquals(LSL_Float a, LSL_Float b, LSL_Float margin) + { + return m_OSSL_Functions.osApproxEquals(a, b, margin); + } + + public LSL_Integer osApproxEquals(vector va, vector vb) + { + return m_OSSL_Functions.osApproxEquals(va, vb); + } + + public LSL_Integer osApproxEquals(vector va, vector vb, LSL_Float margin) + { + return m_OSSL_Functions.osApproxEquals(va, vb, margin); + } + + public LSL_Integer osApproxEquals(rotation ra, rotation rb) + { + return m_OSSL_Functions.osApproxEquals(ra, rb); + } + + public LSL_Integer osApproxEquals(rotation ra, rotation rb, LSL_Float margin) + { + return m_OSSL_Functions.osApproxEquals(ra, rb, margin); + } } } -- cgit v1.1