// Currently shiftAmount needs to be 1 or -1
    // Larger / smaller values won't work properly
    public void ShiftLayer(TexPaintLayer layer, int shiftAmount)
    {
        if (layer.locked)
        {
            return;
        }

        int oldIndex = layer.transform.GetSiblingIndex();
        int newIndex = oldIndex + shiftAmount;

        if (newIndex >= 0 && newIndex < layersList.transform.childCount)
        {
            TexPaintLayer otherLayer = layersList.transform.GetChild(newIndex).GetComponent <TexPaintLayer>();
            if (otherLayer.locked)
            {
                return;
            }

            // Move the layer
            layer.transform.SetSiblingIndex(newIndex);

            // Update terrain material
            SetPaintTexture(newIndex, layer.assignedTexture.texture2D);
            SetPaintMask(newIndex, layer.mask);

            SetPaintTexture(oldIndex, otherLayer.assignedTexture.texture2D);
            SetPaintMask(oldIndex, otherLayer.mask);
        }
    }
    public void AddLayer(string name, bool locked = false)
    {
        if (GetNumberOfLayers() >= 32)
        {
            return;
        }

        TexPaintLayer layer = Instantiate(layerPrefab, layersList.transform);

        layer.managerInstance = this;
        layer.locked          = locked;
        layer.mask            = new Texture2D(128, 128);
        layer.mask.SetPixels(new Color[128 * 128]);
        layer.SetTexture(activeTexture);
        layer.SetName(name);
        layer.Select();

        RefreshTerrainShader();
        int index = layer.transform.GetSiblingIndex();

        SetPaintTexture(index, layer.assignedTexture.texture2D);
        SetPaintMask(index, layer.mask);
    }