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();
 }
Exemplo n.º 4
0
 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();
            }
        }
Exemplo n.º 6
0
        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);
            }
        }