Ejemplo n.º 1
0
        private IntSet32 BuildChildVisibility()
        {
            var visibility = new IntSet32();

            for (var i = 0; i < rows.Count; i++)
            {
                if (rows[i].IsVisible)
                {
                    visibility = visibility.With(i);
                }
            }
            return(visibility);
        }
Ejemplo n.º 2
0
        public void Update()
        {
            foreach (var row in rows.Where(x => x.IsVisible))
            {
                row.Update();
            }
            var newRowVisibility = BuildChildVisibility();

            if (newRowVisibility != rowVisibility)
            {
                RebuildEto();
            }
            rowVisibility = newRowVisibility;
        }
Ejemplo n.º 3
0
        public void GenerateDeterminants4x3()
        {
            for (int r1 = 0; r1 < 4; r1++)
            {
                for (int r2 = r1 + 1; r2 < 4; r2++)
                {
                    for (int c1 = 0; c1 < 4; c1++)
                    {
                        for (int c2 = c1 + 1; c2 < 4; c2++)
                        {
                            var rowSet = IntSet32.Range(0, 4).Without(r1).Without(r2);
                            int dr1    = rowSet.First();
                            int dr2    = rowSet.Last();
                            var colSet = IntSet32.Range(0, 4).Without(c1).Without(c2);
                            int dc1    = colSet.First();
                            int dc2    = colSet.Last();

                            Console.WriteLine("private float D{0}{1}{2}{3} {{ get {{ return M{4}{5} * M{6}{7} - M{4}{7} * M{6}{5}; }} }}",
                                              r1, r2, c1, c2, dr1, dc1, dr2, dc2);
                        }
                    }
                }
            }

            Console.WriteLine();

            for (int r = 0; r < 4; r++)
            {
                for (int c = 0; c < 4; c++)
                {
                    int dc         = c != 3 ? 3 : 2;
                    var drows      = IntSet32.Range(0, 4).Without(r);
                    var memberList = new List <string>();
                    foreach (int dr in drows)
                    {
                        int dr1 = System.Math.Min(r, dr);
                        int dr2 = System.Math.Max(r, dr);
                        int dc1 = System.Math.Min(c, dc);
                        int dc2 = System.Math.Max(c, dc);

                        memberList.Add(string.Format("M{0}{1} * D{2}{3}{4}{5}", dr, dc, dr1, dr2, dc1, dc2));
                    }
                    Console.WriteLine("private float D{0}{1} {{ get {{ return {2} - {3} + {4}; }} }}",
                                      r, c, memberList[0], memberList[1], memberList[2]);
                }
            }
        }
Ejemplo n.º 4
0
        public void GenerateDeterminants3x3()
        {
            for (int r = 0; r < 4; r++)
            {
                for (int c = 0; c < 4; c++)
                {
                    var rowSet = IntSet32.Range(0, 3).Without(r);
                    int dr1    = rowSet.First();
                    int dr2    = rowSet.Last();
                    var colSet = IntSet32.Range(0, 3).Without(c);
                    int dc1    = colSet.First();
                    int dc2    = colSet.Last();

                    Console.WriteLine("private float D{0}{1} {{ get {{ return M{2}{3} * M{4}{5} - M{2}{5} * M{4}{3}; }} }}",
                                      r, c, dr1, dc1, dr2, dc2);
                }
            }
        }
Ejemplo n.º 5
0
        public void TestConstruction()
        {
            var set = IntSet32.Range(7, 15).Without(11).Without(16).With(29).With(31);

            Assert.That(set.ToString(), Is.EqualTo("00000001111011110111110000000101"));
        }
