Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public void DetectCollapse(ProxyObj ProxyObject, CollapsSignature CallbackWhen)
- {
- if (ProxyObject == null) return;
- if (CallbackWhen == null) return;
- // объект не помещен в сетку
- if (!ProxyObject.InGrid) return;
- // увеличить время
- mTick++;
- // пометить обьект чтобы не было пересечения самим с собой
- ProxyObject.TimeStamp = mTick;
- for (int Level = 0; Level < mMaxLevel; Level++)
- {
- // если на этом уровне нет обьектов - то след. ур.
- if (mCountObjInLevel[Level] == 0) continue;
- // магия - 1/4 (1/2) размера клетки ???
- float Delta = mGridSteps[Level] / 2f;
- // найти координаты обьекта в клетках по х и по у - с учетом соседей
- int MinX = (int)Math.Floor((ProxyObject.Pos.X - ProxyObject.Sphere.Radius - Delta) / mGridSteps[Level]);
- int MaxX = (int)Math.Ceiling((ProxyObject.Pos.X + ProxyObject.Sphere.Radius + Delta) / mGridSteps[Level]);
- int MinY = (int)Math.Floor((ProxyObject.Pos.Z - ProxyObject.Sphere.Radius - Delta) / mGridSteps[Level]);
- int MaxY = (int)Math.Ceiling((ProxyObject.Pos.Z + ProxyObject.Sphere.Radius + Delta) / mGridSteps[Level]);
- // проверка прямоугольника вхождения
- for (int x = MinX; x < MaxX; x++)
- {
- for (int y = MinY; y < MaxY; y++)
- {
- Cell CD = new Cell(new Point(x, y), Level);
- if (!mGrid.ContainsKey(CD)) continue;
- List<ProxyObj> ObjInCell = mGrid[CD];
- for (int i = 0; i < ObjInCell.Count; i++)
- {
- // если время совпадает мы уже пересекались с этим обьектом
- if (ObjInCell[i].TimeStamp == mTick) continue;
- // установить время последней проверки
- ObjInCell[i].TimeStamp = mTick;
- // проверить обьект
- if (ProxyObject.Sphere.Intersects(ObjInCell[i].Sphere))
- {
- CallbackWhen(ObjInCell[i]);
- }
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment