public TiledNavMesh(Vector3 origin, float tileWidth, float tileHeight, int maxTiles, int maxPolys) { this.origin = origin; this.tileWidth = tileWidth; this.tileHeight = tileHeight; this.maxTiles = maxTiles; this.maxPolys = maxPolys; //init tiles tileSet = new Dictionary <Vector2i, List <MeshTile> >(); tileRefs = new Dictionary <MeshTile, PolyId>(); tileList = new List <MeshTile>(); //init ID generator values int tileBits = MathHelper.Log2(MathHelper.NextPowerOfTwo(maxTiles)); int polyBits = MathHelper.Log2(MathHelper.NextPowerOfTwo(maxPolys)); //only allow 31 salt bits, since salt mask is calculated using 32-bit int and it will overflow int saltBits = Math.Min(31, 32 - tileBits - polyBits); //TODO handle this in a sane way/do we need this? if (saltBits < 10) { return; } idManager = new PolyIdManager(polyBits, tileBits, saltBits); }
private MeshTile DeserializeMeshTile(JToken token, PolyIdManager manager, PolyId refId) { Vector2i location = token["location"].ToObject <Vector2i>(serializer); int layer = token["layer"].ToObject <int>(serializer); MeshTile result = new MeshTile(location, layer, manager, refId); result.Salt = token["salt"].ToObject <int>(serializer); result.Bounds = token["bounds"].ToObject <BBox3>(serializer); result.Polys = token["polys"].ToObject <Poly[]>(serializer); result.PolyCount = result.Polys.Length; result.Verts = token["verts"].ToObject <Vector3[]>(serializer); result.DetailMeshes = token["detailMeshes"].ToObject <PolyMeshDetail.MeshData[]>(serializer); result.DetailVerts = token["detailVerts"].ToObject <Vector3[]>(serializer); result.DetailTris = token["detailTris"].ToObject <PolyMeshDetail.TriangleData[]>(serializer); result.OffMeshConnections = token["offMeshConnections"].ToObject <OffMeshConnection[]>(serializer); result.OffMeshConnectionCount = result.OffMeshConnections.Length; result.BvNodeCount = token["bvNodeCount"].ToObject <int>(serializer); result.BvQuantFactor = token["bvQuantFactor"].ToObject <float>(serializer); result.WalkableClimb = token["walkableClimb"].ToObject <float>(serializer); var tree = (BVTree)FormatterServices.GetUninitializedObject(typeof(BVTree)); var treeObject = (JObject)token["bvTree"]; var nodes = treeObject.GetValue("nodes").ToObject <BVTree.Node[]>(); SetPrivateField(tree, "nodes", nodes); result.BVTree = tree; return(result); }
/// <summary> /// Initializes a new instance of the <see cref="TiledNavMesh"/> class. /// </summary> /// <param name="data">The Navigation Mesh data</param> public TiledNavMesh(NavMeshBuilder data) { this.origin = data.Header.Bounds.Min; this.tileWidth = data.Header.Bounds.Max.X - data.Header.Bounds.Min.X; this.tileHeight = data.Header.Bounds.Max.Z - data.Header.Bounds.Min.Z; this.maxTiles = 1; this.maxPolys = data.Header.PolyCount; //init tiles tileSet = new Dictionary <Vector2i, List <MeshTile> >(); tileRefs = new Dictionary <MeshTile, PolyId>(); tileList = new List <MeshTile>(); //init ID generator values int tileBits = MathHelper.Log2(MathHelper.NextPowerOfTwo(maxTiles)); int polyBits = MathHelper.Log2(MathHelper.NextPowerOfTwo(maxPolys)); //only allow 31 salt bits, since salt mask is calculated using 32-bit int and it will overflow int saltBits = Math.Min(31, 32 - tileBits - polyBits); //TODO handle this in a sane way/do we need this? if (saltBits < 10) { return; } idManager = new PolyIdManager(polyBits, tileBits, saltBits); AddTile(data); }