//void OnVegetationCellClearCache(VegetationCell vegetationCell)
        //{
        //    List<BillboardCell> overlappingBillboards = BillboardCellQuadTree.Query(vegetationCell.Rectangle);
        //    for (var i = 0; i <= overlappingBillboards.Count - 1; i++)
        //    {
        //        if (overlappingBillboards[i].HasBillboards)
        //        {
        //            overlappingBillboards[i].ClearMeshes();

        //        }
        //    }
        //}

        private void GetVegetationSystem()
        {
            if (VegetationSystem == null)
            {
                VegetationSystem = gameObject.GetComponent <VegetationSystem>();
            }
        }
        //Prepare
        public void CheckAddComponent(Chunk chunk)
        {
                        #if VEGETATION_STUDIO
            Profiler.BeginSample("VS Prepare");

            //adding the main vegetation object
            VegetationStudioManager.AddVegetationStudioManagerToScene();

            //checking if all packs for all of the generators are the same
            if (packageShared == null)
            {
                packageShared = package;
            }
            else
            {
                package = packageShared;
            }

            //finding/creating vegetation system component
            VegetationSystem vetSys = chunk.terrain.gameObject.GetComponentInChildren <VegetationSystem>();
            if (vetSys == null)
            {
                vetSys = VegetationStudioManager.AddVegetationSystemToTerrain(chunk.terrain, package, createPersistentVegetationStoragePackage: true);
            }
            if (vetSys.VegetationPackageList.Count == 0)
            {
                vetSys.VegetationPackageList.Add(package);
            }
            if (vetSys.VegetationPackageList.Count == 1 && vetSys.VegetationPackageList[0] == null)
            {
                vetSys.VegetationPackageList[0] = package;
            }
            if (!vetSys.VegetationPackageList.Contains(package))
            {
                vetSys.VegetationPackageList.Add(package);
            }

            if (!vetSys.InitDone)
            {
                vetSys.SetupVegetationSystem();
                vetSys.RefreshVegetationPackage();
            }
            cellSize = vetSys.CellSize;


            //saving per-chunk storage (to access it from thread)
            PersistentVegetationStorage storage = vetSys.gameObject.GetComponent <PersistentVegetationStorage>();
            if (!vetStorComponents.ContainsKey(chunk.rect))
            {
                vetStorComponents.Add(chunk.rect, null);
            }
            vetStorComponents[chunk.rect] = storage;

            Profiler.EndSample();
                        #endif
        }
        public VegetationSystem CopyVegetationSystem(GameObject srcGameObj, Terrain terrain)
        {
            GameObject vegetationSystemObject = GameObject.Instantiate(srcGameObj);

            vegetationSystemObject.transform.SetParent(terrain.transform);

            VegetationSystem vegetationSystem = vegetationSystemObject.GetComponent <VegetationSystem>();

            if (vegetationSystem == null)
            {
                vegetationSystem = vegetationSystemObject.AddComponent <VegetationSystem>();
            }

            if (package != null)
            {
                vegetationSystem.AddVegetationPackage(package, true);
            }

            if (vegetationSystemObject.GetComponent <TerrainSystem>() == null)
            {
                vegetationSystemObject.AddComponent <TerrainSystem>();
            }

            BillboardSystem billboardSystem = vegetationSystemObject.GetComponent <BillboardSystem>();

            if (billboardSystem == null)
            {
                billboardSystem = vegetationSystemObject.AddComponent <BillboardSystem>();
            }
            billboardSystem.VegetationSystem = vegetationSystem;

            PersistentVegetationStorage srcStorage = vegetationSystemObject.GetComponent <PersistentVegetationStorage>();

            if (srcStorage != null)
            {
                GameObject.DestroyImmediate(srcStorage);
            }

            PersistentVegetationStorage persistentVegetationStorage = vegetationSystemObject.AddComponent <PersistentVegetationStorage>();

            persistentVegetationStorage.VegetationSystem = vegetationSystem;
            vegetationSystem.AutoselectTerrain           = false;
            vegetationSystem.currentTerrain = terrain;
            //vegetationSystem.AutomaticWakeup = true;

            PersistentVegetationStoragePackage persistentVegetationStoragePackage = ScriptableObject.CreateInstance <PersistentVegetationStoragePackage>();

            persistentVegetationStorage.PersistentVegetationStoragePackage         = persistentVegetationStoragePackage;
            persistentVegetationStorage.AutoInitPersistentVegetationStoragePackage = true;

            vegetationSystem.SetSleepMode(false);

            return(vegetationSystem);
        }
