Ejemplo 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;
            }
        }
Ejemplo n.º 2
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);
        }