Beispiel #1
0
        public Vector2 Transform(TransformationGrid2D transformation)
        {
            switch (transformation)
            {
            case TransformationGrid2D.Identity:
                return(this);

            case TransformationGrid2D.Rotate90:
                return(RotateAroundCenter(90));

            case TransformationGrid2D.Rotate180:
                return(RotateAroundCenter(180));

            case TransformationGrid2D.Rotate270:
                return(RotateAroundCenter(270));

            case TransformationGrid2D.MirrorX:
                return(new Vector2(X, -Y));

            case TransformationGrid2D.MirrorY:
                return(new Vector2(-X, Y));

            case TransformationGrid2D.Diagonal13:
                return(new Vector2(Y, X));

            case TransformationGrid2D.Diagonal24:
                return(new Vector2(-Y, -X));

            default:
                throw new ArgumentException("Given polygon transformation is not implemented");
            }
        }
 /// <param name="room">See the <see cref="Room"/> property.</param>
 /// <param name="outline">See the <see cref="Outline"/> property.</param>
 /// <param name="position">See the <see cref="Position"/> property.</param>
 /// <param name="isCorridor">See the <see cref="IsCorridor"/> property.</param>
 /// <param name="roomTemplate">See the <see cref="RoomTemplate"/> property.</param>
 /// <param name="roomDescription">See the <see cref="RoomDescription"/> property.</param>
 /// <param name="transformation">See the <see cref="Transformation"/> property.</param>
 public LayoutRoomGrid2D(TRoom room, PolygonGrid2D outline, Vector2Int position, bool isCorridor, RoomTemplateGrid2D roomTemplate, RoomDescriptionGrid2D roomDescription, TransformationGrid2D transformation)
 {
     Room            = room;
     Outline         = outline;
     Position        = position;
     IsCorridor      = isCorridor;
     RoomTemplate    = roomTemplate;
     Transformation  = transformation;
     RoomDescription = roomDescription;
 }
Beispiel #3
0
 public Room(TNode node, PolygonGrid2D shape, Vector2Int position, bool isCorridor, RoomTemplate roomTemplate, IRoomDescription roomDescription, TransformationGrid2D transformation, List <TransformationGrid2D> transformations, RoomTemplateInstance roomTemplateInstance)
 {
     Node                 = node;
     Shape                = shape;
     Position             = position;
     IsCorridor           = isCorridor;
     RoomTemplate         = roomTemplate;
     Transformation       = transformation;
     Transformations      = transformations;
     RoomTemplateInstance = roomTemplateInstance;
     RoomDescription      = roomDescription;
 }
        /// <summary>
        /// Transforms a given polygon.
        /// </summary>
        /// <remarks>
        /// Returns a new polygon rather than modifying the original one.
        ///
        /// Some transformations would result in a counter-clockwise order of points, which is currently not allowed.
        /// In that case, the order of points is reversed with the first point staying the same.
        /// </remarks>
        /// <param name="transformation"></param>
        /// <returns></returns>
        public PolygonGrid2D Transform(TransformationGrid2D transformation)
        {
            var newPoints = points.Select(x => x.Transform(transformation));

            // Change order of points if needed
            if (transformation == TransformationGrid2D.MirrorX ||
                transformation == TransformationGrid2D.MirrorY ||
                transformation == TransformationGrid2D.Diagonal13 ||
                transformation == TransformationGrid2D.Diagonal24)
            {
                var newPointsList = newPoints.ToList();
                newPoints = new[] { newPointsList[0] }.Concat(newPointsList.Skip(1).Reverse());
            }

            return(new PolygonGrid2D(newPoints));
        }
