public void CalculateMaterialCellAssets(out IList<byte> materialAssetList, out Dictionary<byte, long> materialVoxelCells)
{
materialAssetList = new List<byte>();
materialVoxelCells = new Dictionary<byte, long>();
Vector3I cellCoord;
for (cellCoord.X = 0; cellCoord.X < _dataCellsCount.X; cellCoord.X++)
{
for (cellCoord.Y = 0; cellCoord.Y < _dataCellsCount.Y; cellCoord.Y++)
{
for (cellCoord.Z = 0; cellCoord.Z < _dataCellsCount.Z; cellCoord.Z++)
{
var voxelCell = _voxelContentCells[cellCoord.X][cellCoord.Y][cellCoord.Z];
var matCell = _voxelMaterialCells[cellCoord.X][cellCoord.Y][cellCoord.Z];
if (voxelCell == null)
{
// Voxel wasn't found in cell dictionary, so cell must be FULL
if (matCell.IsSingleMaterialForWholeCell)
{
for (var i = 0; i < MyVoxelConstants.VOXEL_DATA_CELL_SIZE_IN_VOXELS_TOTAL; i++)
{
materialAssetList.Add(matCell.SingleMaterial);
if (materialVoxelCells.ContainsKey(matCell.SingleMaterial))
materialVoxelCells[matCell.SingleMaterial] += MyVoxelConstants.VOXEL_CONTENT_FULL;
else
materialVoxelCells.Add(matCell.SingleMaterial, MyVoxelConstants.VOXEL_CONTENT_FULL);
}
}
else
{
// A full cell, with mixed materials.
Vector3I voxelCoordInCell;
for (voxelCoordInCell.X = 0; voxelCoordInCell.X < MyVoxelConstants.VOXEL_DATA_CELL_SIZE_IN_VOXELS; voxelCoordInCell.X++)
{
for (voxelCoordInCell.Y = 0; voxelCoordInCell.Y < MyVoxelConstants.VOXEL_DATA_CELL_SIZE_IN_VOXELS; voxelCoordInCell.Y++)
{
for (voxelCoordInCell.Z = 0; voxelCoordInCell.Z < MyVoxelConstants.VOXEL_DATA_CELL_SIZE_IN_VOXELS; voxelCoordInCell.Z++)
{
var material = matCell.GetMaterial(ref voxelCoordInCell);
materialAssetList.Add(material);
if (materialVoxelCells.ContainsKey(material))
materialVoxelCells[material] += MyVoxelConstants.VOXEL_CONTENT_FULL;
else
materialVoxelCells.Add(material, MyVoxelConstants.VOXEL_CONTENT_FULL);
}
}
}
}
}
else if (voxelCell.CellType == MyVoxelCellType.MIXED)
{
if (matCell.IsSingleMaterialForWholeCell)
{
// a mixed cell, with one material.
Vector3I voxelCoordInCell;
for (voxelCoordInCell.X = 0; voxelCoordInCell.X < MyVoxelConstants.VOXEL_DATA_CELL_SIZE_IN_VOXELS; voxelCoordInCell.X++)
{
for (voxelCoordInCell.Y = 0; voxelCoordInCell.Y < MyVoxelConstants.VOXEL_DATA_CELL_SIZE_IN_VOXELS; voxelCoordInCell.Y++)
{
for (voxelCoordInCell.Z = 0; voxelCoordInCell.Z < MyVoxelConstants.VOXEL_DATA_CELL_SIZE_IN_VOXELS; voxelCoordInCell.Z++)
{
var content = voxelCell.GetVoxelContent(ref voxelCoordInCell);
if (content != MyVoxelConstants.VOXEL_CONTENT_EMPTY)
{
materialAssetList.Add(matCell.SingleMaterial);
if (materialVoxelCells.ContainsKey(matCell.SingleMaterial))
materialVoxelCells[matCell.SingleMaterial] += content;
else
materialVoxelCells.Add(matCell.SingleMaterial, content);
}
}
}
}
}
else
{
// A mixed cell, with mixed materials.
Vector3I voxelCoordInCell;
for (voxelCoordInCell.X = 0; voxelCoordInCell.X < MyVoxelConstants.VOXEL_DATA_CELL_SIZE_IN_VOXELS; voxelCoordInCell.X++)
{
for (voxelCoordInCell.Y = 0; voxelCoordInCell.Y < MyVoxelConstants.VOXEL_DATA_CELL_SIZE_IN_VOXELS; voxelCoordInCell.Y++)
{
for (voxelCoordInCell.Z = 0; voxelCoordInCell.Z < MyVoxelConstants.VOXEL_DATA_CELL_SIZE_IN_VOXELS; voxelCoordInCell.Z++)
{
var content = voxelCell.GetVoxelContent(ref voxelCoordInCell);
if (content != MyVoxelConstants.VOXEL_CONTENT_EMPTY)
{
var material = matCell.GetMaterial(ref voxelCoordInCell);
materialAssetList.Add(material);
if (materialVoxelCells.ContainsKey(material))
materialVoxelCells[material] += content;
else
materialVoxelCells.Add(material, content);
}
}
}
}
}
}
}
}
}
}