public static Vector3 ToVector3(this JavaScriptValue v)
        {
            switch (v.ValueType)
            {
            case JavaScriptValueType.Array:
                var length = v.Length();
                if (!length.HasValue || length.Value != 3)
                {
                    return(new Vector3(0, 0, 0));
                }
                return(new Vector3(
                           (float)v.Get(0).ToDouble(),
                           (float)v.Get(1).ToDouble(),
                           (float)v.Get(2).ToDouble()
                           ));

            case JavaScriptValueType.Object:
                if (v.Has("x") && v.Has("y") && v.Has("z"))
                {
                    return(new Vector3(
                               (float)v.Get("x").ConvertToNumber().ToDouble(),
                               (float)v.Get("y").ConvertToNumber().ToDouble(),
                               (float)v.Get("z").ConvertToNumber().ToDouble()
                               ));
                }
                else
                {
                    return(new Vector3(0, 0, 0));
                }

            default:
                return(new Vector3(0, 0, 0));
            }
        }
        public static Color ToColor(this JavaScriptValue v)
        {
            switch (v.ValueType)
            {
            case JavaScriptValueType.String:
                var s = v.ToString();
                // TODO: do this
                return(Color.White);

            case JavaScriptValueType.Object:
                if (v.Has("r") && v.Has("g") && v.Has("b"))
                {
                    var a = v.Has("a") ? v.Get("a").ConvertToNumber().ToInt32() : 255;
                    return(Color.FromByteFormat(
                               (byte)v.Get("r").ConvertToNumber().ToInt32(),
                               (byte)v.Get("g").ConvertToNumber().ToInt32(),
                               (byte)v.Get("b").ConvertToNumber().ToInt32(),
                               (byte)a));
                }
                else
                {
                    return(Color.White);
                }

            case JavaScriptValueType.Array:
                var length = v.Length();
                if (length == 4)
                {
                    return(Color.FromByteFormat(
                               (byte)v.Get(0).ConvertToNumber().ToInt32(),
                               (byte)v.Get(1).ConvertToNumber().ToInt32(),
                               (byte)v.Get(2).ConvertToNumber().ToInt32(),
                               (byte)v.Get(3).ConvertToNumber().ToInt32()));
                }
                else if (length == 3)
                {
                    return(Color.FromByteFormat(
                               (byte)v.Get(0).ConvertToNumber().ToInt32(),
                               (byte)v.Get(1).ConvertToNumber().ToInt32(),
                               (byte)v.Get(2).ConvertToNumber().ToInt32(),
                               0));
                }
                else
                {
                    return(Color.White);
                }

            default:
                return(Color.White);
            }
        }