Prechádzať zdrojové kódy

VideoPlayer: Fix reloading translation remapped stream

Fixes #43917.

(cherry picked from commit 7d0c561e02d37a27884162128387064f4fb1b90b)
Rémi Verschelde 1 rok pred
rodič
commit
e4aec48bea

+ 0 - 1
doc/classes/VideoStreamPlayer.xml

@@ -6,7 +6,6 @@
 	<description>
 		A control used for playback of [VideoStream] resources.
 		Supported video formats are [url=https://www.theora.org/]Ogg Theora[/url] ([code].ogv[/code], [VideoStreamTheora]) and any format exposed via a GDExtension plugin.
-		[b]Note:[/b] Due to a bug, VideoStreamPlayer does not support localization remapping yet.
 		[b]Warning:[/b] On Web, video playback [i]will[/i] perform poorly due to missing architecture-specific assembly optimizations.
 	</description>
 	<tutorials>

+ 10 - 0
scene/gui/video_stream_player.cpp

@@ -237,6 +237,12 @@ bool VideoStreamPlayer::has_loop() const {
 void VideoStreamPlayer::set_stream(const Ref<VideoStream> &p_stream) {
 	stop();
 
+	// Make sure to handle stream changes seamlessly, e.g. when done via
+	// translation remapping.
+	if (stream.is_valid()) {
+		stream->disconnect_changed(callable_mp(this, &VideoStreamPlayer::set_stream));
+	}
+
 	AudioServer::get_singleton()->lock();
 	mix_buffer.resize(AudioServer::get_singleton()->thread_get_mix_buffer_size());
 	stream = p_stream;
@@ -248,6 +254,10 @@ void VideoStreamPlayer::set_stream(const Ref<VideoStream> &p_stream) {
 	}
 	AudioServer::get_singleton()->unlock();
 
+	if (stream.is_valid()) {
+		stream->connect_changed(callable_mp(this, &VideoStreamPlayer::set_stream).bind(stream));
+	}
+
 	if (!playback.is_null()) {
 		playback->set_paused(paused);
 		texture = playback->get_texture();

+ 1 - 0
scene/resources/video_stream.cpp

@@ -172,6 +172,7 @@ Ref<VideoStreamPlayback> VideoStream::instantiate_playback() {
 
 void VideoStream::set_file(const String &p_file) {
 	file = p_file;
+	emit_changed();
 }
 
 String VideoStream::get_file() {