/// <summary>
        /// Converts a Detail Prototype array into a Terrain Grass List
        /// An empty (but not null) terrainGrassList is supplied to reduce GC
        /// </summary>
        /// <param name="detailPrototypes"></param>
        /// <param name="terrainGrassList"></param>
        public static void ToLBTerrainGrassList(DetailPrototype[] detailPrototypes, List <LBTerrainGrass> terrainGrassList)
        {
            if (detailPrototypes != null && terrainGrassList != null)
            {
                if (detailPrototypes.Length > 0)
                {
                    terrainGrassList.Clear();

                    for (int i = 0; i < detailPrototypes.Length; i++)
                    {
                        LBTerrainGrass temp = new LBTerrainGrass();
                        // NOTE: Texture will be null if a mesh is being used
                        temp.texture          = detailPrototypes[i].prototypeTexture;
                        temp.minHeight        = detailPrototypes[i].minHeight;
                        temp.maxHeight        = detailPrototypes[i].maxHeight;
                        temp.minWidth         = detailPrototypes[i].minWidth;
                        temp.maxWidth         = detailPrototypes[i].maxWidth;
                        temp.dryColour        = detailPrototypes[i].dryColor;
                        temp.healthyColour    = detailPrototypes[i].healthyColor;
                        temp.noiseSpread      = detailPrototypes[i].noiseSpread;
                        temp.detailRenderMode = detailPrototypes[i].renderMode;
                        // Used when using a mesh prefab instead of a texture for the grass
                        temp.useMeshPrefab = detailPrototypes[i].usePrototypeMesh;
                        temp.meshPrefab    = detailPrototypes[i].prototype;
                        terrainGrassList.Add(temp);
                        temp = null;
                    }
                }
            }
        }
        private void UserDefinedLookup(LBTerrainGrass lbTerrainGrass, string sourceName)
        {
            if (lbGrassSetup == null)
            {
                Debug.LogWarning("LandscapeBuilderGrassEditor.UserDefinedLookup - Grass Setup is not defined");
            }
            else if (lbTerrainGrass == null)
            {
                Debug.LogWarning("LandscapeBuilderGrassEditor.UserDefinedLookup - Terrain Grass cannot be null");
            }
            else
            {
                string filePath = LBTextureOperations.GetTextureFilePath(lbTerrainGrass.texture);
                string textureNameWithExtension = LBTextureOperations.GetTextureFileNameFromPath(filePath);

                // Find a match in the current config list
                LBGrassConfig lbGrassConfig = lbGrassSetup.lbGrassConfigList.Find(g => g.grassTextureName == textureNameWithExtension && g.sourceName == sourceName);

                // If we didn't find a match, create a new one
                if (lbGrassConfig == null)
                {
                    AddGrassConfig(lbTerrainGrass, textureNameWithExtension);
                }
            }
        }
 /// <summary>
 /// Add a new LBGrassConfig using an existing LBTerrainGrass instance
 /// </summary>
 /// <param name="lbTerrainGrass"></param>
 private void AddGrassConfig(LBTerrainGrass lbTerrainGrass, string textureName)
 {
     if (lbGrassSetup == null)
     {
         Debug.LogWarning("LandscapeBuilderGrassEditor.AddGrassConfig - Grass Setup is not defined");
     }
     else if (lbTerrainGrass == null)
     {
         Debug.LogWarning("LandscapeBuilderGrassEditor.AddGrassConfig - Terrain Grass cannot be null");
     }
     else if (lbGrassSetup.lbGrassConfigList == null)
     {
         Debug.LogWarning("LandscapeBuilderGrassEditor.AddGrassConfig - GrassConfigList is not defined");
     }
     else
     {
         LBGrassConfig lbGrassConfigNew = new LBGrassConfig();
         if (lbGrassConfigNew != null)
         {
             lbGrassConfigNew.sourceName           = LBGrassSetup.UserDefinedSourceFilter;
             lbGrassConfigNew.texture2D            = lbTerrainGrass.texture;
             lbGrassConfigNew.grassTexturePath     = AssetDatabase.GetAssetPath(lbTerrainGrass.texture);
             lbGrassConfigNew.grassTextureName     = LBTextureOperations.GetTextureFileNameFromPath(lbGrassConfigNew.grassTexturePath);
             lbGrassConfigNew.detailRenderMode     = lbTerrainGrass.detailRenderMode;
             lbGrassConfigNew.dryColour            = lbTerrainGrass.dryColour;
             lbGrassConfigNew.grassPatchFadingMode = (LBGrassConfig.GrassPatchFadingMode)lbTerrainGrass.grassPatchFadingMode;
             lbGrassConfigNew.healthyColour        = lbTerrainGrass.healthyColour;
             lbGrassConfigNew.minWidth             = lbTerrainGrass.minWidth;
             lbGrassConfigNew.maxWidth             = lbTerrainGrass.maxWidth;
             lbGrassConfigNew.minHeight            = lbTerrainGrass.minHeight;
             lbGrassConfigNew.maxHeight            = lbTerrainGrass.maxHeight;
             lbGrassSetup.lbGrassConfigList.Add(lbGrassConfigNew);
             lbGrassSetup.Save(false);
             if (lbWindow != null)
             {
                 lbWindow.isGrassConfigListDirty = true;
             }
         }
     }
 }
 /// <summary>
 /// Constructor to create a clone of a LBTerrainGrass instance
 /// </summary>
 /// <param name="lbTerrainGrass"></param>
 public LBTerrainGrass(LBTerrainGrass lbTerrainGrass)
 {
     this.texture = lbTerrainGrass.texture;
     if (lbTerrainGrass.textureName == null)
     {
         this.textureName = string.Empty;
     }
     else
     {
         this.textureName = lbTerrainGrass.textureName;
     }
     this.minHeight              = lbTerrainGrass.minHeight;
     this.maxHeight              = lbTerrainGrass.maxHeight;
     this.minWidth               = lbTerrainGrass.minWidth;
     this.maxWidth               = lbTerrainGrass.maxWidth;
     this.healthyColour          = lbTerrainGrass.healthyColour;
     this.dryColour              = lbTerrainGrass.dryColour;
     this.noiseSpread            = lbTerrainGrass.noiseSpread;
     this.minPopulatedHeight     = lbTerrainGrass.minPopulatedHeight;
     this.maxPopulatedHeight     = lbTerrainGrass.maxPopulatedHeight;
     this.minInclination         = lbTerrainGrass.minInclination;
     this.maxInclination         = lbTerrainGrass.maxInclination;
     this.influence              = lbTerrainGrass.influence;
     this.minDensity             = lbTerrainGrass.minDensity;
     this.density                = lbTerrainGrass.density;
     this.detailRenderMode       = lbTerrainGrass.detailRenderMode;
     this.isCurvatureConcave     = lbTerrainGrass.isCurvatureConcave;
     this.curvatureDistance      = lbTerrainGrass.curvatureDistance;
     this.curvatureMinHeightDiff = lbTerrainGrass.curvatureMinHeightDiff;
     this.grassPlacingMode       = lbTerrainGrass.grassPlacingMode;
     this.grassPatchFadingMode   = lbTerrainGrass.grassPatchFadingMode;
     this.map                    = lbTerrainGrass.map;
     this.mapColour              = lbTerrainGrass.mapColour;
     this.mapTolerance           = lbTerrainGrass.mapTolerance;
     this.mapInverse             = lbTerrainGrass.mapInverse;
     this.mapToleranceBlendCurve = lbTerrainGrass.mapToleranceBlendCurve;
     this.mapIsPath              = lbTerrainGrass.mapIsPath;
     this.isDisabled             = lbTerrainGrass.isDisabled;
     if (lbTerrainGrass.filterList != null)
     {
         this.filterList = LBFilter.CopyList(lbTerrainGrass.filterList);
     }
     else
     {
         this.filterList = new List <LBFilter>();
     }
     this.showGrass            = lbTerrainGrass.showGrass;
     this.useNoise             = lbTerrainGrass.useNoise;
     this.noiseTileSize        = lbTerrainGrass.noiseTileSize;
     this.noiseOctaves         = lbTerrainGrass.noiseOctaves;
     this.grassPlacementCutoff = lbTerrainGrass.grassPlacementCutoff;
     if (lbTerrainGrass.lbTerrainDataList == null)
     {
         this.lbTerrainDataList = null;
     }
     else
     {
         this.lbTerrainDataList = new List <LBTerrainData>(lbTerrainGrass.lbTerrainDataList);
     }
     this.useMeshPrefab = lbTerrainGrass.useMeshPrefab;
     this.meshPrefab    = lbTerrainGrass.meshPrefab;
     if (lbTerrainGrass.meshPrefabName == null)
     {
         this.meshPrefabName = string.Empty;
     }
     else
     {
         this.meshPrefabName = lbTerrainGrass.meshPrefabName;
     }
     this.showPrefabPreview = lbTerrainGrass.showPrefabPreview;
     this.GUID = lbTerrainGrass.GUID;
 }