Example #4
0
    void DoAddPersistentStorage(VegetationSystem _vegetationSystem)
    {
        _vegetationSystem.AutomaticWakeup = true;
        // NB seems redundant to recurse into parent object - but this is needed to get the terrain name
        GameObject parentTerrainGo = _vegetationSystem.gameObject.transform.parent.gameObject;
        PersistentVegetationStorage _persistentVegetationStorage = parentTerrainGo.GetComponentInChildren <PersistentVegetationStorage>();

        PersistentVegetationStoragePackage newPersistentVegetationStoragePackage = ScriptableObject.CreateInstance <PersistentVegetationStoragePackage>();

        AssetDatabase.CreateAsset(newPersistentVegetationStoragePackage, _assetsPath + "/" + parentTerrainGo.name + _DEFAULT_SUFFIX + ".asset");
        _persistentVegetationStorage.PersistentVegetationStoragePackage = newPersistentVegetationStoragePackage;

        // initialize
        _persistentVegetationStorage.InitializePersistentStorage();

        if (_debugToLog)
        {
            Debug.Log("Added storage asset for " + parentTerrainGo.name);
        }

        if (_autoBake)
        {
            if (_debugToLog)
            {
                Debug.Log("Auto Baking " + parentTerrainGo.name);
            }
            //if (_vegetationSystem.GetSleepMode())
            //{
            _vegetationSystem.SetSleepMode(false);     // wake up VegetationSystem, needed for prefab
            //}
            // now bake
            List <string> vegetationItemIdList =
                VegetationPackageEditorTools.CreateVegetationInfoIdList(_persistentVegetationStorage.VegetationSystem.CurrentVegetationPackage);


            for (int i = 0; i <= vegetationItemIdList.Count - 1; i++)
            {
                _persistentVegetationStorage.BakeVegetationItem(vegetationItemIdList[i]);
            }
            _persistentVegetationStorage.VegetationSystem.DelayedClearVegetationCellCache();
            EditorUtility.SetDirty(_persistentVegetationStorage.PersistentVegetationStoragePackage);
            EditorUtility.SetDirty(_persistentVegetationStorage.VegetationSystem.CurrentVegetationPackage);
            if (_debugToLog)
            {
                Debug.Log("Finished Baking for " + parentTerrainGo.name);
            }
        }
    }
    public void AssignTerrainToFreeVS(Terrain terrain)
    {
        if (useDebug)
        {
            Debug.Log("<b>Starting trying</b> to AssignTerrainToFreeVS() on " + shortenTerrainName(terrain.name));
        }
        //VegetationSystem targetVS = existingVS.Find(x => x.currentTerrain == null);
        VegetationSystem targetVS = null;

        for (int i = 0; i < existingVS.Count; i++)
        {
            if (existingVS[i].currentTerrain == null)
            {
                if (useDebug)
                {
                    Debug.Log(shortenTerrainName(terrain.name) + " > i=" + i.ToString() + ". <color=green>VS System" + existingVS[i].name + " has currentTerrain as NULL</color>");
                }
                targetVS = existingVS[i];
                break;
            }
            else
            {
                if (useDebug)
                {
                    Debug.Log(shortenTerrainName(terrain.name) + " " + i.ToString() + ". <color=red>VS System: " + existingVS[i].name + " has currentTerrain " + existingVS[i].currentTerrain.name + "</color>");
                }
            }
        }


        if (targetVS != null)
        {
            var storagePackage = persistentStorageBundle.LoadAsset <PersistentVegetationStoragePackage> (persistentStorageAssetPrefix + terrain.name + persistentStorageAssetSuffix + ".asset");
            if (useDebug)
            {
                Debug.Log("<color=green>Adding PersistentVSPackage to terrain: " + shortenTerrainName(terrain.name) + "</color>");
            }
            AssignTerrainToVS(terrain, targetVS, vsPackage, storagePackage);
        }
        else
        {
            if (useDebug)
            {
                Debug.Log("<color=red>targetVS is null</color> on terrain: " + shortenTerrainName(terrain.name) + " _<b>can't assign</b>");
            }
        }
    }
        public static void SetupTerrain(Terrain terrain, ref VegetationPackage package, out VegetationSystem system, out PersistentVegetationStorage storage)
        {
            var vetSystems          = GetVegetationSystemsForTerrain(terrain);
            VegetationSystem vetSys = null;

            for (var i = 0; i < vetSystems.Count; ++i)
            {
                var candidate = vetSystems[i];
                if (candidate.CurrentVegetationPackage == package)
                {
                    vetSys = candidate;
                    break;
                }
            }

            if (vetSys == null)
            {
                vetSys = VegetationStudioManager.AddVegetationSystemToTerrain(terrain, package, createPersistentVegetationStoragePackage: true);
            }
            if (package != null)
            {
                if (vetSys.VegetationPackageList.Count == 0)
                {
                    vetSys.VegetationPackageList.Add(package);
                }
                if (vetSys.VegetationPackageList.Count == 1 && vetSys.VegetationPackageList[0] == null)
                {
                    vetSys.VegetationPackageList[0] = package;
                }
                if (!vetSys.VegetationPackageList.Contains(package))
                {
                    vetSys.VegetationPackageList.Add(package);
                }
            }
            if (!vetSys.InitDone)
            {
                vetSys.SetupVegetationSystem();
                vetSys.RefreshVegetationPackage();
            }
            vetSys.SetSleepMode(false);
            package = vetSys.CurrentVegetationPackage;
            system  = vetSys;
            storage = vetSys.GetComponent <PersistentVegetationStorage>();
        }
    void AssignTerrainToVS(Terrain terrain, VegetationSystem vs, VegetationPackage vegetationPackage, PersistentVegetationStoragePackage storagePackage)
    {
        vs.AutoselectTerrain = false;

        vs.CurrentVegetationPackage = vegetationPackage;
        PersistentVegetationStorage storage = vs.GetComponent <PersistentVegetationStorage>();

        if (storage != null)
        {
            storage.SetPersistentVegetationStoragePackage(storagePackage);
        }
        if (vs.InitDone)
        {
            vs.HotswapTerrain(terrain, new UnityTerrainData(terrain));
        }
        else
        {
            vs.SetTerrain(terrain);
        }
    }
        // ReSharper disable once UnusedMember.Local
        void OnEnable()
        {
            VegetationSystem = gameObject.GetComponent <VegetationSystem>();
            if (VegetationSystem)
            {
                VegetationSystem.OnVegetationCellVisibleDelegate            += OnVegetationCellVisible;
                VegetationSystem.OnVegetationCellInvisibleDelegate          += OnVegetationInvisible;
                VegetationSystem.OnResetVisibleCellListDelegate             += OnResetVisibleCellList;
                VegetationSystem.OnVegetationCellChangeDistanceBandDelegate += OnVegetationCellChangeDistanceBand;
                VegetationSystem.OnSetVegetationPackageDelegate             += OnSetVegetationPackage;
            }

            _vegetationCellColliderList = new List <VegetationCellCollider>();

            if (!ColliderParent)
            {
                CreateColliderParent();
            }

            RefreshColliders();
        }
        public static IEnumerator Apply(CoordRect rect, Terrain terrain, object dataBox, Func <float, bool> stop = null)
        {
            Profiler.BeginSample("VS Apply");

                        #if VEGETATION_STUDIO
            //clear cache
            VegetationSystem vetSys = terrain.gameObject.GetComponentInChildren <VegetationSystem>();
            for (int i = 0; i < vetSys.VegetationCellList.Count; i++)
            {
                vetSys.VegetationCellList[i].ClearCache();
            }

            vetSys.UnityTerrainData = new UnityTerrainData(terrain, false, false);

            //refresh billboards
            BillboardSystem billboardSystem = vetSys.GetComponent <BillboardSystem>();
            billboardSystem.RefreshBillboards();

            Profiler.EndSample();
                        #endif

            yield return(null);
        }
