public static GStylizedTerrain CreateTerrainFromSource(GTerrainData srcData)
        {
            GEditorSettings.WizardToolsSettings settings = GEditorSettings.Instance.wizardTools;
            GameObject g = new GameObject("Low Poly Terrain");

            g.transform.localPosition = Vector3.zero;
            g.transform.localRotation = Quaternion.identity;
            g.transform.localScale    = Vector3.one;

            GTerrainData terrainData = GTerrainData.CreateInstance <GTerrainData>();

            terrainData.Reset();

#if UNITY_EDITOR
            string assetName = "TerrainData_" + terrainData.Id;
            GUtilities.EnsureDirectoryExists(settings.dataDirectory);
            AssetDatabase.CreateAsset(terrainData, Path.Combine(settings.dataDirectory, assetName + ".asset"));
#endif
            srcData.CopyTo(terrainData);

            Material mat = null;
            if (srcData != null && srcData.Shading.CustomMaterial != null)
            {
                mat = UnityEngine.Object.Instantiate(srcData.Shading.CustomMaterial);
            }
            if (mat != null)
            {
                string matName = "TerrainMaterial_" + terrainData.Id;
                mat.name = matName;
#if UNITY_EDITOR
                GUtilities.EnsureDirectoryExists(settings.dataDirectory);
                AssetDatabase.CreateAsset(mat, Path.Combine(settings.dataDirectory, matName + ".mat"));
#endif
                terrainData.Shading.CustomMaterial = mat;
            }

            GStylizedTerrain terrain = g.AddComponent <GStylizedTerrain>();
            terrain.GroupId     = 0;
            terrain.TerrainData = terrainData;

#if UNITY_EDITOR
            Undo.RegisterCreatedObjectUndo(g, "Creating Low Poly Terrain");
#endif

            GameObject colliderGO = new GameObject("Tree Collider");
            colliderGO.transform.parent        = terrain.transform;
            colliderGO.transform.localPosition = Vector3.zero;
            colliderGO.transform.localRotation = Quaternion.identity;
            colliderGO.transform.localScale    = Vector3.one;

            GTreeCollider collider = colliderGO.AddComponent <GTreeCollider>();
            collider.Terrain = terrain;

#if UNITY_EDITOR
            Selection.activeGameObject = g;
#endif
            return(terrain);
        }
        private void OnTerrainDataDirty(GTerrainData data, GTerrainData.DirtyFlags flag)
        {
            GStylizedTerrain t = GTextureToolParams.Instance.LivePreview.Terrain;

            if (t == null || t.TerrainData != data)
            {
                return;
            }
            RenderPreviewTexture();
        }
