for instance, the following code normally returns FALSE, even though rot1 and rot2 are obviously equal:

CODE

integer RotEqualityTester()

{

rotation rot1 = llEuler2Rot(<33.33, 25.25, 70.70> * DEG_TO_RAD);

rotation rot2 = rot1;

return (rot1 == rot2);

}

The problem here is that rots use floats for the element values, and because of the nature of rots, 7 points of precisions just isn't accurate enough to truely identify a specific rotation.

However, since 5 decimal places of precision are enough accuracy for most uses, you can use the following function to compare two rots, with significant accuracy:

CODE

integer CompareRots(rotation rot1, rotation rot2)

{

return (

llRound(rot1.x * 10000) == llRound(rot2.x * 10000)

&& llRound(rot1.y * 10000) == llRound(rot2.y * 10000)

&& llRound(rot1.z * 10000) == llRound(rot2.z * 10000)

&& llRound(rot1.s * 10000) == llRound(rot2.s * 10000)

);

}

Using the previous example, we now get true if we use this function instead of the equality operator:

CODE

integer RotEqualityTester()

{

rotation rot1 = llEuler2Rot(<33.33, 25.25, 70.70> * DEG_TO_RAD);

rotation rot2 = rot1;

return CompareRots(rot1, rot2);

}