private void HandleNormal(Bounds portalBounds, GridPortalComponent p)
        {
            var grid = GridManager.instance.GetGridComponent(_portalRectStart);
            if (grid == null)
            {
                grid = GridManager.instance.GetGridComponent(_portalRectEnd);
                if (grid == null)
                {
                    return;
                }
            }

            portalBounds = EditorUtilities.SnapToGrid(grid, portalBounds, _gridConnectMode);

            if (p.relativeToTransform)
            {
                portalBounds.center = p.transform.InverseTransformPoint(portalBounds.center);
            }

            if (_shiftDown)
            {
                p.portalTwo = portalBounds;
            }
            else
            {
                p.portalOne = portalBounds;
            }
        }
        private void ShowPortalCommands(GridPortalComponent p)
        {
            EditorGUILayout.Separator();
            if (_inPortalMode)
            {
                var msg = "Using the Left mouse button, click and drag to place Portal One.\n\nUsing the Left mouse button and Shift, click and drag to place Portal Two.\n\nHolding Control or Command with either option will expand the portal along the nearest perimeter.";
                if (p.type == PortalType.Connector)
                {
                    msg = string.Concat(msg, "\n\nTo easily place a connector portal between adjacent grids, simply drag the rectangle over the two grids to connect.");
                }

                EditorGUILayout.HelpBox(msg, MessageType.Info);
                EditorGUILayout.Separator();

                if (GUILayout.Button("Done (Esc)"))
                {
                    ToggleEditMode(false);
                }
            }
            else if (GUILayout.Button("Edit Portals"))
            {
                ToggleEditMode(true);

                if (SceneView.sceneViews.Count > 0)
                {
                    ((SceneView)SceneView.sceneViews[0]).Focus();
                }
            }
        }
        private void HandleConnector(Bounds portalBounds, GridPortalComponent p)
        {
            var g1 = GridManager.instance.GetGridComponent(_portalRectStart);
            var g2 = GridManager.instance.GetGridComponent(_portalRectEnd);

            if (g1 != null && g2 != null && g1 != g2)
            {
                var p1 = EditorUtilities.SnapToGridEdge(g1, portalBounds, _gridConnectMode);
                var p2 = EditorUtilities.SnapToGridEdge(g2, portalBounds, _gridConnectMode);

                if (p.relativeToTransform)
                {
                    p1.center = p.transform.InverseTransformPoint(p1.center);
                    p2.center = p.transform.InverseTransformPoint(p2.center);
                }

                p.portalOne = p1;
                p.portalTwo = p2;
            }
            else
            {
                HandleNormal(portalBounds, p);
                EnsureValidConnector(p);
            }
        }
        private static void DrawActiveIndication(GridPortalComponent p)
        {
            Handles.color = Color.white;
            var radius = 0.5f + ((Mathf.Cos(Time.realtimeSinceStartup * 10f) + 1f) / 6f);
            var p1 = p.portalOne.center;
            var p2 = p.portalTwo.center;
            if (p.relativeToTransform)
            {
                var t = p.transform;
                p1 = t.TransformPoint(p1);
                p2 = t.TransformPoint(p2);
            }

            Handles.DrawWireDisc(p1, Vector3.up, radius);
            Handles.DrawWireDisc(p2, Vector3.up, radius);
        }
        private static void EnsureValidConnector(GridPortalComponent p)
        {
            var p1 = p.portalOne;
            var p2 = p.portalTwo;

            var p1WorldCenter = p1.center;
            var p2WorldCenter = p2.center;
            if (p.relativeToTransform)
            {
                var t = p.transform;
                p1WorldCenter = t.TransformPoint(p1WorldCenter);
                p2WorldCenter = t.TransformPoint(p2WorldCenter);
            }

            var g1 = GridManager.instance.GetGridComponent(p1WorldCenter);
            var g2 = GridManager.instance.GetGridComponent(p2WorldCenter);

            //If either portal has not yet been defined
            if (p1.size.sqrMagnitude == 0 && p2.size.sqrMagnitude == 0)
            {
                return;
            }
            else if (p1.size.sqrMagnitude == 0)
            {
                p.portalTwo = SizeAsConnector(p2, g2.cellSize);
                return;
            }
            else if (p2.size.sqrMagnitude == 0)
            {
                p.portalOne = SizeAsConnector(p1, g1.cellSize);
                return;
            }

            p1 = SizeAsConnector(p1, g1.cellSize);

            var rel = g2.origin - g1.origin;
            if (rel.x > rel.z)
            {
                p2 = new Bounds(new Vector3(p2.center.x, p2.center.y, p1.center.z), new Vector3(p1.size.x, p2.size.y, p1.size.z));
            }
            else
            {
                p2 = new Bounds(new Vector3(p1.center.x, p2.center.y, p2.center.z), new Vector3(p1.size.x, p2.size.y, p1.size.z));
            }

            p.portalOne = p1;
            p.portalTwo = p2;
        }
Exemplo n.º 6
0
        private void ShowActionSelector(GridPortalComponent portal)
        {
            object pa = portal.As<IPortalAction>();
            if (pa == null)
            {
                pa = portal.As<IPortalActionFactory>();
            }

            if (pa == null)
            {
                if (_actionsList == null)
                {
                    _actionsList = new List<KeyValuePair<string, Type>>();

                    var asm = Assembly.GetAssembly(typeof(GridPortalComponent));
                    foreach (var actionType in asm.GetTypes().Where(t => (typeof(IPortalActionFactory).IsAssignableFrom(t) || typeof(IPortalAction).IsAssignableFrom(t)) && t.IsClass && !t.IsAbstract))
                    {
                        var actionName = actionType.Name;

                        var acm = Attribute.GetCustomAttribute(actionType, typeof(AddComponentMenu)) as AddComponentMenu;
                        if (acm != null)
                        {
                            var startIdx = acm.componentMenu.LastIndexOf('/') + 1;
                            actionName = acm.componentMenu.Substring(startIdx);
                        }

                        var pair = new KeyValuePair<string, Type>(actionName, actionType);
                        _actionsList.Add(pair);
                    }

                    _actionsList.Sort((a, b) => a.Key.CompareTo(b.Key));
                    _actionsNames = _actionsList.Select(p => p.Key).ToArray();
                }

                EditorGUILayout.Separator();
                var style = new GUIStyle(GUI.skin.label);
                style.normal.textColor = Color.yellow;
                EditorGUILayout.LabelField("Select a Portal Action", style);
                var selectedActionIdx = EditorGUILayout.Popup(-1, _actionsNames);
                if (selectedActionIdx >= 0)
                {
                    portal.gameObject.AddComponent(_actionsList[selectedActionIdx].Value);
                }
            }
        }
 /// <summary>
 /// Unregisters the portal component with this manager.
 /// </summary>
 /// <param name="portal">The portal component.</param>
 public void UnregisterPortalComponent(GridPortalComponent portal)
 {
     _portalComponents.Remove(portal);
 }
 /// <summary>
 /// Registers the portal component with this manager.
 /// </summary>
 /// <param name="portal">The portal component.</param>
 public void RegisterPortalComponent(GridPortalComponent portal)
 {
     _portalComponents.Add(portal);
 }