Exemplo n.º 3
0
 private void OnTerrainDataDirty(GTerrainData data, GTerrainData.DirtyFlags flag)
 {
     if (Terrain != null &&
         Terrain.TerrainData == data)
     {
         if (flag == GTerrainData.DirtyFlags.All ||
             flag == GTerrainData.DirtyFlags.Foliage)
         {
             InitTreeInstances();
         }
     }
 }
        private GStylizedTerrain CreateTerrain()
        {
            GameObject g = new GameObject("Stylized Terrain");

            g.transform.localPosition = Vector3.zero;
            g.transform.localRotation = Quaternion.identity;
            g.transform.localScale    = Vector3.one;

            GTerrainData terrainData = GTerrainData.CreateInstance <GTerrainData>();

            terrainData.Reset();

#if UNITY_EDITOR
            string assetName = "TerrainData_" + terrainData.Id;
            AssetDatabase.CreateAsset(terrainData, string.Format("{0}.asset", Path.Combine(DataDirectory, assetName)));
#endif

            Material mat = GGriffinSettings.Instance.WizardSettings.GetClonedMaterial(GLightingModel.PBR, GTexturingModel.Splat);
            if (mat == null && GGriffinSettings.Instance.TerrainDataDefault.Shading.CustomMaterial != null)
            {
                mat = Object.Instantiate(GGriffinSettings.Instance.TerrainDataDefault.Shading.CustomMaterial);
            }
            terrainData.Shading.CustomMaterial = mat;

#if UNITY_EDITOR
            if (mat != null)
            {
                string matName = "TerrainMaterial_" + terrainData.Id;
                mat.name = matName;
                AssetDatabase.CreateAsset(mat, string.Format("{0}.mat", Path.Combine(DataDirectory, matName)));
            }
#endif

            GStylizedTerrain terrain = g.AddComponent <GStylizedTerrain>();
            terrain.GroupId     = 0;
            terrain.TerrainData = terrainData;

            GameObject colliderGO = new GameObject("Tree Collider");
            colliderGO.transform.parent        = terrain.transform;
            colliderGO.transform.localPosition = Vector3.zero;
            colliderGO.transform.localRotation = Quaternion.identity;
            colliderGO.transform.localScale    = Vector3.one;

            GTreeCollider collider = colliderGO.AddComponent <GTreeCollider>();
            collider.Terrain = terrain;

            return(terrain);
        }
        private static void Export()
        {
            EditorUtility.DisplayProgressBar("Exporting", "Exporting terrain to file...", 1f);
            try
            {
                List <Mesh>         meshes      = new List <Mesh>();
                TerrainToFileConfig config      = TerrainToFileConfig.Instance;
                GStylizedTerrain    terrain     = config.Terrain;
                GTerrainData        terrainData = terrain.TerrainData;
                int gridSize = terrainData.Geometry.ChunkGridSize;
                int lod      = config.LOD;

                GTerrainChunk[] chunks = terrain.GetComponentsInChildren <GTerrainChunk>();
                for (int i = 0; i < chunks.Length; ++i)
                {
                    Mesh m = chunks[i].MeshFilterComponent.sharedMesh;
                    if (m != null)
                    {
                        Mesh      cloneMesh      = Object.Instantiate(m);
                        Matrix4x4 chunkToWorld   = chunks[i].transform.localToWorldMatrix;
                        Matrix4x4 worldToTerrain = terrain.transform.worldToLocalMatrix;
                        Matrix4x4 matrix         = chunkToWorld * worldToTerrain;
                        TransformMesh(cloneMesh, matrix);
                        meshes.Add(cloneMesh);
                    }
                }

                string fileName = string.Format("{0}_{1}_{2}",
                                                config.Terrain.name.Replace(" ", "_"),
                                                config.Terrain.GetInstanceID().ToString(),
                                                "LOD" + config.LOD);

                GUtilities.EnsureDirectoryExists(config.Directory);
                string filePath = null;
                if (config.FileType == MeshSaver.FileType.Obj)
                {
                    filePath = MeshSaver.SaveObjMultipleMesh(meshes.ToArray(), config.Directory, fileName);
                }
                else if (config.FileType == MeshSaver.FileType.Fbx)
                {
                    filePath = MeshSaver.SaveFbxMultipleMesh(meshes.ToArray(), config.Directory, fileName);
                }

                for (int i = 0; i < meshes.Count; ++i)
                {
                    Object.DestroyImmediate(meshes[i]);
                }

                AssetDatabase.Refresh();

                if (!string.IsNullOrEmpty(filePath))
                {
                    string        assetPath = filePath;
                    ModelImporter importer  = ModelImporter.GetAtPath(assetPath) as ModelImporter;
                    if (importer != null)
                    {
                        importer.useFileScale = false;
                        importer.weldVertices = false;
                        importer.SaveAndReimport();
                    }

                    Object asset = AssetDatabase.LoadAssetAtPath <Object>(assetPath);
                    if (asset != null)
                    {
                        Selection.activeObject = asset;
                        EditorGUIUtility.PingObject(asset);
                    }
                }
            }
            catch (System.Exception e)
            {
                Debug.LogError(e);
            }

            EditorUtility.ClearProgressBar();
        }
        public static List <GStylizedTerrain> CreateTerrains(GameObject root)
        {
            GEditorSettings.WizardToolsSettings settings = GEditorSettings.Instance.wizardTools;
            List <GStylizedTerrain>             terrains = new List <GStylizedTerrain>();

#if UNITY_EDITOR
            if (!Application.isPlaying)
            {
                GUtilities.EnsureDirectoryExists(settings.dataDirectory);
            }
#endif
            try
            {
                float totalTile = settings.tileCountX * settings.tileCountZ;
                float tileCount = 0;
                for (int z = 0; z < settings.tileCountZ; ++z)
                {
                    for (int x = 0; x < settings.tileCountX; ++x)
                    {
                        tileCount += 1;
#if UNITY_EDITOR
                        GCommonGUI.CancelableProgressBar(
                            "Creating Terrains",
                            string.Format("Creating tile ({0},{1})", x, z),
                            tileCount / totalTile);
#endif
                        GameObject g = new GameObject();
                        g.transform.parent     = root.transform;
                        g.transform.position   = new Vector3(x * settings.tileSize.x, 0, z * settings.tileSize.z) + settings.origin;
                        g.transform.rotation   = Quaternion.identity;
                        g.transform.localScale = Vector3.one;
                        g.name = string.Format("{0}_({1},{2})", settings.terrainNamePrefix, x, z);

                        GTerrainData data = ScriptableObject.CreateInstance <GTerrainData>();

                        if (Application.isPlaying) //Reset() only called in edit mode
                        {
                            data.Reset();
                            data.Geometry.Reset();
                            data.Shading.Reset();
                            data.Rendering.Reset();
                            data.Foliage.Reset();
                            data.Mask.Reset();
                        }
                        data.name            = string.Format("TerrainData_{0}", data.Id);
                        data.Geometry.Width  = settings.tileSize.x;
                        data.Geometry.Height = settings.tileSize.y;
                        data.Geometry.Length = settings.tileSize.z;
                        if (settings.texturingModel == GTexturingModel.VertexColor)
                        {
                            data.Geometry.AlbedoToVertexColorMode = GAlbedoToVertexColorMode.Sharp;
                        }

#if UNITY_EDITOR
                        if (!Application.isPlaying)
                        {
                            string dataAssetPath = Path.Combine(settings.dataDirectory, data.name + ".asset");
                            AssetDatabase.CreateAsset(data, dataAssetPath);
                        }
#endif

                        Material material = GRuntimeSettings.Instance.terrainRendering.GetClonedMaterial(
                            GCommon.CurrentRenderPipeline,
                            settings.lightingModel,
                            settings.texturingModel,
                            settings.splatsModel);
                        if (material != null)
                        {
                            material.name = string.Format("TerrainMaterial_{0}", data.Id);
#if UNITY_EDITOR
                            if (!Application.isPlaying)
                            {
                                string materialAssetPath = Path.Combine(settings.dataDirectory, material.name + ".mat");
                                AssetDatabase.CreateAsset(material, materialAssetPath);
                            }
#endif
                        }
                        data.Shading.CustomMaterial = material;
                        data.Shading.UpdateMaterials();

                        GStylizedTerrain terrain = g.AddComponent <GStylizedTerrain>();
                        terrain.GroupId     = settings.groupId;
                        terrain.TerrainData = data;

#if UNITY_EDITOR
                        Undo.RegisterCreatedObjectUndo(g, "Creating Low Poly Terrain");
#endif

                        GameObject colliderGO = new GameObject("Tree Collider");
                        colliderGO.transform.parent        = g.transform;
                        colliderGO.transform.localPosition = Vector3.zero;
                        colliderGO.transform.localRotation = Quaternion.identity;
                        colliderGO.transform.localScale    = Vector3.one;

                        GTreeCollider collider = colliderGO.AddComponent <GTreeCollider>();
                        collider.Terrain = terrain;
                    }
                }
            }
            catch (GProgressCancelledException)
            {
            }

            GStylizedTerrain.ConnectAdjacentTiles();

#if UNITY_EDITOR
            GCommonGUI.ClearProgressBar();
#endif

            return(terrains);
        }
