public static void SetShader(GStylizedTerrain terrain, GLightingModel lighting, GTexturingModel texturing, GSplatsModel splats = GSplatsModel.Splats4)
        {
            if (terrain.TerrainData == null)
            {
                throw new NullReferenceException("The selected terrain doesn't have terrain data.");
            }
            if (terrain.TerrainData.Shading.CustomMaterial == null)
            {
                throw new NullReferenceException("The selected terrain doesn't have material. Make sure you've assigned a material for it.");
            }

            Material mat = GRuntimeSettings.Instance.terrainRendering.GetClonedMaterial(
                GCommon.CurrentRenderPipeline,
                lighting,
                texturing,
                splats);

            if (mat == null)
            {
                throw new Exception("Fail to get template material. Try re-install render pipeline extension package.");
            }
            terrain.TerrainData.Shading.CustomMaterial.shader = mat.shader;
            terrain.TerrainData.Shading.UpdateMaterials();
            GUtilities.DestroyObject(mat);
        }
Example #2
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
            }
        }
Example #3
0
        public Material GetClonedMaterial(GRenderPipelineType pipeline, GLightingModel light, GTexturingModel texturing, GSplatsModel splats = GSplatsModel.Splats4)
        {
            GWizardMaterialTemplate        matTemplate;
            List <GWizardMaterialTemplate> collection =
                pipeline == GRenderPipelineType.Universal ? UniversalRPMaterials :
                BuiltinRPMaterials;

            if (texturing != GTexturingModel.Splat)
            {
                matTemplate = collection.Find(m =>
                {
                    return(m.LightingModel == light && m.TexturingModel == texturing);
                });
            }
            else
            {
                matTemplate = collection.Find(m =>
                {
                    return(m.LightingModel == light && m.TexturingModel == texturing && m.SplatsModel == splats);
                });
            }

            Material mat = null;

            if (matTemplate.Material != null)
            {
                mat = UnityEngine.Object.Instantiate(matTemplate.Material);
            }

            return(mat);
        }
        private void CreateTerrainAndImportData()
        {
            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
                GStylizedTerrain t = CreateTerrain();
                t.transform.parent   = terrainRoot.transform;
                t.transform.position = Terrains[i].transform.position;
                t.name = Terrains[i].name;

#if !UNITY_2018_1 && !UNITY_2018_2
                t.GroupId = Terrains[i].groupingID;
#endif
                if (ImportSplats)
                {
                    t.TerrainData.Shading.Splats = SplatGroups[SplatGroupIndices[i]];
                    GSplatsModel splatModel = t.TerrainData.Shading.Splats.Prototypes.Count <= 4 ?
                                              GSplatsModel.Splats4Normals4 :
                                              GSplatsModel.Splats8;
                    Material mat = GGriffinSettings.Instance.WizardSettings.GetClonedMaterial(GLightingModel.PBR, GTexturingModel.Splat, splatModel);
                    t.TerrainData.Shading.MaterialToRender.shader = mat.shader;
                    t.TerrainData.Shading.UpdateMaterials();
                    GUtilities.DestroyObject(mat);
                }
                if (ImportTrees)
                {
                    t.TerrainData.Foliage.Trees = TreeGroups[TreeGroupIndices[i]];
                }
                if (ImportGrasses)
                {
                    t.TerrainData.Foliage.Grasses = GrassGroups[GrassGroupIndices[i]];
                }

                GUnityTerrainDataImporter importer = new GUnityTerrainDataImporter();
                importer.SrcData                       = Terrains[i].terrainData;
                importer.SrcTerrain                    = Terrains[i];
                importer.DesData                       = t.TerrainData;
                importer.DesTerrain                    = t;
                importer.ImportGeometry                = ImportGeometry;
                importer.UseUnityTerrainSize           = true;
                importer.ImportSplats                  = ImportSplats;
                importer.ImportSplatsAsAlbedo          = ImportSplatsAsAlbedo;
                importer.CreateNewSplatPrototypesGroup = false;
                importer.ImportTrees                   = ImportTrees;
                importer.CreateNewTreePrototypesGroup  = false;
                importer.ImportGrasses                 = ImportGrasses;
                importer.CreateNewGrassPrototypesGroup = false;
                importer.GrassDensity                  = GUnityTerrainDataImporter.GetAdjustedGrassDensity(importer.SrcData, 1);
                importer.Import();

#if UNITY_EDITOR
                SaveAssets();
                GCommonGUI.ClearProgressBar();
#endif
            }
        }