コード例 #1
0
 private void UpdateLinks(SubTrackNode previous, SubTrackNode next)
 {
     if (previous != null)
         previous.Next = next;
     if (next != null)
         next.Previous = previous;
 }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
        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;
        }
コード例 #4
0
 public void Add(SubTrackNode node)
 {
     _currentGroup.Add(node);
 }