Exemple #1
0
        /// <summary>
        /// Find the distance from a point to a triangle.
        /// </summary>
        /// <param name="indexPoly">Current polygon's index</param>
        /// <param name="pos">Current position</param>
        /// <param name="h">Resulting height</param>
        /// <returns>True, if a height is found. False, if otherwise.</returns>
        public bool ClosestHeight(int indexPoly, Vector3 pos, out float h)
        {
            Poly poly = Polys[indexPoly];

            PolyMeshDetail.MeshData pd = DetailMeshes[indexPoly];

            //find height at the location
            for (int j = 0; j < DetailMeshes[indexPoly].TriangleCount; j++)
            {
                PolyMeshDetail.TriangleData t = DetailTris[pd.TriangleIndex + j];
                Vector3[] v = new Vector3[3];

                for (int k = 0; k < 3; k++)
                {
                    if (t[k] < poly.VertCount)
                    {
                        v[k] = Verts[poly.Verts[t[k]]];
                    }
                    else
                    {
                        v[k] = DetailVerts[pd.VertexIndex + (t[k] - poly.VertCount)];
                    }
                }

                if (Distance.PointToTriangle(pos, v[0], v[1], v[2], out h))
                {
                    return(true);
                }
            }

            h = float.MaxValue;
            return(false);
        }
Exemple #2
0
        public List <Line> GetObstacle()
        {
            //tmpStreamWriter.WriteLine(tmpNavMeshTriangulation.vertices.Length.ToString());
            for (int i = 0; i < polyMeshDetail.Verts.Length; i++)
            {
                //tmpStreamWriter.WriteLine("v " + polyMeshDetail.Verts[i].X + " " + polyMeshDetail.Verts[i].Y + " " + polyMeshDetail.Verts[i].Z);
                _points.Add(new Vector2(polyMeshDetail.Verts[i].X, polyMeshDetail.Verts[i].Z));
            }

            //tmpStreamWriter.WriteLine(tmpNavMeshTriangulation.indices.Length);
            for (int i = 0; i < polyMeshDetail.MeshCount; i++)
            {
                PolyMeshDetail.MeshData m = polyMeshDetail.Meshes[i];

                int vertIndex = m.VertexIndex;
                int triIndex  = m.TriangleIndex;

                for (int j = 0; j < m.TriangleCount; j++)
                {
                    var t = polyMeshDetail.Tris[triIndex + j];

                    var v = polyMeshDetail.Verts[vertIndex + t.VertexHash0];

                    v = polyMeshDetail.Verts[vertIndex + t.VertexHash1];

                    v = polyMeshDetail.Verts[vertIndex + t.VertexHash2];

                    //tmpStreamWriter.WriteLine("f " + (vertIndex + t.VertexHash0 + 1) + " " + (vertIndex + t.VertexHash1 + 1) + " " + (vertIndex + t.VertexHash2 + 1));
                    LinesFromTriangle(_points[vertIndex + t.VertexHash0], _points[vertIndex + t.VertexHash1], _points[vertIndex + t.VertexHash2]);
                }
            }


            for (int i = 0; i < _lines.Count; i++)
            {
                //if(_lines[i].valid == true)
                {
                    for (int ii = i + 1; ii < _lines.Count; ii++)
                    {
                        if (_lines[i] == _lines[ii])// && _lines[ii].valid == true)
                        {
                            _lines[i].valid  = false;
                            _lines[ii].valid = false;
                        }
                    }
                }
            }
            return(_lines);
        }
