Guest User

Untitled

a guest
Jun 27th, 2015
475
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.39 KB | None | 0 0
  1. public void DetectCollapse(ProxyObj ProxyObject, CollapsSignature CallbackWhen)
  2. {
  3.     if (ProxyObject == null) return;
  4.     if (CallbackWhen == null) return;
  5.  
  6.     // объект не помещен в сетку
  7.     if (!ProxyObject.InGrid) return;
  8.  
  9.     // увеличить время
  10.     mTick++;
  11.     // пометить обьект чтобы не было пересечения самим с собой
  12.     ProxyObject.TimeStamp = mTick;
  13.  
  14.     for (int Level = 0; Level < mMaxLevel; Level++)
  15.     {
  16.         // если на этом уровне нет обьектов - то след. ур.
  17.         if (mCountObjInLevel[Level] == 0) continue;
  18.  
  19.         // магия - 1/4 (1/2) размера клетки ???
  20.         float Delta = mGridSteps[Level] / 2f;
  21.  
  22.         // найти координаты обьекта в клетках по х и по у - с учетом соседей
  23.         int MinX = (int)Math.Floor((ProxyObject.Pos.X - ProxyObject.Sphere.Radius - Delta) / mGridSteps[Level]);
  24.         int MaxX = (int)Math.Ceiling((ProxyObject.Pos.X + ProxyObject.Sphere.Radius + Delta) / mGridSteps[Level]);
  25.         int MinY = (int)Math.Floor((ProxyObject.Pos.Z - ProxyObject.Sphere.Radius - Delta) / mGridSteps[Level]);
  26.         int MaxY = (int)Math.Ceiling((ProxyObject.Pos.Z + ProxyObject.Sphere.Radius + Delta) / mGridSteps[Level]);
  27.  
  28.         // проверка прямоугольника вхождения
  29.         for (int x = MinX; x < MaxX; x++)
  30.         {
  31.             for (int y = MinY; y < MaxY; y++)
  32.             {
  33.                 Cell CD = new Cell(new Point(x, y), Level);
  34.                 if (!mGrid.ContainsKey(CD)) continue;
  35.  
  36.                 List<ProxyObj> ObjInCell = mGrid[CD];
  37.                 for (int i = 0; i < ObjInCell.Count; i++)
  38.                 {
  39.                     // если время совпадает мы уже пересекались с этим обьектом
  40.                     if (ObjInCell[i].TimeStamp == mTick) continue;
  41.                     // установить время последней проверки
  42.                     ObjInCell[i].TimeStamp = mTick;
  43.                     // проверить обьект
  44.                     if (ProxyObject.Sphere.Intersects(ObjInCell[i].Sphere))
  45.                     {
  46.                         CallbackWhen(ObjInCell[i]);
  47.                     }
  48.                 }
  49.             }
  50.         }
  51.  
  52.     }
  53.  
  54. }
Advertisement
Add Comment
Please, Sign In to add comment