Esempio n. 1
0
            private static void DrawDoorLine(DoorLineGrid2D doorLine, Grid grid, Color color, string label = null)
            {
                var line      = new OrthogonalLineGrid2D(doorLine.From.ToCustomIntVector2(), doorLine.To.ToCustomIntVector2());
                var fromSolid = line.From;
                var toSolid   = line.From;

                if (line.Length > 0)
                {
                    toSolid += (doorLine.Length - 1) * line.GetDirectionVector();
                }

                var toDotted = line.To;

                var doorsCount = line.Length - doorLine.Length + 2;

                if (doorsCount > 0)
                {
                    var finalLabel = $"{doorsCount} door{(doorsCount != 1 ? "s" : "")}\nSize {doorLine.Length}";

                    if (label != null)
                    {
                        finalLabel += $"\n{label}";
                    }

                    DrawRectangleOutline(grid, fromSolid.ToUnityIntVector3(), toSolid.ToUnityIntVector3(),
                                         color, new Vector2(0.2f, 0.2f));
                }
            }
        protected override void AddDoor(Vector3Int from, Vector3Int to)
        {
            var length   = doors.HybridDoorModeData.DefaultLength;
            var doorLine = new DoorLineGrid2D()
            {
                From   = from,
                To     = to,
                Length = length,
            };
            var line = new OrthogonalLineGrid2D(from.ToCustomIntVector2(), to.ToCustomIntVector2());

            if (doors.HybridDoorModeData.DoorLines.Any(x => x == doorLine))
            {
                return;
            }

            if (line.Length >= length - 1)
            {
                Undo.RecordObject(doors, "Added door positions");

                doors.HybridDoorModeData.DoorLines.Add(doorLine);

                EditorUtility.SetDirty(doors);
            }
        }
        private void DrawDoor(Grid grid, Vector3Int from, Vector3Int to)
        {
            var length   = new OrthogonalLine(from, to).Length;
            var doorLine = new DoorLineGrid2D()
            {
                From   = from,
                To     = to,
                Length = length,
            };

            var color = Color.red;

            DoorsInspectorUtils.DrawDoorLine(doorLine, grid, color);
        }
        protected override void DrawPreview(Vector3Int from, Vector3Int to)
        {
            var gameObject = doors.transform.gameObject;
            var grid       = gameObject.GetComponentInChildren <Grid>();
            var length     = doors.HybridDoorModeData.DefaultLength;
            var doorLine   = new DoorLineGrid2D()
            {
                From   = from,
                To     = to,
                Length = length,
            };

            var color = Color.red;

            DoorsInspectorUtils.DrawDoorLine(doorLine, grid, color);
        }
Esempio n. 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));
        }
Esempio n. 6
0
        private IEnumerator RunCoroutine()
        {
            Show = true;
            var polygon        = RoomTemplateLoaderGrid2D.GetPolygonFromRoomTemplate(gameObject);
            var doorsComponent = gameObject.GetComponent <DoorsGrid2D>();
            var doorMode       = doorsComponent.GetDoorMode();
            var doors          = doorMode.GetDoors(polygon);

            foreach (var doorLineGrid2D in doors)
            {
                foreach (var start in doorLineGrid2D.Line.GetPoints())
                {
                    var end = start + doorLineGrid2D.Length * doorLineGrid2D.Line.GetDirectionVector();

                    DoorLine = new DoorLineGrid2D()
                    {
                        From   = start.ToUnityIntVector3(),
                        To     = end.ToUnityIntVector3(),
                        Length = doorLineGrid2D.Length + 1,
                    };

                    Debug.Log(1);

                    var timer = new Stopwatch();
                    timer.Start();

                    SceneView.RepaintAll();

                    while (timer.ElapsedMilliseconds < 500)
                    {
                        yield return(null);
                    }

                    DoorLine = null;
                }
            }

            Show = false;
            SceneView.RepaintAll();
            yield break;
        }
Esempio n. 7
0
        public static List <DoorLineGrid2D> MergeDoorLines(IEnumerable <DoorLineGrid2D> doorLines)
        {
            var doorLinesByDirection = doorLines.GroupBy(x => x.Line.GetDirection());
            var result = new List <DoorLineGrid2D>();

            foreach (var grouping in doorLinesByDirection)
            {
                if (grouping.Key == OrthogonalLineGrid2D.Direction.Undefined)
                {
                    throw new ArgumentException("There must be no door lines with undefined direction");
                }

                var sameDirectionDoorLines = new LinkedList <DoorLineGrid2D>(grouping);

                while (sameDirectionDoorLines.Count != 0)
                {
                    var doorLineNode = sameDirectionDoorLines.First;
                    var doorLine     = doorLineNode.Value;
                    sameDirectionDoorLines.RemoveFirst();

                    while (true)
                    {
                        var found            = false;
                        var nextDoorLineNode = sameDirectionDoorLines.First;

                        while (nextDoorLineNode != null)
                        {
                            var otherDoorLineNode = nextDoorLineNode;
                            var otherDoorLine     = otherDoorLineNode.Value;
                            nextDoorLineNode = otherDoorLineNode.Next;

                            if (otherDoorLine.Length != doorLine.Length)
                            {
                                continue;
                            }

                            // TODO: improve later
                            if (otherDoorLine.DoorSocket != doorLine.DoorSocket)
                            {
                                continue;
                            }

                            if (doorLine.Line.To + doorLine.Line.GetDirectionVector() == otherDoorLine.Line.From)
                            {
                                doorLine = new DoorLineGrid2D(new OrthogonalLineGrid2D(doorLine.Line.From, otherDoorLine.Line.To), doorLine.Length, doorLine.DoorSocket);
                                found    = true;
                                sameDirectionDoorLines.Remove(otherDoorLineNode);
                            }
                            else if (doorLine.Line.From - doorLine.Line.GetDirectionVector() == otherDoorLine.Line.To)
                            {
                                doorLine = new DoorLineGrid2D(new OrthogonalLineGrid2D(otherDoorLine.Line.From, doorLine.Line.To), doorLine.Length, doorLine.DoorSocket);
                                found    = true;
                                sameDirectionDoorLines.Remove(otherDoorLineNode);
                            }
                        }

                        if (!found)
                        {
                            break;
                        }
                    }

                    result.Add(doorLine);
                }
            }

            return(result);
        }