Exemple #3
0
        public void OutMesh()
        {
            string tmpPath = "mmesh.obj";

            System.IO.StreamWriter tmpStreamWriter = new System.IO.StreamWriter(tmpPath);



            //顶点
            //tmpStreamWriter.WriteLine(tmpNavMeshTriangulation.vertices.Length.ToString());
            for (int i = 0; i < polyMeshDetail.Verts.Length; i++)
            {
                tmpStreamWriter.WriteLine("v " + polyMeshDetail.Verts[i].X + " " + polyMeshDetail.Verts[i].Y + " " + polyMeshDetail.Verts[i].Z);
            }

            //tmpStreamWriter.WriteLine(tmpNavMeshTriangulation.indices.Length);
            for (int i = 0; i < polyMeshDetail.MeshCount; i++)
            {
                PolyMeshDetail.MeshData m = polyMeshDetail.Meshes[i];

                int vertIndex = m.VertexIndex;
                int triIndex  = m.TriangleIndex;

                for (int j = 0; j < m.TriangleCount; j++)
                {
                    var t = polyMeshDetail.Tris[triIndex + j];

                    var v = polyMeshDetail.Verts[vertIndex + t.VertexHash0];

                    v = polyMeshDetail.Verts[vertIndex + t.VertexHash1];

                    v = polyMeshDetail.Verts[vertIndex + t.VertexHash2];
                    tmpStreamWriter.WriteLine("f " + (vertIndex + t.VertexHash0 + 1) + " " + (vertIndex + t.VertexHash1 + 1) + " " + (vertIndex + t.VertexHash2 + 1));
                }
            }
            tmpStreamWriter.Flush();
            tmpStreamWriter.Close();
        }