Example #10
0
    //v1 just deletes all and rebakes
    //void ReBakeAllStorage()
    //{
    //    ClearAllVegetationSystems();

    //    if (_usePrefab)
    //    {
    //        SetupFromPrefab();
    //    }
    //    else
    //    {
    //        SetupFromVegetationPackage();
    //    }

    //}



    void AddAdditionalPackage()
    {
        // do a rebake of existing persistent storage packages.
        // Not quite working as expected - adds additional VegetationPackages to the VegetationSystem component, rather than replacing the existing one
        // Also, buggy?... seems to work first time but not on subsequent rebakes (baked storage ends up empty).


        // take care of storage (path)
        _assetsPath = RemoveTrailingSlash(_assetsPath); // ensures that there isn't an ending slash

        if (!AssetDatabase.IsValidFolder(_assetsPath))
        {
            if (_debugToLog)
            {
                Debug.Log("Asset path is invalid. Creating your folders");
            }
            CreateAssetFolders();
        }

        ClearAllStorageInPath();



        if (_vegetationPackage == null)
        {
            Debug.LogWarning("You need to assign a vegetation package");
            EditorUtility.DisplayDialog("No Vegetation Package",
                                        "You need to drag and drop a vegetation package into the utility window", "OK");
            return;
        }
        if (_forceItemsEnabled)     // Make sure all Vegetation is enabled on Vegetation Package
        {
            SetAllItemsToRuntimeSpawn();
        }


        var terrains = _rootObject ? _rootObject.GetComponentsInChildren <Terrain>() : GameObject.FindObjectsOfType <Terrain>();
        int totalNum = terrains.Length;
        int counter  = 0;

        foreach (Terrain terrain in terrains)
        {
            counter++;
            if (_addPersistentStorage)
            {
                // first check if a Vegetation System already exists
                VegetationSystem _vegetationSystem = terrain.gameObject.GetComponentInChildren <VegetationSystem>();
                if (_vegetationSystem == null)
                {     // add if not already there
                    _vegetationSystem = VegetationStudioManager.AddVegetationSystemToTerrain(terrain, _vegetationPackage, true);
                    if (_debugToLog)
                    {
                        Debug.Log("Rebaking: Added missing VS to " + terrain.name + " (" + counter + " of " + totalNum + ")");
                    }
                }
                else
                {
                    if (_debugToLog)
                    {
                        Debug.Log("Rebaking VS already existed on " + terrain.name + " (" + counter + " of " + totalNum + ")");
                    }
                    _vegetationSystem.AddVegetationPackage(_vegetationPackage, true);
                }

                if (_debugToLog)
                {
                    Debug.Log("Adding Persistent Storage " + terrain.name + " (" + counter + " of " + totalNum + ")");
                }
                DoAddPersistentStorage(_vegetationSystem);
            }
            else
            {
                // just add a Vegetation System
                VegetationStudioManager.AddVegetationSystemToTerrain(terrain, _vegetationPackage);
            }
        }


        EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
    }
