Ejemplo n.º 1
0
        /// <inheritdoc/>
        void IAddElementsHandler.AddElement(Vector3 addPosition)
        {
            var previousWaypoint  = waypointInstance;
            var mapWaypointPrefab = ScenarioManager.Instance.GetExtension <ScenarioWaypointsManager>().waypointPrefab;

            waypointInstance = ScenarioManager.Instance.prefabsPools.GetInstance(mapWaypointPrefab)
                               .GetComponent <ScenarioWaypoint>();
            waypointInstance.transform.position = addPosition;
            var mapManager = ScenarioManager.Instance.GetExtension <ScenarioMapManager>();

            switch (selectedAgent.Type)
            {
            case AgentType.Ego:
            case AgentType.Npc:
                mapManager.LaneSnapping.SnapToLane(LaneSnappingHandler.LaneType.Traffic,
                                                   waypointInstance.transform);
                break;

            case AgentType.Pedestrian:
                mapManager.LaneSnapping.SnapToLane(LaneSnappingHandler.LaneType.Pedestrian,
                                                   waypointInstance.transform);
                break;
            }

            selectedAgentWaypoints.AddWaypoint(waypointInstance, true, previousWaypoint);
            ScenarioManager.Instance.IsScenarioDirty = true;
            ScenarioManager.Instance.GetExtension <ScenarioUndoManager>()
            .RegisterRecord(new UndoAddElement(previousWaypoint));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Adds waypoint to this agent at the index position
        /// </summary>
        /// <param name="waypoint">Waypoint that will be added to this agent</param>
        /// <param name="index">Index position where waypoint will be added</param>
        public int AddWaypoint(ScenarioWaypoint waypoint, int index)
        {
            if (index > waypoints.Count)
            {
                index = waypoints.Count;
            }
            if (index < 0)
            {
                index = 0;
            }
            AddTrigger(waypoint.LinkedTrigger);
            waypoints.Insert(index, waypoint);
            waypoint.ParentAgent               = ParentAgent;
            waypoint.ParentAgentWaypoints      = this;
            waypoint.waypointRenderer.material = ParentAgent.Source.WaypointsMaterial;
            waypoint.IndexInAgent              = index;
            var waypointTransform = waypoint.transform;

            waypointTransform.SetParent(WaypointsParent);
            waypointTransform.localRotation = Quaternion.Euler(0.0f, 0.0f, 0.0f);
            PathRenderer.positionCount      = waypoints.Count + 1;
            for (var i = index; i < waypoints.Count; i++)
            {
                var position = LineRendererPositionOffset + waypoints[i].transform.localPosition;
                PathRenderer.SetPosition(i + 1, position);
                waypoints[i].IndexInAgent = i;
            }

            WaypointPositionChanged(waypoint);

            return(index);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Method that updates line rendered, has to be called every time when waypoint changes the position
        /// </summary>
        /// <param name="waypoint">Waypoint that changed it's position</param>
        public void WaypointPositionChanged(ScenarioWaypoint waypoint)
        {
            var index    = waypoints.IndexOf(waypoint);
            var position = LineRendererPositionOffset + waypoint.transform.transform.localPosition;

            PathRenderer.SetPosition(index + 1, position);

            //Update waypoint direction indicator
            var previousPosition = PathRenderer.GetPosition(index) - position;

            waypoint.directionTransform.localPosition = previousPosition / 2.0f;
            waypoint.directionTransform.localRotation = previousPosition.sqrMagnitude > 0.0f
                ? Quaternion.LookRotation(-previousPosition)
                : Quaternion.Euler(0.0f, 0.0f, 0.0f);

            if (index + 1 < waypoints.Count)
            {
                var nextPosition = position - PathRenderer.GetPosition(index + 2);
                var nextWaypoint = waypoints[index + 1];
                nextWaypoint.directionTransform.localPosition = nextPosition / 2.0f;
                nextWaypoint.directionTransform.localRotation = nextPosition.sqrMagnitude > 0.0f
                    ? Quaternion.LookRotation(-nextPosition)
                    : Quaternion.Euler(0.0f, 0.0f, 0.0f);
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Instantiates a scenario waypoint for the given waypoint type
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public T GetWaypointInstance <T>() where T : ScenarioWaypoint
        {
            ScenarioWaypoint prefab =
                waypointPrefabs.FirstOrDefault(waypointPrefab => waypointPrefab.GetType() == typeof(T));

            if (prefab == null)
            {
                foreach (var waypointPrefab in waypointPrefabs)
                {
                    if (!(waypointPrefab is T))
                    {
                        continue;
                    }

                    prefab = waypointPrefab;
                    break;
                }
            }

            if (prefab == null)
            {
                ScenarioManager.Instance.logPanel.EnqueueError(
                    $"Could not instantiate a waypoints prefab for type {typeof(T).Name}. Add a proper waypoint prefab to the {nameof(ScenarioWaypointsManager)}.");
                return(null);
            }

            return(ScenarioManager.Instance.prefabsPools
                   .GetInstance(prefab.gameObject).GetComponent <T>());
        }
Ejemplo n.º 5
0
 /// <inheritdoc/>
 void IAddElementsHandler.AddElement(Vector3 addPosition)
 {
     ScenarioManager.Instance.IsScenarioDirty = true;
     ScenarioManager.Instance.GetExtension <ScenarioUndoManager>()
     .RegisterRecord(new UndoAddElement(newWaypointInstance));
     newWaypointInstance = agentWaypointsPath.GetWaypointInstance();
     newWaypointInstance.ForceMove(addPosition);
     agentWaypointsPath.AddWaypoint(newWaypointInstance, null);
 }
        /// <inheritdoc/>
        void IAddElementsHandler.AddElement(Vector3 addPosition)
        {
            var path = destinationPointExtension.DestinationPoint.PlaybackPath;

            ScenarioManager.Instance.IsScenarioDirty = true;
            ScenarioManager.Instance.GetExtension <ScenarioUndoManager>()
            .RegisterRecord(new UndoAddElement(newWaypointInstance));
            newWaypointInstance = path.GetWaypointInstance();
            newWaypointInstance.ForceMove(addPosition);
            path.AddWaypoint(newWaypointInstance, null);
        }
Ejemplo n.º 7
0
        /// <inheritdoc/>
        void IAddElementsHandler.AddingCancelled(Vector3 addPosition)
        {
            if (waypointInstance != null)
            {
                waypointInstance.RemoveFromMap();
                waypointInstance.Dispose();
            }

            waypointInstance  = null;
            isAddingWaypoints = false;
        }
        /// <inheritdoc/>
        void IAddElementsHandler.AddingCancelled(Vector3 addPosition)
        {
            if (newWaypointInstance.CanBeRemoved)
            {
                newWaypointInstance.RemoveFromMap();
                newWaypointInstance.Dispose();
            }

            newWaypointInstance = null;
            isAddingWaypoints   = false;
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Adds waypoint to this agent right after previous waypoint
        /// </summary>
        /// <param name="waypoint">Waypoint that will be added to this agent</param>
        /// <param name="copyProperties">If true, waypoint will copy properties from the previous waypoint</param>
        /// <param name="previousWaypoint">New waypoint will be added after previous waypoint, if null new is added as last</param>
        public void AddWaypoint(ScenarioWaypoint waypoint, bool copyProperties = true,
                                ScenarioWaypoint previousWaypoint = null)
        {
            var index = previousWaypoint == null ? waypoints.Count : waypoints.IndexOf(previousWaypoint) + 1;

            if (copyProperties && index > 0)
            {
                waypoint.CopyProperties(waypoints[index - 1]);
            }

            AddWaypoint(waypoint, index);
        }
        /// <inheritdoc/>
        void IAddElementsHandler.AddElement(Vector3 addPosition)
        {
            ScenarioManager.Instance.IsScenarioDirty = true;
            ScenarioManager.Instance.GetExtension <ScenarioUndoManager>()
            .RegisterRecord(new UndoAddElement(newWaypointInstance));
            var mapWaypointPrefab =
                ScenarioManager.Instance.GetExtension <ScenarioWaypointsManager>().waypointPrefab;

            newWaypointInstance = ScenarioManager.Instance.prefabsPools
                                  .GetInstance(mapWaypointPrefab).GetComponent <ScenarioWaypoint>();
            newWaypointInstance.ForceMove(addPosition);
            agentWaypoints.AddWaypoint(newWaypointInstance, true);
        }
Ejemplo n.º 11
0
        /// <inheritdoc/>
        void IAddElementsHandler.AddingStarted(Vector3 addPosition)
        {
            newWaypointInstance = agentWaypointsPath.GetWaypointInstance();
            if (newWaypointInstance == null)
            {
                Debug.LogWarning(
                    $"Cannot add waypoints. Add {nameof(ScenarioAgentWaypoint)} component to the prefab.");
                ScenarioManager.Instance.GetExtension <InputManager>().CancelAddingElements(this);
                return;
            }

            newWaypointInstance.ForceMove(addPosition);
            agentWaypointsPath.AddWaypoint(newWaypointInstance, null);
            isAddingWaypoints = true;
        }
        /// <inheritdoc/>
        void IAddElementsHandler.AddingStarted(Vector3 addPosition)
        {
            var mapWaypointPrefab =
                ScenarioManager.Instance.GetExtension <ScenarioWaypointsManager>().waypointPrefab;

            newWaypointInstance = ScenarioManager.Instance.prefabsPools
                                  .GetInstance(mapWaypointPrefab).GetComponent <ScenarioWaypoint>();
            if (newWaypointInstance == null)
            {
                Debug.LogWarning(
                    $"Cannot add waypoints. Add {nameof(ScenarioWaypoint)} component to the prefab.");
                ScenarioManager.Instance.GetExtension <InputManager>().CancelAddingElements(this);
                return;
            }

            newWaypointInstance.ForceMove(addPosition);
            agentWaypoints.AddWaypoint(newWaypointInstance, true);
            isAddingWaypoints = true;
        }
Ejemplo n.º 13
0
        /// <inheritdoc/>
        void IAddElementsHandler.AddingStarted(Vector3 addPosition)
        {
            if (selectedAgent == null)
            {
                Debug.LogWarning("Cannot add waypoints if no agent or waypoint is selected.");
                ScenarioManager.Instance.GetExtension <InputManager>().CancelAddingElements(this);
                return;
            }

            isAddingWaypoints = true;

            var mapWaypointPrefab = ScenarioManager.Instance.GetExtension <ScenarioWaypointsManager>().waypointPrefab;

            waypointInstance = ScenarioManager.Instance.prefabsPools.GetInstance(mapWaypointPrefab)
                               .GetComponent <ScenarioWaypoint>();
            if (waypointInstance == null)
            {
                Debug.LogWarning("Cannot add waypoints. Add waypoint component to the prefab.");
                ScenarioManager.Instance.GetExtension <InputManager>().CancelAddingElements(this);
                ScenarioManager.Instance.prefabsPools.ReturnInstance(waypointInstance.gameObject);
                return;
            }

            waypointInstance.transform.position = addPosition;
            var mapManager = ScenarioManager.Instance.GetExtension <ScenarioMapManager>();

            switch (selectedAgent.Type)
            {
            case AgentType.Ego:
            case AgentType.Npc:
                mapManager.LaneSnapping.SnapToLane(LaneSnappingHandler.LaneType.Traffic,
                                                   waypointInstance.transform);
                break;

            case AgentType.Pedestrian:
                mapManager.LaneSnapping.SnapToLane(LaneSnappingHandler.LaneType.Pedestrian,
                                                   waypointInstance.transform);
                break;
            }

            selectedAgentWaypoints.AddWaypoint(waypointInstance, true, selectedWaypoint);
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Removes the waypoint from this agent
        /// </summary>
        /// <param name="waypoint">Waypoint that will be removed from this agent</param>
        public int RemoveWaypoint(ScenarioWaypoint waypoint)
        {
            var index = waypoints.IndexOf(waypoint);

            waypoints.Remove(waypoint);
            RemoveTrigger(waypoint.LinkedTrigger);
            for (var i = index; i < waypoints.Count; i++)
            {
                var position = LineRendererPositionOffset + waypoints[i].transform.transform.localPosition;
                PathRenderer.SetPosition(i + 1, position);
                waypoints[i].IndexInAgent = i;
            }

            PathRenderer.positionCount = waypoints.Count + 1;

            //Update position after removing an element
            if (index < waypoints.Count)
            {
                WaypointPositionChanged(waypoints[index]);
            }
            return(index);
        }
Ejemplo n.º 15
0
        /// <summary>
        /// Method called when another scenario element has been selected
        /// </summary>
        /// <param name="selectedElement">Scenario element that has been selected</param>
        private void OnSelectedOtherElement(ScenarioElement selectedElement)
        {
            if (isAddingWaypoints)
            {
                ScenarioManager.Instance.GetExtension <InputManager>().CancelAddingElements(this);
            }

            //Force input apply on deselect
            if (selectedWaypoint != null)
            {
                SubmitChangedInputs();
            }
            selectedWaypoint       = selectedElement as ScenarioWaypoint;
            selectedAgent          = selectedWaypoint != null ? selectedWaypoint.ParentAgent : null;
            selectedAgentWaypoints = selectedAgent == null ? null : selectedAgent.GetExtension <AgentWaypoints>();
            //Disable waypoints for ego vehicles
            if (selectedAgent == null || selectedAgentWaypoints == null ||
                !selectedAgent.Source.AgentSupportWaypoints(selectedAgent))
            {
                gameObject.SetActive(false);
            }
            else
            {
                gameObject.SetActive(true);
                speedPanel.SetActive(selectedWaypoint != null);
                waitTimePanel.SetActive(selectedWaypoint != null);
                if (selectedWaypoint != null)
                {
                    speedInput.ExternalValueChange(selectedWaypoint.Speed, false);
                    waitTimeInput.text = selectedWaypoint.WaitTime.ToString("F");
                }

                triggerEditPanel.OnSelectedNewTrigger(selectedWaypoint.LinkedTrigger);
                UnityUtilities.LayoutRebuild(transform as RectTransform);
            }
        }
 /// <summary>
 /// Registers the waypoint in the manager
 /// </summary>
 /// <param name="waypoint">Waypoint to register</param>
 public void RegisterWaypoint(ScenarioWaypoint waypoint)
 {
     Waypoints.Add(waypoint);
 }
 /// <summary>
 /// Unregisters the waypoint in the manager
 /// </summary>
 /// <param name="waypoint">Waypoint to unregister</param>
 public void UnregisterWaypoint(ScenarioWaypoint waypoint)
 {
     Waypoints.Remove(waypoint);
 }