//Index = per cloud
            public void Execute(int index)
            {
                float3 currentCellPosition;
                int    cellCount = 0;
                NativeMultiHashMapIterator <int> it;


                if (!CloudMarkersMap.TryGetFirstValue(CloudData[index].ID, out currentCellPosition, out it))
                {
                    return;
                }
                cellCount++;

                while (CloudMarkersMap.TryGetNextValue(out currentCellPosition, ref it))
                {
                    cellCount++;
                }

                float     totalArea    = cellCount * CellArea;
                CloudData cData        = CloudData[index];
                float     delta        = cData.AgentQuantity / totalArea;
                Color     densityColor = Parameters.Density2Color(delta, CloudData[index].ID);

                if (!CloudMarkersMap.TryGetFirstValue(CloudData[index].ID, out currentCellPosition, out it))
                {
                    return;
                }

                int2 grid_cell = GridConverter.PositionToGridCell(new float3(currentCellPosition.x, currentCellPosition.y, currentCellPosition.z));

                tex_mat[grid_cell.y * mat_rows + grid_cell.x] = densityColor;

                cloudDensities.TryAdd(CloudData[index].ID, delta);

                while (CloudMarkersMap.TryGetNextValue(out currentCellPosition, ref it))
                {
                    grid_cell = GridConverter.PositionToGridCell(new float3(currentCellPosition.x, currentCellPosition.y, currentCellPosition.z));
                    tex_mat[grid_cell.y * mat_rows + grid_cell.x] = densityColor;
                }
            }
    protected override void OnUpdate()
    {
        processing.records.Clear();
        processing.frame = frames++;

        for (int i = 0; i < agentGroup.Length; i++)
        {
            processing.records.Add(new AgentRecord
            {
                AgentID  = agentGroup.Data[i].ID,
                Position = WindowManager.Crowds2Clouds(agentGroup.Position[i].Value),
                CloudID  = agentGroup.OwnerCloud[i].CloudID
            });
        }

        FrameRecord aux = complete;

        complete   = processing;
        processing = aux;


        var inst = BioClouds.Parameters.Instance;

        if (!inst.SaveSimulationData)
        {
            return;
        }

        //Data recording
        #region BioClouds Datarecording
        NativeMultiHashMap <int, float3> cellmap = m_CellMarkSystem.cloudID2MarkedCellsMap;
        float3 currentCellPosition;
        NativeMultiHashMapIterator <int> it;

        //if ((inst.SaveDenstiies || inst.SavePositions))
        //{
        if (inst.MaxSimulationFrames > CurrentFrame && CurrentFrame % inst.FramesForDataSave == 0)
        {
            for (int i = 0; i < m_CloudDataGroup.Length; i++)
            {
                List <int> cellIDs = new List <int>();

                if (!cellmap.TryGetFirstValue(m_CloudDataGroup.CloudData[i].ID, out currentCellPosition, out it))
                {
                    continue;
                }
                int2 grid_cell = GridConverter.PositionToGridCell(new float3(currentCellPosition.x, currentCellPosition.y, currentCellPosition.z));
                cellIDs.Add(GridConverter.GridCell2CellID(grid_cell));

                while (cellmap.TryGetNextValue(out currentCellPosition, ref it))
                {
                    grid_cell = GridConverter.PositionToGridCell(new float3(currentCellPosition.x, currentCellPosition.y, currentCellPosition.z));
                    cellIDs.Add(GridConverter.GridCell2CellID(grid_cell));
                }

                if (inst.IDToRecord == -1 || m_CloudDataGroup.CloudData[i].ID == inst.IDToRecord)
                {
                    BioClouds.Record record = new BioClouds.Record(frames,
                                                                   m_CloudDataGroup.CloudData[i].ID,
                                                                   m_CloudDataGroup.CloudData[i].AgentQuantity,
                                                                   cellIDs.Count,
                                                                   cellIDs,
                                                                   m_CloudDataGroup.Position[i].Value,
                                                                   m_CloudDataGroup.CloudData[i].Radius
                                                                   );

                    bioCloudsRecords.Add(record);
                }
            }
        }

        //if (inst.MaxSimulationFrames == CurrentFrame - 1)
        //{
        using (System.IO.StreamWriter file =
                   new System.IO.StreamWriter(inst.LogFilePath + "Clouds.txt", true))
        {
            foreach (BioClouds.Record record in bioCloudsRecords)
            {
                file.Write(record.ToString() + '\n');
            }
        }
        bioCloudsRecords.Clear();
        //}
        //}
        #endregion


        #region BioCrowds DataRecording

        //if (inst.MaxSimulationFrames == CurrentFrame - 1)
        //{
        using (System.IO.StreamWriter file =
                   new System.IO.StreamWriter(inst.LogFilePath + "Agents.txt", true))
        {
            file.Write(complete.ToString() + '\n');
        }
        //}

        #endregion
    }