OpenSim.Region.ScriptEngine.Shared.Api.LSL_Api.llAxes2Rot C# (CSharp) Method

llAxes2Rot() public method

public llAxes2Rot ( OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3 fwd, OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3 left, OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3 up ) : OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion
fwd OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3
left OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3
up OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3
return OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion
        public LSL_Rotation llAxes2Rot(LSL_Vector fwd, LSL_Vector left, LSL_Vector up)
        {
            m_host.AddScriptLPS(1);
            double s;
            double tr = fwd.x + left.y + up.z + 1.0;

            if (tr >= 1.0)
            {
                s = 0.5 / Math.Sqrt(tr);
                return new LSL_Rotation(
                        (left.z - up.y) * s,
                        (up.x - fwd.z) * s,
                        (fwd.y - left.x) * s,
                        0.25 / s);
            }
            else
            {
                double max = (left.y > up.z) ? left.y : up.z;

                if (max < fwd.x)
                {
                    s = Math.Sqrt(fwd.x - (left.y + up.z) + 1.0);
                    double x = s * 0.5;
                    s = 0.5 / s;
                    return new LSL_Rotation(
                            x,
                            (fwd.y + left.x) * s,
                            (up.x + fwd.z) * s,
                            (left.z - up.y) * s);
                }
                else if (max == left.y)
                {
                    s = Math.Sqrt(left.y - (up.z + fwd.x) + 1.0);
                    double y = s * 0.5;
                    s = 0.5 / s;
                    return new LSL_Rotation(
                            (fwd.y + left.x) * s,
                            y,
                            (left.z + up.y) * s,
                            (up.x - fwd.z) * s);
                }
                else
                {
                    s = Math.Sqrt(up.z - (fwd.x + left.y) + 1.0);
                    double z = s * 0.5;
                    s = 0.5 / s;
                    return new LSL_Rotation(
                            (up.x + fwd.z) * s,
                            (left.z + up.y) * s,
                            z,
                            (fwd.y - left.x) * s);
                }
            }
        }
LSL_Api