private void OnSceneGUI()
        {
            var linkmap = (KuroiLinkMap)target;
            var navmesh = linkmap.NavMesh;

            if (navmesh == null)
            {
                return;
            }

            var navigationNodes = linkmap.nodes;

            if (navigationNodes == null || navigationNodes.Length != navmesh.Area)
            {
                return;
            }

            var grid      = navmesh.grid;
            var mousePos  = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition).origin;
            var mouseCell = grid.WorldToCell(mousePos);

            if (drawHeat)
            {
                var nodes = navmesh.Nodes;
                if (nodes == null || nodes.Length != navmesh.Area)
                {
                    return;
                }

                var highest = WithMostConnectionIndex;

                var min = navmesh.Min;
                var max = navmesh.Max;

                for (var x = min.x; x <= max.x; x++)
                {
                    for (var y = min.y; y <= max.y; y++)
                    {
                        var index = navmesh.IndexOfUnsafe(x, y);
                        var other = navmesh.Nodes[index];

                        if (other.IsSolid())
                        {
                            continue;
                        }

                        var node = navigationNodes[index];
                        var c    = node.directLinks.Length + node.gravitationalLinks.Length;
                        if (c == 0)
                        {
                            continue;
                        }

                        var color = Color.black;
                        color.r = ((float)c / highest);
                        color.a = 1;
                        UnityX.DrawCell(x, y, navmesh.grid, color, Color.clear);
                    }
                }
            }

            /*Handles.DrawSolidRectangleWithOutline(
             *  new Rect(
             *      (Vector2) mousePos - linkmap.hitBoxSize / 2, linkmap.hitBoxSize),
             *  Color.red,
             *  Color.clear
             * );*/
            for (var x = -linkRadius; x <= linkRadius; x++)
            {
                for (var y = -linkRadius; y <= linkRadius; y++)
                {
                    var gridPos = new Vector3Int(x, y, 0) + mouseCell;


                    var index = navmesh.IndexOfUnsafe(gridPos.x, gridPos.y);
                    if (index > navmesh.Nodes.Length)
                    {
                        continue;
                    }

                    var origin = grid.GetCellCenterWorld(gridPos);
                    var node   = navigationNodes[index];

                    if (drawDirect)
                    {
                        foreach (var link in node.directLinks)
                        {
                            var nI         = (Vector3Int)navmesh.PositionOf(link.Destination);
                            var pos        = grid.GetCellCenterWorld(nI);
                            var neightboor = navmesh.Nodes[link.Destination];
                            var dir        = pos - origin;
                            var n          = dir.normalized;
                            var color      = new Color((n.x + 1) / 2, (n.y + 1) / 2, 1);
                            EditorX.ForHandles(origin, dir, color);
                        }
                    }

                    if (drawGravitational)
                    {
                        foreach (var link in node.gravitationalLinks)
                        {
                            var   nI   = (Vector3Int)navmesh.PositionOf(link.Destination);
                            var   pos  = grid.GetCellCenterWorld(nI);
                            float size = 4;
                            var   p    = link.Path;


                            for (int i = 0; i < p.Length - 1; i++)
                            {
                                var current = p[i];
                                var next    = p[i + 1];
                                var dir     = next - current;
                                dir.Normalize();
                                var color = new Color((dir.x + 1) / 2, (dir.y + 1) / 2, 0);
                                var prog  = (float)i / p.Length;
                                color.b       = prog;
                                color.a       = 0.5F + (prog / 2);
                                Handles.color = color;
                                Handles.DrawLine(current, next);
                            }
                        }
                    }
                }
            }

            var radius = new Vector2Int(linkRadius, linkRadius);

            Handles.color = Color.red;
            EditorX.DrawBoundaries(
                (Vector2Int)mouseCell - radius,
                (Vector2Int)mouseCell + radius, grid
                );
        }
Esempio n. 2
0
        private void DrawNodes(KuroiNavMesh navmesh)
        {
            var nodes = navmesh.Nodes;

            if (nodes == null || nodes.Length != navmesh.Area)
            {
                return;
            }

            var min = navmesh.Min;
            var max = navmesh.Max;

            for (var x = min.x; x <= max.x; x++)
            {
                for (var y = min.y; y <= max.y; y++)
                {
                    var index = navmesh.IndexOfUnsafe(x, y);
                    var node  = nodes[index];
                    if (!drawSolids && node.IsSolid())
                    {
                        continue;
                    }

                    if (!drawEmpty && node.IsEmpty())
                    {
                        continue;
                    }

                    Color color = Color.black;
                    color.a = node.IsSolid() ? 0.9F : 0.5f;
                    Color outlineColor = Color.black;
                    if (node.IsSupported())
                    {
                        color.g = 1;
                    }

                    if (node.IsLeftWall())
                    {
                        color.r = 1;
                    }

                    if (node.IsRightWall())
                    {
                        color.b = 1;
                    }

                    if (node.IsLeftEdge())
                    {
                        //color.r = 1;
                        outlineColor.r = 1;
                    }

                    if (node.IsRightEdge())
                    {
                        //color.b = 1;
                        outlineColor.b = 1;
                    }

                    UnityX.DrawCell(x, y, navmesh.grid, color, outlineColor);
                }
            }
        }