Ejemplo n.º 1
0
    private void CreateBoundsHelper()
    {
        GameObject helperGO = new GameObject("Mesh To Terrain Helper");

        helperGO.transform.position = Vector3.zero;
        boundsHelper = helperGO.AddComponent <MeshToTerrainBoundsHelper>();

        boundsHelper.bounds          = hasBounds ? bounds : new Bounds();
        boundsHelper.OnBoundChanged += delegate
        {
            bounds = boundsHelper.bounds;
            MeshToTerrain.RepaintWindow();
        };

        boundsHelper.OnDestroyed += MeshToTerrain.RepaintWindow;

        if (!hasBounds)
        {
            bool findedBounds = false;

            foreach (GameObject meshGO in meshes)
            {
                MeshRenderer[] meshRenderers = meshGO.GetComponentsInChildren <MeshRenderer>();

                foreach (MeshRenderer meshRenderer in meshRenderers)
                {
                    if (!findedBounds)
                    {
                        findedBounds        = true;
                        boundsHelper.bounds = meshRenderer.bounds;
                    }
                    else
                    {
                        boundsHelper.bounds.Encapsulate(meshRenderer.bounds);
                    }
                }
            }

            if (!findedBounds)
            {
                boundsHelper.bounds = new Bounds(Vector3.zero, Vector3.one);
            }
            bounds    = boundsHelper.bounds;
            hasBounds = true;
        }

        Selection.activeGameObject = helperGO;
    }
Ejemplo n.º 2
0
    private void OnEnable()
    {
        try
        {
            helper = target as MeshToTerrainBoundsHelper;

            if (target == null || helper == null)
            {
                return;
            }
            if (helper.bounds == default(Bounds))
            {
                DestroyImmediate(helper);
                return;
            }

            boxEditor = new BoxEditor(true, -1);
        }
        catch
        {
        }
    }
Ejemplo n.º 3
0
    private void OnTerrainsGUINew()
    {
        if (availableResolutionsStr == null || availableHeightsStr == null)
        {
            availableHeightsStr     = availableHeights.Select(h => h.ToString()).ToArray();
            availableResolutionsStr = availableResolutions.Select(r => r.ToString()).ToArray();
        }

        GUILayout.BeginHorizontal();
        GUILayout.Label("Count terrains. X: ", GUILayout.ExpandWidth(false));
        newTerrainCountX = Mathf.Max(EditorGUILayout.IntField(newTerrainCountX, GUILayout.ExpandWidth(false)), 1);
        GUILayout.Label("Y: ", GUILayout.ExpandWidth(false));
        newTerrainCountY = Mathf.Max(EditorGUILayout.IntField(newTerrainCountY, GUILayout.ExpandWidth(false)), 1);
        GUILayout.EndHorizontal();

        adjustMeshSize = EditorGUILayout.Toggle("Adjust size of meshes", adjustMeshSize);
        EditorGUILayout.HelpBox("Adjust the size of meshes will break your prefabs (if present), but will help to work around the raycast problem on too small and too big meshes.\nAfter generation meshes and terrains will have the original size.", MessageType.Info);

        EditorGUI.BeginChangeCheck();
        boundsType = (MeshToTerrainBounds)EditorGUILayout.EnumPopup("Bounds", boundsType);

        if (EditorGUI.EndChangeCheck())
        {
            if (boundsType == MeshToTerrainBounds.selectBounds)
            {
            }
            else if (boundsHelper != null)
            {
                Object.DestroyImmediate(boundsHelper.gameObject);
            }
        }

        if (boundsType == MeshToTerrainBounds.fromGameobject)
        {
            boundsGameObject = (GameObject)EditorGUILayout.ObjectField("Bounds GameObject: ", boundsGameObject, typeof(GameObject), true);
        }
        else if (boundsType == MeshToTerrainBounds.selectBounds)
        {
            if (boundsHelper == null)
            {
                showBoundSelector = false;
            }

            showBoundSelector = GUILayout.Toggle(showBoundSelector, "Show Selector", GUI.skin.button);
            if (showBoundSelector && boundsHelper == null)
            {
                CreateBoundsHelper();
            }
            else if (!showBoundSelector && boundsHelper != null)
            {
                Object.DestroyImmediate(boundsHelper.gameObject);
                boundsHelper = null;
            }

            EditorGUI.BeginChangeCheck();
            bounds = EditorGUILayout.BoundsField("Bounds", bounds);

            if (EditorGUI.EndChangeCheck() && boundsHelper != null)
            {
                boundsHelper.bounds = bounds;
            }

            if (GUILayout.Button("Detect Bounds"))
            {
                DetectBounds();
            }
        }

        const string detailTooltip             = "The resolution of the map that controls grass and detail meshes. For performance reasons (to save on draw calls) the lower you set this number the better.";
        const string resolutionPerPatchTooltip = "Specifies the size in pixels of each individually rendered detail patch. A larger number reduces draw calls, but might increase triangle count since detail patches are culled on a per batch basis. A recommended value is 16. If you use a very large detail object distance and your grass is very sparse, it makes sense to increase the value.";
        const string basemapTooltip            = "Resolution of the composite texture used on the terrain when viewed from a distance greater than the Basemap Distance.";
        const string heightmapTooltip          = "Pixel resolution of the terrains heightmap.";
        const string alphamapTooltip           = "Resolution of the splatmap that controls the blending of the different terrain textures.";
        const string helpHref = "http://docs.unity3d.com/Manual/terrain-OtherSettings.html";

        DrawField("Heightmap Resolution", ref heightmapResolution, heightmapTooltip, helpHref, availableHeightsStr, availableHeights);
        DrawField("Detail Resolution", ref detailResolution, detailTooltip, helpHref);
        DrawField("Control Texture Resolution", ref alphamapResolution, alphamapTooltip, helpHref, availableResolutionsStr, availableResolutions);
        DrawField("Base Texture Resolution", ref baseMapResolution, basemapTooltip, helpHref, availableResolutionsStr, availableResolutions);
        DrawField("Resolution Per Patch", ref resolutionPerPatch, resolutionPerPatchTooltip, helpHref);

        if (resolutionPerPatch < 1)
        {
            resolutionPerPatch = 1;
        }
        detailResolution = detailResolution / resolutionPerPatch * resolutionPerPatch;
    }