// Update is called once per frame void Update() { _multipleMedia = sphere.GetComponent <MultiplePlayerControl>(); _player = _multipleMedia.Player; _gatedClips = GetComponents <GatedClip>(); _playableClips = GetComponents <PlayableClip>(); _previewMode = GetComponent <PreviewMode>(); Array.Sort(_playableClips); this.transform.position = Camera.main.transform.position; currentTime = _multipleMedia.GetCurrentTime(); CurrentVisibleView = GetVisibleView(); if (_multipleMedia.IsPaused()) { float relativeTime = currentTime - _playableClips[_currentClipIndex].startTime; Debug.Log("Current frame: " + (int)(currentTime * _multipleMedia.Player.Info.GetVideoFrameRate()) + ". Current view is " + CurrentVisibleView + ". Current clip: " + GetCurrentClipIndex()); Debug.Log("Relative frame: " + (int)(relativeTime * _multipleMedia.Player.Info.GetVideoFrameRate())); } currentTime = _multipleMedia.GetCurrentTime(); if (initialized) // Need in case the first clip does not start at t = 0s of the raw video. { Debug.Log("Is playing? " + _multipleMedia.IsPlaying()); _multipleMedia.Seek(_playableClips[0].startTime); if (Mathf.Abs(_player.Control.GetCurrentTimeMs() / 1000f - _playableClips[0].startTime) < GetVideoFps()) { initialized = false; } Debug.Log("Initialized. Current time: " + Mathf.Abs(_player.Control.GetCurrentTimeMs()) / 1000f + ", Initialized? " + initialized.ToString()); return; } // If there are no playable clips, stop. if (_playableClips.Length == 0 || _currentClipIndex < 0 || _currentClipIndex >= _playableClips.Length) { this.SetPlayMode(false); this.PauseVideo(); return; } if (!_multipleMedia.SyncMediaPlayers() && _multipleMedia.isTransitioning) { Debug.Log("Not in sync DESPITE FORCEWAIT"); if (_multipleMedia.Player.Control.IsSeeking()) { playMode = false; } else if (_multipleMedia.OtherPlayer.Control.IsSeeking()) { playMode = false; } } currentTime = _multipleMedia.GetCurrentTime(); if (playMode) { this.PlayVideo(); } else { this.PauseVideo(); } this.SetupEquirectTexture(); // Storing equirect texture into PreviewMode component, which is read by VideoEditorWindow. if (_player.TextureProducer != null) { if (_previewMode.equirectTexture != null) { MediaPlayer equirectPlayer = _multipleMedia.GetEquirectPlayer(); if (equirectPlayer != null) { _previewMode.equirectTexture = (Texture2D)equirectPlayer.TextureProducer.GetTexture(); } } } if (currentTime < _playableClips[_currentClipIndex].startTime - 5) { Debug.Log("Current time " + currentTime + " is less than start time of clip index " + _currentClipIndex + ": " + _playableClips[_currentClipIndex] + ". Skipping ahead..."); _multipleMedia.Seek(_playableClips[_currentClipIndex].startTime); return; } _previewMode.SetCurrentClip(_playableClips[_currentClipIndex].clipIndex); int previousClipIndex = _currentClipIndex; int currentFrame = (int)(currentTime * _multipleMedia.Player.Info.GetVideoFrameRate()); // Check whether playable clip is gated clip. GatedClip gc = _playableClips[_currentClipIndex] as GatedClip; if (gc != null) { // This clip is a gated clip. if ((_player.Control.IsPlaying() || _multipleMedia.IsPaused()) && gc.checkSalient(currentTime, _multipleMedia, this)) { currentTime = _multipleMedia.GetCurrentTime(); Debug.Log("Current time: " + currentTime + ". Current face: " + GetVisibleView() + ". Passed gated clip " + gc + ". Moving from index: " + _currentClipIndex); if (_multipleMedia.isTransitioning) { Debug.Log("Finishing in-progress transition."); _multipleMedia.FinishTransition(); Debug.Log("Multiple media is transition? " + _multipleMedia.isTransitioning); } else { Debug.Log("No in-progress transition"); } _playableClips = sphere.GetComponents <PlayableClip>(); Array.Sort(_playableClips); _currentClipIndex++; _multipleMedia.expectedCurrentFrame = 0; _multipleMedia.expectedNextFrame = 1; while (_currentClipIndex < _playableClips.Length && !_playableClips[_currentClipIndex].enabled) { _currentClipIndex++; _multipleMedia.expectedCurrentFrame = 0; _multipleMedia.expectedNextFrame = 1; } Debug.Log("Next clip index: " + _currentClipIndex); if (_currentClipIndex >= 0 && _currentClipIndex < _playableClips.Length) { Debug.Log(_playableClips[_currentClipIndex].ToString()); } _multipleMedia.UpdateAudio(); } } else // Not a gated clip. { if (_player.Control.IsPlaying() && _playableClips[_currentClipIndex].checkSalient(currentTime, _multipleMedia, this)) { _playableClips = sphere.GetComponents <PlayableClip>(); Array.Sort(_playableClips); Debug.Log("Current time: " + currentTime + ". Finished clip " + _playableClips[_currentClipIndex] + ". Moving from index: " + _currentClipIndex); _currentClipIndex++; _multipleMedia.expectedCurrentFrame = 0; _multipleMedia.expectedNextFrame = 1; while (_currentClipIndex < _playableClips.Length && !_playableClips[_currentClipIndex].enabled) { _currentClipIndex++; _multipleMedia.expectedCurrentFrame = 0; _multipleMedia.expectedNextFrame = 1; } Debug.Log("Next clip index: " + _currentClipIndex); _multipleMedia.UpdateAudio(); } } if (_currentClipIndex >= _playableClips.Length) { _currentClipIndex = -1; Debug.Log("End of all clips."); SetPlayMode(false); return; } if (previousClipIndex != _currentClipIndex && Mathf.Abs(_playableClips[_currentClipIndex].startTime - _playableClips[previousClipIndex].endTime) > 0.5f) { Debug.Log("Jumping to beginning of next clip index: " + _currentClipIndex + ". " + _playableClips[_currentClipIndex].ToString()); _multipleMedia.Seek(_playableClips[_currentClipIndex].startTime); } }