private static IEnumerable<MyObjectBuilder_CubeBlock> MirrorCubes(StructureCubeGridModel viewModel, bool integrate, Mirror xMirror, int xAxis, Mirror yMirror, int yAxis, Mirror zMirror, int zAxis)
{
var blocks = new List<MyObjectBuilder_CubeBlock>();
SubtypeId outVal;
if (xMirror == Mirror.None && yMirror == Mirror.None && zMirror == Mirror.None)
return blocks;
foreach (var block in viewModel.CubeGrid.CubeBlocks.Where(b => b.SubtypeName == "" || (Enum.TryParse<SubtypeId>(b.SubtypeName, out outVal) && !InvalidMirrorBlocks.Contains(outVal))))
{
var newBlock = block.Clone() as MyObjectBuilder_CubeBlock;
newBlock.EntityId = block.EntityId == 0 ? 0 : SpaceEngineersApi.GenerateEntityId(IDType.ENTITY);
if (block is MyObjectBuilder_MotorBase)
{
((MyObjectBuilder_MotorBase)newBlock).RotorEntityId = ((MyObjectBuilder_MotorBase)block).RotorEntityId == 0 ? 0 : SpaceEngineersApi.GenerateEntityId(IDType.ENTITY);
}
if (block is MyObjectBuilder_PistonBase)
{
((MyObjectBuilder_PistonBase)newBlock).TopBlockId = ((MyObjectBuilder_PistonBase)block).TopBlockId == 0 ? 0 : SpaceEngineersApi.GenerateEntityId(IDType.ENTITY);
}
newBlock.BlockOrientation = MirrorCubeOrientation(block.SubtypeName, block.BlockOrientation, xMirror, yMirror, zMirror);
var definition = SpaceEngineersApi.GetCubeDefinition(block.TypeId, viewModel.GridSize, block.SubtypeName);
if (definition.Size.X == 1 && definition.Size.Y == 1 && definition.Size.Z == 1)
{
newBlock.Min = block.Min.Mirror(xMirror, xAxis, yMirror, yAxis, zMirror, zAxis);
}
else
{
// resolve size of component, and transform to original orientation.
var orientSize = definition.Size.Add(-1).Transform(block.BlockOrientation).Abs();
var min = block.Min.Mirror(xMirror, xAxis, yMirror, yAxis, zMirror, zAxis);
var blockMax = new SerializableVector3I(block.Min.X + orientSize.X, block.Min.Y + orientSize.Y, block.Min.Z + orientSize.Z);
var max = blockMax.Mirror(xMirror, xAxis, yMirror, yAxis, zMirror, zAxis);
if (xMirror != Mirror.None)
newBlock.Min = new SerializableVector3I(max.X, min.Y, min.Z);
if (yMirror != Mirror.None)
newBlock.Min = new SerializableVector3I(min.X, max.Y, min.Z);
if (zMirror != Mirror.None)
newBlock.Min = new SerializableVector3I(min.X, min.Y, max.Z);
}
// Don't place a block if one already exists there in the mirror.
if (integrate && viewModel.CubeGrid.CubeBlocks.Any(b => b.Min.X == newBlock.Min.X && b.Min.Y == newBlock.Min.Y && b.Min.Z == newBlock.Min.Z /*|| b.Max == newBlock.Min*/)) // TODO: check cubeblock size.
continue;
blocks.Add(newBlock);
}
return blocks;
}