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(); }
private void DoImportTrees() { if (!ImportTreeInstancesOnly) { GTreePrototypeGroup treeGroup = DesData.Foliage.Trees; if (treeGroup == null || treeGroup == GRuntimeSettings.Instance.foliageDefault.trees) { CreateNewTreePrototypesGroup = true; } if (CreateNewTreePrototypesGroup) { treeGroup = ScriptableObject.CreateInstance <GTreePrototypeGroup>(); #if UNITY_EDITOR if (!Application.isPlaying) { string path = AssetDatabase.GetAssetPath(DesData); string directory = Path.GetDirectoryName(path); string filePath = Path.Combine(directory, string.Format("Trees_{0}_{1}.asset", DesData.Id, System.DateTime.Now.Ticks)); AssetDatabase.CreateAsset(treeGroup, filePath); } #endif DesData.Foliage.Trees = treeGroup; } treeGroup.Prototypes.Clear(); TreePrototype[] treePrototypes = SrcData.treePrototypes; for (int i = 0; i < treePrototypes.Length; ++i) { GTreePrototype proto = (GTreePrototype)treePrototypes[i]; treeGroup.Prototypes.Add(proto); } GCommon.SetDirty(treeGroup); } DesData.Foliage.TreeInstances.Clear(); TreeInstance[] treeInstances = SrcData.treeInstances; for (int i = 0; i < treeInstances.Length; ++i) { GTreeInstance t = (GTreeInstance)treeInstances[i]; DesData.Foliage.TreeInstances.Add(t); } if (DesTerrain != null) { DesData.Foliage.SetTreeRegionDirty(GCommon.UnitRect); DesTerrain.UpdateTreesPosition(); DesData.Foliage.ClearTreeDirtyRegions(); } DesData.SetDirty(GTerrainData.DirtyFlags.Foliage); //GC.Collect(); }
private void DoImportGeometry() { if (UseUnityTerrainSize) { DesData.Geometry.Width = SrcData.size.x; DesData.Geometry.Height = SrcData.size.y; DesData.Geometry.Length = SrcData.size.z; } int hmResolution = SrcData.heightmapResolution - 1; DesData.Geometry.HeightMapResolution = hmResolution; float[,] heightSample = SrcData.GetHeights(0, 0, DesData.Geometry.HeightMapResolution, DesData.Geometry.HeightMapResolution); Color[] heightMapColor = new Color[DesData.Geometry.HeightMapResolution * DesData.Geometry.HeightMapResolution]; float h = 0; Vector2 enc; int length = heightSample.GetLength(0); int width = heightSample.GetLength(1); for (int z = 0; z < length; ++z) { for (int x = 0; x < width; ++x) { h = Mathf.Clamp(heightSample[z, x], 0f, 0.99999f); enc = GCommon.EncodeTerrainHeight(h); heightMapColor[GUtilities.To1DIndex(x, z, width)] = new Color(enc.x, enc.y, 0, 0); } } DesData.Geometry.HeightMap.SetPixels(heightMapColor); DesData.Geometry.HeightMap.Apply(); DesData.Geometry.SetRegionDirty(GCommon.UnitRect); DesData.SetDirty(GTerrainData.DirtyFlags.GeometryTimeSliced); if (!SkipFoliageSnap) { if (DesTerrain != null) { DesData.Foliage.SetTreeRegionDirty(GCommon.UnitRect); DesData.Foliage.SetGrassRegionDirty(GCommon.UnitRect); DesTerrain.UpdateTreesPosition(); DesTerrain.UpdateGrassPatches(); DesData.Foliage.ClearTreeDirtyRegions(); DesData.Foliage.ClearGrassDirtyRegions(); } } //GC.Collect(); }