Exemplo n.º 1
0
 public void DebugDraw(ref Matrix drawMatrix, MyWingedEdgeMesh mesh)
 {
     Dictionary <Vector3I, int> .Enumerator enumerator = this.m_outerEdgePoints.EnumerateBins();
     for (int i = 0; enumerator.MoveNext(); i++)
     {
         int binIndex = MyCestmirDebugInputComponent.BinIndex;
         if ((binIndex == this.m_outerEdgePoints.InvalidIndex) || (i == binIndex))
         {
             BoundingBoxD xd;
             BoundingBoxD xd2;
             Vector3I     key   = enumerator.Current.Key;
             int          index = enumerator.Current.Value;
             this.m_outerEdgePoints.GetLocalBinBB(ref key, out xd);
             xd2.Min = Vector3D.Transform(xd.Min, drawMatrix);
             xd2.Max = Vector3D.Transform(xd.Max, drawMatrix);
             while (true)
             {
                 if (index == this.m_outerEdgePoints.InvalidIndex)
                 {
                     MyRenderProxy.DebugDrawAABB(xd2, Color.PowderBlue, 1f, 1f, false, false, false);
                     break;
                 }
                 Vector3 point = this.m_outerEdgePoints.GetPoint(index);
                 MyWingedEdgeMesh.Edge edge = mesh.GetEdge(this.m_outerEdgePoints.GetData(index).EdgeIndex);
                 Vector3  vertexPosition    = mesh.GetVertexPosition(edge.Vertex2);
                 Vector3D pointTo           = Vector3D.Transform(point, drawMatrix);
                 MyRenderProxy.DebugDrawArrow3D(Vector3D.Transform((mesh.GetVertexPosition(edge.Vertex1) + vertexPosition) * 0.5f, drawMatrix), pointTo, Color.Yellow, new Color?(Color.Yellow), false, 0.1, null, 0.5f, false);
                 index = this.m_outerEdgePoints.GetNextBinIndex(index);
             }
         }
     }
 }
Exemplo n.º 2
0
        public void GetEdgeVertices(int index, out Vector3 pred, out Vector3 succ)
        {
            MyWingedEdgeMesh mesh = this.m_navMesh.Mesh;

            MyWingedEdgeMesh.Edge edge = mesh.GetEdge(this.GetEdgeIndex(index));
            pred = mesh.GetVertexPosition(edge.GetFacePredVertex(this.m_triIndex));
            succ = mesh.GetVertexPosition(edge.GetFaceSuccVertex(this.m_triIndex));
        }
Exemplo n.º 3
0
        public void GetEdgeVertices(int index, out Vector3 pred, out Vector3 succ)
        {
            MyWingedEdgeMesh mesh = m_navMesh.Mesh;

            int i = GetEdgeIndex(index);

            MyWingedEdgeMesh.Edge edge = mesh.GetEdge(i);
            pred = mesh.GetVertex(edge.GetFacePredVertex(m_triIndex));
            succ = mesh.GetVertex(edge.GetFaceSuccVertex(m_triIndex));
        }
