protected bool IsIndextInRange(SpatialIndex a, SpatialIndex b, float range) { var xRange = Mathf.CeilToInt(range / cellSizeX); var yRange = Mathf.CeilToInt(range / cellSizeY); var zRange = Mathf.CeilToInt(range / cellSizeZ); return(Mathf.Abs(a.X - b.X) <= xRange && Mathf.Abs(a.Y - b.Y) <= yRange && Mathf.Abs(a.Z - b.Z) <= zRange); }
public void UpdateObjectIndex() { foreach (var hashObject in objectsUpdateQuerry) { GetSpacialIndexes(hashObject.Position, out int x, out int y, out int z); var newIndext = new SpatialIndex(x, y, z); if (newIndext != hashObject.SpatialIndex) { RemoveObject(hashObject); hashObject.SpatialIndex = newIndext; AddObject(hashObject); } } }
private void UpdateNearbyIndexiesCach(float radious, Vector3 centerPoint, bool usingCach = true) { if (CachedValid(radious, centerPoint) && usingCach) { return; } catchedIndexes.Clear(); cachedIndex = Vector3ToSpatialIndex(centerPoint); catchedRadious = radious; cachIsDerty = false; GetSpacialIndexes(centerPoint + Vector3.one * radious, out int rightBoundIndex, out int upBoundIndex, out int frontBoundIndex); GetSpacialIndexes(centerPoint - Vector3.one * radious, out int leftBoundIndex, out int downBoundIndex, out int backBoundIndex); var querry = from index in objectsTable.Keys where index.X >= leftBoundIndex && index.Y >= downBoundIndex && index.Z >= backBoundIndex && index.X <= rightBoundIndex && index.Y <= upBoundIndex && index.Z <= frontBoundIndex select index; foreach (var index in querry) { if (objectsTable.ContainsKey(index)) { catchedIndexes.Add(index); } } // for (int i = leftBoundIndex; i <= rightBoundIndex; i++) // { // for (int j = downBoundIndex; j <= upBoundIndex; j++) // { // for (int k = backBoundIndex; k <= frontBoundIndex; k++) // { // var temp = new SpatialIndex(i, j, k); // // temp.SetValue(i, j, k); // // if (objectsTable.ContainsKey(temp)) // { // results.Add(temp); // catchedIndexes.Add(temp); // } // } // } // } }