internal static void Draw()
        {
            GEditorSettings.WizardToolsSettings settings = GEditorSettings.Instance.wizardTools;
            if (bulkSetShader)
            {
                settings.setShaderGroupId = GEditorCommon.ActiveTerrainGroupPopupWithAllOption("Group Id", settings.setShaderGroupId);
            }
            else
            {
                settings.setShaderTerrain = EditorGUILayout.ObjectField("Terrain", settings.setShaderTerrain, typeof(GStylizedTerrain), true) as GStylizedTerrain;
            }
            GWizardEditorCommon.DrawMaterialSettingsGUI();

            if (GUILayout.Button("Set"))
            {
                if (bulkSetShader)
                {
                    GWizard.SetShader(settings.setShaderGroupId);
                }
                else
                {
                    GWizard.SetShader(settings.setShaderTerrain);
                }
            }
        }
 public static void SetShader(int groupId)
 {
     GEditorSettings.WizardToolsSettings settings = GEditorSettings.Instance.wizardTools;
     GCommon.ForEachTerrain(groupId, (t) =>
     {
         SetShader(t, settings.lightingModel, settings.texturingModel, settings.splatsModel);
     });
 }
        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);
        }
 public static void SetShader(GStylizedTerrain terrain)
 {
     GEditorSettings.WizardToolsSettings settings = GEditorSettings.Instance.wizardTools;
     SetShader(terrain, settings.lightingModel, settings.texturingModel, settings.splatsModel);
 }
        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);
        }
Exemple #6
0
        private static void DrawCreateTerrainsGUI()
        {
            string label = "1. Create Terrains";
            string id    = "wizard-create-terrains";

            GEditorCommon.Foldout(label, true, id, () =>
            {
                GEditorSettings.WizardToolsSettings settings = GEditorSettings.Instance.wizardTools;

                GEditorCommon.Header("Physical");

                GUIContent originLabel = new GUIContent(
                    "Origin", "Position of the first terrain in the grid.");
                settings.origin = GEditorCommon.InlineVector3Field(originLabel, settings.origin);

                GUIContent tileSizeLabel = new GUIContent(
                    "Tile Size", "Size of each terrain tile in world space.");
                settings.tileSize = GEditorCommon.InlineVector3Field(tileSizeLabel, settings.tileSize);
                settings.tileSize = new Vector3(
                    Mathf.Max(1, settings.tileSize.x),
                    Mathf.Max(1, settings.tileSize.y),
                    Mathf.Max(1, settings.tileSize.z));

                GUIContent tileXLabel = new GUIContent(
                    "Tile Count X", "Number of tiles along X-axis.");
                settings.tileCountX = EditorGUILayout.IntField(tileXLabel, settings.tileCountX);
                settings.tileCountX = Mathf.Max(1, settings.tileCountX);

                GUIContent tileZLabel = new GUIContent(
                    "Tile Count Z", "Number of tiles along Z-axis.");
                settings.tileCountZ = EditorGUILayout.IntField(tileZLabel, settings.tileCountZ);
                settings.tileCountZ = Mathf.Max(1, settings.tileCountZ);

                GEditorCommon.Header("Material");
                GWizardEditorCommon.DrawMaterialSettingsGUI();

                GEditorCommon.Header("Utilities");

                GUIContent namePrefixLabel = new GUIContent(
                    "Name Prefix",
                    "The beginning of each terrain's name. Useful for some level streaming system.");
                settings.terrainNamePrefix = EditorGUILayout.TextField(namePrefixLabel, settings.terrainNamePrefix);

                GUIContent groupIdLabel = new GUIContent(
                    "Group Id",
                    "An integer for grouping and connecting adjacent terrain tiles.");
                settings.groupId = EditorGUILayout.IntField(groupIdLabel, settings.groupId);

                GEditorCommon.Header("Data");

                GUIContent directoryLabel = new GUIContent(
                    "Directory",
                    "Where to store created terrain data. A sub-folder of Assets/ is recommended.");
                string dir = settings.dataDirectory;
                GEditorCommon.BrowseFolder(directoryLabel, ref dir);
                if (string.IsNullOrEmpty(dir))
                {
                    dir = "Assets/";
                }
                settings.dataDirectory = dir;

                if (GUILayout.Button("Create"))
                {
                    GameObject environmentRoot = null;
                    if (menuCmd != null && menuCmd.context != null)
                    {
                        environmentRoot = menuCmd.context as GameObject;
                    }
                    if (environmentRoot == null)
                    {
                        environmentRoot = new GameObject("Low Poly Environment");
                        environmentRoot.transform.position = settings.origin;
                    }
                    GWizard.CreateTerrains(environmentRoot);
                }
            });
        }