Exemple #4
0
        private void DrawPolyMeshDetail()
        {
            if (polyMeshDetail == null)
            {
                return;
            }

            GL.PushMatrix();

            Matrix4 transMatrix = Matrix4.CreateTranslation(0, -polyMesh.CellHeight, 0);

            GL.MultMatrix(ref transMatrix);

            Color4 color = Color4.DarkViolet;

            color.A = 0.5f;
            GL.Color4(color);

            GL.Begin(PrimitiveType.Triangles);
            for (int i = 0; i < polyMeshDetail.MeshCount; i++)
            {
                PolyMeshDetail.MeshData m = polyMeshDetail.Meshes[i];

                int vertIndex = m.VertexIndex;
                int triIndex  = m.TriangleIndex;

                for (int j = 0; j < m.TriangleCount; j++)
                {
                    var t = polyMeshDetail.Tris[triIndex + j];

                    var v = polyMeshDetail.Verts[vertIndex + t.VertexHash0];
                    GL.Vertex3(v.X, v.Y, v.Z);

                    v = polyMeshDetail.Verts[vertIndex + t.VertexHash1];
                    GL.Vertex3(v.X, v.Y, v.Z);

                    v = polyMeshDetail.Verts[vertIndex + t.VertexHash2];
                    GL.Vertex3(v.X, v.Y, v.Z);
                }
            }

            GL.End();

            GL.Color4(Color4.Purple);
            GL.LineWidth(1.5f);
            GL.Begin(PrimitiveType.Lines);
            for (int i = 0; i < polyMeshDetail.MeshCount; i++)
            {
                var m = polyMeshDetail.Meshes[i];

                int vertIndex = m.VertexIndex;
                int triIndex  = m.TriangleIndex;

                for (int j = 0; j < m.TriangleCount; j++)
                {
                    var t = polyMeshDetail.Tris[triIndex + j];
                    for (int k = 0, kp = 2; k < 3; kp = k++)
                    {
                        if (((t.Flags >> (kp * 2)) & 0x3) == 0)
                        {
                            if (t[kp] < t[k])
                            {
                                var v = polyMeshDetail.Verts[vertIndex + t[kp]];
                                GL.Vertex3(v.X, v.Y, v.Z);

                                v = polyMeshDetail.Verts[vertIndex + t[k]];
                                GL.Vertex3(v.X, v.Y, v.Z);
                            }
                        }
                    }
                }
            }

            GL.End();

            GL.LineWidth(3.5f);
            GL.Begin(PrimitiveType.Lines);
            for (int i = 0; i < polyMeshDetail.MeshCount; i++)
            {
                var m = polyMeshDetail.Meshes[i];

                int vertIndex = m.VertexIndex;
                int triIndex  = m.TriangleIndex;

                for (int j = 0; j < m.TriangleCount; j++)
                {
                    var t = polyMeshDetail.Tris[triIndex + j];
                    for (int k = 0, kp = 2; k < 3; kp = k++)
                    {
                        if (((t.Flags >> (kp * 2)) & 0x3) != 0)
                        {
                            var v = polyMeshDetail.Verts[vertIndex + t[kp]];
                            GL.Vertex3(v.X, v.Y, v.Z);

                            v = polyMeshDetail.Verts[vertIndex + t[k]];
                            GL.Vertex3(v.X, v.Y, v.Z);
                        }
                    }
                }
            }

            GL.End();

            GL.PointSize(4.8f);
            GL.Begin(PrimitiveType.Points);
            for (int i = 0; i < polyMeshDetail.MeshCount; i++)
            {
                var m = polyMeshDetail.Meshes[i];

                for (int j = 0; j < m.VertexCount; j++)
                {
                    var v = polyMeshDetail.Verts[m.VertexIndex + j];
                    GL.Vertex3(v.X, v.Y, v.Z);
                }
            }

            GL.End();

            GL.PopMatrix();
        }
        private NavTile DeserializeMeshTile(ref Stream stream, NavPolyIdManager manager, out NavPolyId baseRef)
        {
            NavTile tile;

            using (var binaryReader = new BinaryReader(stream))
            {
                var id = binaryReader.ReadInt32();
                baseRef = new NavPolyId(id);

                var x        = binaryReader.ReadInt32();
                var y        = binaryReader.ReadInt32();
                var location = new Vector2i(x, y);

                var layer = binaryReader.ReadInt32();

                tile      = new NavTile(location, layer, manager, baseRef);
                tile.Salt = binaryReader.ReadInt32();

                var minX = binaryReader.ReadSingle();
                var minY = binaryReader.ReadSingle();
                var minZ = binaryReader.ReadSingle();
                var maxX = binaryReader.ReadSingle();
                var maxY = binaryReader.ReadSingle();
                var maxZ = binaryReader.ReadSingle();
                tile.Bounds = new BBox3(minX, minY, minZ, maxX, maxY, maxZ);

                var polysCount = binaryReader.ReadInt32();
                var polys      = new NavPoly[polysCount];

                for (var i = 0; i < polysCount; i++)
                {
                    var poly = new NavPoly();
                    poly.PolyType = (NavPolyType)binaryReader.ReadByte();

                    var polyLinksCount = binaryReader.ReadInt32();

                    for (var j = 0; j < polyLinksCount; j++)
                    {
                        var navPolyId = binaryReader.ReadInt32();

                        var link = new Link();
                        link.Reference = new NavPolyId(navPolyId);
                        link.Edge      = binaryReader.ReadInt32();
                        link.Side      = (BoundarySide)binaryReader.ReadByte();
                        link.BMin      = binaryReader.ReadInt32();
                        link.BMax      = binaryReader.ReadInt32();

                        poly.Links.Add(link);
                    }

                    var polyVertsCount = binaryReader.ReadInt32();
                    poly.Verts = new int[polyVertsCount];

                    for (var j = 0; j < polyVertsCount; j++)
                    {
                        poly.Verts[j] = binaryReader.ReadInt32();
                    }

                    var polyNeisCount = binaryReader.ReadInt32();
                    poly.Neis = new int[polyNeisCount];

                    for (var j = 0; j < polyNeisCount; j++)
                    {
                        poly.Neis[j] = binaryReader.ReadInt32();
                    }

                    var polyTag = binaryReader.ReadByte();

                    if (polyTag == 0xFE)
                    {
                        poly.Tag = null;
                    }
                    else
                    {
                        poly.Tag = (OffMeshConnectionFlags)polyTag;
                    }

                    poly.VertCount = binaryReader.ReadInt32();

                    var areaId = binaryReader.ReadByte();
                    poly.Area = new Area(areaId);

                    polys[i] = poly;
                }

                tile.Polys     = polys;
                tile.PolyCount = polysCount;

                var vertsCount = binaryReader.ReadInt32();
                var verts      = new Vector3[vertsCount];

                for (var i = 0; i < vertsCount; i++)
                {
                    var vx   = binaryReader.ReadSingle();
                    var vy   = binaryReader.ReadSingle();
                    var vz   = binaryReader.ReadSingle();
                    var vert = new Vector3(vx, vy, vz);

                    verts[i] = vert;
                }

                tile.Verts = verts;

                var detailMeshesCount = binaryReader.ReadInt32();
                var detailMeshes      = new PolyMeshDetail.MeshData[detailMeshesCount];

                for (var i = 0; i < detailMeshesCount; i++)
                {
                    var detailMesh = new PolyMeshDetail.MeshData();
                    detailMesh.VertexIndex   = binaryReader.ReadInt32();
                    detailMesh.VertexCount   = binaryReader.ReadInt32();
                    detailMesh.TriangleIndex = binaryReader.ReadInt32();
                    detailMesh.TriangleCount = binaryReader.ReadInt32();

                    detailMeshes[i] = detailMesh;
                }

                tile.DetailMeshes = detailMeshes;

                var detailVertsCount = binaryReader.ReadInt32();
                var detailVerts      = new Vector3[detailVertsCount];

                for (var i = 0; i < detailVertsCount; i++)
                {
                    var vx         = binaryReader.ReadSingle();
                    var vy         = binaryReader.ReadSingle();
                    var vz         = binaryReader.ReadSingle();
                    var detailVert = new Vector3(vx, vy, vz);

                    detailVerts[i] = detailVert;
                }

                tile.DetailVerts = detailVerts;

                var detailTrisCount = binaryReader.ReadInt32();
                var detailTris      = new PolyMeshDetail.TriangleData[detailTrisCount];

                for (var i = 0; i < detailTrisCount; i++)
                {
                    var hash0     = binaryReader.ReadInt32();
                    var hash1     = binaryReader.ReadInt32();
                    var hash2     = binaryReader.ReadInt32();
                    var flags     = binaryReader.ReadInt32();
                    var detailTri = new PolyMeshDetail.TriangleData(hash0, hash1, hash2, flags);

                    detailTris[i] = detailTri;
                }

                tile.DetailTris = detailTris;

                var offMeshConnectionsCount = binaryReader.ReadInt32();

                for (var i = 0; i < offMeshConnectionsCount; i++)
                {
                }

                var nodesCount = binaryReader.ReadInt32();
                var nodes      = new BVTree.Node[nodesCount];

                for (var i = 0; i < nodesCount; i++)
                {
                    var node = new BVTree.Node();
                    node.Bounds.Min.X = binaryReader.ReadInt32();
                    node.Bounds.Min.Y = binaryReader.ReadInt32();
                    node.Bounds.Min.Z = binaryReader.ReadInt32();
                    node.Bounds.Max.X = binaryReader.ReadInt32();
                    node.Bounds.Max.Y = binaryReader.ReadInt32();
                    node.Bounds.Max.Z = binaryReader.ReadInt32();
                    node.Index        = binaryReader.ReadInt32();

                    nodes[i] = node;
                }

                tile.BVTree = new BVTree(nodes);

                tile.BvQuantFactor = binaryReader.ReadSingle();
                tile.BvNodeCount   = binaryReader.ReadInt32();
                tile.WalkableClimb = binaryReader.ReadSingle();
            }

            return(tile);
        }
