Exemple #1
0
        private static List <SubsectorEdge> CreateSubsectorEdges(ConvexTraversal convexTraversal, Rotation rotation)
        {
            List <ConvexTraversalPoint> traversal = convexTraversal.Traversal;

            Debug.Assert(traversal.Count >= 3, "Traversal must yield at least a triangle in size");

            List <SubsectorEdge> subsectorEdges = new List <SubsectorEdge>();

            ConvexTraversalPoint firstTraversal = traversal.First();
            Vec2D startPoint = firstTraversal.Vertex;

            foreach (ConvexTraversalPoint traversalPoint in traversal)
            {
                BspSegment segment            = traversalPoint.Segment;
                Vec2D      endingPoint        = segment.Opposite(traversalPoint.Endpoint).Struct();
                bool       traversedFrontSide = CheckIfTraversedFrontSide(traversalPoint, rotation);

                SubsectorEdge edge = new SubsectorEdge(startPoint, endingPoint, segment.Line.Value, traversedFrontSide);
                subsectorEdges.Add(edge);

                Debug.Assert(startPoint != endingPoint, "Traversal produced the wrong endpoint indices");
                startPoint = endingPoint;
            }

            Debug.Assert(subsectorEdges.Count == traversal.Count, "Added too many subsector edges in traversal");
            return(subsectorEdges);
        }
Exemple #2
0
        /// <summary>
        /// Takes the convex traversal that was done and adds it to the top BSP
        /// node on the stack. This effectively creates the subsector.
        /// </summary>
        private void AddConvexTraversalToTopNode()
        {
            Debug.Assert(!workItems.Empty(), "Cannot add convex traversal to an empty work item stack");

            ConvexTraversal      traversal = ConvexChecker.States.ConvexTraversal;
            Rotation             rotation  = ConvexChecker.States.Rotation;
            List <SubsectorEdge> edges     = SubsectorEdge.FromClockwiseTraversal(traversal, rotation);

            workItems.Peek().Node.ClockwiseEdges = edges;
        }
Exemple #3
0
        /// <summary>
        /// Using the convex traversal and the rotation of the traversal, this
        /// will create a clockwise traversal to form the final subsector for
        /// a BSP node.
        /// </summary>
        /// <param name="convexTraversal">The traversal we did earlier that
        /// resulted in a convex subsector.</param>
        /// <param name="rotation">What direction that traversal went.</param>
        /// <returns>A convex series of sequential subsector edges that make up
        /// the closed subsector.</returns>
        public static List <SubsectorEdge> FromClockwiseTraversal(ConvexTraversal convexTraversal, Rotation rotation)
        {
            List <SubsectorEdge> edges = CreateSubsectorEdges(convexTraversal, rotation);

            if (rotation == Rotation.Left)
            {
                edges.ForEach(edge => edge.Reverse());
                edges.Reverse();
            }

            // TODO: Assert valid subsector edges!
            return(edges);
        }