private void UpdateLinks(SubTrackNode previous, SubTrackNode next) { if (previous != null) previous.Next = next; if (next != null) next.Previous = previous; }
private void CreateTrackGroups(IList<SubTrackNode> trackNodes, IList<SplittedRegion> splitRegions) { SubTrackBuilder lastStBuilder = null; for (int i = 0; i < trackNodes.Count; i += 1) { SubTrackNode node = trackNodes[i]; SubTrackBuilder stBuilder = NextTrackBuilder(node.Position, splitRegions); SplittedRegion bounds = stBuilder.SplitRegion; if ((lastStBuilder != stBuilder) && (lastStBuilder != null)) { stBuilder.NextGroup(); SubTrackNode previousNode = trackNodes[i - 1]; Vector3 actualPrevPos = previousNode.Position + GetOffset(node.Forward); Vector3 actualIntersectPos = bounds.ToAxisAlignedBounds().ClosestPoint(actualPrevPos); Vector3 intersectPos = actualIntersectPos - new Vector3(0.5f, 0.5f, 0.5f) + node.Forward / 2f; if ((intersectPos != previousNode.Position) || (intersectPos != node.Position)) { bool intersectsPrev = intersectPos == previousNode.Position; bool intersectsNext = intersectPos == node.Position; if (intersectsPrev && !intersectsNext) { stBuilder.Add(previousNode); UpdateLinks(previousNode, node); } else if (intersectsNext && !intersectsPrev) { lastStBuilder.Add(node); UpdateLinks(previousNode, node); } else { SubTrackNode intersectNode = new SubTrackNode(intersectPos, previousNode.Forward, previousNode.Down); UpdateLinks(intersectNode, node); UpdateLinks(previousNode, intersectNode); lastStBuilder.Add(intersectNode); stBuilder.Add(intersectNode); } } } stBuilder.Add(node); lastStBuilder = stBuilder; } }
public List<SubTrackNode> Build(Track track) { List<SubTrackNode> stNodes = new List<SubTrackNode>(); XmlTrackNode[] nodes = track.Nodes; if (nodes.Length < 2) return new List<SubTrackNode>(); SubTrackNode previousStNode = null; Vector3 down = track.Down; Vector3 lastForward = GetStartForward(track); for (int i = 0; i < nodes.Length; i++) { Vector3 forward = i > 0 ? GetDirection(nodes[i - 1].Position, nodes[i].Position) : lastForward; Vector3 nextForward = i < nodes.Length - 1 ? GetDirection(nodes[i].Position, nodes[i + 1].Position) : forward; down = GetNextDownDirection(forward, lastForward, down); lastForward = forward; SubTrackNode stNode = new SubTrackNode(nodes[i].Position, forward, down); stNodes.Add(stNode); UpdateLinks(previousStNode, stNode); previousStNode = stNode; // create a duplicate corner node if required if (Vector3.Angle(forward, nextForward) > 0.1f) { down = GetNextDownDirection(nextForward, lastForward, down); lastForward = nextForward; SubTrackNode cornerNode = new SubTrackNode(nodes[i].Position, nextForward, down); stNodes.Add(cornerNode); UpdateLinks(stNode, cornerNode); previousStNode = cornerNode; } } return stNodes; }
public void Add(SubTrackNode node) { _currentGroup.Add(node); }