Beispiel #5
0
        public static DoorLineGrid2D TransformDoorLine(DoorLineGrid2D doorLine, TransformationGrid2D transformation)
        {
            var doorPosition = doorLine.Line;

            if (doorPosition.GetDirection() == OrthogonalLineGrid2D.Direction.Undefined)
            {
                throw new InvalidOperationException("Cannot fix door direction when original direction is undefined");
            }

            switch (transformation)
            {
            case TransformationGrid2D.Identity:
                return(doorLine);

            case TransformationGrid2D.Rotate90:
                return(new DoorLineGrid2D(doorPosition.Rotate(90), doorLine.Length, doorLine.DoorSocket));

            case TransformationGrid2D.Rotate180:
                return(new DoorLineGrid2D(doorPosition.Rotate(180), doorLine.Length, doorLine.DoorSocket));

            case TransformationGrid2D.Rotate270:
                return(new DoorLineGrid2D(doorPosition.Rotate(270), doorLine.Length, doorLine.DoorSocket));
            }

            // Other transformations need to switch door directions
            var firstStartPoint      = doorPosition.From.Transform(transformation);
            var lastStartPoint       = doorPosition.To.Transform(transformation);
            var length               = doorLine.Length;
            var transformedDirection = TransformDirection(doorPosition.GetDirection(), transformation);
            var transformedLine      = new OrthogonalLineGrid2D(firstStartPoint, lastStartPoint, transformedDirection);

            var lastEndPoint = lastStartPoint + length * transformedLine.GetDirectionVector();

            var newDirection    = OrthogonalLineGrid2D.GetOppositeDirection(transformedDirection);
            var newDoorPosition = new OrthogonalLineGrid2D(lastEndPoint, lastEndPoint + transformedLine.Length * transformedLine.SwitchOrientation().GetDirectionVector(), newDirection);

            if (newDoorPosition.Length != doorPosition.Length)
            {
                throw new InvalidOperationException();
            }

            return(new DoorLineGrid2D(newDoorPosition, doorLine.Length, doorLine.DoorSocket));
        }
 public RoomTemplateInstance(RoomTemplate roomTemplate, PolygonGrid2D roomShape, TransformationGrid2D transformation, List <DoorLine> doorLines)
     : this(roomTemplate, roomShape, new List <TransformationGrid2D>() { transformation }, doorLines)
 {
 }
Beispiel #7
0
        private static OrthogonalLineGrid2D.Direction TransformDirection(OrthogonalLineGrid2D.Direction originalDirection, TransformationGrid2D transformation)
        {
            if (originalDirection == OrthogonalLineGrid2D.Direction.Undefined)
            {
                throw new InvalidOperationException("Cannot transform direction when original direction is undefined");
            }

            switch (transformation)
            {
            case TransformationGrid2D.MirrorX:
                if (IsHorizontal(originalDirection))
                {
                    return(originalDirection);
                }

                return(OrthogonalLineGrid2D.GetOppositeDirection(originalDirection));

            case TransformationGrid2D.MirrorY:
                if (IsHorizontal(originalDirection))
                {
                    return(OrthogonalLineGrid2D.GetOppositeDirection(originalDirection));
                }

                return(originalDirection);

            case TransformationGrid2D.Diagonal13:
                switch (originalDirection)
                {
                case OrthogonalLineGrid2D.Direction.Top:
                    return(OrthogonalLineGrid2D.Direction.Right);

                case OrthogonalLineGrid2D.Direction.Right:
                    return(OrthogonalLineGrid2D.Direction.Top);

                case OrthogonalLineGrid2D.Direction.Bottom:
                    return(OrthogonalLineGrid2D.Direction.Left);

                case OrthogonalLineGrid2D.Direction.Left:
                    return(OrthogonalLineGrid2D.Direction.Bottom);

                default:
                    throw new ArgumentException();
                }

            case TransformationGrid2D.Diagonal24:
                switch (originalDirection)
                {
                case OrthogonalLineGrid2D.Direction.Top:
                    return(OrthogonalLineGrid2D.Direction.Left);

                case OrthogonalLineGrid2D.Direction.Right:
                    return(OrthogonalLineGrid2D.Direction.Bottom);

                case OrthogonalLineGrid2D.Direction.Bottom:
                    return(OrthogonalLineGrid2D.Direction.Right);

                case OrthogonalLineGrid2D.Direction.Left:
                    return(OrthogonalLineGrid2D.Direction.Top);

                default:
                    throw new ArgumentException();
                }
            }

            throw new ArgumentException();
        }
 // TODO: not nice
 public static Vector3Int Transform(this Vector3Int vector, TransformationGrid2D transformation)
 {
     return(vector.ToCustomIntVector2().Transform(transformation).ToUnityIntVector3());
 }