public void SetupFromRecordingInfo(SessionRecordingInfo recordingInfo, List <IFunctionalityProvider> providers)
        {
            k_DataRecordings.Clear();
            Director = GetComponent <PlayableDirector>();
            Director.playableAsset     = recordingInfo.Timeline;
            Director.timeUpdateMode    = DirectorUpdateMode.Manual;
            Director.extrapolationMode = recordingInfo.DefaultExtrapolationMode;
            m_Duration = Director.duration;
            m_ControlsMarsLifecycle = recordingInfo.ControlsMarsLifecycle;
            recordingInfo.GetDataRecordings(k_DataRecordings);
            foreach (var recording in k_DataRecordings)
            {
                recording.SetupDataProviders(Director, providers);
            }

            m_RecordedDataProviders.Clear();
            foreach (var provider in providers)
            {
                var recordedProvider = provider as IRecordedDataProvider;
                if (recordedProvider != null)
                {
                    m_RecordedDataProviders.Add(recordedProvider);
                }
            }

            k_DataRecordings.Clear();
        }
 public void Clear()
 {
     SceneSubscriberTypes.Clear();
     SceneRequirements.Clear();
     m_EnvironmentMode    = default;
     m_EnvironmentPrefab  = null;
     m_SyntheticRecording = null;
     m_Temporal           = false;
 }
        public static SessionRecordingInfo CreateSessionRecordingAsset(string path)
        {
            var timeline = ScriptableObject.CreateInstance <TimelineAsset>();

            AssetDatabase.CreateAsset(timeline, path);
            var recordingInfo = SessionRecordingInfo.Create(timeline);

            AssetDatabase.AddObjectToAsset(recordingInfo, timeline);
            return(recordingInfo);
        }
        internal bool Update(MARSSession marsSession, List <IFunctionalitySubscriber> subscribers, bool temporal)
        {
            k_SubscriberTypes.Clear();
            k_TraitRequirements.Clear();

            var moduleLoader = ModuleLoaderCore.instance;

            foreach (var module in moduleLoader.modules)
            {
                k_SubscriberTypes.Add(module.GetType());
            }

            foreach (var subscriber in subscribers)
            {
                k_SubscriberTypes.Add(subscriber.GetType());
            }

            k_TraitRequirements.UnionWith(marsSession.requirements.TraitRequirements);

            var simulationSettings   = SimulationSettings.instance;
            var environmentMode      = simulationSettings.EnvironmentMode;
            var environmentPrefab    = simulationSettings.EnvironmentPrefab;
            var independentRecording = simulationSettings.IndependentRecording;
            var syntheticRecording   = simulationSettings.UseSyntheticRecording ?
                                       simulationSettings.GetRecordingForCurrentSyntheticEnvironment() : null;

            var recordingPlaybackModule  = moduleLoader.GetModule <MarsRecordingPlaybackModule>();
            var disableRecordingPlayback = recordingPlaybackModule != null && recordingPlaybackModule.DisableRecordingPlayback;

            var changed = !SceneSubscriberTypes.SetEquals(k_SubscriberTypes) ||
                          !SceneRequirements.SetEquals(k_TraitRequirements) ||
                          m_EnvironmentMode != environmentMode ||
                          m_EnvironmentPrefab != environmentPrefab ||
                          m_SyntheticRecording != syntheticRecording ||
                          m_IndependentRecording != independentRecording ||
                          m_Temporal != temporal ||
                          m_DisableRecordingPlayback != disableRecordingPlayback;

            SceneSubscriberTypes.Clear();
            SceneSubscriberTypes.UnionWith(k_SubscriberTypes);
            SceneRequirements.Clear();
            SceneRequirements.UnionWith(k_TraitRequirements);
            m_EnvironmentMode          = environmentMode;
            m_EnvironmentPrefab        = environmentPrefab;
            m_SyntheticRecording       = syntheticRecording;
            m_IndependentRecording     = independentRecording;
            m_Temporal                 = temporal;
            m_DisableRecordingPlayback = disableRecordingPlayback;

            k_SubscriberTypes.Clear();
            k_TraitRequirements.Clear();
            return(changed);
        }
