/// <inheritdoc />
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            try
            {
                JObject jObject      = JObject.Load(reader);
                var     colliderType = jObject["shape"].ToObject <string>();

                ColliderGeometry colliderGeometry = null;
                switch (colliderType)
                {
                case "sphere":
                    colliderGeometry = new SphereColliderGeometry();
                    break;

                case "box":
                    colliderGeometry = new BoxColliderGeometry();
                    break;

                case "capsule":
                    colliderGeometry = new CapsuleColliderGeometry();
                    break;

                case "mesh":
                    colliderGeometry = new MeshColliderGeometry();
                    break;

                case "auto":
                    colliderGeometry = new AutoColliderGeometry();
                    break;

                default:
                    MREAPI.Logger.LogError($"Failed to deserialize collider geometry.  Invalid collider type <{colliderType}>.");
                    break;
                }

                serializer.Populate(jObject.CreateReader(), colliderGeometry);

                return(colliderGeometry);
            }
            catch (Exception e)
            {
                MREAPI.Logger.LogError($"Failed to create collider geometry from json.  Exception: {e.Message}\nStack Trace: {e.StackTrace}");
                throw;
            }
        }
        internal ColliderPatch GenerateInitialPatch()
        {
            ColliderGeometry colliderGeo = null;

            // Note: SDK has no "mesh" collider type
            if (Shape == ColliderType.Auto || Shape == ColliderType.Mesh)
            {
                colliderGeo = new AutoColliderGeometry();
            }
            else if (_collider is SphereCollider sphereCollider)
            {
                colliderGeo = new SphereColliderGeometry()
                {
                    Radius = sphereCollider.radius,
                    Center = sphereCollider.center.CreateMWVector3()
                };
            }
            else if (_collider is BoxCollider boxCollider)
            {
                colliderGeo = new BoxColliderGeometry()
                {
                    Size   = boxCollider.size.CreateMWVector3(),
                    Center = boxCollider.center.CreateMWVector3()
                };
            }
            else if (_collider is CapsuleCollider capsuleCollider)
            {
                // The size vector describes the dimensions of the bounding box containing the collider
                MWVector3 size;
                if (capsuleCollider.direction == 0)
                {
                    size = new MWVector3(capsuleCollider.height, 2 * capsuleCollider.radius, 2 * capsuleCollider.radius);
                }
                else if (capsuleCollider.direction == 1)
                {
                    size = new MWVector3(2 * capsuleCollider.radius, capsuleCollider.height, 2 * capsuleCollider.radius);
                }
                else
                {
                    size = new MWVector3(2 * capsuleCollider.radius, 2 * capsuleCollider.radius, capsuleCollider.height);
                }

                colliderGeo = new CapsuleColliderGeometry()
                {
                    Center = capsuleCollider.center.CreateMWVector3(),
                    Size   = size
                };
            }
            else
            {
                _ownerActor.App.Logger.LogWarning($"MRE SDK does not support the following Unity collider and will not " +
                                                  $"be available in the MRE app.  Collider Type: {_collider.GetType()}");
            }

            return(colliderGeo == null ? null : new ColliderPatch()
            {
                IsEnabled = _collider.enabled,
                IsTrigger = _collider.isTrigger,
                Geometry = colliderGeo
            });
        }