private void OnDepositQueryComplete(Vector3I depositCell, MyEntityOreDeposit deposit) { Debug.Assert(m_issuedQueries.Contains(depositCell)); m_issuedQueries.Remove(depositCell); m_depositsByCellCoord[depositCell] = deposit; IssueQueries(); }
private void OnComplete() { m_args.CompletionCallback(m_args.Cell, m_result); m_args = default(Args); m_result = null; m_instancePool.Deallocate(this); }
private void OnComplete() { ProfilerShort.Begin("MyOreDetectorComponent - OnComplete"); m_args.CompletionCallback(m_args.Cell, m_result); m_args = default(Args); m_result = null; m_instancePool.Deallocate(this); ProfilerShort.End(); }
public void Clear() { foreach (MyOreDepositGroup local1 in this.m_depositGroupsByEntity.Values) { local1.ClearMinMax(); IEnumerator <MyEntityOreDeposit> enumerator = local1.Deposits.GetEnumerator(); try { while (enumerator.MoveNext()) { MyEntityOreDeposit current = enumerator.Current; MyHud.OreMarkers.UnregisterMarker(current); } } finally { if (enumerator == null) { continue; } enumerator.Dispose(); } } }
void IWork.DoWork() { ProfilerShort.Begin("MyDepositQuery.DoWork"); try { var storage = m_args.VoxelMap.Storage; if (storage == null) { return; // voxel map was probably closed in the meantime. } var cache = Cache; cache.Resize(new Vector3I(MyOreDetectorComponent.CELL_SIZE_IN_LOD_VOXELS)); var min = m_args.Cell << MyOreDetectorComponent.CELL_SIZE_IN_VOXELS_BITS; var max = min + (MyOreDetectorComponent.CELL_SIZE_IN_LOD_VOXELS - 1); storage.ReadRange(cache, MyStorageDataTypeFlags.Content, MyOreDetectorComponent.QUERY_LOD, ref min, ref max); if (!cache.ContainsVoxelsAboveIsoLevel()) { return; } var materialData = MaterialData; storage.ReadRange(cache, MyStorageDataTypeFlags.Material, MyOreDetectorComponent.QUERY_LOD, ref min, ref max); Vector3I c; for (c.Z = 0; c.Z < MyOreDetectorComponent.CELL_SIZE_IN_LOD_VOXELS; ++c.Z) { for (c.Y = 0; c.Y < MyOreDetectorComponent.CELL_SIZE_IN_LOD_VOXELS; ++c.Y) { for (c.X = 0; c.X < MyOreDetectorComponent.CELL_SIZE_IN_LOD_VOXELS; ++c.X) { int i = cache.ComputeLinear(ref c); if (cache.Content(i) > MyVoxelConstants.VOXEL_ISO_LEVEL) { const float VOXEL_SIZE = MyVoxelConstants.VOXEL_SIZE_IN_METRES * (1 << MyOreDetectorComponent.QUERY_LOD); const float VOXEL_SIZE_HALF = VOXEL_SIZE * 0.5f; var material = cache.Material(i); Vector3D localPos = (c + min) * VOXEL_SIZE + VOXEL_SIZE_HALF; materialData[material].Sum += localPos; materialData[material].Count += 1; } } } } for (int materialIdx = 0; materialIdx < materialData.Length; ++materialIdx) { if (materialData[materialIdx].Count == 0) { continue; } var material = MyDefinitionManager.Static.GetVoxelMaterialDefinition((byte)materialIdx); if (material.IsRare) { if (m_result == null) { m_result = new MyEntityOreDeposit(m_args.VoxelMap, m_args.Cell); } m_result.Materials.Add(new MyEntityOreDeposit.Data() { Material = material, AverageLocalPosition = materialData[materialIdx].Sum / materialData[materialIdx].Count, }); } } Array.Clear(materialData, 0, materialData.Length); } finally { ProfilerShort.End(); } }
private unsafe void ProcessCell(MyStorageData cache, IMyStorage storage, Vector3I cell, long detectorId) { Vector3I lodVoxelRangeMin = cell << 3; Vector3I lodVoxelRangeMax = (Vector3I)(lodVoxelRangeMin + 7); storage.ReadRange(cache, MyStorageDataTypeFlags.Content, 2, lodVoxelRangeMin, lodVoxelRangeMax); if (cache.ContainsVoxelsAboveIsoLevel()) { Vector3I vectori3; MyVoxelRequestFlags preciseOrePositions = MyVoxelRequestFlags.PreciseOrePositions; storage.ReadRange(cache, MyStorageDataTypeFlags.Material, 2, lodVoxelRangeMin, lodVoxelRangeMax, ref preciseOrePositions); MaterialPositionData[] materialData = MaterialData; vectori3.Z = 0; while (vectori3.Z < 8) { vectori3.Y = 0; while (true) { if (vectori3.Y >= 8) { int *numPtr4 = (int *)ref vectori3.Z; numPtr4[0]++; break; } vectori3.X = 0; while (true) { if (vectori3.X >= 8) { int *numPtr3 = (int *)ref vectori3.Y; numPtr3[0]++; break; } int linearIdx = cache.ComputeLinear(ref vectori3); if (cache.Content(linearIdx) > 0x7f) { byte index = cache.Material(linearIdx); Vector3D vectord = ((vectori3 + lodVoxelRangeMin) * 4f) + 2f; Vector3 *vectorPtr1 = (Vector3 *)ref materialData[index].Sum; vectorPtr1[0] += vectord; int *numPtr1 = (int *)ref materialData[index].Count; numPtr1[0]++; } int *numPtr2 = (int *)ref vectori3.X; numPtr2[0]++; } } } MyEntityOreDeposit item = null; for (int i = 0; i < materialData.Length; i++) { if (materialData[i].Count != 0) { MyVoxelMaterialDefinition voxelMaterialDefinition = MyDefinitionManager.Static.GetVoxelMaterialDefinition((byte)i); if ((voxelMaterialDefinition != null) && voxelMaterialDefinition.IsRare) { if (item == null) { item = new MyEntityOreDeposit(this.VoxelMap, cell, detectorId); } MyEntityOreDeposit.Data data = new MyEntityOreDeposit.Data { Material = voxelMaterialDefinition, AverageLocalPosition = (Vector3)Vector3D.Transform((materialData[i].Sum / ((float)materialData[i].Count)) - this.VoxelMap.SizeInMetresHalf, Quaternion.CreateFromRotationMatrix(this.VoxelMap.WorldMatrix)) }; item.Materials.Add(data); } } } if (item != null) { this.m_result.Add(item); } else { this.m_emptyCells.Add(cell); } Array.Clear(materialData, 0, materialData.Length); } }