RebuildBBTree() public static method

public static RebuildBBTree ( NavMeshGraph graph ) : void
graph NavMeshGraph
return void
Ejemplo n.º 1
0
 public override void RelocateNodes(Matrix4x4 oldMatrix, Matrix4x4 newMatrix)
 {
     if (this.vertices == null || this.vertices.Length == 0 || this.originalVertices == null || this.originalVertices.Length != this.vertices.Length)
     {
         return;
     }
     for (int i = 0; i < this._vertices.Length; i++)
     {
         this._vertices[i] = (Int3)newMatrix.MultiplyPoint3x4(this.originalVertices[i]);
     }
     for (int j = 0; j < this.nodes.Length; j++)
     {
         TriangleMeshNode triangleMeshNode = this.nodes[j];
         triangleMeshNode.UpdatePositionFromVertices();
         if (triangleMeshNode.connections != null)
         {
             for (int k = 0; k < triangleMeshNode.connections.Length; k++)
             {
                 triangleMeshNode.connectionCosts[k] = (uint)(triangleMeshNode.position - triangleMeshNode.connections[k].position).costMagnitude;
             }
         }
     }
     base.SetMatrix(newMatrix);
     NavMeshGraph.RebuildBBTree(this);
 }
Ejemplo n.º 2
0
        public static void DeserializeMeshNodes(NavMeshGraph graph, GraphNode[] nodes, byte[] bytes)
        {
            MemoryStream input        = new MemoryStream(bytes);
            BinaryReader binaryReader = new BinaryReader(input);

            for (int i = 0; i < nodes.Length; i++)
            {
                TriangleMeshNode triangleMeshNode = nodes[i] as TriangleMeshNode;
                if (triangleMeshNode == null)
                {
                    Debug.LogError("Serialization Error : Couldn't cast the node to the appropriate type - NavMeshGenerator");
                    return;
                }
                triangleMeshNode.v0 = binaryReader.ReadInt32();
                triangleMeshNode.v1 = binaryReader.ReadInt32();
                triangleMeshNode.v2 = binaryReader.ReadInt32();
            }
            int num = binaryReader.ReadInt32();

            graph.vertices = new Int3[num];
            for (int j = 0; j < num; j++)
            {
                int x = binaryReader.ReadInt32();
                int y = binaryReader.ReadInt32();
                int z = binaryReader.ReadInt32();
                graph.vertices[j] = new Int3(x, y, z);
            }
            NavMeshGraph.RebuildBBTree(graph);
        }
