private static void BakeGround(SceneInfo scene, Stopwatch timer, SceneGeometry geometry) { var initTime = new TimeDif(timer); var tempTime = new TimeDif(timer); var nodes = scene.groundNodes; Log.Message($"Vanilla nodes: {nodes.nodes.Length}"); Log.Message($"Vanilla links: {nodes.links.Length}"); timer.Start(); geometry.AddToNavmesh(); var triang = NavMesh.CalculateTriangulation(); timer.Stop(); Log.Warning($"Triangulation: {timer.TimeSince(ref tempTime)}"); Log.Message($"Triangulation vert: {triang.vertices.Length}"); Log.Message($"Triangulation inds: {triang.indices.Length}"); timer.Start(); var verts = triang.vertices; var newNodes = new Array <NodeGraph.Node>(verts.Length); for (var i = newNodes.zero; i < newNodes.length; ++i) { newNodes[i] = new NodeGraph.Node { position = verts[(Int32)i], lineOfSightMask = new SerializableBitArray(0), flags = NodeFlags.TeleporterOK, forbiddenHulls = HullMask.None, linkListIndex = new NodeGraph.LinkListIndex { index = -1, size = 0, }, }; } timer.Stop(); Log.Warning($"Nodes init: {timer.TimeSince(ref tempTime)}"); timer.Start(); var tris = new TriangleArray(triang.indices); var newLinks = new Array <NodeGraph.Link>((Int32)tris.length * 6); var curIndex = newLinks.zero; for (var ind = tris.zero; ind < tris.length; ++ind) { var tri = tris[ind]; newLinks[curIndex++] = tri.ab; newLinks[curIndex++] = tri.ac; newLinks[curIndex++] = tri.ba; newLinks[curIndex++] = tri.bc; newLinks[curIndex++] = tri.ca; newLinks[curIndex++] = tri.cb; } timer.Stop(); Log.Warning($"Links init: {timer.TimeSince(ref tempTime)}"); timer.Start(); // HACK: Use a better structure for links when they are first generated and sort by an icomparable impl Array.Sort(newLinks._data, (a, b) => a.nodeIndexA.nodeIndex - b.nodeIndexA.nodeIndex); timer.Stop(); Log.Warning($"Link sort: {timer.TimeSince(ref tempTime)}"); timer.Start(); for (var i = newLinks.zero; i < newLinks.length; ++i) { var link = newLinks[i]; newNodes[(Array <NodeGraph.Node> .Index)link.nodeIndexA.nodeIndex].IncCounter(i); } timer.Stop(); Log.Warning($"Link index assignment: {timer.TimeSince(ref tempTime)}"); if (newNodes._data.Length > 0 && newLinks._data.Length > 0) { nodes.nodes = newNodes._data; nodes.links = newLinks._data; } else { Log.Fatal("Links or nodes failed to generate"); } Log.Message($"New nodes count: {newNodes.length}"); Log.Message($"New links count: {newLinks.length}"); geometry.RemoveFromNavmesh(); }
public NodeStep(NodeGraph.Node decoratedObject) { DecoratedNode = decoratedObject; DefaultLength = (int)RenderSettings.fogEndDistance / 5; }