public static bool Build(TileRect rect, out PreciseSectorRows tiles) { Span <int> xList = stackalloc int[5]; var xSize = build_clamped_tile_coordlist(rect.x1, rect.x2 + 1, 64, xList); var xSizeMin1 = xSize - 1; if (xSize == 1) { tiles = default; return(false); } Span <int> yList = stackalloc int[5]; var ySize = build_clamped_tile_coordlist(rect.y1, rect.y2 + 1, 64, yList) - 1; if (ySize <= 0) { tiles = default; return(false); } tiles = new PreciseSectorRows(); tiles.Init(); var v17 = 0; var v18 = ySize; do { var deltaY = yList[v17 + 1] - yList[v17]; tiles.Rows[v17].colCount = 0; tiles.Rows[v17].field_68 = deltaY; var v14 = 0; if (xSizeMin1 > 0) { do { tiles.Rows[v17].Tiles[v14] = new locXY(xList[v14], yList[v17]); tiles.Rows[v17].sectors[v14] = new SectorLoc(tiles.Rows[v17].Tiles[v14]); tiles.Rows[v17].startTiles[v14] = Sector.GetSectorTileIndex(xList[v14], yList[v17]); tiles.Rows[v17].strides[v14] = xList[v14 + 1] - xList[v14]; v14++; } while (v14 < xSizeMin1); } tiles.Rows[v17].colCount = xSizeMin1; v17++; v18--; } while (v18 > 0); tiles.RowCount = ySize; return(true); }
public void TestRaycast() { var origin = new LocAndOffsets(new locXY(496, 458), -9.42809f, -8.42809f); var target = new LocAndOffsets(new locXY(512, 611), -7.42809f, -7.42809f); var radius = 17.5f; var ray_search = new RaycastPointSearchPacket(); ray_search.origin = origin.ToInches2D(); ray_search.target = target.ToInches2D(); ray_search.radius = radius; ray_search.direction = ray_search.target - ray_search.origin; ray_search.rangeInch = ray_search.direction.Length(); ray_search.direction /= ray_search.rangeInch; ray_search.absOdotU = Vector2.Dot(ray_search.direction, ray_search.origin); var locBeforeCover = target; SearchPointAlongRay search_func = RaycastPacket.IsPointCloseToSegment; var tileRadius = 1 + (int)(radius / locXY.INCH_PER_TILE); TestContext.Out.WriteLine(tileRadius.ToString()); var tile_rect = RaycastPacket.BuildSearchRectangle(ray_search.origin, ray_search.target); var canFly = false; foreach (var s in tile_rect) { //int left = Math.Max(0, s.TileRectangle.Left - tileRadius); //int top = Math.Max(0, s.TileRectangle.Top - tileRadius); //int right = Math.Min(64, s.TileRectangle.Right + tileRadius); //int bottom = Math.Min(64, s.TileRectangle.Bottom + tileRadius); int left = s.TileRectangle.Left; int top = s.TileRectangle.Top; int right = s.TileRectangle.Right; int bottom = s.TileRectangle.Bottom; TestContext.Out.WriteLine($"{s.SectorLoc.X} {s.SectorLoc.Y} {left},{top} {right},{bottom}"); } TestContext.Out.WriteLine("OLD OLD OLD"); if (!PreciseSectorRows.Build(tile_rect, out var sector_tiles)) { return; } var local_254 = Math.Min(origin.location.locx, target.location.locx); var local_25c = Math.Max(origin.location.locx, target.location.locx); var local_2a4 = Math.Min(origin.location.locy, target.location.locy); var local_2b4 = Math.Max(origin.location.locy, target.location.locy); /* * local_254 -= tileRadius; * local_2a4 -= tileRadius; * local_25c += tileRadius; * local_2b4 += tileRadius; */ for (var local_2dc = 0; local_2dc < sector_tiles.RowCount; local_2dc++) { ref var pPVar2 = ref sector_tiles.Rows[local_2dc]; Span <int> local_208 = stackalloc int[pPVar2.colCount]; Span <int> local_1d8 = stackalloc int[pPVar2.colCount]; for (var i = 0; i < pPVar2.colCount; i++) { local_208[i] = pPVar2.startTiles[i]; local_1d8[i] = 64 - pPVar2.strides[i]; } for (var local_2f0 = 0; local_2f0 < pPVar2.colCount; local_2f0++) { var sectorBaseTile = pPVar2.sectors[local_2f0].GetBaseTile(); var sectorTileMinX = local_254 - sectorBaseTile.locx; var sectorTileMaxX = local_25c - sectorBaseTile.locx; var sectorTileMinY = local_2a4 - sectorBaseTile.locy; var sectorTileMaxY = local_2b4 - sectorBaseTile.locy; if (sectorTileMinX < 0) { sectorTileMinX = 0; } if (sectorTileMinY < 0) { sectorTileMinY = 0; } if (sectorTileMaxX > 63) { sectorTileMaxX = 63; } if (sectorTileMaxY > 63) { sectorTileMaxY = 63; } TestContext.Out.WriteLine($"{pPVar2.sectors[local_2f0].X} {pPVar2.sectors[local_2f0].Y} {sectorTileMinX},{sectorTileMinY}->{sectorTileMaxX},{sectorTileMaxY}"); } }