Exemple #6
0
        private void DrawPolyMeshDetail()
        {
            if (Program.nav.polyMeshDetail == null)
            {
                return;
            }

            GL.PushMatrix();

            Matrix4 transMatrix = Matrix4.CreateTranslation(0, -Program.nav.polyMesh.CellHeight, 0);

            GL.MultMatrix(ref transMatrix);

            Color4 color = Color4.DarkViolet;

            color.A = 0.5f;
            GL.Color4(color);

            GL.Begin(BeginMode.Triangles);
            for (int i = 0; i < Program.nav.polyMeshDetail.MeshCount; i++)
            {
                PolyMeshDetail.MeshData m = Program.nav.polyMeshDetail.Meshes[i];

                int vertIndex = m.VertexIndex;
                int triIndex  = m.TriangleIndex;

                for (int j = 0; j < m.TriangleCount; j++)
                {
                    if (color.R < 1)
                    {
                        color.R += 0.1f;
                    }
                    if (color.G < 1)
                    {
                        color.G += 0.1f;
                    }
                    if (color.R >= 1)
                    {
                        color.R = 0.1f;
                    }
                    if (color.G >= 1)
                    {
                        color.G = 0.1f;
                    }
                    GL.Color4(color);
                    var t = Program.nav.polyMeshDetail.Tris[triIndex + j];

                    var v = Program.nav.polyMeshDetail.Verts[vertIndex + t.VertexHash0];
                    GL.Vertex3(v.X, v.Y, v.Z);

                    v = Program.nav.polyMeshDetail.Verts[vertIndex + t.VertexHash1];
                    GL.Vertex3(v.X, v.Y, v.Z);

                    v = Program.nav.polyMeshDetail.Verts[vertIndex + t.VertexHash2];
                    GL.Vertex3(v.X, v.Y, v.Z);
                }
            }
            GL.End();


            GL.Color4(Color4.Purple);
            GL.LineWidth(0.5f);
            GL.Begin(BeginMode.Lines);
            for (int i = 0; i < Program.nav.polyMeshDetail.MeshCount; i++)
            {
                var m = Program.nav.polyMeshDetail.Meshes[i];

                int vertIndex = m.VertexIndex;
                int triIndex  = m.TriangleIndex;

                for (int j = 0; j < m.TriangleCount; j++)
                {
                    var t = Program.nav.polyMeshDetail.Tris[triIndex + j];
                    for (int k = 0, kp = 2; k < 3; kp = k++)
                    {
                        if (((t.Flags >> (kp * 2)) & 0x3) == 0)
                        {
                            if (t[kp] < t[k])
                            {
                                var v = Program.nav.polyMeshDetail.Verts[vertIndex + t[kp]];
                                GL.Vertex3(v.X, v.Y, v.Z);

                                v = Program.nav.polyMeshDetail.Verts[vertIndex + t[k]];
                                GL.Vertex3(v.X, v.Y, v.Z);
                            }
                        }
                    }
                }
            }

            GL.End();

            GL.Color4(Color4.Red);
            GL.LineWidth(0.5f);
            GL.Begin(BeginMode.Lines);
            for (int i = 0; i < Program.nav.polyMeshDetail.MeshCount; i++)
            {
                var m = Program.nav.polyMeshDetail.Meshes[i];

                int vertIndex = m.VertexIndex;
                int triIndex  = m.TriangleIndex;

                for (int j = 0; j < m.TriangleCount; j++)
                {
                    var t = Program.nav.polyMeshDetail.Tris[triIndex + j];
                    for (int k = 0, kp = 2; k < 3; kp = k++)
                    {
                        if (((t.Flags >> (kp * 2)) & 0x3) == 0)
                        {
                            if (t[kp] < t[k])
                            {
                                var v = Program.nav.polyMeshDetail.Verts[vertIndex + t[kp]];
                                GL.Vertex3(v.X, v.Y, v.Z);

                                v = Program.nav.polyMeshDetail.Verts[vertIndex + t[k]];
                                GL.Vertex3(v.X, v.Y, v.Z);
                            }
                        }
                    }
                }
            }

            //GL.Vertex3(-144, 2, -372);
            //GL.Vertex3(-280, 2,124.8);
            GL.End();

            GL.LineWidth(0.5f);
            GL.Begin(BeginMode.Lines);
            for (int i = 0; i < Program.nav.polyMeshDetail.MeshCount; i++)
            {
                var m = Program.nav.polyMeshDetail.Meshes[i];

                int vertIndex = m.VertexIndex;
                int triIndex  = m.TriangleIndex;

                for (int j = 0; j < m.TriangleCount; j++)
                {
                    var t = Program.nav.polyMeshDetail.Tris[triIndex + j];
                    for (int k = 0, kp = 2; k < 3; kp = k++)
                    {
                        if (((t.Flags >> (kp * 2)) & 0x3) != 0)
                        {
                            var v = Program.nav.polyMeshDetail.Verts[vertIndex + t[kp]];
                            GL.Vertex3(v.X, v.Y, v.Z);

                            v = Program.nav.polyMeshDetail.Verts[vertIndex + t[k]];
                            GL.Vertex3(v.X, v.Y, v.Z);
                        }
                    }
                }
            }

            GL.End();

            //         GL.PointSize(4.8f);
            //GL.Begin(BeginMode.Points);
            //for (int i = 0; i < polyMeshDetail.MeshCount; i++)
            //{
            //	var m = polyMeshDetail.Meshes[i];

            //	for (int j = 0; j < m.VertexCount; j++)
            //	{
            //		var v = polyMeshDetail.Verts[m.VertexIndex + j];
            //		GL.Vertex3(v.X, v.Y, v.Z);
            //	}
            //}

            //GL.End();

            GL.PopMatrix();
        }