Exemplo n.º 4
0
        protected MyNavigationTriangle AddTriangle(ref Vector3 A, ref Vector3 B, ref Vector3 C, ref int edgeAB, ref int edgeBC, ref int edgeCA)
        {
            MyNavigationTriangle userData = this.m_triPool.Allocate();
            int num           = ((0 + ((edgeAB == -1) ? 1 : 0)) + ((edgeBC == -1) ? 1 : 0)) + ((edgeCA == -1) ? 1 : 0);
            int triangleIndex = -1;

            if (num == 3)
            {
                triangleIndex = this.m_mesh.MakeNewTriangle(userData, ref A, ref B, ref C, out edgeAB, out edgeBC, out edgeCA);
            }
            else if (num == 2)
            {
                triangleIndex = (edgeAB == -1) ? ((edgeBC == -1) ? this.m_mesh.ExtrudeTriangleFromEdge(ref B, edgeCA, userData, out edgeAB, out edgeBC) : this.m_mesh.ExtrudeTriangleFromEdge(ref A, edgeBC, userData, out edgeCA, out edgeAB)) : this.m_mesh.ExtrudeTriangleFromEdge(ref C, edgeAB, userData, out edgeBC, out edgeCA);
            }
            else if (num == 1)
            {
                triangleIndex = (edgeAB != -1) ? ((edgeBC != -1) ? this.GetTriangleOneNewEdge(ref edgeCA, ref edgeAB, ref edgeBC, userData) : this.GetTriangleOneNewEdge(ref edgeBC, ref edgeCA, ref edgeAB, userData)) : this.GetTriangleOneNewEdge(ref edgeAB, ref edgeBC, ref edgeCA, userData);
            }
            else
            {
                MyWingedEdgeMesh.Edge other = this.m_mesh.GetEdge(edgeAB);
                MyWingedEdgeMesh.Edge edge  = this.m_mesh.GetEdge(edgeBC);
                MyWingedEdgeMesh.Edge edge3 = this.m_mesh.GetEdge(edgeCA);
                int sharedB = edge3.TryGetSharedVertex(ref other);
                int sharedC = other.TryGetSharedVertex(ref edge);
                int num5    = edge.TryGetSharedVertex(ref edge3);
                int num6    = ((0 + ((sharedB == -1) ? 0 : 1)) + ((sharedC == -1) ? 0 : 1)) + ((num5 == -1) ? 0 : 1);
                if (num6 == 3)
                {
                    triangleIndex = this.m_mesh.MakeFace(userData, edgeAB);
                }
                else if (num6 == 2)
                {
                    triangleIndex = (sharedB != -1) ? ((sharedC != -1) ? this.GetTriangleTwoSharedVertices(edgeCA, edgeAB, ref edgeBC, sharedB, sharedC, userData) : this.GetTriangleTwoSharedVertices(edgeBC, edgeCA, ref edgeAB, num5, sharedB, userData)) : this.GetTriangleTwoSharedVertices(edgeAB, edgeBC, ref edgeCA, sharedC, num5, userData);
                }
                else if (num6 == 1)
                {
                    triangleIndex = (sharedB == -1) ? ((sharedC == -1) ? this.GetTriangleOneSharedVertex(edgeBC, edgeCA, ref edgeAB, num5, userData) : this.GetTriangleOneSharedVertex(edgeAB, edgeBC, ref edgeCA, sharedC, userData)) : this.GetTriangleOneSharedVertex(edgeCA, edgeAB, ref edgeBC, sharedB, userData);
                }
                else
                {
                    int num7;
                    int num8;
                    triangleIndex = this.m_mesh.ExtrudeTriangleFromEdge(ref C, edgeAB, userData, out num7, out num8);
                    this.m_mesh.MergeEdges(num8, edgeCA);
                    this.m_mesh.MergeEdges(num7, edgeBC);
                }
            }
            userData.Init(this, triangleIndex);
            return(userData);
        }
Exemplo n.º 5
0
        public override IMyPathVertex <MyNavigationPrimitive> GetOwnNeighbor(int index)
        {
            int i = GetEdgeIndex(index);

            MyWingedEdgeMesh.Edge edge = m_navMesh.Mesh.GetEdge(i);
            int neighborIndex          = edge.OtherFace(m_triIndex);

            if (neighborIndex != -1)
            {
                return(m_navMesh.Mesh.GetFace(neighborIndex).GetUserData <MyNavigationPrimitive>());
            }
            else
            {
                return(null);
            }
        }
Exemplo n.º 6
0
 private void CheckOuterEdgeConsistency()
 {
     if (DO_CONSISTENCY_CHECKS)
     {
         foreach (MyTuple <MyVoxelConnectionHelper.OuterEdgePoint, Vector3> local1 in new List <MyTuple <MyVoxelConnectionHelper.OuterEdgePoint, Vector3> >())
         {
             int edgeIndex = local1.Item1.EdgeIndex;
             MyWingedEdgeMesh.Edge edge = base.Mesh.GetEdge(edgeIndex);
             if (local1.Item1.FirstPoint)
             {
                 edge.GetFaceSuccVertex(-1);
                 continue;
             }
             edge.GetFacePredVertex(-1);
         }
     }
 }
Exemplo n.º 7
0
        private int GetTriangleOneNewEdge(ref int newEdge, ref int succ, ref int pred, MyNavigationTriangle newTri)
        {
            MyWingedEdgeMesh.Edge edge  = this.m_mesh.GetEdge(pred);
            MyWingedEdgeMesh.Edge other = this.m_mesh.GetEdge(succ);
            int vertex = edge.TryGetSharedVertex(ref other);

            if (vertex != -1)
            {
                int num3 = edge.OtherVertex(vertex);
                return(this.m_mesh.MakeEdgeFace(num3, other.OtherVertex(vertex), pred, succ, newTri, out newEdge));
            }
            int     num2           = succ;
            Vector3 vertexPosition = this.m_mesh.GetVertexPosition(other.GetFacePredVertex(-1));

            this.m_mesh.MergeEdges(num2, succ);
            return(this.m_mesh.ExtrudeTriangleFromEdge(ref vertexPosition, pred, newTri, out newEdge, out succ));
        }