Ejemplo n.º 6
0
        private void PlaceCorridors()
        {
            var occupiedLanes = new IntSet32[sg.NodeIds.Max() + 1];

            foreach (var edge in sg.Edges)
            {
                laneBuilder.StartLane(edge);
                var disambiguator       = 0;
                var commonOccupiedLanes = new IntSet32();
                if (sg.Parents[edge.First] == sg.Parents[edge.Second])
                {
                    var commonParent = sg.Parents[edge.First];
                    var startPoint   = relPositions[edge.First] + Vector3.UnitX * halfSizes[edge.First].Width;
                    var endPoint     = relPositions[edge.Second] - Vector3.UnitX * halfSizes[edge.Second].Width;

                    if (!IsMultiFloorNode(commonParent))
                    {
                        if (nodeRows[edge.Second] - nodeRows[edge.First] == 1)
                        {
                            laneBuilder.StartLaneSegment(BuildingStoryLayoutLanePartType.Immediate, true);
                            laneBuilder.AddRawPoint(startPoint);
                            laneBuilder.AddRawPoint(startPoint + Vector3.UnitX * BuildingConstants.CorridorBranchingOffset);
                            laneBuilder.AddRawPoint(endPoint - Vector3.UnitX * BuildingConstants.CorridorBranchingOffset);
                            laneBuilder.AddRawPoint(endPoint);
                            laneBuilder.EndLaneSegment(commonParent, true);
                        }
                        else
                        {
                            disambiguator = 1;
                            while (occupiedLanes[commonParent].Contains(disambiguator))
                            {
                                disambiguator++;
                            }

                            var leafChildrenOnly = !sg.Children[commonParent].SelectMany(x => sg.Children[x]).Any();
                            if (leafChildrenOnly)
                            {
                                laneBuilder.StartLaneSegment(BuildingStoryLayoutLanePartType.LongRange, true);
                                laneBuilder.AddRawPoint(startPoint);
                                laneBuilder.AddRawPoint(startPoint + Vector3.UnitX * BuildingConstants.CorridorBranchingOffset);
                                laneBuilder.AddRawPoint(new Vector3(startPoint.X + BuildingConstants.WidthMargin - BuildingConstants.CorridorBranchingOffset, startPoint.Y, 0));
                                laneBuilder.AddRawPoint(new Vector3(endPoint.X - BuildingConstants.WidthMargin + BuildingConstants.CorridorBranchingOffset, startPoint.Y, 0));
                                laneBuilder.AddRawPoint(endPoint - Vector3.UnitX * BuildingConstants.CorridorBranchingOffset);
                                laneBuilder.AddRawPoint(endPoint);
                                laneBuilder.EndLaneSegment(commonParent, true);
                                occupiedLanes[commonParent] = occupiedLanes[commonParent].With(disambiguator);
                            }
                            else
                            {
                                laneBuilder.StartLaneSegment(BuildingStoryLayoutLanePartType.LongRange, true);
                                laneBuilder.AddRawPoint(startPoint);
                                laneBuilder.AddRawPoint(startPoint + Vector3.UnitX * BuildingConstants.CorridorBranchingOffset);
                                laneBuilder.AddRawPoint(new Vector3(startPoint.X + BuildingConstants.WidthMargin - BuildingConstants.CorridorBranchingOffset, startPoint.Y, 0));
                                laneBuilder.AddRawPoint(new Vector3(startPoint.X + BuildingConstants.WidthMargin, startPoint.Y, 0));
                                laneBuilder.EndLaneSegment(commonParent, false);

                                laneBuilder.StartLaneSegment(BuildingStoryLayoutLanePartType.LongRange, false);
                                laneBuilder.AddRawPoint(new Vector3(endPoint.X - BuildingConstants.WidthMargin, startPoint.Y, 0));
                                laneBuilder.AddRawPoint(new Vector3(endPoint.X - BuildingConstants.WidthMargin + BuildingConstants.CorridorBranchingOffset, startPoint.Y, 0));
                                laneBuilder.AddRawPoint(endPoint - Vector3.UnitX * BuildingConstants.CorridorBranchingOffset);
                                laneBuilder.AddRawPoint(endPoint);
                                laneBuilder.EndLaneSegment(commonParent, true);

                                occupiedLanes[commonParent] = occupiedLanes[commonParent].With(disambiguator);
                            }
                        }
                    }
                    else
                    {
                        disambiguator = 1;
                        while (occupiedLanes[commonParent].Contains(disambiguator))
                        {
                            disambiguator++;
                        }

                        var floorDistance = nodeRows[edge.Second] - nodeRows[edge.First];
                        laneBuilder.StartLaneSegment(BuildingStoryLayoutLanePartType.LongRange, true);
                        laneBuilder.AddRawPoint(startPoint);
                        laneBuilder.AddRawPoint(new Vector3(halfSizes[commonParent].Width, startPoint.Y, startPoint.Z));
                        laneBuilder.AddRawPoint(new Vector3(halfSizes[commonParent].Width, startPoint.Y, -halfSizes[commonParent].Depth - BuildingConstants.StairsDistance * (floorDistance + 1)));
                        laneBuilder.AddRawPoint(new Vector3(halfSizes[commonParent].Width, endPoint.Y, -halfSizes[commonParent].Depth - BuildingConstants.StairsDistance * (floorDistance + 1)));
                        laneBuilder.AddRawPoint(new Vector3(halfSizes[commonParent].Width, endPoint.Y, endPoint.Z));
                        laneBuilder.AddRawPoint(endPoint);
                        laneBuilder.EndLaneSegment(commonParent, true);
                    }
                }
                else
                {
                    var commonParent       = sg.GetCommonParent(edge.First, edge.Second);
                    var laneContainerNodes = new List <int>();

                    var descendingNodes = new Stack <int>();
                    {
                        var descNode = edge.Second;
                        while (descNode != commonParent)
                        {
                            descendingNodes.Push(descNode);
                            descNode = sg.Parents[descNode];
                        }
                    }

                    var node = edge.First;
                    while (sg.Parents[node] != commonParent)
                    {
                        var parent = sg.Parents[node];
                        commonOccupiedLanes = commonOccupiedLanes.Union(occupiedLanes[parent]);
                        laneContainerNodes.Add(parent);
                        var nodeLoc         = node;
                        var transitSiblings = sg.Children[parent].Where(x => relPositions[x].Z == 0f && nodeRows[nodeLoc] < nodeRows[x]);
                        foreach (var transitSibling in transitSiblings)
                        {
                            commonOccupiedLanes = commonOccupiedLanes.Union(occupiedLanes[transitSibling]);
                            laneContainerNodes.Add(transitSibling);
                        }
                        var startPoint = relPositions[node] + Vector3.UnitX * halfSizes[node].Width;
                        laneBuilder.StartLaneSegment(BuildingStoryLayoutLanePartType.InterNode, node == edge.First);
                        laneBuilder.AddRawPoint(startPoint);
                        laneBuilder.AddRawPoint(startPoint + Vector3.UnitX * BuildingConstants.CorridorBranchingOffset);
                        laneBuilder.AddRawPoint(new Vector3(startPoint.X + BuildingConstants.WidthMargin - BuildingConstants.CorridorBranchingOffset, startPoint.Y, 0));
                        laneBuilder.AddRawPoint(new Vector3(halfSizes[parent].Width, startPoint.Y, 0));
                        laneBuilder.EndLaneSegment(parent, false);
                        node = sg.Parents[node];
                    }

                    {
                        var topLevelChildFirst  = node;
                        var topLevelChildSecond = descendingNodes.Pop();
                        commonOccupiedLanes = commonOccupiedLanes.Union(occupiedLanes[commonParent]);
                        laneContainerNodes.Add(commonParent);

                        var startPoint = relPositions[topLevelChildFirst] + Vector3.UnitX * halfSizes[topLevelChildFirst].Width;
                        var endPoint   = relPositions[topLevelChildSecond] - Vector3.UnitX * halfSizes[topLevelChildSecond].Width;

                        if (!IsMultiFloorNode(commonParent))
                        {
                            if (nodeRows[topLevelChildSecond] - nodeRows[topLevelChildFirst] == 1)
                            {
                                laneBuilder.StartLaneSegment(BuildingStoryLayoutLanePartType.InterNode, false);
                                laneBuilder.AddRawPoint(startPoint);
                                laneBuilder.AddRawPoint(startPoint + Vector3.UnitX * BuildingConstants.CorridorBranchingOffset);
                                laneBuilder.AddRawPoint(endPoint - Vector3.UnitX * BuildingConstants.CorridorBranchingOffset);
                                laneBuilder.AddRawPoint(endPoint);
                                laneBuilder.EndLaneSegment(commonParent, false);
                            }
                            else
                            {
                                var transitSiblings = sg.Children[commonParent].Where(x => relPositions[x].Z == 0f && nodeRows[topLevelChildFirst] < nodeRows[x] && nodeRows[x] < nodeRows[topLevelChildSecond]);
                                foreach (var transitSibling in transitSiblings)
                                {
                                    commonOccupiedLanes = commonOccupiedLanes.Union(occupiedLanes[transitSibling]);
                                    laneContainerNodes.Add(transitSibling);
                                }

                                laneBuilder.StartLaneSegment(BuildingStoryLayoutLanePartType.InterNode, false);
                                laneBuilder.AddRawPoint(startPoint);
                                laneBuilder.AddRawPoint(startPoint + Vector3.UnitX * BuildingConstants.CorridorBranchingOffset);
                                laneBuilder.AddRawPoint(new Vector3(startPoint.X + BuildingConstants.WidthMargin - BuildingConstants.CorridorBranchingOffset, startPoint.Y, 0));
                                laneBuilder.AddRawPoint(new Vector3(endPoint.X - BuildingConstants.WidthMargin + BuildingConstants.CorridorBranchingOffset, startPoint.Y, 0));
                                laneBuilder.AddRawPoint(endPoint - Vector3.UnitX * BuildingConstants.CorridorBranchingOffset);
                                laneBuilder.AddRawPoint(endPoint);
                                laneBuilder.EndLaneSegment(commonParent, false);
                            }
                        }
                        else
                        {
                            var revStartPoint = new Vector3(-startPoint.X, startPoint.Y, startPoint.Z);
                            var revEndPoint   = new Vector3(-endPoint.X, endPoint.Y, endPoint.Z);

                            var floorDistance = nodeRows[topLevelChildSecond] - nodeRows[topLevelChildFirst];
                            laneBuilder.StartLaneSegment(BuildingStoryLayoutLanePartType.Elevator, false);
                            if (!isReversed[topLevelChildFirst])
                            {
                                laneBuilder.AddRawPoint(startPoint);
                                laneBuilder.AddRawPoint(startPoint + Vector3.UnitX * BuildingConstants.ElevatorOffset);
                            }
                            else
                            {
                                laneBuilder.AddRawPoint(revStartPoint);
                                laneBuilder.AddRawPoint(revStartPoint - Vector3.UnitX * BuildingConstants.ElevatorOffset);
                            }

                            if (!isReversed[topLevelChildSecond])
                            {
                                if (!isReversed[topLevelChildFirst])
                                {
                                    laneBuilder.AddRawPoint(revEndPoint + Vector3.UnitX * BuildingConstants.ElevatorOffset);
                                    laneBuilder.AddRawPoint(revEndPoint);
                                    laneBuilder.AddRawPoint(endPoint);
                                }
                                else
                                {
                                    laneBuilder.AddRawPoint(endPoint - Vector3.UnitX * BuildingConstants.ElevatorOffset);
                                    laneBuilder.AddRawPoint(endPoint);
                                }
                            }
                            else
                            {
                                if (!isReversed[topLevelChildFirst])
                                {
                                    laneBuilder.AddRawPoint(revEndPoint + Vector3.UnitX * BuildingConstants.ElevatorOffset);
                                    laneBuilder.AddRawPoint(revEndPoint);
                                }
                                else
                                {
                                    laneBuilder.AddRawPoint(endPoint - Vector3.UnitX * BuildingConstants.ElevatorOffset);
                                    laneBuilder.AddRawPoint(endPoint);
                                    laneBuilder.AddRawPoint(revEndPoint);
                                }
                            }
                            laneBuilder.EndLaneSegment(commonParent, false);
                        }
                    }

                    while (descendingNodes.Any())
                    {
                        node = descendingNodes.Pop();
                        var parent = sg.Parents[node];
                        commonOccupiedLanes = commonOccupiedLanes.Union(occupiedLanes[parent]);
                        laneContainerNodes.Add(parent);
                        var nodeLoc         = node;
                        var transitSiblings = sg.Children[parent].Where(x => relPositions[x].Z == 0f && nodeRows[x] < nodeRows[nodeLoc]);
                        foreach (var transitSibling in transitSiblings)
                        {
                            commonOccupiedLanes = commonOccupiedLanes.Union(occupiedLanes[transitSibling]);
                            laneContainerNodes.Add(transitSibling);
                        }

                        var endPoint = relPositions[node] - Vector3.UnitX * halfSizes[node].Width;
                        laneBuilder.StartLaneSegment(BuildingStoryLayoutLanePartType.InterNode, false);
                        laneBuilder.AddRawPoint(new Vector3(-halfSizes[parent].Width, endPoint.Y, 0));
                        laneBuilder.AddRawPoint(new Vector3(endPoint.X - BuildingConstants.WidthMargin + BuildingConstants.CorridorBranchingOffset, endPoint.Y, 0));
                        laneBuilder.AddRawPoint(new Vector3(endPoint.X - BuildingConstants.CorridorBranchingOffset, endPoint.Y, endPoint.Z));
                        laneBuilder.AddRawPoint(endPoint);
                        laneBuilder.EndLaneSegment(parent, node == edge.Second);
                    }

                    disambiguator = 1;
                    while (commonOccupiedLanes.Contains(disambiguator))
                    {
                        disambiguator++;
                    }

                    foreach (var laneContainerNode in laneContainerNodes)
                    {
                        occupiedLanes[laneContainerNode] = occupiedLanes[laneContainerNode].With(disambiguator);
                    }
                }
                laneBuilder.EndLane(disambiguator);
            }
        }