public override void NotifyCamera(Camera cam, PagedWorldSection section)
{
var stratData = (Grid2DPageStrategyData)section.StrategyData;
Vector3 pos = cam.DerivedPosition;
Vector2 gridpos = Vector2.Zero;
stratData.ConvertWorldToGridSpace(pos, ref gridpos);
int x, y;
stratData.DetermineGridLocation(gridpos, out x, out y);
Real loadRadius = stratData.LoadRadiusInCells;
Real holdRadius = stratData.HoldRadiusInCells;
//scan the whole hold range
Real fxmin = (Real)x - holdRadius;
Real fxmax = (Real)x + holdRadius;
Real fymin = (Real)y - holdRadius;
Real fymax = (Real)y + holdRadius;
int xmin = stratData.CellRangeMinX;
int xmax = stratData.CellRangeMaxX;
int ymin = stratData.CellRangeMinY;
int ymax = stratData.CellRangeMaxY;
// Round UP max, round DOWN min
xmin = fxmin < xmin ? xmin : (int)System.Math.Floor(fxmin);
xmax = fxmax > xmax ? xmax : (int)System.Math.Ceiling(fxmax);
ymin = fymin < ymin ? ymin : (int)System.Math.Floor(fymin);
ymax = fymax > ymax ? ymax : (int)System.Math.Ceiling(fymax);
// the inner, active load range
fxmin = (Real)x - loadRadius;
fxmax = (Real)x + loadRadius;
fymin = (Real)y - loadRadius;
fymax = (Real)y + loadRadius;
// Round UP max, round DOWN min
int loadxmin = fxmin < xmin ? xmin : (int)System.Math.Floor(fxmin);
int loadxmax = fxmax > xmax ? xmax : (int)System.Math.Ceiling(fxmax);
int loadymin = fymin < ymin ? ymin : (int)System.Math.Floor(fymin);
int loadymax = fymax > ymax ? ymax : (int)System.Math.Ceiling(fymax);
for (int cy = ymin; cy <= ymax; ++cy)
{
for (int cx = xmin; cx <= xmax; ++cx)
{
PageID pageID = stratData.CalculatePageID(cx, cy);
if (cx >= loadxmin && cx <= loadxmax && cy >= loadymin && cy <= loadymax)
{
// in the 'load' range, request it
section.LoadPage(pageID);
}
else
{
// in the outer 'hold' range, keep it but don't actively load
section.HoldPage(pageID);
}
// other pages will by inference be marked for unloading
}
}
}