Ejemplo n.º 3
0
        private void GenerateNodes(Vector3[] vectorVertices, int[] triangles, out Vector3[] originalVertices, out Int3[] vertices)
        {
            if (vectorVertices.Length == 0 || triangles.Length == 0)
            {
                originalVertices = vectorVertices;
                vertices         = new Int3[0];
                this.nodes       = new TriangleMeshNode[0];
                return;
            }
            vertices = new Int3[vectorVertices.Length];
            int num = 0;

            for (int i = 0; i < vertices.Length; i++)
            {
                vertices[i] = (Int3)this.matrix.MultiplyPoint3x4(vectorVertices[i]);
            }
            Dictionary <Int3, int> dictionary = new Dictionary <Int3, int>();

            int[] array = new int[vertices.Length];
            for (int j = 0; j < vertices.Length; j++)
            {
                if (!dictionary.ContainsKey(vertices[j]))
                {
                    array[num] = j;
                    dictionary.Add(vertices[j], num);
                    num++;
                }
            }
            for (int k = 0; k < triangles.Length; k++)
            {
                Int3 key = vertices[triangles[k]];
                triangles[k] = dictionary[key];
            }
            Int3[] array2 = vertices;
            vertices         = new Int3[num];
            originalVertices = new Vector3[num];
            for (int l = 0; l < num; l++)
            {
                vertices[l]         = array2[array[l]];
                originalVertices[l] = vectorVertices[array[l]];
            }
            this.nodes = new TriangleMeshNode[triangles.Length / 3];
            int graphIndex = this.active.astarData.GetGraphIndex(this);

            for (int m = 0; m < this.nodes.Length; m++)
            {
                this.nodes[m] = new TriangleMeshNode(this.active);
                TriangleMeshNode triangleMeshNode = this.nodes[m];
                triangleMeshNode.GraphIndex = (uint)graphIndex;
                triangleMeshNode.Penalty    = this.initialPenalty;
                triangleMeshNode.Walkable   = true;
                triangleMeshNode.v0         = triangles[m * 3];
                triangleMeshNode.v1         = triangles[m * 3 + 1];
                triangleMeshNode.v2         = triangles[m * 3 + 2];
                if (!Polygon.IsClockwise(vertices[triangleMeshNode.v0], vertices[triangleMeshNode.v1], vertices[triangleMeshNode.v2]))
                {
                    int v = triangleMeshNode.v0;
                    triangleMeshNode.v0 = triangleMeshNode.v2;
                    triangleMeshNode.v2 = v;
                }
                if (Polygon.IsColinear(vertices[triangleMeshNode.v0], vertices[triangleMeshNode.v1], vertices[triangleMeshNode.v2]))
                {
                    Debug.DrawLine((Vector3)vertices[triangleMeshNode.v0], (Vector3)vertices[triangleMeshNode.v1], Color.red);
                    Debug.DrawLine((Vector3)vertices[triangleMeshNode.v1], (Vector3)vertices[triangleMeshNode.v2], Color.red);
                    Debug.DrawLine((Vector3)vertices[triangleMeshNode.v2], (Vector3)vertices[triangleMeshNode.v0], Color.red);
                }
                triangleMeshNode.UpdatePositionFromVertices();
            }
            Dictionary <Int2, TriangleMeshNode> dictionary2 = new Dictionary <Int2, TriangleMeshNode>();
            int n    = 0;
            int num2 = 0;

            while (n < triangles.Length)
            {
                dictionary2[new Int2(triangles[n], triangles[n + 1])]     = this.nodes[num2];
                dictionary2[new Int2(triangles[n + 1], triangles[n + 2])] = this.nodes[num2];
                dictionary2[new Int2(triangles[n + 2], triangles[n])]     = this.nodes[num2];
                num2++;
                n += 3;
            }
            List <MeshNode> list  = new List <MeshNode>();
            List <uint>     list2 = new List <uint>();
            int             num3  = 0;
            int             num4  = 0;

            while (num3 < triangles.Length)
            {
                list.Clear();
                list2.Clear();
                TriangleMeshNode triangleMeshNode2 = this.nodes[num4];
                for (int num5 = 0; num5 < 3; num5++)
                {
                    TriangleMeshNode triangleMeshNode3;
                    if (dictionary2.TryGetValue(new Int2(triangles[num3 + (num5 + 1) % 3], triangles[num3 + num5]), out triangleMeshNode3))
                    {
                        list.Add(triangleMeshNode3);
                        list2.Add((uint)(triangleMeshNode2.position - triangleMeshNode3.position).costMagnitude);
                    }
                }
                triangleMeshNode2.connections     = list.ToArray();
                triangleMeshNode2.connectionCosts = list2.ToArray();
                num4++;
                num3 += 3;
            }
            NavMeshGraph.RebuildBBTree(this);
        }
