private MyHighLevelPrimitive GetClosestHighLevelPrimitive(ref Vector3 point, ref float closestDistanceSq) { MyHighLevelPrimitive retval = null; // Convert from world matrix local coords to LeftBottomCorner-based coords Vector3 lbcPoint = point + (m_voxelMap.PositionComp.GetPosition() - m_voxelMap.PositionLeftBottomCorner); m_tmpIntList.Clear(); // Collect components from the eight closest cells Vector3I closestCellCorner = Vector3I.Round(lbcPoint / m_cellSize); for (int i = 0; i < 8; ++i) { Vector3I cell = closestCellCorner + m_cornerOffsets[i]; MyCellCoord coord = new MyCellCoord(NAVMESH_LOD, cell); ulong packedCoord = coord.PackId64(); m_higherLevelHelper.CollectComponents(packedCoord, m_tmpIntList); } foreach (int componentIndex in m_tmpIntList) { var hlPrimitive = m_higherLevel.GetPrimitive(componentIndex); Debug.Assert(hlPrimitive != null, "Couldnt' find a high-level primitive for the index given by higher level helper!"); if (hlPrimitive == null) { continue; } float distSq = Vector3.DistanceSquared(hlPrimitive.Position, point); if (distSq < closestDistanceSq) { closestDistanceSq = distSq; retval = hlPrimitive; } } m_tmpIntList.Clear(); return(retval); }
public override IMyPathVertex <MyNavigationPrimitive> GetOwnNeighbor(int index) { return(m_parent.GetPrimitive(m_neighbors[index])); }