Exemplo n.º 7
0
        private static void Export()
        {
            EditorUtility.DisplayProgressBar("Exporting", "Exporting terrain to file...", 1f);
            try
            {
                List <Mesh>         meshes      = new List <Mesh>();
                TerrainToFileConfig config      = TerrainToFileConfig.Instance;
                GStylizedTerrain    terrain     = config.Terrain;
                GTerrainData        terrainData = terrain.TerrainData;
                int gridSize = terrainData.Geometry.ChunkGridSize;
                int lod      = config.LOD;

                for (int z = 0; z < gridSize; ++z)
                {
                    for (int x = 0; x < gridSize; ++x)
                    {
                        Vector2 meshIndex = new Vector2(x, z);
                        Mesh    m         = terrainData.GeometryData.GetMesh(GTerrainChunk.GetChunkMeshName(meshIndex, lod));
                        if (m != null)
                        {
                            meshes.Add(m);
                        }
                    }
                }

                string fileName = string.Format("{0}_{1}_{2}",
                                                config.Terrain.name.Replace(" ", "_"),
                                                config.Terrain.GetInstanceID().ToString(),
                                                "LOD" + config.LOD);

                string filePath = null;
                if (config.FileType == MeshSaver.FileType.Obj)
                {
                    filePath = MeshSaver.SaveObjMultipleMesh(meshes.ToArray(), config.Directory, fileName);
                }
                else if (config.FileType == MeshSaver.FileType.Fbx)
                {
                    filePath = MeshSaver.SaveFbxMultipleMesh(meshes.ToArray(), config.Directory, fileName);
                }

                AssetDatabase.Refresh();

                if (!string.IsNullOrEmpty(filePath))
                {
                    string        assetPath = filePath;
                    ModelImporter importer  = ModelImporter.GetAtPath(assetPath) as ModelImporter;
                    if (importer != null)
                    {
                        importer.useFileScale = false;
                        importer.weldVertices = false;
                        importer.SaveAndReimport();
                    }

                    Object asset = AssetDatabase.LoadAssetAtPath <Object>(assetPath);
                    if (asset != null)
                    {
                        Selection.activeObject = asset;
                        EditorGUIUtility.PingObject(asset);
                    }
                }
            }
            catch (System.Exception e)
            {
                Debug.LogError(e);
            }

            EditorUtility.ClearProgressBar();
        }
