Exemplo n.º 1
0
        /// <summary>
        /// Returns a list of outdoor cells within visible range of player
        /// </summary>
        public List <ObjCell> GetOutdoorCells(ObjCell cell)
        {
            // get cell x/y global offset
            var lcoord = LandDefs.get_outside_lcoord(cell.ID, PhysicsObj.Position.Frame.Origin.X, PhysicsObj.Position.Frame.Origin.Y).Value;

            // includes the origin cell
            var blockLength = (int)CellRadiusOutside * 2 + 1;
            var cells       = new List <ObjCell>(/*blockLength * blockLength*/);

            var start = new Vector2(lcoord.X - CellRadiusOutside, lcoord.Y - CellRadiusOutside);
            var end   = new Vector2(lcoord.X + CellRadiusOutside, lcoord.Y + CellRadiusOutside);

            for (var cellX = start.X; cellX <= end.X; cellX++)
            {
                for (var cellY = start.Y; cellY <= end.Y; cellY++)
                {
                    var blockCellID = LandDefs.lcoord_to_gid(cellX, cellY);
                    var _cell       = LScape.get_landcell((uint)blockCellID);
                    if (_cell == null)
                    {
                        continue;
                    }
                    cells.Add(_cell);

                    // does this outdoor cell contain a building?
                    // if so, add all of its cells
                    var landCell = _cell as LandCell;
                    if (landCell.has_building())
                    {
                        //Console.WriteLine($"Found building in cell {landCell.ID:X8}");
                        var buildingCells = landCell.Building.get_building_cells();
                        //Console.WriteLine("# cells: " + buildingCells.Count);
                        cells.AddRange(buildingCells);
                    }
                }
            }
            return(cells);
        }
Exemplo n.º 2
0
        public void ConstructPolygons(uint landblockID)
        {
            var lcoord = LandDefs.blockid_to_lcoord(landblockID).Value;

            var polyNum   = 1;
            var seedA     = (uint)((int)lcoord.X * LandDefs.VertexPerCell * 214614067);
            var seedB     = (uint)((int)lcoord.X * LandDefs.VertexPerCell * 1109124029);
            var vertexCnt = 0;

            for (var x = 0; x < SideCellCount; x++)
            {
                var lcoordX      = lcoord.X + x;
                var originY      = 1;
                var colVertexCnt = 0;
                var originX      = polyNum;

                for (var y = 0; y < SideCellCount; y++)
                {
                    var lcoordY = (int)lcoord.Y + y;
                    var magicB  = seedB;
                    var magicA  = seedA + 1813693831;

                    for (var i = 0; i < LandDefs.VertexPerCell; i++)
                    {
                        var idxI = vertexCnt + i;
                        var idxJ = colVertexCnt;

                        for (var j = 0; j < LandDefs.VertexPerCell; j++)
                        {
                            var splitDir = (uint)(((int)lcoord.Y * LandDefs.VertexPerCell + idxJ) * magicA - magicB - 1369149221);
                            var polyIdx  = (LandDefs.VertexPerCell * i + j) * 2;

                            var cellIdx     = x * SideCellCount + y;
                            var vertIdx     = idxI * SideVertexCount + idxJ;
                            var firstVertex = (idxI * SidePolyCount + idxJ) * 2;
                            var nextVertIdx = (idxI + 1) * SideVertexCount + idxJ;

                            var lcell = (LandCell)LandCells[cellIdx];

                            if (splitDir * 2.3283064e-10 < 0.5f)
                            {
                                //  2    1---0
                                //  | \   \  |
                                //  |  \   \ |
                                //  0---1    2

                                SWtoNEcut[cellIdx] = false;

                                lcell.Polygons[polyIdx]     = AddPolygon(firstVertex, vertIdx, nextVertIdx, vertIdx + 1);
                                lcell.Polygons[polyIdx + 1] = AddPolygon(firstVertex + 1, nextVertIdx + 1, vertIdx + 1, nextVertIdx);
                            }
                            else
                            {
                                //     2   2---1
                                //    / |  |  /
                                //   /  |  | /
                                //  0---1  0

                                SWtoNEcut[cellIdx] = true;

                                lcell.Polygons[polyIdx]     = AddPolygon(firstVertex, vertIdx, nextVertIdx, nextVertIdx + 1);
                                lcell.Polygons[polyIdx + 1] = AddPolygon(firstVertex + 1, vertIdx, nextVertIdx + 1, vertIdx + 1);
                            }
                            idxJ++;
                        }
                        magicA += 214614067;
                        magicB += 1109124029;
                    }

                    var cellID   = (uint)LandDefs.lcoord_to_gid(lcoordX, lcoordY);
                    var landCell = LandCells[x * SideCellCount + y];
                    landCell.ID                 = cellID;
                    landCell.Pos.ObjCellID      = cellID;
                    landCell.Pos.Frame.Origin.X = originX * LandDefs.HalfSquareLength;
                    landCell.Pos.Frame.Origin.Y = originY * LandDefs.HalfSquareLength;

                    originY      += 2;
                    colVertexCnt += LandDefs.VertexPerCell;
                }
                vertexCnt += LandDefs.VertexPerCell;
                seedB     += 1109124029 * (uint)LandDefs.VertexPerCell;
                seedA     += 214614067 * (uint)LandDefs.VertexPerCell;
                polyNum   += 2;
            }
        }