add osApproxEquals for float, vector and rotation, note that default margin is 1e-6 to match strings rounding

This commit is contained in:
UbitUmarov
2018-11-20 18:12:18 +00:00
parent c4a0e574c8
commit cb1ebd1604
7 changed files with 220 additions and 33 deletions

View File

@@ -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;
}
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}
}