Ejemplo n.º 1
0
        public static void SetTextures(Rect terrainRect, Texture2D[] textures, int[] maskGroupNums, VegetationPackagePro package)
        {
            for (int i = 0; i < textures.Length; i++)
            {
                Texture2D tex = textures[i];
                if (tex == null)
                {
                    continue;
                }

                TextureMaskGroup maskGroup = package.TextureMaskGroupList[maskGroupNums[i]];

                //creating new mask only if the mask with the same rect doesn't exist
                TextureMask mask = maskGroup.TextureMaskList.Find(m => m.TextureRect == terrainRect);
                if (mask == null)
                {
                    mask = new TextureMask {
                        TextureRect = terrainRect
                    };
                    maskGroup.TextureMaskList.Add(mask);
                }

                mask.MaskTexture = tex;
            }

            //VegetationSystemPro system = GameObject.FindObjectOfType<VegetationSystemPro>();
            //if (system != null)
            //	system.ClearCache(); //clearing cache causes flickering

            system.ClearCache(new Bounds(terrainRect.center.V3(), terrainRect.size.V3()));
            VegetationStudioManager.RefreshTerrainHeightMap();
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Sets a new persistentVegetationStoragePackage. Will refresh the VegetationSystem component.
 /// </summary>
 /// <param name="persistentVegetationStoragePackage"></param>
 public void SetPersistentVegetationStoragePackage(
     PersistentVegetationStoragePackage persistentVegetationStoragePackage)
 {
     PersistentVegetationStoragePackage = persistentVegetationStoragePackage;
     if (VegetationSystemPro)
     {
         VegetationSystemPro.ClearCache();
     }
 }
Ejemplo n.º 3
0
    public static void RefreshVegetation()
    {
        VegetationStudioManager VegetationStudioInstance = FindVegetationStudioInstance();

        List <VegetationSystemPro> VegetationSystemList = VegetationStudioInstance.VegetationSystemList;

        for (int i = 0; i <= VegetationSystemList.Count - 1; i++)
        {
            VegetationSystemPro vegetationSystemPro = VegetationSystemList[i];

            vegetationSystemPro.ClearCache();
            vegetationSystemPro.RefreshTerrainHeightmap();
            SceneView.RepaintAll();

            SetSceneDirty(vegetationSystemPro);
        }
    }
            /// <summary>
            /// Iterate through all items of the selected biome
            /// </summary>
            /// <param name="selectedBiomeTypes"></param>
            /// <returns></returns>
            public int Process(BiomeType[] selectedBiomeTypes)
            {
                int itemChangeCount = 0;

                List <VegetationSystemPro> VegetationSystemList = VegetationStudioInstance.VegetationSystemList;

                for (int i = 0; i <= VegetationSystemList.Count - 1; i++)
                {
                    VegetationSystemPro vegetationSystemPro = VegetationSystemList[i];

                    foreach (VegetationPackagePro vegetationPackagePro in vegetationSystemPro.VegetationPackageProList)
                    {
                        // filter biome type
                        if (!ArrayUtility.Contains(selectedBiomeTypes, vegetationPackagePro.BiomeType))
                        {
                            continue;
                        }

                        // note: the delete mechanism operates on the list itself => we have to use a clone => using ToArray() on the list
                        foreach (VegetationItemInfoPro vegetationItemInfoPro in vegetationPackagePro.VegetationInfoList.ToArray())
                        {
                            // perform the actual action
                            OnActionPerformed(vegetationPackagePro, vegetationItemInfoPro);

                            // clear cache
                            vegetationSystemPro.ClearCache(vegetationItemInfoPro.VegetationItemID);

                            itemChangeCount++;
                        }

                        EditorUtility.SetDirty(vegetationPackagePro);
                    }

                    vegetationSystemPro.RefreshVegetationSystem();

                    VegetationStudioProUtils.SetSceneDirty(vegetationSystemPro);
                }

                return(itemChangeCount);
            }
Ejemplo n.º 5
0
        void BakeVegetationItemColliders(ColliderManager colliderManager, VegetationItemInfoPro vegetationItemInfoPro)
        {
            GC.Collect();

            GameObject rootItem = new GameObject("Baked colliders_" + vegetationItemInfoPro.Name + "_" + vegetationItemInfoPro.VegetationItemID);

#if UNITY_EDITOR
            if (!Application.isPlaying)
            {
                EditorUtility.DisplayProgressBar("Bake Collider: " + vegetationItemInfoPro.Name, "Bake cell", 0);
            }
#endif
            int colliderCount = 0;

            for (int i = 0; i <= VegetationSystemPro.VegetationCellList.Count - 1; i++)
            {
                VegetationCell vegetationCell = VegetationSystemPro.VegetationCellList[i];

#if UNITY_EDITOR
                if (i % 10 == 0)
                {
                    if (!Application.isPlaying)
                    {
                        EditorUtility.DisplayProgressBar("Bake Collider: " + vegetationItemInfoPro.Name, "Bake cell " + i + "/" + (VegetationSystemPro.VegetationCellList.Count - 1), i / ((float)VegetationSystemPro.VegetationCellList.Count - 1));
                    }
                }
#endif

                VegetationSystemPro.SpawnVegetationCell(vegetationCell, vegetationItemInfoPro.VegetationItemID);
                NativeList <MatrixInstance> vegetationInstanceList =
                    VegetationSystemPro.GetVegetationItemInstances(vegetationCell, vegetationItemInfoPro.VegetationItemID);

                for (int j = 0; j <= vegetationInstanceList.Length - 1; j++)
                {
                    Matrix4x4  vegetationItemMatrix = vegetationInstanceList[j].Matrix;
                    Vector3    position             = MatrixTools.ExtractTranslationFromMatrix(vegetationItemMatrix);
                    Vector3    scale    = MatrixTools.ExtractScaleFromMatrix(vegetationItemMatrix);
                    Quaternion rotation = MatrixTools.ExtractRotationFromMatrix(vegetationItemMatrix);

                    ItemSelectorInstanceInfo itemSelectorInstanceInfo = new ItemSelectorInstanceInfo
                    {
                        Position = position, Scale = scale, Rotation = rotation
                    };

                    GameObject newCollider = colliderManager.ColliderPool.GetObject(itemSelectorInstanceInfo);
                    newCollider.hideFlags = HideFlags.None;
                    newCollider.transform.SetParent(rootItem.transform, true);
                    SetNavmeshArea(newCollider, vegetationItemInfoPro.NavMeshArea);

                    if (SetBakedCollidersStatic)
                    {
                        SetStatic(newCollider);
                    }

                    if (ConvertBakedCollidersToMesh)
                    {
                        CreateNavMeshColliderMeshes(newCollider);
                    }


                    colliderCount++;
                }

                vegetationCell.ClearCache();
            }

            VegetationSystemPro.ClearCache(vegetationItemInfoPro.VegetationItemID);

#if UNITY_EDITOR
            if (!Application.isPlaying)
            {
                EditorUtility.ClearProgressBar();
            }
#endif

            if (colliderCount == 0)
            {
                DestroyImmediate(rootItem);
            }
        }
Ejemplo n.º 6
0
        public void GenerateSplatMap(bool clearLockedTextures, IVegetationStudioTerrain iVegetationStudioTerrain)
        {
            if (!VegetationSystemPro)
            {
                return;
            }

            VegetationSystemPro.ClearCache(iVegetationStudioTerrain.TerrainBounds);
            PrepareTextureCurves();

            float worldspaceMinHeight = VegetationSystemPro.VegetationSystemBounds.center.y -
                                        VegetationSystemPro.VegetationSystemBounds.extents.y;
            float worldspaceSeaLevel  = worldspaceMinHeight + VegetationSystemPro.SeaLevel;
            float worldspaceMaxHeight = VegetationSystemPro.VegetationSystemBounds.center.y +
                                        VegetationSystemPro.VegetationSystemBounds.extents.y;
            float heightCurveSampleHeight = worldspaceMaxHeight - worldspaceSeaLevel;

            VegetationPackagePro defaultBiomeVegetationPackagePro =
                VegetationSystemPro.GetVegetationPackageFromBiome(BiomeType.Default);

            if (defaultBiomeVegetationPackagePro == null)
            {
                Debug.LogWarning("You need a default biome in order to generate splatmaps. ");
                return;
            }

            iVegetationStudioTerrain.PrepareSplatmapGeneration(clearLockedTextures);

            iVegetationStudioTerrain.GenerateSplatMapBiome(VegetationSystemPro.VegetationSystemBounds,
                                                           BiomeType.Default, null, defaultBiomeVegetationPackagePro.TerrainTextureSettingsList,
                                                           heightCurveSampleHeight, worldspaceSeaLevel, clearLockedTextures);

            List <BiomeType> additionalBiomeList = VegetationSystemPro.GetAdditionalBiomeList();

            List <VegetationPackagePro> additionalVegetationPackageList = new List <VegetationPackagePro>();

            for (int i = 0; i <= additionalBiomeList.Count - 1; i++)
            {
                additionalVegetationPackageList.Add(
                    VegetationSystemPro.GetVegetationPackageFromBiome(additionalBiomeList[i]));
            }
            BiomeSortOrderComparer biomeSortOrderComparer = new BiomeSortOrderComparer();

            additionalVegetationPackageList.Sort(biomeSortOrderComparer);

            for (int i = 0; i <= additionalVegetationPackageList.Count - 1; i++)
            {
                VegetationPackagePro currentVegetationPackagePro = additionalVegetationPackageList[i];
                if (!currentVegetationPackagePro.GenerateBiomeSplamap)
                {
                    continue;
                }

                List <PolygonBiomeMask> biomeMaskList = VegetationStudioManager.GetBiomeMasks(currentVegetationPackagePro.BiomeType);
                iVegetationStudioTerrain.GenerateSplatMapBiome(VegetationSystemPro.VegetationSystemBounds,
                                                               currentVegetationPackagePro.BiomeType, biomeMaskList, currentVegetationPackagePro.TerrainTextureSettingsList, heightCurveSampleHeight, worldspaceSeaLevel, clearLockedTextures);
            }

            JobHandle.ScheduleBatchedJobs();
            iVegetationStudioTerrain.CompleteSplatmapGeneration();
            DisposeTextureCurves();
        }
Ejemplo n.º 7
0
        public void GenerateSplatMap(bool clearLockedTextures)
        {
            if (!VegetationSystemPro)
            {
                return;
            }

            VegetationSystemPro.ClearCache();

            List <IVegetationStudioTerrain> overlapTerrainList =
                GetOverlapTerrainList(VegetationSystemPro.VegetationSystemBounds);

            PrepareTextureCurves();

            float worldspaceMinHeight = VegetationSystemPro.VegetationSystemBounds.center.y -
                                        VegetationSystemPro.VegetationSystemBounds.extents.y;
            float worldspaceSeaLevel  = worldspaceMinHeight + VegetationSystemPro.SeaLevel;
            float worldspaceMaxHeight = VegetationSystemPro.VegetationSystemBounds.center.y +
                                        VegetationSystemPro.VegetationSystemBounds.extents.y;
            float heightCurveSampleHeight = worldspaceMaxHeight - worldspaceSeaLevel;


            VegetationPackagePro defaultBiomeVegetationPackagePro =
                VegetationSystemPro.GetVegetationPackageFromBiome(BiomeType.Default);

            if (defaultBiomeVegetationPackagePro == null)
            {
                Debug.LogWarning("You need a default biome in order to generate splatmaps. ");
                return;
            }

            int terrainCount = overlapTerrainList.Count;

            for (int i = 0; i <= overlapTerrainList.Count - 1; i++)
            {
                overlapTerrainList[i].PrepareSplatmapGeneration(clearLockedTextures);
#if UNITY_EDITOR
                EditorUtility.DisplayProgressBar("Prepare generation",
                                                 "Terrain " + (i + 1) + "/" + terrainCount, (i + 1) / (float)terrainCount);
#endif
            }

            for (int i = 0; i <= overlapTerrainList.Count - 1; i++)
            {
                overlapTerrainList[i].GenerateSplatMapBiome(VegetationSystemPro.VegetationSystemBounds,
                                                            BiomeType.Default, null, defaultBiomeVegetationPackagePro.TerrainTextureSettingsList, heightCurveSampleHeight, worldspaceSeaLevel, clearLockedTextures);

#if UNITY_EDITOR
                EditorUtility.DisplayProgressBar("Generating default biome",
                                                 "Terrain " + (i + 1) + "/" + terrainCount, (i + 1) / (float)terrainCount);
#endif
            }

            List <BiomeType> additionalBiomeList = VegetationSystemPro.GetAdditionalBiomeList();


            List <VegetationPackagePro> additionalVegetationPackageList = new List <VegetationPackagePro>();
            for (int i = 0; i <= additionalBiomeList.Count - 1; i++)
            {
                additionalVegetationPackageList.Add(
                    VegetationSystemPro.GetVegetationPackageFromBiome(additionalBiomeList[i]));
            }
            BiomeSortOrderComparer biomeSortOrderComparer = new BiomeSortOrderComparer();
            additionalVegetationPackageList.Sort(biomeSortOrderComparer);

            for (int i = 0; i <= additionalVegetationPackageList.Count - 1; i++)
            {
                VegetationPackagePro currentVegetationPackagePro = additionalVegetationPackageList[i];

                List <PolygonBiomeMask> biomeMaskList = VegetationStudioManager.GetBiomeMasks(currentVegetationPackagePro.BiomeType);
                for (int j = 0; j <= overlapTerrainList.Count - 1; j++)
                {
                    overlapTerrainList[j].GenerateSplatMapBiome(VegetationSystemPro.VegetationSystemBounds,
                                                                currentVegetationPackagePro.BiomeType, biomeMaskList, currentVegetationPackagePro.TerrainTextureSettingsList, heightCurveSampleHeight, worldspaceSeaLevel, clearLockedTextures);
                }
            }

            JobHandle.ScheduleBatchedJobs();


            for (int i = 0; i <= overlapTerrainList.Count - 1; i++)
            {
#if UNITY_EDITOR
                EditorUtility.DisplayProgressBar("Updating terrain",
                                                 "Terrain " + (i + 1) + "/" + terrainCount, (i + 1) / (float)terrainCount);
      #endif
                overlapTerrainList[i].CompleteSplatmapGeneration();
            }
#if UNITY_EDITOR
            EditorUtility.ClearProgressBar();
#endif
            DisposeTextureCurves();
        }