/// <summary>
        /// Sets up the next recording for the current environment and triggers simulation restart
        /// </summary>
        public void SetupNextRecordingAndRestartSimulation()
        {
            var simulationSettings = SimulationSettings.instance;
            var recordingsCount    = m_CurrentSyntheticRecordings.Count;

            if (recordingsCount <= 1 || !simulationSettings.UseSyntheticRecording)
            {
                return;
            }

            if (CurrentSyntheticRecordingOptionIndex >= recordingsCount)
            {
                CurrentSyntheticRecordingOptionIndex = 1;
            }
            else
            {
                CurrentSyntheticRecordingOptionIndex++;
            }

            simulationSettings.SetRecordingForCurrentSyntheticEnvironment(m_CurrentSyntheticRecordings[CurrentSyntheticRecordingOptionIndex - 1]);
            RecordingOptionChanged?.Invoke();

            m_QuerySimulationModule.RequestSimulationModeSelection(SimulationModeSelection.TemporalMode);
            m_QuerySimulationModule.RestartSimulationIfNeeded(true);
        }
        /// <summary>
        /// Sets an optional recording to use with the current environment and triggers simulation restart
        /// </summary>
        /// <param name="optionIndex">Index of the recording to use, where 0 means no recording should be used</param>
        public void SetRecordingOptionAndRestartSimulation(int optionIndex)
        {
            if (optionIndex < 0 || optionIndex > CurrentSyntheticRecordingsCount)
            {
                optionIndex = 0;
            }

            // An optionIndex of 0 means no recording is used, so the index into current recordings is optionIndex - 1
            var useRecording = optionIndex > 0;

            CurrentSyntheticRecordingOptionIndex = optionIndex;
            var simulationSettings = SimulationSettings.instance;

            if (useRecording)
            {
                simulationSettings.UseSyntheticRecording = true;
                simulationSettings.SetRecordingForCurrentSyntheticEnvironment(m_CurrentSyntheticRecordings[optionIndex - 1]);
            }
            else
            {
                simulationSettings.UseSyntheticRecording = false;
            }

            RecordingOptionChanged?.Invoke();

            if (useRecording)
            {
                m_QuerySimulationModule.RequestSimulationModeSelection(SimulationModeSelection.TemporalMode);
            }

            m_QuerySimulationModule.RestartSimulationIfNeeded(true);
        }
 void SetIndependentRecording(int index)
 {
     CurrentIndependentRecordingIndex = index;
     SimulationSettings.instance.IndependentRecording = m_IndependentRecordings[index];
     RecordingOptionChanged?.Invoke();
 }
        void GetSyntheticRecordings()
        {
            m_SyntheticRecordingsMap.Clear();
            var recordingGUIDs = AssetDatabase.FindAssets(k_SessionRecordingFilter);

            foreach (var guid in recordingGUIDs)
            {
                k_EnvironmentPrefabs.Clear();
                var path      = AssetDatabase.GUIDToAssetPath(guid);
                var recording = AssetDatabase.LoadAssetAtPath <SessionRecordingInfo>(path);
                recording.GetSyntheticEnvironments(k_EnvironmentPrefabs);
                foreach (var environmentPrefab in k_EnvironmentPrefabs)
                {
                    if (m_SyntheticRecordingsMap.TryGetValue(environmentPrefab, out var recordings))
                    {
                        recordings.Add(recording);
                    }
                    else
                    {
                        m_SyntheticRecordingsMap[environmentPrefab] = new List <SessionRecordingInfo> {
                            recording
                        }
                    };
                }
            }

            k_EnvironmentPrefabs.Clear();
        }

        void UpdateCurrentSyntheticRecordings()
        {
            m_CurrentSyntheticRecordings.Clear();
            var simulationSettings = SimulationSettings.instance;

            if (simulationSettings.EnvironmentMode != EnvironmentMode.Synthetic)
            {
                return;
            }

            var environmentPrefab = simulationSettings.EnvironmentPrefab;

            if (environmentPrefab != null && m_SyntheticRecordingsMap.TryGetValue(environmentPrefab, out var recordings))
            {
                m_CurrentSyntheticRecordings.AddRange(recordings);
            }

            var recordingsCount = m_CurrentSyntheticRecordings.Count;

            SyntheticRecordingOptionContents    = new GUIContent[recordingsCount + 1];
            SyntheticRecordingOptionContents[0] = new GUIContent("No Recording (Manual)");
            for (var i = 0; i < recordingsCount; i++)
            {
                SyntheticRecordingOptionContents[i + 1] = new GUIContent(m_CurrentSyntheticRecordings[i].DisplayName);
            }

            var currentRecording = simulationSettings.GetRecordingForCurrentSyntheticEnvironment();

            if (currentRecording == null)
            {
                if (recordingsCount > 0)
                {
                    // The current environment has recordings but it does not have a valid recording assigned
                    // in simulation settings, so assign one now
                    currentRecording = m_CurrentSyntheticRecordings[0];
                    simulationSettings.SetRecordingForCurrentSyntheticEnvironment(currentRecording);
                }
                else if (simulationSettings.UseSyntheticRecording)
                {
                    // The current environment does not have recordings but the previous environment was using
                    // a recording, so make sure the next simulation is one-shot
                    m_QuerySimulationModule.NextSimModeSelection = SimulationModeSelection.SingleFrameMode;
                    simulationSettings.UseSyntheticRecording     = false;
                }
            }

            CurrentSyntheticRecordingOptionIndex = simulationSettings.UseSyntheticRecording ?
                                                   1 + m_CurrentSyntheticRecordings.IndexOf(currentRecording) : 0;

            RecordingOptionChanged?.Invoke();
        }

        void UpdateIndependentRecordings()
        {
            m_IndependentRecordings.Clear();
            var recordingGUIDs = AssetDatabase.FindAssets(k_SessionRecordingFilter);

            foreach (var guid in recordingGUIDs)
            {
                k_EnvironmentPrefabs.Clear();
                var path      = AssetDatabase.GUIDToAssetPath(guid);
                var recording = AssetDatabase.LoadAssetAtPath <SessionRecordingInfo>(path);
                recording.GetSyntheticEnvironments(k_EnvironmentPrefabs);
                if (k_EnvironmentPrefabs.Count == 0)
                {
                    m_IndependentRecordings.Add(recording);
                }
            }

            k_EnvironmentPrefabs.Clear();

            m_IndependentRecordings.Sort((a, b) => a.DisplayName.CompareTo(b.DisplayName));
            m_IndependentRecordingPaths.Clear();
            foreach (var recording in m_IndependentRecordings)
            {
                m_IndependentRecordingPaths.Add(AssetDatabase.GetAssetPath(recording));
            }

            var simulationSettings = SimulationSettings.instance;

            IndependentRecordingContents = m_IndependentRecordings.ConvertAll(recording => new GUIContent(recording.DisplayName)).ToArray();
            var currentRecordingAssetPath = AssetDatabase.GetAssetPath(simulationSettings.IndependentRecording);

            CurrentIndependentRecordingIndex = Mathf.Max(m_IndependentRecordingPaths.IndexOf(currentRecordingAssetPath), 0);

            if (simulationSettings.IndependentRecording == null && IndependentRecordingsExist)
            {
                SetIndependentRecording(0);
            }
        }