예제 #5
0
        public SessionRecordingInfo GetCurrentRecording()
        {
            SessionRecordingInfo recordingInfo = null;

            var recording = _control.CurrentRecording;

            if (recording != null)
            {
                recordingInfo    = _mapper.Map <SessionRecordingInfo>(recording);
                recordingInfo.Id = ApiRoutes.Recording.ConvertToRouteString(recording.OpenedAt);
            }

            return(recordingInfo);
        }
 void IModule.UnloadModule()
 {
     EditorApplication.update -= EditorUpdate;
     QuerySimulationModule.BeforeTemporalSimulationRestart -= OnBeforeTemporalSimulationRestart;
     QuerySimulationModule.addCustomProviders            -= OnBeforeSetupDefaultProviders;
     QuerySimulationModule.onTemporalSimulationStop      -= OnTemporalSimulationStop;
     QuerySimulationModule.BeforeCleanupProviders        -= OnBeforeCleanupProviders;
     QuerySimulationModule.OnOneShotSimulationStart      -= OnOneShotSimulationStart;
     m_MarsSceneModule.BeforeSetupDefaultProviders       -= OnBeforeSetupDefaultProviders;
     m_SimulationRecordingManager.RecordingOptionChanged -= OnRecordingOptionChanged;
     EditorOnlyDelegates.GetCurrentRecordingDirector      = () => null;
     m_CurrentRecordingInfo         = null;
     m_ManualTimeChangeTask         = null;
     TimelineSyncState              = SimulationTimeSyncState.NoTimeline;
     TimelineSyncProgress           = 0f;
     SyncEndTime                    = 0d;
     m_PreviousMasterDirector       = null;
     m_ShouldShowTimelineOnSimStart = false;
     m_IgnoreTimeChangeFromWindow   = false;
     m_IgnoreTimeChangeFrame        = 0;
 }
        /// <summary>
        /// Adds data from the most recent recording session to the given recording
        /// </summary>
        /// <param name="recordingInfo">The session recording to add data to</param>
        public void AddDataFromRecordingSession(SessionRecordingInfo recordingInfo)
        {
            k_DataRecordings.Clear();
            k_NewAssets.Clear();

            var timeline = recordingInfo.Timeline;

            m_SessionRecordingModule.CreateDataRecordings(timeline, k_DataRecordings, k_NewAssets);
            foreach (var dataRecording in k_DataRecordings)
            {
                recordingInfo.AddDataRecording(dataRecording);
                dataRecording.name = dataRecording.GetType().Name;
                AssetDatabase.AddObjectToAsset(dataRecording, timeline);
            }

            foreach (var newAsset in k_NewAssets)
            {
                AssetDatabase.AddObjectToAsset(newAsset, timeline);
            }

            k_DataRecordings.Clear();
            k_NewAssets.Clear();
        }
        void OnBeforeSetupDefaultProviders(List <IFunctionalityProvider> providers)
        {
            var simulationSettings = SimulationSettings.instance;

            if (DisableRecordingPlayback || !simulationSettings.IsUsingRecording || !MarsEditorUtils.SimulatingDiscovery)
            {
                m_CurrentRecordingInfo = null;
                TimelineSyncState      = SimulationTimeSyncState.NoTimeline;
                return;
            }

            var sessionDirectorGO = GameObjectUtils.Create("Session Director");

            // Deactivate until we've set up so that the session director does not receive OnEnable immediately
            sessionDirectorGO.SetActive(false);
            m_CurrentSessionDirector = sessionDirectorGO.AddComponent <RecordedSessionDirector>();
            var recordingInfo = simulationSettings.GetCurrentRecording();

            if (recordingInfo != m_CurrentRecordingInfo)
            {
                m_CurrentRecordingInfo = recordingInfo;
                SetStateToSynced();
            }

            k_RecordedDataProviders.Clear();
            m_CurrentSessionDirector.SetupFromRecordingInfo(recordingInfo, k_RecordedDataProviders);
            m_CurrentSessionDirector.TimeUpdated += OnDirectorTimeUpdated;
            m_CurrentSessionDirector.EndReached  += OnDirectorEndReached;
            var director = m_CurrentSessionDirector.Director;

            director.played  += OnDirectorPlayed;
            director.paused  += OnDirectorPaused;
            director.stopped += OnDirectorStopped;
            sessionDirectorGO.SetActive(true);

            providers.AddRange(k_RecordedDataProviders);
            m_SteppableDataProviders.Clear();
            var hasPlanesProvider     = false;
            var hasPointCloudProvider = false;

            foreach (var provider in k_RecordedDataProviders)
            {
                if (provider is ISteppableRecordedDataProvider steppableDataProvider)
                {
                    m_SteppableDataProviders.Add(steppableDataProvider);
                }

                if (provider is IProvidesPlaneFinding)
                {
                    hasPlanesProvider = true;
                }
                else if (provider is IProvidesPointCloud)
                {
                    hasPointCloudProvider = true;
                }
            }

            // If there are recorded planes or point cloud providers, we need to set up stub providers to make sure
            // the simulated discovery provider game object doesn't get created.
            if (hasPlanesProvider || hasPointCloudProvider)
            {
                var stubProvidersObj = GameObjectUtils.Create(k_StubProvidersName);
                var sessionProvider  = stubProvidersObj.AddComponent <StubSessionProvider>();
                sessionProvider.SuppressWarnings = true;
                providers.Add(sessionProvider);
                if (!hasPlanesProvider)
                {
                    var planesProvider = stubProvidersObj.AddComponent <StubPlanesProvider>();
                    planesProvider.SuppressWarnings = true;
                    providers.Add(planesProvider);
                }
                else if (!hasPointCloudProvider)
                {
                    var pointCloudProvider = stubProvidersObj.AddComponent <StubPointCloudProvider>();
                    pointCloudProvider.SuppressWarnings = true;
                    providers.Add(pointCloudProvider);
                }
            }
        }