private static int compare(object left, object right, int ascending)
{
if (!left.GetType().Equals(right.GetType()))
{
// unequal types are always "equal" for comparison purposes.
// this way, the bubble sort will never swap them, and we'll
// get that feathered effect we're looking for
return 0;
}
int ret = 0;
if (left is key)
{
key l = (key)left;
key r = (key)right;
ret = String.CompareOrdinal(l.value, r.value);
}
else if (left is LSLString)
{
LSLString l = (LSLString)left;
LSLString r = (LSLString)right;
ret = String.CompareOrdinal(l.m_string, r.m_string);
}
else if (left is LSLInteger)
{
LSLInteger l = (LSLInteger)left;
LSLInteger r = (LSLInteger)right;
ret = Math.Sign(l.value - r.value);
}
else if (left is LSLFloat)
{
LSLFloat l = (LSLFloat)left;
LSLFloat r = (LSLFloat)right;
ret = Math.Sign(l.value - r.value);
}
else if (left is Vector3)
{
Vector3 l = (Vector3)left;
Vector3 r = (Vector3)right;
ret = Math.Sign(Vector3.Mag(l) - Vector3.Mag(r));
}
else if (left is Quaternion)
{
Quaternion l = (Quaternion)left;
Quaternion r = (Quaternion)right;
ret = Math.Sign(Quaternion.Mag(l) - Quaternion.Mag(r));
}
if (ascending == 0)
{
ret = 0 - ret;
}
return ret;
}