/// <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)); }
/// <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); }
/// <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); } }
/// <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>()); }
/// <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); }
/// <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; }
/// <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); }
/// <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; }
/// <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); }
/// <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); }
/// <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); }