Esempio n. 1
0
        void fill(Room room, PropUnitCollection propUnitCollection, GameObject parent)
        {
            var points    = propUnitCollection.getListOfPoints();
            var neighbors = new List <Vector3>();


            foreach (Vector3 v in points)
            {
                var cell  = room.cells[v];
                var walls = cell.findWallWithAttribute(FaceTypes.WALL);
                foreach (Shape s in walls)
                {
                    neighbors.Add(s.normal.normalized);
                }

                foreach (Vector3 v0 in VoxelIterators.VonNeumanNeighbors())
                {
                    var v2 = v + v0;
                    if (grid.ContainsKey(v2) && grid[v2].C == Color.white)
                    {
                        neighbors.Add(v0);
                    }
                }
            }

            Vector3 horizontal;

            if (neighbors.Count == 0)
            {
                horizontal = Vector3.right;
            }
            else
            {
                var grouping  = neighbors.GroupBy(a => a.GetHashCode());
                var groupList = grouping.OrderByDescending(b => b.Count());
                horizontal = groupList.First().First();
            }

            foreach (PropUnit propUnit in propUnitCollection.list)
            {
                var center   = propUnit.b.center;
                var vertical = Vector3.forward;
                var prop     = GameObject.Instantiate(propUnit.overlay.prop);
                Aligner.AlignBoundingBoxFaceToBoundingBoxFace(horizontal, vertical, propUnit.b, prop);
                prop.transform.parent = parent.transform;
            }
        }
Esempio n. 2
0
 public bool Equals(PropUnitCollection other)
 {
     return(object.Equals(this.list, other.list));
 }
Esempio n. 3
0
        bool recurse(int iter, Vector3 direction, Vector3 p, Quaternion rotation, PropOverlay overlay, Room room, PropUnitCollection propUnitCollection)
        {
            if (iter == 0)
            {
                return(true);
            }



            var size   = rotation * overlay.size;
            var points = new List <Vector3>();
            var allocateBlackSpaceSucceeded = allocateBlackSpace(room, overlay, size, p, points);


            var totalblack = getListOfPointsOfColor(Color.black).ConvertAll(x => x.V).ToList();


            totalblack.AddRange(propUnitCollection.getListOfPoints());
            var totalWhite = grid.Keys.Except(totalblack).ToList();
            var islegal    = check(grid.Keys.ToList(), totalWhite, totalblack);

            if (!islegal)
            {
                GameObject.Instantiate(g3).transform.position = p;
                grid[p].changeColor(Color.white);
                return(false);
            }

            if (!allocateBlackSpaceSucceeded || points.Count == 0)
            {
                return(true);
            }

            var propUnit = new PropUnit(points, overlay);

            propUnitCollection.list.Add(propUnit);


            recurse(iter - 1, direction, p + direction, rotation, overlay, room, propUnitCollection);

            return(true);
        }
Esempio n. 4
0
        public List <PropUnitCollection> partitionSpace(Room room)
        {
            var rects     = new Dictionary <Rect, PropOverlay>();
            var POG       = propOverlays[0].propOverlays;
            var propQueue = new Queue <PropOverlay>(POG);
            var output    = new List <PropUnitCollection>();

            var list = getListOfPointsOfColor(Color.grey);

            list = list.OrderByDescending(x => x.value).ToList();
            var queue = new Queue <GridUnit>(list);

            for (int q = 0; q < cutoff; q++)
            {
                if (list.Count == 0)
                {
                    break;
                }
                var gU = queue.Dequeue();
                var p  = gU.V;
                queue.Enqueue(gU);


                PropOverlay overlay = propQueue.Peek();

                if (!overlay.highPriority)
                {
                    propQueue.Dequeue();
                    propQueue.Enqueue(overlay);
                }

                int iter = 1;
                if (overlay.extendable)
                {
                    iter = r.Next(3, 6);
                }

                List <PropUnitCollection> possibilities = new List <PropUnitCollection>();
                foreach (Vector3 direction in VoxelIterators.VonNeumanNeighbors())
                {
                    var d2    = new Vector3(direction.x * overlay.size.x, direction.y * overlay.size.y, direction.z * overlay.size.z);
                    var rot   = Quaternion.identity;
                    var black = new PropUnitCollection();
                    if (recurse(iter, d2, p, rot, overlay, room, black) && black.list.Count > 0)
                    {
                        possibilities.Add(black);
                    }
                }
                possibilities = possibilities.OrderByDescending(x => x.list.Count).ToList();
                if (possibilities.Count > 0)
                {
                    var first = possibilities.First();
                    var black = first.getListOfPoints();
                    if (black.Count > 0)
                    {
                        output.Add(first);
                        commitColorChangeToGrid(black, Color.black);
                        var whitespace = new List <Vector3>();
                        allocateWhiteSpace(black, whitespace);
                        commitColorChangeToGrid(whitespace, Color.white);

                        list  = getListOfPointsOfColor(Color.grey);
                        list  = list.OrderByDescending(x => x.value).ToList();
                        queue = new Queue <GridUnit>(list);
                    }

                    if (overlay.highPriority)
                    {
                        propQueue.Dequeue();
                    }
                }
            }
            //foreach (GridUnit v in getListOfPointsOfColor(Color.white)) GameObject.Instantiate(g1).transform.position = v.V;
            //foreach (GridUnit v in getListOfPointsOfColor(Color.black)) GameObject.Instantiate(g2).transform.position = v.V;


            return(output);
        }