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