Exemplo n.º 8
0
        private void ImportDataAndCreateTerrain()
        {
            GameObject terrainRoot = new GameObject(string.Format("{0}-{1}", Root.name, ConversionName));

            terrainRoot.transform.parent   = Root.transform.parent;
            terrainRoot.transform.position = Root.transform.position;

            for (int i = 0; i < Terrains.Count; ++i)
            {
#if UNITY_EDITOR
                GCommonGUI.CancelableProgressBar("Converting", "Converting " + Terrains[i].name, 1f);
#endif

                GTerrainData data = ScriptableObject.CreateInstance <GTerrainData>();
                if (DataTemplate != null)
                {
                    DataTemplate.Geometry.CopyTo(data.Geometry);
                    DataTemplate.Shading.CopyTo(data.Shading);
                    DataTemplate.Rendering.CopyTo(data.Rendering);
                    DataTemplate.Foliage.CopyTo(data.Foliage);
                    DataTemplate.Mask.CopyTo(data.Mask);
                }
                else
                {
                    if (Application.isPlaying) //Reset() only called in edit mode
                    {
                        data.Reset();
                        data.Geometry.Reset();
                        data.Shading.Reset();
                        data.Rendering.Reset();
                        data.Foliage.Reset();
                        data.Mask.Reset();
                    }
                }

#if UNITY_EDITOR
                if (!Application.isPlaying)
                {
                    string assetName = "TerrainData_" + data.Id;
                    AssetDatabase.CreateAsset(data, string.Format("{0}.asset", Path.Combine(DataDirectory, assetName)));
                }
#endif

                Material templateMaterial = null;
                if (DataTemplate != null)
                {
                    templateMaterial = DataTemplate.Shading.CustomMaterial;
                }

                Material material = null;
                if (templateMaterial != null)
                {
                    material = new Material(templateMaterial.shader);
                }
                else
                {
                    if (ImportSplats)
                    {
                        if (ImportSplatsAsAlbedo && AlbedoUsage == GAlbedoUsage.ColorMap)
                        {
                            material = GRuntimeSettings.Instance.terrainRendering.GetClonedMaterial(GCommon.CurrentRenderPipeline, GLightingModel.PBR, GTexturingModel.ColorMap);
                        }
                        else if (ImportSplatsAsAlbedo && AlbedoUsage == GAlbedoUsage.VertexColor)
                        {
                            material = GRuntimeSettings.Instance.terrainRendering.GetClonedMaterial(GCommon.CurrentRenderPipeline, GLightingModel.PBR, GTexturingModel.VertexColor);
                            data.Geometry.AlbedoToVertexColorMode = GAlbedoToVertexColorMode.Sharp;
                        }
                        else
                        {
                            GSplatPrototypeGroup splats     = DataTemplate ? DataTemplate.Shading.Splats : SplatGroups[SplatGroupIndices[i]];
                            GSplatsModel         splatModel = (splats == null || splats.Prototypes.Count <= 4) ?
                                                              GSplatsModel.Splats4Normals4 :
                                                              GSplatsModel.Splats8;
                            material = GRuntimeSettings.Instance.terrainRendering.GetClonedMaterial(GCommon.CurrentRenderPipeline, GLightingModel.PBR, GTexturingModel.Splat, splatModel);
                        }
                    }
                    else
                    {
                        material = GRuntimeSettings.Instance.terrainRendering.GetClonedMaterial(GCommon.CurrentRenderPipeline, GLightingModel.PBR, GTexturingModel.Splat, GSplatsModel.Splats4);
                    }
                }
                data.Shading.CustomMaterial = material;

#if UNITY_EDITOR
                if (!Application.isPlaying && material != null)
                {
                    string matName = "TerrainMaterial_" + data.Id;
                    material.name = matName;
                    AssetDatabase.CreateAsset(material, string.Format("{0}.mat", Path.Combine(DataDirectory, matName)));
                }
#endif

                if (ImportSplats)
                {
                    data.Shading.Splats = DataTemplate ? DataTemplate.Shading.Splats : SplatGroups[SplatGroupIndices[i]];
                    data.Shading.UpdateMaterials();
                }
                if (ImportTrees)
                {
                    data.Foliage.Trees = DataTemplate ? DataTemplate.Foliage.Trees : TreeGroups[TreeGroupIndices[i]];
                }
                if (ImportGrasses)
                {
                    data.Foliage.Grasses = DataTemplate ? DataTemplate.Foliage.Grasses : GrassGroups[GrassGroupIndices[i]];
                }

                GUnityTerrainDataImporter importer = new GUnityTerrainDataImporter();
                importer.SrcData                         = Terrains[i].terrainData;
                importer.SrcTerrain                      = Terrains[i];
                importer.DesData                         = data;
                importer.DesTerrain                      = null;
                importer.ImportGeometry                  = ImportGeometry;
                importer.UseUnityTerrainSize             = true;
                importer.ImportSplats                    = ImportSplats;
                importer.ImportSplatsAsAlbedo            = ImportSplatsAsAlbedo;
                importer.ImportSplatControlMapsOnly      = DataTemplate != null && DataTemplate.Shading.Splats != null;
                importer.ImportSplatControlMapResolution = DataTemplate == null;
                importer.CreateNewSplatPrototypesGroup   = false;
                importer.ImportTrees                     = ImportTrees;
                importer.ImportTreeInstancesOnly         = DataTemplate != null && DataTemplate.Foliage.Trees != null;
                importer.CreateNewTreePrototypesGroup    = false;
                importer.ImportGrasses                   = ImportGrasses;
                importer.ImportGrassInstancesOnly        = DataTemplate != null && DataTemplate.Foliage.Grasses != null;
                importer.CreateNewGrassPrototypesGroup   = false;
                importer.GrassDensity                    = 1;
                importer.SkipFoliageSnap                 = SkipFoliageSnap;
                importer.Import();

                GStylizedTerrain t = CreateTerrain();
                t.transform.parent   = terrainRoot.transform;
                t.transform.position = Terrains[i].transform.position;
                t.name = Terrains[i].name;

#if UNITY_2018_3_OR_NEWER
                t.GroupId = Terrains[i].groupingID;
#endif

                t.TerrainData = data;

                if (ImportTrees || ImportGrasses)
                {
                    data.Foliage.SetTreeRegionDirty(GCommon.UnitRect);
                    data.Foliage.SetGrassRegionDirty(GCommon.UnitRect);
                    t.UpdateTreesPosition();
                    t.UpdateGrassPatches();
                    data.Foliage.ClearTreeDirtyRegions();
                    data.Foliage.ClearGrassDirtyRegions();
                }

                ConvertedTerrains.Add(t);
#if UNITY_EDITOR
                //SaveAssets();
                GCommonGUI.ClearProgressBar();
#endif
            }
        }