public void RotateCubes(VRageMath.Quaternion quaternion)
{
foreach (var cube in CubeGrid.CubeBlocks)
{
var definition = SpaceEngineersApi.GetCubeDefinition(cube.TypeId, CubeGrid.GridSizeEnum, cube.SubtypeName);
if (definition.Size.X == 1 && definition.Size.Y == 1 && definition.Size.Z == 1)
{
// rotate position around origin.
cube.Min = Vector3I.Transform(cube.Min.ToVector3I(), quaternion);
}
else
{
// resolve size of component, and transform to original orientation.
var orientSize = definition.Size.Add(-1).Transform(cube.BlockOrientation).Abs();
var min = Vector3I.Transform(cube.Min.ToVector3I(), quaternion);
var blockMax = new Vector3I(cube.Min.X + orientSize.X, cube.Min.Y + orientSize.Y, cube.Min.Z + orientSize.Z);
var max = Vector3I.Transform(blockMax, quaternion);
cube.Min = new SerializableVector3I(Math.Min(min.X, max.X), Math.Min(min.Y, max.Y), Math.Min(min.Z, max.Z));
}
// rotate BlockOrientation.
var q = quaternion * cube.BlockOrientation.ToQuaternion();
q.Normalize();
cube.BlockOrientation = new SerializableBlockOrientation(ref q);
}
// Rotate Groupings.
foreach (var group in CubeGrid.BlockGroups)
{
for (var i = 0; i < group.Blocks.Count; i++)
{
// The Group location is in the center of the cube.
// It doesn't have to be exact though, as it appears SE is just doing a location test of whatever object is at that location.
group.Blocks[i] = Vector3I.Transform(group.Blocks[i], quaternion);
}
}
// TODO: Rotate Bones
//if (CubeGrid.Skeleton != null)
//{
// for (var i = 0; i < CubeGrid.Skeleton.Count; i++)
// {
// var bone = CubeGrid.Skeleton[i];
// bone.BonePosition = Vector3I.Transform(bone.BonePosition, quaternion);
// bone.BoneOffset = bone.BoneOffset.Transform(VRageMath.Quaternion.Inverse(quaternion));
// }
//}
// TODO: Rotate ConveyorLines
foreach (var conveyorLine in CubeGrid.ConveyorLines)
{
//conveyorLine.StartPosition = Vector3I.Transform(conveyorLine.StartPosition, quaternion);
//conveyorLine.StartDirection =
//conveyorLine.EndPosition = Vector3I.Transform(conveyorLine.EndPosition, quaternion);
//conveyorLine.EndDirection =
}
// Rotate the ship also to maintain the appearance that it has not changed.
var o = CubeGrid.PositionAndOrientation.Value.ToQuaternion() * VRageMath.Quaternion.Inverse(quaternion);
o.Normalize();
var p = new MyPositionAndOrientation(o.ToMatrix());
CubeGrid.PositionAndOrientation = new MyPositionAndOrientation
{
Position = CubeGrid.PositionAndOrientation.Value.Position,
Forward = p.Forward,
Up = p.Up
};
UpdateGeneralFromEntityBase();
}