public void ApplyModification(TerrainModification mod)
{
TerrainModified?.Invoke(this, mod);
// Compute bounding box
int tlx = (int)Math.Floor(mod.X - mod.Radius);
int tly = (int)Math.Floor(mod.Y - mod.Radius);
int brx = (int)Math.Ceiling(mod.X + mod.Radius);
int bry = (int)Math.Ceiling(mod.Y + mod.Radius);
// Clamp to world boundaries
tlx = Math.Min(Math.Max(0, tlx), width - 1);
tly = Math.Min(Math.Max(0, tly), height - 1);
brx = Math.Min(Math.Max(0, brx), width - 1);
bry = Math.Min(Math.Max(0, bry), height - 1);
// Iterate over bounding box part of bitmap
for (int j = tly; j < bry; ++j)
{
for (int i = tlx; i < brx; ++i)
{
if (Distance(i, j, mod.X, mod.Y) > mod.Radius)
continue;
TerrainType cur = PublicShape.TerrainBitmap[i, j];
if (cur == TerrainType.Earth || cur == TerrainType.Sand)
{
if (mod.Subtract)
PublicShape.TerrainBitmap[i, j] = TerrainType.Air;
else
PublicShape.TerrainBitmap[i, j] = TerrainType.Earth;
}
}
}
// Let sand "fall down" etc.
UpdateTerrain(tly, tlx, brx);
WorkingRevision++;
}