Ejemplo n.º 4
0
 private void GenerateNodes(Vector3[] vectorVertices, int[] triangles, out Vector3[] originalVertices, out VInt3[] vertices)
 {
     if (vectorVertices.Length == 0 || triangles.Length == 0)
     {
         originalVertices = vectorVertices;
         vertices = new VInt3[0];
         this.nodes = new TriangleMeshNode[0];
         return;
     }
     vertices = new VInt3[vectorVertices.Length];
     int num = 0;
     for (int i = 0; i < vertices.Length; i++)
     {
         vertices[i] = (VInt3)this.matrix.MultiplyPoint3x4(vectorVertices[i]);
     }
     Dictionary<VInt3, int> dictionary = new Dictionary<VInt3, int>();
     int[] array = new int[vertices.Length];
     for (int j = 0; j < vertices.Length; j++)
     {
         if (!dictionary.ContainsKey(vertices[j]))
         {
             array[num] = j;
             dictionary.Add(vertices[j], num);
             num++;
         }
     }
     for (int k = 0; k < triangles.Length; k++)
     {
         VInt3 vInt = vertices[triangles[k]];
         triangles[k] = dictionary.get_Item(vInt);
     }
     VInt3[] array2 = vertices;
     vertices = new VInt3[num];
     originalVertices = new Vector3[num];
     for (int l = 0; l < num; l++)
     {
         vertices[l] = array2[array[l]];
         originalVertices[l] = vectorVertices[array[l]];
     }
     this.nodes = new TriangleMeshNode[triangles.Length / 3];
     int graphIndex = this.active.astarData.GetGraphIndex(this);
     for (int m = 0; m < this.nodes.Length; m++)
     {
         this.nodes[m] = new TriangleMeshNode(this.active);
         TriangleMeshNode triangleMeshNode = this.nodes[m];
         triangleMeshNode.GraphIndex = (uint)graphIndex;
         triangleMeshNode.Penalty = this.initialPenalty;
         triangleMeshNode.Walkable = true;
         triangleMeshNode.v0 = triangles[m * 3];
         triangleMeshNode.v1 = triangles[m * 3 + 1];
         triangleMeshNode.v2 = triangles[m * 3 + 2];
         if (!Polygon.IsClockwise(vertices[triangleMeshNode.v0], vertices[triangleMeshNode.v1], vertices[triangleMeshNode.v2]))
         {
             int v = triangleMeshNode.v0;
             triangleMeshNode.v0 = triangleMeshNode.v2;
             triangleMeshNode.v2 = v;
         }
         if (Polygon.IsColinear(vertices[triangleMeshNode.v0], vertices[triangleMeshNode.v1], vertices[triangleMeshNode.v2]))
         {
             Debug.DrawLine((Vector3)vertices[triangleMeshNode.v0], (Vector3)vertices[triangleMeshNode.v1], Color.red);
             Debug.DrawLine((Vector3)vertices[triangleMeshNode.v1], (Vector3)vertices[triangleMeshNode.v2], Color.red);
             Debug.DrawLine((Vector3)vertices[triangleMeshNode.v2], (Vector3)vertices[triangleMeshNode.v0], Color.red);
         }
         triangleMeshNode.UpdatePositionFromVertices();
     }
     DictionaryView<VInt2, TriangleMeshNode> dictionaryView = new DictionaryView<VInt2, TriangleMeshNode>();
     int n = 0;
     int num2 = 0;
     while (n < triangles.Length)
     {
         dictionaryView[new VInt2(triangles[n], triangles[n + 1])] = this.nodes[num2];
         dictionaryView[new VInt2(triangles[n + 1], triangles[n + 2])] = this.nodes[num2];
         dictionaryView[new VInt2(triangles[n + 2], triangles[n])] = this.nodes[num2];
         num2++;
         n += 3;
     }
     ListLinqView<MeshNode> listLinqView = new ListLinqView<MeshNode>();
     List<uint> list = new List<uint>();
     int num3 = 0;
     int num4 = 0;
     int num5 = 0;
     while (num4 < triangles.Length)
     {
         listLinqView.Clear();
         list.Clear();
         TriangleMeshNode triangleMeshNode2 = this.nodes[num5];
         for (int num6 = 0; num6 < 3; num6++)
         {
             TriangleMeshNode triangleMeshNode3;
             if (dictionaryView.TryGetValue(new VInt2(triangles[num4 + (num6 + 1) % 3], triangles[num4 + num6]), out triangleMeshNode3))
             {
                 listLinqView.Add(triangleMeshNode3);
                 list.Add((uint)(triangleMeshNode2.position - triangleMeshNode3.position).costMagnitude);
             }
         }
         triangleMeshNode2.connections = listLinqView.ToArray();
         triangleMeshNode2.connectionCosts = list.ToArray();
         num5++;
         num4 += 3;
     }
     if (num3 > 0)
     {
         Debug.LogError("One or more triangles are identical to other triangles, this is not a good thing to have in a navmesh\nIncreasing the scale of the mesh might help\nNumber of triangles with error: " + num3 + "\n");
     }
     NavMeshGraph.RebuildBBTree(this);
 }