public RTree(int minPerNode, int maxPerNode) { m_MinPerNode = minPerNode; m_MaxPerNode = maxPerNode; m_CornerSplitChildren = new List <ISpatialObject> [8]; for (var i = 0; i < m_CornerSplitChildren.Length; ++i) { m_CornerSplitChildren[i] = new List <ISpatialObject>(); } m_RootNode = new SpatialNode(); m_PriorityHeap = new PriorityHeap <ISpatialObject>(m_MaxPerNode, Comparer <ISpatialObject> .Create((a, b) => a.priority.CompareTo(b.priority))); // split node comparison is reversed compared to existing node // that way children closest to the split axis are always at the end of the list m_NodeComparerX = Comparer <ISpatialObject> .Create((a, b) => a.center.x.CompareTo(b.center.x)); m_SplitNodeComparerX = Comparer <ISpatialObject> .Create((a, b) => b.center.x.CompareTo(a.center.x)); m_NodeComparerY = Comparer <ISpatialObject> .Create((a, b) => a.center.y.CompareTo(b.center.y)); m_SplitNodeComparerY = Comparer <ISpatialObject> .Create((a, b) => b.center.y.CompareTo(a.center.y)); m_NodeComparerZ = Comparer <ISpatialObject> .Create((a, b) => a.center.z.CompareTo(b.center.z)); m_SplitNodeComparerZ = Comparer <ISpatialObject> .Create((a, b) => b.center.z.CompareTo(a.center.z)); }
public SpatialFilter(Transform root, SpatialFilterSettings settings, StreamAssetOutput streamOutput, ISpatialCollection <ISpatialObject> spatialCollection = null, Func <ISpatialObject, bool> visibilityPredicate = null, Func <ISpatialObject, float> visibilityPrioritizer = null) { m_Root = root; this.settings = settings; m_StreamOutput = streamOutput; this.spatialCollection = spatialCollection ?? CreateDefaultSpatialCollection(); m_VisibilityPredicate = visibilityPredicate ?? DefaultVisibilityPredicate; m_VisibilityPrioritizer = visibilityPrioritizer ?? DefaultVisibilityPrioritizer; InitCamera(); if (settings.displayUnloadedObjectBoundingBoxes) { InitBoundingBoxSceneObjects(); } m_ObjectsToLoad = new PriorityHeap <SpatialObject>(settings.visibleObjectsMax, Comparer <SpatialObject> .Create((a, b) => a.priority.CompareTo(b.priority))); }