Esempio n. 1
0
        private void DoImportGrasses()
        {
            if (!ImportGrassInstancesOnly)
            {
                GGrassPrototypeGroup grassesGroup = DesData.Foliage.Grasses;
                if (grassesGroup == null ||
                    grassesGroup == GRuntimeSettings.Instance.foliageDefault.grasses)
                {
                    CreateNewGrassPrototypesGroup = true;
                }

                if (CreateNewGrassPrototypesGroup)
                {
                    grassesGroup = ScriptableObject.CreateInstance <GGrassPrototypeGroup>();

#if UNITY_EDITOR
                    if (!Application.isPlaying)
                    {
                        string path      = AssetDatabase.GetAssetPath(DesData);
                        string directory = Path.GetDirectoryName(path);
                        string filePath  = Path.Combine(directory, string.Format("Grasses_{0}_{1}.asset", DesData.Id, System.DateTime.Now.Ticks));
                        AssetDatabase.CreateAsset(grassesGroup, filePath);
                    }
#endif
                    DesData.Foliage.Grasses = grassesGroup;
                }

                grassesGroup.Prototypes.Clear();

                DetailPrototype[] detailPrototypes = SrcData.detailPrototypes;
                for (int i = 0; i < detailPrototypes.Length; ++i)
                {
                    GGrassPrototype proto = (GGrassPrototype)detailPrototypes[i];
                    grassesGroup.Prototypes.Add(proto);
                }
                GCommon.SetDirty(grassesGroup);
            }

            List <GGrassInstance> grasses = new List <GGrassInstance>();
            int detailResolution          = SrcData.detailResolution;
            int detailLayerCount          = SrcData.detailPrototypes.Length;
            for (int layer = 0; layer < detailLayerCount; ++layer)
            {
                int[,] density = SrcData.GetDetailLayer(0, 0, detailResolution, detailResolution, layer);
                DoImportDetailLayer(layer, density, grasses);
            }

            DesData.Foliage.ClearGrassInstances();
            DesData.Foliage.AddGrassInstances(grasses);
            if (DesTerrain != null)
            {
                DesData.Foliage.SetGrassRegionDirty(GCommon.UnitRect);
                DesTerrain.UpdateGrassPatches(-1, true);
                DesData.Foliage.ClearGrassDirtyRegions();
            }

            DesData.SetDirty(GTerrainData.DirtyFlags.Foliage);
            //GC.Collect();
        }
Esempio n. 2
0
        private void CreateSharedGrasses()
        {
            GrassGroups.Clear();
            GrassGroupIndices.Clear();

            for (int i = 0; i < Terrains.Count; ++i)
            {
                Terrain           t = Terrains[i];
                DetailPrototype[] detailPrototypes = t.terrainData.detailPrototypes;

                int grassGroupIndex = -1;
                for (int j = 0; j < GrassGroups.Count; ++j)
                {
                    if (GrassGroups[j].Equals(detailPrototypes))
                    {
                        grassGroupIndex = j;
                        break;
                    }
                }

                if (grassGroupIndex >= 0)
                {
                    GrassGroupIndices.Add(grassGroupIndex);
                }
                else
                {
                    GGrassPrototypeGroup group = GGrassPrototypeGroup.Create(detailPrototypes);
                    GrassGroups.Add(group);
                    GrassGroupIndices.Add(GrassGroups.Count - 1);
                }
            }

#if UNITY_EDITOR
            if (!Application.isPlaying)
            {
                GUtilities.EnsureDirectoryExists(DataDirectory);
                for (int i = 0; i < GrassGroups.Count; ++i)
                {
                    GGrassPrototypeGroup group = GrassGroups[i];
                    group.name = string.Format("{0}{1}_{2}", "SharedGrasses", i.ToString(), ConversionName);
                    string assetPath = string.Format("{0}.asset", Path.Combine(DataDirectory, group.name));
                    AssetDatabase.CreateAsset(group, assetPath);
                }
            }
#endif
        }
Esempio n. 3
0
        private void ConvertToGrassPrototypeGroup()
        {
            GGrassPrototypeGroup group = ScriptableObject.CreateInstance <GGrassPrototypeGroup>();

            for (int i = 0; i < instance.Prototypes.Count; ++i)
            {
                GameObject prefab = instance.Prototypes[i];
                if (prefab != null)
                {
                    group.Prototypes.Add(GGrassPrototype.Create(prefab));
                }
            }

            string path      = AssetDatabase.GetAssetPath(instance);
            string directory = Path.GetDirectoryName(path);
            string filePath  = Path.Combine(directory, string.Format("{0}_{1}_{2}.asset", instance.name, "DetailObjects", GCommon.GetUniqueID()));

            AssetDatabase.CreateAsset(group, filePath);

            Selection.activeObject = group;
        }