Exemplo n.º 1
0
 private void FixSnapTransformationBase6()
 {
     if (base.CopiedGrids.Count != 0)
     {
         MyCubeGrid hitEntity = base.m_hitEntity as MyCubeGrid;
         if (hitEntity != null)
         {
             Matrix rotationDeltaMatrixToHitGrid = this.GetRotationDeltaMatrixToHitGrid(hitEntity);
             foreach (MyCubeGrid local1 in base.PreviewGrids)
             {
                 MatrixD worldMatrix = local1.WorldMatrix;
                 Matrix  matrix2     = (Matrix)(worldMatrix.GetOrientation() * rotationDeltaMatrixToHitGrid);
                 MatrixD xd          = MatrixD.CreateWorld(base.m_pastePosition, matrix2.Forward, matrix2.Up);
                 local1.PositionComp.SetWorldMatrix(xd, null, false, true, true, false, false, false);
             }
             if ((hitEntity.GridSizeEnum == MyCubeSize.Large) && (base.PreviewGrids[0].GridSizeEnum == MyCubeSize.Small))
             {
                 base.m_pastePosition = hitEntity.GridIntegerToWorld(MyCubeBuilder.TransformLargeGridHitCoordToSmallGrid(base.m_hitPos, hitEntity.PositionComp.WorldMatrixNormalizedInv, hitEntity.GridSize));
             }
             else
             {
                 Vector3I vectori    = Vector3I.Round(base.m_hitNormal);
                 Vector3I gridOffset = hitEntity.WorldToGridInteger(base.m_pastePosition);
                 Vector3I min        = base.PreviewGrids[0].Min;
                 Vector3I vectori4   = Vector3I.Abs(Vector3I.Round(Vector3D.TransformNormal(Vector3D.TransformNormal((Vector3D)((base.PreviewGrids[0].Max - min) + Vector3I.One), base.PreviewGrids[0].WorldMatrix), hitEntity.PositionComp.WorldMatrixNormalizedInv)));
                 int      num        = Math.Abs(Vector3I.Dot(ref vectori, ref vectori4));
                 int      num2       = 0;
                 while (true)
                 {
                     if ((num2 >= num) || hitEntity.CanMergeCubes(base.PreviewGrids[0], gridOffset))
                     {
                         if (num2 == num)
                         {
                             gridOffset = hitEntity.WorldToGridInteger(base.m_pastePosition);
                         }
                         base.m_pastePosition = hitEntity.GridIntegerToWorld(gridOffset);
                         break;
                     }
                     gridOffset = (Vector3I)(gridOffset + vectori);
                     num2++;
                 }
             }
             for (int i = 0; i < base.PreviewGrids.Count; i++)
             {
                 MyCubeGrid local2      = base.PreviewGrids[i];
                 MatrixD    worldMatrix = local2.WorldMatrix;
                 worldMatrix.Translation = base.m_pastePosition + Vector3.Transform(base.m_copiedGridOffsets[i], rotationDeltaMatrixToHitGrid);
                 local2.PositionComp.SetWorldMatrix(worldMatrix, null, false, true, true, false, false, false);
             }
             if (MyDebugDrawSettings.DEBUG_DRAW_COPY_PASTE)
             {
                 MyRenderProxy.DebugDrawLine3D(base.m_hitPos, base.m_hitPos + base.m_hitNormal, Color.Red, Color.Green, false, false);
             }
         }
     }
 }
        private new void FixSnapTransformationBase6()
        {
            Debug.Assert(CopiedGrids.Count > 0);
            if (CopiedGrids.Count == 0)
            {
                return;
            }

            var hitGrid = m_hitEntity as MyCubeGrid;

            if (hitGrid == null)
            {
                return;
            }

            // Fix rotation of the first pasted grid
            Matrix rotationDelta = GetRotationDeltaMatrixToHitGrid(hitGrid);

            foreach (var grid in PreviewGrids)
            {
                Matrix rotation = grid.WorldMatrix.GetOrientation();
                rotation = rotation * rotationDelta;

                Vector3D position = m_pastePosition;

                MatrixD newWorld = MatrixD.CreateWorld(position, rotation.Forward, rotation.Up);
                Debug.Assert(newWorld.GetOrientation().IsRotation());
                grid.PositionComp.SetWorldMatrix(newWorld);
            }

            bool smallOnLargeGrid = hitGrid.GridSizeEnum == MyCubeSize.Large && PreviewGrids[0].GridSizeEnum == MyCubeSize.Small;

            if (smallOnLargeGrid)
            {
                Vector3 pasteOffset = MyCubeBuilder.TransformLargeGridHitCoordToSmallGrid(m_hitPos, hitGrid.PositionComp.WorldMatrixNormalizedInv, hitGrid.GridSize);
                m_pastePosition = hitGrid.GridIntegerToWorld(pasteOffset);
            }
            else
            {
                // Find a collision-free position for the first paste grid along the raycast normal
                Vector3I collisionTestStep        = Vector3I.Round(m_hitNormal);
                Vector3I pasteOffset              = hitGrid.WorldToGridInteger(m_pastePosition);
                Vector3I previewGridMin           = PreviewGrids[0].Min;
                Vector3I previewGridMax           = PreviewGrids[0].Max;
                Vector3I previewGridSize          = previewGridMax - previewGridMin + Vector3I.One;
                Vector3D previewGridSizeInWorld   = Vector3D.TransformNormal((Vector3D)previewGridSize, PreviewGrids[0].WorldMatrix);
                Vector3I previewGridSizeInHitGrid = Vector3I.Abs(Vector3I.Round(Vector3D.TransformNormal(previewGridSizeInWorld, hitGrid.PositionComp.WorldMatrixNormalizedInv)));

                int attemptsCount = Math.Abs(Vector3I.Dot(ref collisionTestStep, ref previewGridSizeInHitGrid));
                Debug.Assert(attemptsCount > 0);
                int i;

                for (i = 0; i < attemptsCount; ++i)
                {
                    if (hitGrid.CanMergeCubes(PreviewGrids[0], pasteOffset))
                    {
                        break;
                    }
                    pasteOffset += collisionTestStep;
                }

                if (i == attemptsCount)
                {
                    pasteOffset = hitGrid.WorldToGridInteger(m_pastePosition);
                }

                m_pastePosition = hitGrid.GridIntegerToWorld(pasteOffset);
            }

            // Move all the grids according to the collision-free position of the first one
            for (int i = 0; i < PreviewGrids.Count; ++i)
            {
                var     grid   = PreviewGrids[i];
                MatrixD matrix = grid.WorldMatrix;
                matrix.Translation = m_pastePosition + Vector3.Transform(m_copiedGridOffsets[i], rotationDelta);
                grid.PositionComp.SetWorldMatrix(matrix);
            }

            if (MyDebugDrawSettings.DEBUG_DRAW_COPY_PASTE)
            {
                MyRenderProxy.DebugDrawLine3D(m_hitPos, m_hitPos + m_hitNormal, Color.Red, Color.Green, false);
            }
        }