/// <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); }
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; } }