mirror of
https://github.com/opensim/opensim.git
synced 2026-08-01 22:26:09 +08:00
add osApproxEquals for float, vector and rotation, note that default margin is 1e-6 to match strings rounding
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user