public bool MoveNext() { ++m_mortonCode; if (m_mortonCode < m_maxMortonCode) { MyMortonCode3D.Decode(m_mortonCode, out m_pos); m_current = m_source.Get(m_type, ref m_pos); return(true); } return(false); }
public static MyDefinitionId?VoxelMaterialAt(this MyVoxelBase voxel, Vector3D min, Vector3D grow, ref MyStorageData cache) { if (cache == null) { cache = new MyStorageData(); } var shape = new BoundingBoxD(Vector3D.Min(min, min + grow), Vector3D.Max(min, min + grow)); Vector3I voxMin; Vector3I voxMax; Vector3I voxCells; GetVoxelShapeDimensions(voxel, shape, out voxMin, out voxMax, out voxCells); Vector3I_RangeIterator cellsItr = new Vector3I_RangeIterator(ref Vector3I.Zero, ref voxCells); while (cellsItr.IsValid()) { Vector3I cellMinCorner; Vector3I cellMaxCorner; GetCellCorners(ref voxMin, ref voxMax, ref cellsItr, out cellMinCorner, out cellMaxCorner); Vector3I rangeMin = cellMinCorner - 1; Vector3I rangeMax = cellMaxCorner + 1; voxel.Storage.ClampVoxelCoord(ref rangeMin); voxel.Storage.ClampVoxelCoord(ref rangeMax); cache.Resize(rangeMin, rangeMax); voxel.Storage.ReadRange(cache, MyStorageDataTypeFlags.Material, 0, rangeMin, rangeMax); var mortonCode = -1; var maxMortonCode = cache.Size3D.Size; while (++mortonCode < maxMortonCode) { Vector3I pos; MyMortonCode3D.Decode(mortonCode, out pos); var content = cache.Content(ref pos); if (content <= MyVoxelConstants.VOXEL_CONTENT_EMPTY) { continue; } var material = cache.Material(ref pos); var def = MyDefinitionManager.Static.GetVoxelMaterialDefinition(material); if (def != null) { return(def.Id); } } cellsItr.MoveNext(); } return(null); }