private AxesPair GetSecondAxesPair(AxesPair axes)
        {
            switch (axes)
            {
            case AxesPair.XY:
                return(AxesPair.XZ);

            case AxesPair.YZ:
                return(AxesPair.YX);

            case AxesPair.ZX:
                return(AxesPair.ZY);

            case AxesPair.YX:
                return(AxesPair.YZ);

            case AxesPair.ZY:
                return(AxesPair.ZX);

            case AxesPair.XZ:
                return(AxesPair.XY);

            default:
                throw new InvalidEnumArgumentException("Unsupported axes pair");
            }
        }
        private void AxesPairToUI(AxesPair pair, out string uiAxis1, out string uiAxis2)
        {
            string axis1, axis2, axis3;

            AxesPairToHLSL(pair, out axis1, out axis2, out axis3);
            uiAxis1 = "Axis" + axis1[axis1.Length - 1];
            uiAxis2 = "Axis" + axis2[axis2.Length - 1];
        }
 /// <summary>
 /// Given two axes in (X, Y, Z), compute the third one so that the resulting basis is left handed
 /// </summary>
 /// <param name="axis1">hlsl value of first axis in pair</param>
 /// <param name="axis2">hlsl value of second axis</param>
 private string LeftHandedBasis(AxesPair axes, string axis1, string axis2)
 {
     if (axes <= AxesPair.ZX)
     {
         return("cross(" + axis1 + ", " + axis2 + ")");
     }
     else
     {
         return("cross(" + axis2 + ", " + axis1 + ")");
     }
 }
        private void AxesPairToHLSL(AxesPair axes, out string axis1, out string axis2, out string axis3)
        {
            const string X = "axisX";
            const string Y = "axisY";
            const string Z = "axisZ";

            switch (axes)
            {
            case AxesPair.XY:
                axis1 = X;
                axis2 = Y;
                axis3 = Z;
                break;

            case AxesPair.XZ:
                axis1 = X;
                axis2 = Z;
                axis3 = Y;
                break;

            case AxesPair.YX:
                axis1 = Y;
                axis2 = X;
                axis3 = Z;
                break;

            case AxesPair.YZ:
                axis1 = Y;
                axis2 = Z;
                axis3 = X;
                break;

            case AxesPair.ZX:
                axis1 = Z;
                axis2 = X;
                axis3 = Y;
                break;

            case AxesPair.ZY:
                axis1 = Z;
                axis2 = Y;
                axis3 = X;
                break;

            default:
                throw new InvalidEnumArgumentException("Unsupported axes pair");
            }
        }
        private void AxesPairToVector(AxesPair pair, out Vector3 axis1, out Vector3 axis2)
        {
            Vector3 X = Vector3.right, Y = Vector3.up, Z = Vector3.forward;

            switch (pair)
            {
            case AxesPair.XY:
                axis1 = X;
                axis2 = Y;
                break;

            case AxesPair.XZ:
                axis1 = X;
                axis2 = Z;
                break;

            case AxesPair.YX:
                axis1 = Y;
                axis2 = X;
                break;

            case AxesPair.YZ:
                axis1 = Y;
                axis2 = Z;
                break;

            case AxesPair.ZX:
                axis1 = Z;
                axis2 = X;
                break;

            case AxesPair.ZY:
                axis1 = Z;
                axis2 = Y;
                break;

            default:
                throw new InvalidEnumArgumentException("Unsupported axes pair");
            }
        }