Example #11
0
    void SetupFromPrefab()
    {
        _assetsPath = RemoveTrailingSlash(_assetsPath); // ensures that there isn't an ending slash

        if (!AssetDatabase.IsValidFolder(_assetsPath))
        {
            if (_debugToLog)
            {
                Debug.Log("Asset path is invalid. Creating your folders");
            }
            CreateAssetFolders();
        }

        if (_forceItemsEnabled) // Make sure all Vegetation is enabled on Vegetation Package
        {
            _vegetationPackage = _vegetationSystemPrefab.GetComponent <VegetationSystem>().CurrentVegetationPackage;
            SetAllItemsToRuntimeSpawn();
        }
        if (_autoBake) // if going to rebake then delete any existing packages
        {
            ClearAllStorageInPath();
        }

        var terrains = _rootObject ? _rootObject.GetComponentsInChildren <Terrain>() : GameObject.FindObjectsOfType <Terrain>();
        int totalNum = terrains.Length;
        int counter  = 0;

        foreach (Terrain terrain in terrains)
        {
            // first check if a Vegetation System already exists
            VegetationSystem _vegetationSystem = terrain.gameObject.GetComponentInChildren <VegetationSystem>();
            if (_vegetationSystem != null)
            { // add if already there, destroy
                DestroyImmediate(_vegetationSystem.gameObject);
            }

            GameObject       vegetationSystemObject = Instantiate(_vegetationSystemPrefab, terrain.gameObject.transform);
            VegetationSystem vegetationSystem       = vegetationSystemObject.GetComponent <VegetationSystem>();
            if (vegetationSystem)
            {
                vegetationSystem.AutoselectTerrain = false;
                vegetationSystem.SetTerrain(terrain);

                counter++;
                if (_debugToLog)
                {
                    Debug.Log("Added VS Prefab to " + terrain.name + " (" + counter + " of " + totalNum + ")");
                }
                if (_addPersistentStorage)
                {
                    if (_debugToLog)
                    {
                        Debug.Log("Adding Persistent Storage " + terrain.name + " (" + counter + " of " + totalNum + ")");
                    }
                    DoAddPersistentStorage(vegetationSystem);
                }
            }
        }

        EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
    }
