static public void UpdateBiomeArea(GameObject go, ERVSData[] vsData, float distance, float blendDistance, float noise)
    {
                #if VEGETATION_STUDIO_PRO
        AwesomeTechnologies.VegetationSystem.Biomes.BiomeMaskArea biomeArea = go.GetComponent <AwesomeTechnologies.VegetationSystem.Biomes.BiomeMaskArea>();

        if (biomeArea == null)
        {
            biomeArea           = go.AddComponent <AwesomeTechnologies.VegetationSystem.Biomes.BiomeMaskArea>();
            biomeArea.BiomeType = AwesomeTechnologies.VegetationSystem.BiomeType.Road;
        }

        biomeArea.BlendDistance = blendDistance;
        if (noise > 0)
        {
            biomeArea.UseNoise   = true;
            biomeArea.NoiseScale = noise;
        }

        biomeArea.ClearNodes();

        distance += blendDistance;
        foreach (ERVSData data in vsData)
        {
            biomeArea.AddNode(data.leftPosition + (distance * -data.dir));
            biomeArea.AddNode(data.rightPosition + (distance * data.dir));
        }


        //	vegetationMaskLine.AddNodeToEnd(nodePositions[0], widths[0], activeStates[0]);

        biomeArea.UpdateBiomeMask();
                #endif
    }
예제 #2
0
        // ReSharper disable once InconsistentNaming
        public virtual void OnSceneGUI()
        {
            _biomeMaskArea = (BiomeMaskArea)target;
            if (_biomeMaskArea.ShowHandles && _biomeMaskArea.enabled)
            {
                Event currentEvent = Event.current;

                if (currentEvent.shift || currentEvent.control)
                {
                    HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive));
                }

                if (currentEvent.shift && currentEvent.control)
                {
                    for (int i = 0; i <= _biomeMaskArea.Nodes.Count - 1; i++)
                    {
                        Vector3 cameraPosition = SceneView.currentDrawingSceneView.camera.transform.position;
                        Vector3 worldSpaceNode =
                            _biomeMaskArea.transform.TransformPoint(_biomeMaskArea.Nodes[i].Position);
                        float distance = Vector3.Distance(cameraPosition, worldSpaceNode);

                        Handles.color = Color.red;
                        if (Handles.Button(worldSpaceNode,
                                           Quaternion.LookRotation(worldSpaceNode - cameraPosition, Vector3.up), 0.030f * distance,
                                           0.015f * distance, Handles.CircleHandleCap))
                        {
                            _biomeMaskArea.DeleteNode(_biomeMaskArea.Nodes[i]);
                            SetMaskDirty();
                        }
                    }
                }

                if (currentEvent.alt && currentEvent.control)
                {
                    for (int i = 0; i <= _biomeMaskArea.Nodes.Count - 1; i++)
                    {
                        Vector3 cameraPosition = SceneView.currentDrawingSceneView.camera.transform.position;
                        Vector3 worldSpaceNode =
                            _biomeMaskArea.transform.TransformPoint(_biomeMaskArea.Nodes[i].Position);
                        float distance = Vector3.Distance(cameraPosition, worldSpaceNode);

                        Handles.color = Color.yellow;
                        if (Handles.Button(worldSpaceNode,
                                           Quaternion.LookRotation(worldSpaceNode - cameraPosition, Vector3.up), 0.030f * distance,
                                           0.015f * distance, Handles.CircleHandleCap))
                        {
                            _biomeMaskArea.Nodes[i].DisableEdge = !_biomeMaskArea.Nodes[i].DisableEdge;
                            SetMaskDirty();
                        }
                    }
                }

                if (currentEvent.type == EventType.MouseDown && currentEvent.button == 0 && currentEvent.control &&
                    !currentEvent.shift && !currentEvent.alt)
                {
                    Ray ray  = HandleUtility.GUIPointToWorldRay(currentEvent.mousePosition);
                    var hits = Physics.RaycastAll(ray, 10000f);
                    for (int i = 0; i <= hits.Length - 1; i++)
                    {
                        if (hits[i].collider is TerrainCollider || _biomeMaskArea.GroundLayerMask.Contains(hits[i].collider.gameObject.layer))
                        {
                            _biomeMaskArea.AddNode(hits[i].point);
                            currentEvent.Use();
                            SetMaskDirty();
                            break;
                        }
                    }
                }

                if (!currentEvent.shift && !currentEvent.alt)
                {
                    bool    nodeChange     = false;
                    Vector3 cameraPosition = SceneView.currentDrawingSceneView.camera.transform.position;

                    for (int i = 0; i <= _biomeMaskArea.Nodes.Count - 1; i++)
                    {
                        Vector3 worldSpaceNode =
                            _biomeMaskArea.transform.TransformPoint(_biomeMaskArea.Nodes[i].Position);
                        float distance = Vector3.Distance(cameraPosition, worldSpaceNode);
                        if (distance > 200 && _biomeMaskArea.Nodes.Count > 50)
                        {
                            continue;
                        }

                        Vector3 newWorldSpaceNode = Handles.PositionHandle(worldSpaceNode, Quaternion.identity);
                        _biomeMaskArea.Nodes[i].Position =
                            _biomeMaskArea.transform.InverseTransformPoint(newWorldSpaceNode);
                        if (worldSpaceNode != newWorldSpaceNode)
                        {
                            nodeChange = true;
                        }
                    }

                    if (nodeChange)
                    {
                        _biomeMaskArea.PositionNodes();
                        SetMaskDirty();
                    }
                }
            }

            if (_biomeMaskArea.ShowArea)
            {
                Vector3[] worldPoints = new Vector3[_biomeMaskArea.Nodes.Count];
                for (int i = 0; i <= _biomeMaskArea.Nodes.Count - 1; i++)
                {
                    worldPoints[i] = _biomeMaskArea.transform.TransformPoint(_biomeMaskArea.Nodes[i].Position);
                }

                List <Vector3> worldPointsClosedList = new List <Vector3>(worldPoints);
                worldPointsClosedList.Add(worldPointsClosedList[0]);
                Handles.color = new Color(1, 1, 1, 0.8f);
                Handles.DrawAAPolyLine(3, worldPointsClosedList.ToArray());



                if (_biomeMaskArea.BlendDistance > 0.01f)
                {
                    List <Vector3> inflatedTreeListMax = PolygonUtility.InflatePolygon(worldPointsClosedList, -_biomeMaskArea.BlendDistance, true);
                    PolygonUtility.AlignPointsWithTerrain(inflatedTreeListMax, true, _biomeMaskArea.GroundLayerMask);
                    Handles.color = new Color(1, 0, 0, 0.8f);
                    Handles.DrawAAPolyLine(3, inflatedTreeListMax.ToArray());
                }
            }
        }