Exemplo n.º 8
0
        public bool IsEdgeVertexDangerous(int index, bool predVertex)
        {
            MyWingedEdgeMesh mesh = this.m_navMesh.Mesh;
            int edgeIndex         = this.GetEdgeIndex(index);

            MyWingedEdgeMesh.Edge edge = mesh.GetEdge(edgeIndex);
            int vertexIndex            = predVertex ? edge.GetFacePredVertex(this.m_triIndex) : edge.GetFaceSuccVertex(this.m_triIndex);

            while (!IsTriangleDangerous(edge.VertexLeftFace(vertexIndex)))
            {
                int nextVertexEdge = edge.GetNextVertexEdge(vertexIndex);
                edge = mesh.GetEdge(nextVertexEdge);
                if (nextVertexEdge == edgeIndex)
                {
                    return(false);
                }
            }
            return(true);
        }
Exemplo n.º 9
0
        public MyNavigationEdge GetNavigationEdge(int index)
        {
            MyWingedEdgeMesh mesh = this.m_navMesh.Mesh;
            int edgeIndex         = this.GetEdgeIndex(index);

            MyWingedEdgeMesh.Edge edge = mesh.GetEdge(edgeIndex);
            MyNavigationTriangle  triA = null;
            MyNavigationTriangle  triB = null;

            if (edge.LeftFace != -1)
            {
                triA = mesh.GetFace(edge.LeftFace).GetUserData <MyNavigationTriangle>();
            }
            if (edge.RightFace != -1)
            {
                triB = mesh.GetFace(edge.RightFace).GetUserData <MyNavigationTriangle>();
            }
            MyNavigationEdge.Static.Init(triA, triB, edgeIndex);
            return(MyNavigationEdge.Static);
        }
Exemplo n.º 10
0
        /// <summary>
        /// Whether it's dangerous for the bot to navigate close to this edge
        /// </summary>
        public bool IsEdgeVertexDangerous(int index, bool predVertex)
        {
            MyWingedEdgeMesh mesh = m_navMesh.Mesh;
            int i = GetEdgeIndex(index);
            int e = i;

            MyWingedEdgeMesh.Edge edge = mesh.GetEdge(e);
            int v = predVertex ? edge.GetFacePredVertex(m_triIndex) : edge.GetFaceSuccVertex(m_triIndex);

            do
            {
                if (IsTriangleDangerous(edge.VertexLeftFace(v)))
                {
                    return(true);
                }
                e    = edge.GetNextVertexEdge(v);
                edge = mesh.GetEdge(e);
            } while (e != i);

            return(false);
        }