Example #12
0
    void SetupFromVegetationPackage()
    {
        _assetsPath = RemoveTrailingSlash(_assetsPath); // ensures that there isn't an ending slash

        if (!AssetDatabase.IsValidFolder(_assetsPath))
        {
            if (_debugToLog)
            {
                Debug.Log("Asset path is invalid. Creating your folders");
            }
            CreateAssetFolders();
        }


        if (_forceItemsEnabled) // Make sure all Vegetation is enabled on Vegetation Package
        {
            SetAllItemsToRuntimeSpawn();
        }

        if (_autoBake) // if going to rebake then delete any existing packages
        {
            ClearAllStorageInPath();
        }

        var terrains = _rootObject ? _rootObject.GetComponentsInChildren <Terrain>() : GameObject.FindObjectsOfType <Terrain>();
        int totalNum = terrains.Length;
        int counter  = 0;

        foreach (Terrain terrain in terrains)
        {
            counter++;
            if (_addPersistentStorage)
            {
                if (_debugToLog)
                {
                    Debug.Log("---------------------------------------------------------------");
                }
                // first check if a Vegetation System already exists
                VegetationSystem _vegetationSystem = terrain.gameObject.GetComponentInChildren <VegetationSystem>();
                if (_vegetationSystem != null)
                {
                    DestroyImmediate(_vegetationSystem.gameObject);
                }
                // add
                _vegetationSystem = VegetationStudioManager.AddVegetationSystemToTerrain(terrain, _vegetationPackage, true);

                if (_debugToLog)
                {
                    Debug.Log("Added VS to " + terrain.name + " (" + counter + " of " + totalNum + ")");
                }


                if (_debugToLog)
                {
                    Debug.Log("Adding Persistent Storage " + terrain.name + " (" + counter + " of " + totalNum + ")");
                }
                DoAddPersistentStorage(_vegetationSystem);
            }
            else
            {
                VegetationStudioManager.AddVegetationSystemToTerrain(terrain, _vegetationPackage); // just add a Vegetation System
            }
        }
        EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
    }