Exemplo n.º 1
0
        protected virtual void UpdateResolutionChange()
        {
            #if UNITY_EDITOR
            UnityEditor.EditorUtility.DisplayProgressBar("uNature Foliage", "uNature is recalculating the new Foliage area resolution \nThat might take awhile...", 0.2f);
            #endif

            // recreate sectors.
            DestroyImmediate(sector.gameObject);

            // update world map
            worldMap = UNMapGenerators.GenerateWorldMap(this);

            // update & clean grass maps
            DisposeExistingGrassMaps();

            _grassMaps = null;
            UpdateGrassMapsForMaterials();

            PoolMeshInstances();

            UNSettings.Log("uNature finished updating the area resolution successfully!! New resolution : " + _foliageAreaResolutionIntegral);

            #if UNITY_EDITOR
            UnityEditor.EditorUtility.ClearProgressBar();
            #endif
        }
Exemplo n.º 2
0
        public static void ApplyAreaSizeChange(FoliageManagerInstance mInstance)
        {
            FoliageGrassMap grassMap;

            for (int i = 0; i < FoliageDB.unSortedPrototypes.Count; i++)
            {
                grassMap = mInstance.grassMaps[FoliageDB.unSortedPrototypes[i]];

                grassMap.Resize(mInstance.foliageAreaResolutionIntegral);
            }

            UNSettings.Log("Grass maps updated succesfully after modifying resolution.");
        }
Exemplo n.º 3
0
        /// <summary>
        /// On terrain changed.
        /// </summary>
        /// <param name="changedFlags"></param>
        protected virtual void OnTerrainChanged(int changedFlags)
        {
            TerrainChangedFlags flag = (TerrainChangedFlags)changedFlags;

            if (flag == TerrainChangedFlags.TreeInstances)
            {
                if (sector == null)
                {
                    GenerateSector(sectorResolution);
                }

                #if UNITY_EDITOR
                UNEditorUtility.StartSceneScrollbar("Fetching tree instances...", 1);
                #endif

                sector.FetchTreeInstances(true, () =>
                {
                    #if UNITY_EDITOR
                    UNSettings.Log("Trees Updated.");

                    UNEditorUtility.currentProgressIndex = 1;
                    #endif
                });
            }
            else if (flag == TerrainChangedFlags.TreePrototypesChanged)
            {
                CreatePool(PoolItemType);
            }
            else if (flag == TerrainChangedFlags.DelayedHeightmapUpdate)
            {
                if (FoliageCore_MainManager.instance == null || !updateGrassOnHeightsChange || !manageGrass)
                {
                    return;
                }

                TerrainData tData = terrain.terrainData;

                float[,] heights = tData.GetHeights(0, 0, tData.heightmapWidth, tData.heightmapHeight);
                bool changed = false;

                float cordX;
                float cordY;

                FoliageCore_MainManager manager = FoliageCore_MainManager.instance;

                int mChunkID;
                FoliageCore_Chunk      mChunk;
                FoliageManagerInstance mInstance;

                Vector3 position        = transform.position;
                Vector3 managerPosition = manager.transform.position;

                FoliageWorldMap worldMap;

                int transformedSize;

                for (int x = 0; x < tData.heightmapWidth; x++)
                {
                    for (int y = 0; y < tData.heightmapHeight; y++)
                    {
                        if (heights[y, x] != terrainData.multiThreaded_terrainHeights[y, x]) // change on cord.
                        {
                            changed = true;

                            cordX = ((x * tData.size.x) / tData.heightmapWidth) + position.x;
                            cordY = ((y * tData.size.z) / tData.heightmapHeight) + position.z;

                            mChunkID = manager.GetChunkID(cordX - managerPosition.x, cordY - managerPosition.z);

                            if (manager.CheckChunkInBounds(mChunkID))
                            {
                                mChunk = manager.sector.foliageChunks[mChunkID];

                                if (!mChunk.isFoliageInstanceAttached)
                                {
                                    continue;
                                }

                                mInstance = mChunk.GetOrCreateFoliageManagerInstance();

                                worldMap = mInstance.worldMap;

                                cordX = mInstance.TransformCord(cordX, mInstance.transform.position.x);
                                cordY = mInstance.TransformCord(cordY, mInstance.transform.position.z);

                                transformedSize = mInstance.TransformCord(2, 0);

                                worldMap.UpdateHeight_RANGE(cordX, cordY, transformedSize, transformedSize, false);

                                worldMap.SetPixels32Delayed();
                            }
                        }
                    }
                }

                if (changed)
                {
                    FoliageCore_MainManager.SaveDelayedMaps();
                }

                terrainData.multiThreaded_terrainHeights = heights;
            }
        }
Exemplo n.º 4
0
        public static void ApplyAreaSizeChange(FoliageManagerInstance mInstance)
        {
            mInstance.worldMap.Resize(mInstance.foliageAreaResolutionIntegral);

            UNSettings.Log("World map updated succesfully after modifying resolution.");
        }