Exemple #1
0
        private void GenerateObstacleMask()
        {
            string path = EditorUtility.SaveFilePanelInProject("Save mask background", "", "png",
                                                               "Please enter a file name to save the mask background to");

            if (path.Length != 0)
            {
                ObstacleMaskCreator obstacleMaskCreator = (ObstacleMaskCreator)target;
                int textureResolution =
                    obstacleMaskCreator.GetObstacleMaskQualityPixelResolution(obstacleMaskCreator.ObstacleMaskQuality);

                Texture2D obstacleMaskTexture = new Texture2D(textureResolution, textureResolution,
                                                              TextureFormat.ARGB32,
                                                              false, true);

                float cellSize = obstacleMaskCreator.AreaRect.size.x / textureResolution;

                Vector3 terrainCorner = new Vector3(obstacleMaskCreator.AreaRect.position.x, 0, obstacleMaskCreator.AreaRect.position.y);// - new Vector3(vegetationSystem.UnityTerrainData.size.x/2f,0, vegetationSystem.UnityTerrainData.size.z / 2f);

                for (int x = 0; x <= textureResolution - 1; x++)
                {
                    if (x % 100 == 0)
                    {
                        EditorUtility.DisplayProgressBar("Generate obstacle mask ", "Raycast for obstacles", (float)x / textureResolution);
                    }

                    for (int z = 0; z <= textureResolution - 1; z++)
                    {
                        RaycastHit hit;
                        Ray        ray = new Ray(new Vector3(x * cellSize, 10000, z * cellSize) + terrainCorner, Vector3.down);
                        if (Physics.SphereCast(ray, (0.5f * cellSize) + obstacleMaskCreator.MinimumDistance, out hit, float.MaxValue, obstacleMaskCreator.LayerMask))
                        {
                            if (!(hit.collider is TerrainCollider))
                            {
                                obstacleMaskTexture.SetPixel(x, z, Color.black);
                            }
                        }
                    }
                }
                EditorUtility.ClearProgressBar();
                obstacleMaskTexture.Apply();
                SaveTexture(obstacleMaskTexture, path);
            }
        }
Exemple #2
0
        public override void OnInspectorGUI()
        {
            HelpTopic = "obstacle-mask-creator";
            ShowLogo  = false;

            ObstacleMaskCreator obstacleMaskCreator = (ObstacleMaskCreator)target;
            VegetationSystemPro vegetationSystem    = obstacleMaskCreator.gameObject.GetComponent <VegetationSystemPro>();

            if (!vegetationSystem)
            {
                EditorGUILayout.HelpBox("Add this component to a GameObject with a VegetationSystem component.",
                                        MessageType.Error);
                return;
            }

            base.OnInspectorGUI();

            if (vegetationSystem)
            {
                GUILayout.BeginVertical("box");
                obstacleMaskCreator.AreaRect = EditorGUILayout.RectField("Area", obstacleMaskCreator.AreaRect);
                EditorGUILayout.HelpBox(
                    "You can snap the area to any added terrain, total world area or manually setting the area for generation.",
                    MessageType.Info);
                GUILayout.EndVertical();


                GUILayout.BeginVertical("box");
                GUILayout.BeginHorizontal();
                string[] terrains = new string[vegetationSystem.VegetationStudioTerrainList.Count];
                for (int i = 0; i <= vegetationSystem.VegetationStudioTerrainList.Count - 1; i++)
                {
                    terrains[i] = vegetationSystem.VegetationStudioTerrainObjectList[i].name;
                }

                _selectedTerrainIndex = EditorGUILayout.Popup("Select terrain", _selectedTerrainIndex, terrains);
                if (GUILayout.Button("Snap to terrain", GUILayout.Width(120)))
                {
                    IVegetationStudioTerrain iVegetationStudioTerrain =
                        vegetationSystem.VegetationStudioTerrainList[_selectedTerrainIndex];
                    Bounds bounds = iVegetationStudioTerrain.TerrainBounds;
                    obstacleMaskCreator.AreaRect = RectExtension.CreateRectFromBounds(bounds);
                }

                GUILayout.EndHorizontal();

                if (GUILayout.Button("Snap to world area"))
                {
                    obstacleMaskCreator.AreaRect =
                        RectExtension.CreateRectFromBounds(vegetationSystem.VegetationSystemBounds);
                }

                EditorGUILayout.HelpBox(
                    "You can snap the area to any added terrain, total world area or manually setting the rect.",
                    MessageType.Info);

                GUILayout.EndVertical();

                GUILayout.BeginVertical("box");
                EditorGUILayout.LabelField("Settings", LabelStyle);
                obstacleMaskCreator.ObstacleMaskQuality =
                    (ObstacleMaskQuality)EditorGUILayout.EnumPopup("Mask resolution",
                                                                   obstacleMaskCreator.ObstacleMaskQuality);
                EditorGUILayout.HelpBox(
                    "Pixel resolution of the obstacle mask. Low = 1024x1024, Normal = 2048x2048, High = 4096x4096 and Ultra = 8192x8192",
                    MessageType.Info);
                obstacleMaskCreator.LayerMask       = LayerMaskField("Obstacle layers", obstacleMaskCreator.LayerMask);
                obstacleMaskCreator.MinimumDistance =
                    EditorGUILayout.Slider("Minimum distance", obstacleMaskCreator.MinimumDistance, 0, 10);

                GUILayout.EndVertical();


                GUILayout.BeginVertical("box");
                if (GUILayout.Button("Generate obstacle mask"))
                {
                    GenerateObstacleMask();
                }

                GUILayout.EndVertical();
            }
        }