Exemplo n.º 11
0
 public override unsafe void DebugDraw(ref Matrix drawMatrix)
 {
     if (MyFakes.DEBUG_DRAW_NAVMESH_PROCESSED_VOXEL_CELLS)
     {
         Vector3 vector  = Vector3.TransformNormal(this.m_cellSize, (Matrix)drawMatrix);
         Vector3 vector2 = Vector3.Transform((Vector3)(this.m_voxelMap.PositionLeftBottomCorner - this.m_voxelMap.PositionComp.GetPosition()), (Matrix)drawMatrix);
         foreach (Vector3I vectori in this.m_processedCells)
         {
             BoundingBoxD xd;
             xd.Min = vector2 + (vector * (new Vector3(0.0625f) + vectori));
             BoundingBoxD *xdPtr1 = (BoundingBoxD *)ref xd;
             xdPtr1->Max = xd.Min + vector;
             xd.Inflate((double)-0.20000000298023224);
             MyRenderProxy.DebugDrawAABB(xd, Color.Orange, 1f, 1f, false, false, false);
             MyRenderProxy.DebugDrawText3D(xd.Center, vectori.ToString(), Color.Orange, 0.5f, false, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_TOP, -1, false);
         }
     }
     if (MyFakes.DEBUG_DRAW_NAVMESH_CELLS_ON_PATHS)
     {
         Vector3     vector3 = Vector3.TransformNormal(this.m_cellSize, (Matrix)drawMatrix);
         Vector3     vector4 = Vector3.Transform((Vector3)(this.m_voxelMap.PositionLeftBottomCorner - this.m_voxelMap.PositionComp.GetPosition()), (Matrix)drawMatrix);
         MyCellCoord coord   = new MyCellCoord();
         foreach (ulong num in this.m_cellsOnWayCoords)
         {
             BoundingBoxD xd2;
             coord.SetUnpack(num);
             Vector3I coordInLod = coord.CoordInLod;
             xd2.Min = vector4 + (vector3 * (new Vector3(0.0625f) + coordInLod));
             BoundingBoxD *xdPtr2 = (BoundingBoxD *)ref xd2;
             xdPtr2->Max = xd2.Min + vector3;
             xd2.Inflate((double)-0.30000001192092896);
             MyRenderProxy.DebugDrawAABB(xd2, Color.Green, 1f, 1f, false, false, false);
         }
     }
     if (MyFakes.DEBUG_DRAW_NAVMESH_PREPARED_VOXEL_CELLS)
     {
         Vector3  vector5          = Vector3.TransformNormal(this.m_cellSize, (Matrix)drawMatrix);
         Vector3  vector6          = Vector3.Transform((Vector3)(this.m_voxelMap.PositionLeftBottomCorner - this.m_voxelMap.PositionComp.GetPosition()), (Matrix)drawMatrix);
         float    negativeInfinity = float.NegativeInfinity;
         Vector3I zero             = Vector3I.Zero;
         int      index            = 0;
         while (true)
         {
             if (index >= this.m_toAdd.Count)
             {
                 for (int i = 0; i < this.m_toAdd.Count; i++)
                 {
                     BoundingBoxD      xd3;
                     CellToAddHeapItem local1   = this.m_toAdd.GetItem(i);
                     float             num6     = local1.HeapKey;
                     Vector3I          position = local1.Position;
                     xd3.Min = vector6 + (vector5 * (new Vector3(0.0625f) + position));
                     BoundingBoxD *xdPtr3 = (BoundingBoxD *)ref xd3;
                     xdPtr3->Max = xd3.Min + vector5;
                     xd3.Inflate((double)-0.10000000149011612);
                     Color aqua = Color.Aqua;
                     if (position.Equals(zero))
                     {
                         aqua = Color.Red;
                     }
                     MyRenderProxy.DebugDrawAABB(xd3, aqua, 1f, 1f, false, false, false);
                     string text = $"{num6.ToString("n2")}";
                     MyRenderProxy.DebugDrawText3D(xd3.Center, text, aqua, 0.7f, false, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_TOP, -1, false);
                 }
                 break;
             }
             CellToAddHeapItem item    = this.m_toAdd.GetItem(index);
             float             heapKey = item.HeapKey;
             if (heapKey > negativeInfinity)
             {
                 negativeInfinity = heapKey;
                 zero             = item.Position;
             }
             index++;
         }
     }
     MyRenderProxy.DebugDrawSphere(this.m_debugPos1, 0.2f, Color.Red, 1f, false, false, true, false);
     MyRenderProxy.DebugDrawSphere(this.m_debugPos2, 0.2f, Color.Green, 1f, false, false, true, false);
     MyRenderProxy.DebugDrawSphere(this.m_debugPos3, 0.1f, Color.Red, 1f, false, false, true, false);
     MyRenderProxy.DebugDrawSphere(this.m_debugPos4, 0.1f, Color.Green, 1f, false, false, true, false);
     if (MyFakes.DEBUG_DRAW_VOXEL_CONNECTION_HELPER)
     {
         this.m_connectionHelper.DebugDraw(ref drawMatrix, base.Mesh);
     }
     if (MyFakes.DEBUG_DRAW_NAVMESH_CELL_BORDERS)
     {
         foreach (KeyValuePair <ulong, List <DebugDrawEdge> > pair in this.m_debugCellEdges)
         {
             foreach (DebugDrawEdge edge in pair.Value)
             {
                 MyRenderProxy.DebugDrawLine3D(edge.V1, edge.V2, Color.Orange, Color.Orange, false, false);
             }
         }
     }
     else
     {
         this.m_debugCellEdges.Clear();
     }
     if (MyFakes.DEBUG_DRAW_NAVMESH_HIERARCHY)
     {
         if (MyFakes.DEBUG_DRAW_NAVMESH_HIERARCHY_LITE)
         {
             this.m_higherLevel.DebugDraw(true);
         }
         else
         {
             this.m_higherLevel.DebugDraw(false);
             this.m_higherLevelHelper.DebugDraw();
         }
     }
     if ((MyDebugDrawSettings.DEBUG_DRAW_NAVMESHES == MyWEMDebugDrawMode.LINES) && !(this.m_voxelMap is MyVoxelPhysics))
     {
         int num7 = 0;
         MyWingedEdgeMesh.EdgeEnumerator edges = base.Mesh.GetEdges(null);
         Vector3D position = this.m_voxelMap.PositionComp.GetPosition();
         while (edges.MoveNext())
         {
             MyWingedEdgeMesh.Edge current = edges.Current;
             Vector3D vectord2             = base.Mesh.GetVertexPosition(current.Vertex2) + position;
             Vector3D point = ((base.Mesh.GetVertexPosition(edges.Current.Vertex1) + position) + vectord2) * 0.5;
             if (MyCestmirPathfindingShorts.Pathfinding.Obstacles.IsInObstacle(point))
             {
                 MyRenderProxy.DebugDrawSphere(point, 0.05f, Color.Red, 1f, false, false, true, false);
             }
             num7++;
         }
     }
 }
Exemplo n.º 12
0
 protected MyNavigationTriangle GetEdgeTriangle(int edgeIndex)
 {
     MyWingedEdgeMesh.Edge edge = this.m_mesh.GetEdge(edgeIndex);
     return((edge.LeftFace != -1) ? this.GetTriangle(edge.LeftFace) : this.GetTriangle(edge.RightFace));
 }