private void HandleSimpleMode()
        {
            var doors      = target as Doors;
            var gameObject = doors.transform.gameObject;
            var grid       = gameObject.GetComponentInChildren <Grid>();

            try
            {
                var polygon = RoomTemplatesLoader.GetPolygonFromRoomTemplate(doors.gameObject);

                if (polygon == null)
                {
                    return;
                }

                foreach (var line in polygon.GetLines())
                {
                    if (line.Length - 2 * doors.DistanceFromCorners < doors.DoorLength - 1)
                    {
                        continue;
                    }

                    var doorLine = line.Shrink(doors.DistanceFromCorners);
                    var from     = doorLine.From;
                    var to       = doorLine.To;

                    GridUtils.DrawRectangleOutline(grid, from.ToUnityIntVector3(), to.ToUnityIntVector3(), Color.red, new Vector2(0.1f, 0.1f));
                }
            }
            catch (ArgumentException)
            {
            }
        }
        private void DrawOverlap()
        {
            var doors = target as Doors;
            var go    = doors.transform.gameObject;

            try
            {
                var polygon = RoomTemplatesLoader.GetPolygonFromRoomTemplate(doors.gameObject);

                if (polygon == null)
                {
                    return;
                }

                foreach (var line in polygon.GetLines())
                {
                    if (line.Length - 2 * doors.DistanceFromCorners < doors.DoorLength - 1)
                    {
                        continue;
                    }

                    var doorLine = line.Shrink(doors.DistanceFromCorners);
                    var from     = doorLine.From;
                    var to       = doorLine.To;

                    DrawOutline(new Vector3(Math.Min(from.X, to.X), Math.Min(from.Y, to.Y)), new Vector3(Math.Max(from.X, to.X), Math.Max(from.Y, to.Y)), Color.red);
                }
            }
            catch (ArgumentException)
            {
            }
        }
Example #3
0
        public Polygon2D(List <Vector2Int> points)
        {
            this.points = points;

            if (!RoomTemplatesLoader.IsClockwiseOriented(points.Select(x => x.ToCustomIntVector2()).ToList()))
            {
                this.points.Reverse();
            }

            CheckValidity();
        }
Example #4
0
        private RoomTemplate GetRoomTemplate(GameObject roomTemplatePrefab)
        {
            if (prefabToRoomTemplateMapping.ContainsKey(roomTemplatePrefab))
            {
                return(prefabToRoomTemplateMapping[roomTemplatePrefab]);
            }

            var roomTemplate = RoomTemplatesLoader.GetRoomTemplate(roomTemplatePrefab);

            prefabToRoomTemplateMapping.Add(roomTemplatePrefab, roomTemplate);

            return(roomTemplate);
        }
Example #5
0
        private void HandleManualModeInspector()
        {
            var doors = target as Doors;

            var addDoorsNew    = GUILayout.Toggle(currentMode == Mode.AddDoors, "Add door positions", GUI.skin.button);
            var deleteDoorsNew = GUILayout.Toggle(currentMode == Mode.DeleteDoors, "Delete door positions", GUI.skin.button);

            if (addDoorsNew && currentMode != Mode.AddDoors)
            {
                currentMode = Mode.AddDoors;
            }
            else if (deleteDoorsNew && currentMode != Mode.DeleteDoors)
            {
                currentMode = Mode.DeleteDoors;
            }
            else if (!addDoorsNew && !deleteDoorsNew)
            {
                currentMode = Mode.Idle;
            }

            if (GUILayout.Button("Delete all door positions"))
            {
                Undo.RecordObject(target, "Delete all door positions");

                doors.DoorsList.Clear();

                EditorUtility.SetDirty(target);
            }

            // DrawDoorsList();

            try
            {
                var polygon       = RoomTemplatesLoader.GetPolygonFromRoomTemplate(doors.gameObject);
                var doorPositions = doors.GetDoorMode().GetDoors(polygon);

                if (doorPositions.Count != doors.DoorsList.Count)
                {
                    EditorGUILayout.HelpBox(
                        "There seems to be a door of length 1 that is at the corner of the outline, which is currently not supported. Either use outline override to change the outline or remove the door position.",
                        MessageType.Error);
                }
            }
            catch (ArgumentException)
            {
            }

            EditorGUILayout.HelpBox("The visualization of manual doors works differently than that of simple doors. If you want to add, for example, 5 doors of length 1, you have to manually add all 5 doors - not a single door with length 5.", MessageType.Warning);
        }
Example #6
0
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            var doors = target as Doors;

            var selectedModeProp = serializedObject.FindProperty(nameof(Doors.SelectedMode));

            selectedModeProp.intValue = GUILayout.SelectionGrid(doors.SelectedMode, new[] { "Simple mode", "Specific positions" }, 2);

            EditorGUILayout.Space();

            if (selectedModeProp.intValue == 0)
            {
                EditorGUILayout.IntSlider(doorsLength, 1, 10, "Door length");
                EditorGUILayout.IntSlider(distanceFromCorners, 0, 10, "Corner distance");
            }

            if (selectedModeProp.intValue == 1)
            {
                addSpecificDoorPositions = GUILayout.Toggle(addSpecificDoorPositions, "Add door positions", GUI.skin.button);

                if (GUILayout.Button("Delete all door positions"))
                {
                    doorsList.ClearArray();
                }

                try
                {
                    var polygon       = RoomTemplatesLoader.GetPolygonFromRoomTemplate(doors.gameObject);
                    var doorPositions = DoorHandler.DefaultHandler.GetDoorPositions(polygon, doors.GetDoorMode());

                    if (doorPositions.Count != doors.DoorsList.Count)
                    {
                        EditorGUILayout.HelpBox("There seems to be a door of length 1 that is at the corner of the outline, which is currently not supported. Either use outline override to change the outline or remove the door position.", MessageType.Error);
                    }
                }
                catch (Exception)
                {
                }
            }

            serializedObject.ApplyModifiedProperties();
        }
        public void OnSceneGUITest(SceneView sceneView)
        {
            if (target == null)
            {
                #if UNITY_2019_1_OR_NEWER
                SceneView.duringSceneGui -= OnSceneGUITest;
                #endif
                return;
            }

            if (PrefabStageUtility.GetCurrentPrefabStage() == null)
            {
                #if UNITY_2019_1_OR_NEWER
                SceneView.duringSceneGui -= OnSceneGUITest;
                #endif
                return;
            }

            try
            {
                var roomTemplate = (RoomTemplate)target;
                var tilemaps     = RoomTemplateUtils.GetTilemaps(roomTemplate.gameObject);
                var polygon      = RoomTemplatesLoader.GetPolygonFromTilemaps(tilemaps);
                var points       = polygon.GetPoints();

                Handles.color = Color.yellow;
                for (int i = 0; i < points.Count; i++)
                {
                    var point1 = new Vector3(points[i].X, points[i].Y, -1);
                    var point2 = new Vector3(points[(i + 1) % points.Count].X, points[(i + 1) % points.Count].Y, -1);
                    // Handles.DrawLine(point1 + new Vector3(0.5f, 0.5f), point2 + new Vector3(0.5f, 0.5f));
                    DrawOutline(point1, point2, Color.green);
                }
            }
            catch (ArgumentException)
            {
            }
        }
 /// <summary>
 /// Tries to compute a room template from a given game object and returns the result.
 /// </summary>
 /// <param name="roomTemplate"></param>
 /// <returns></returns>
 public static ActionResult CheckAll(GameObject roomTemplate)
 {
     RoomTemplatesLoader.TryGetRoomTemplate(roomTemplate, out var _, out var result);
     return(result);
 }