protected virtual void Update()
    {
        List <SurfaceDeposit> surface_deposits = SurfaceDeposits.OrderBy(surface_deposit => surface_deposit.Extent).Reverse().ToList();

        while (surface_deposits.Count > 0)
        {
            SurfaceDeposit surface_deposit = surface_deposits.TakeAt(0);

            foreach (SurfaceDeposit other_surface_deposit in new List <SurfaceDeposit>(SurfaceDeposits))
            {
                if (other_surface_deposit == surface_deposit)
                {
                    continue;
                }

                float distance = surface_deposit.transform.position
                                 .Distance(other_surface_deposit.transform.position);

                if (distance <= surface_deposit.Extent)
                {
                    surface_deposit.AddTo(other_surface_deposit.Composition.Normalized() * other_surface_deposit.Volume);

                    surface_deposits.Remove(other_surface_deposit);
                    other_surface_deposit.transform.SetParent(null);
                    GameObject.Destroy(other_surface_deposit.gameObject);
                }
            }
        }
    }
    public void Litter(Vector3 position, Pile pile)
    {
        if (pile.Volume == 0)
        {
            return;
        }

        SurfaceDeposit nearest_deposit = SurfaceDeposits.ToList()
                                         .Find(deposit => deposit.transform.position.Distance(position) <= deposit.Extent);

        if (nearest_deposit == null)
        {
            nearest_deposit = SurfaceDeposit.Create();
            nearest_deposit.transform.SetParent(Surface.transform);
            nearest_deposit.transform.position = position;
        }


        nearest_deposit.AddTo(pile);
    }