/// <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); }
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); }
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(); }
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); }
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(); }