/// <summary>
    /// Called when free mode is selected for the first time - copies all existing points to 
    /// the free mode configuration
    /// </summary>
    public void OnCopyToFreeModeSelected()
    {
        if(IsSpriteValid())
        {
            m_FreeModeBodyPositions.Clear();
            m_FreeModeBodyRadii.Clear();
            m_FreeModeBodyKinematic.Clear();

            Bounds spriteBounds = GetSpriteBounds();
            float width = spriteBounds.size.x * m_SoftBodyScale.x * m_SpriteScale.x;
            float height = spriteBounds.size.y * m_SoftBodyScale.y * m_SpriteScale.y;

            switch(m_Style)
            {
                case PhysicsStyle.Circle:
                {
                    width = spriteBounds.size.x * m_SpriteScale.x;
                    height = spriteBounds.size.y * m_SpriteScale.x;

                    int numPoints = m_RadiusPoints;
                    float radius = width * 0.5f;

                    AddFreeModeBodyDefinition(Vector2.zero, width * m_SphereRadius, m_CentralBodyKinematic);

                    for(int loop = 0; loop < numPoints; loop++)
                    {
                        float angle = ((Mathf.PI * 2)/numPoints) * loop;
                        Vector2 offset = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle));
                        offset *= radius;
                        offset.x *= m_SoftBodyScale.x;
                        offset.y *= m_SoftBodyScale.y;
                        AddFreeModeBodyDefinition(offset * (1.0f - (2 * m_SphereRadius)), width * m_SphereRadius, false);
                    }
                }
                break;

                case PhysicsStyle.Triangle:
                {
                    float radius = spriteBounds.size.y * m_SphereRadius * m_SpriteScale.y;
                    float offsetFactor = 0.5f - m_SphereRadius;
                    AddFreeModeBodyDefinition(Vector2.zero, radius, m_CentralBodyKinematic);
                    AddFreeModeBodyDefinition(new Vector2(-width * offsetFactor, -height * offsetFactor), radius, false);
                    AddFreeModeBodyDefinition(new Vector2(width * offsetFactor, -height * offsetFactor), radius, false);
                    AddFreeModeBodyDefinition(new Vector2(0.0f, height * offsetFactor), radius, false);
                }
                break;

                case PhysicsStyle.Rectangle:
                {
                    float radius = spriteBounds.size.y * m_SphereRadius * m_SpriteScale.y;
                    float offsetFactor = 0.5f - m_SphereRadius;
                    AddFreeModeBodyDefinition(Vector2.zero, radius, m_CentralBodyKinematic);
                    AddFreeModeBodyDefinition(new Vector2(-width * offsetFactor, -height * offsetFactor), radius, false);
                    AddFreeModeBodyDefinition(new Vector2(width * offsetFactor, -height * offsetFactor), radius, false);
                    AddFreeModeBodyDefinition(new Vector2(-width * offsetFactor, height * offsetFactor), radius, false);
                    AddFreeModeBodyDefinition(new Vector2(width * offsetFactor, height * offsetFactor), radius, false);
                }
                break;

                case PhysicsStyle.Free:
                break;

                case PhysicsStyle.Grid:
                {
                    width -= (m_SphereRadius * 4);
                    height -= (m_SphereRadius * 4);

                    float radius = spriteBounds.size.x * m_SphereRadius * m_SpriteScale.x;
                    AddFreeModeBodyDefinition(Vector2.zero, radius, m_CentralBodyKinematic);
                    int columns = m_GridColumns;
                    int rows = m_GridRows;

                    for(int y = 0; y < rows; y++)
                    {
                        for(int x = 0; x < (y % 2 == 0? columns : columns - 1); x++)
                        {
                            Vector2 position;
                            position.x = (-width * 0.5f) + ((width/(float)(columns - 1)) * x);

                            if(y % 2 != 0)
                            {
                                position.x += width/(float)(columns - 1) * 0.5f;
                            }

                            position.y = (-height * 0.5f) + ((height/(float)(rows - 1)) * y);

                            AddFreeModeBodyDefinition(position, radius, false);
                        }
                    }
                }
                break;
            }

            m_Style = PhysicsStyle.Free;
        }
    }
    /// <summary>
    /// Called when free mode is selected for the first time - copies all existing points to 
    /// the free mode configuration
    /// </summary>
    public void OnCopyToFreeModeSelected()
    {
        if(IsMeshValid())
        {
            m_FreeModeBodyPositions.Clear();
            m_FreeModeBodyRadii.Clear();
            m_FreeModeBodyKinematic.Clear();

            Bounds meshBounds = m_SourceMesh.bounds;
            float width = meshBounds.size.x * m_SoftBodyScale.x * m_MeshScale.x;
            float height = meshBounds.size.y * m_SoftBodyScale.y * m_MeshScale.y;
            float depth = meshBounds.size.z * m_SoftBodyScale.z * m_MeshScale.z;

            switch(m_Style)
            {
                case PhysicsStyle.Circle:
                {
                    width = meshBounds.size.x * m_MeshScale.x;
                    height = meshBounds.size.y * m_MeshScale.x;

                    int numPoints = m_RadiusPoints;
                    float radius = width * 0.5f;

                    AddFreeModeBodyDefinition(m_SoftBodyPivotOffset, width * m_SphereRadius, m_CentralBodyKinematic);

                    for(int loop = 0; loop < numPoints; loop++)
                    {
                        float angle = ((Mathf.PI * 2)/numPoints) * loop;
                        Vector3 offset = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle));
                        offset *= radius;
                        offset.x *= m_SoftBodyScale.x;
                        offset.y *= m_SoftBodyScale.y;
                        AddFreeModeBodyDefinition(offset * (1.0f - (2 * m_SphereRadius)) + m_SoftBodyOffset, width * m_SphereRadius, false);
                    }
                }
                break;

            case PhysicsStyle.Sphere:
                {
                    width = meshBounds.size.x * m_MeshScale.x;
                    float radius = width * 0.5f;
                    AddFreeModeBodyDefinition(m_SoftBodyPivotOffset, width * m_SphereRadius, m_CentralBodyKinematic);

                    int latitudes = m_RadiusPoints;
                    int longitudes = m_RadiusPoints;

                    float latitudeIncrement = 360.0f / latitudes;
                    float longitudeIncrement = 180.0f / longitudes;

                    for (float u = 0; u <= 360.0f; u += latitudeIncrement)
                    {
                        for (float t = 0; t <= 180.0f; t += longitudeIncrement)
                        {
                            float rad = radius;
                            float x = (float) (rad * Mathf.Sin(Mathf.Deg2Rad * t) * Mathf.Sin(Mathf.Deg2Rad * u)) * m_SoftBodyScale.x;
                            float y = (float) (rad * Mathf.Cos(Mathf.Deg2Rad * t)) * m_SoftBodyScale.y;
                            float z = (float) (rad * Mathf.Sin(Mathf.Deg2Rad * t) * Mathf.Cos(Mathf.Deg2Rad * u)) * m_SoftBodyScale.z;
                            AddFreeModeBodyDefinition((new Vector3(x, y, z) * (1.0f - (2 * m_SphereRadius))) + m_SoftBodyOffset, width * m_SphereRadius, false);
                        }
                    }
                }
                break;

                case PhysicsStyle.Triangle:
                {
                    float radius = meshBounds.size.y * m_SphereRadius * m_MeshScale.y;
                    float offsetFactor = 0.5f - m_SphereRadius;
                    AddFreeModeBodyDefinition(m_SoftBodyPivotOffset, radius, m_CentralBodyKinematic);
                    AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, -height * offsetFactor) + m_SoftBodyOffset, radius, false);
                    AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, -height * offsetFactor) + m_SoftBodyOffset, radius, false);
                    AddFreeModeBodyDefinition(new Vector3(0.0f, height * offsetFactor) + m_SoftBodyOffset, radius, false);
                }
                break;

            case PhysicsStyle.Pyramid:
                {
                    float radius = meshBounds.size.y * m_SphereRadius * m_MeshScale.y;
                    float offsetFactor = 0.5f - m_SphereRadius;
                    AddFreeModeBodyDefinition(m_SoftBodyPivotOffset, radius, m_CentralBodyKinematic);
                    AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, -height * offsetFactor, -depth * offsetFactor) + m_SoftBodyOffset, radius, false);
                    AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, -height * offsetFactor, -depth * offsetFactor) + m_SoftBodyOffset, radius, false);
                    AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, -height * offsetFactor, depth * offsetFactor) + m_SoftBodyOffset, radius, false);
                    AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, -height * offsetFactor, depth * offsetFactor) + m_SoftBodyOffset, radius, false);
                    AddFreeModeBodyDefinition(new Vector3(0.0f, height * offsetFactor), radius, false);
                }
                break;

                case PhysicsStyle.Rectangle:
                {
                    float radius = meshBounds.size.y * m_SphereRadius * m_MeshScale.y;
                    float offsetFactor = 0.5f - m_SphereRadius;
                    AddFreeModeBodyDefinition(m_SoftBodyPivotOffset, radius, m_CentralBodyKinematic);
                    AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, -height * offsetFactor) + m_SoftBodyOffset, radius, false);
                    AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, -height * offsetFactor) + m_SoftBodyOffset, radius, false);
                    AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, height * offsetFactor) + m_SoftBodyOffset, radius, false);
                    AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, height * offsetFactor) + m_SoftBodyOffset, radius, false);
                }
                break;

                case PhysicsStyle.Cube:
                {
                    float radius = meshBounds.size.y * m_SphereRadius * m_MeshScale.y;
                    float offsetFactor = 0.5f - m_SphereRadius;
                    AddFreeModeBodyDefinition(m_SoftBodyPivotOffset, radius, m_CentralBodyKinematic);

                    AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, -height * offsetFactor, -depth * offsetFactor) + m_SoftBodyOffset, radius, false);
                    AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, -height * offsetFactor, -depth * offsetFactor) + m_SoftBodyOffset, radius, false);
                    AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, height * offsetFactor, -depth * offsetFactor) + m_SoftBodyOffset, radius, false);
                    AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, height * offsetFactor, -depth * offsetFactor) + m_SoftBodyOffset, radius, false);

                    AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, -height * offsetFactor, depth * offsetFactor) + m_SoftBodyOffset, radius, false);
                    AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, -height * offsetFactor, depth * offsetFactor) + m_SoftBodyOffset, radius, false);
                    AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, height * offsetFactor, depth * offsetFactor) + m_SoftBodyOffset, radius, false);
                    AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, height * offsetFactor, depth * offsetFactor) + m_SoftBodyOffset, radius, false);
                }
                break;

                case PhysicsStyle.Free:
                break;
            }

            m_SoftBodyPivotOffset = Vector3.zero;
            m_SoftBodyRotation = Vector3.zero;
            m_SoftBodyRotation = Vector3.zero;
            m_Style = PhysicsStyle.Free;
        }
    }