diff --git a/doc/classes/CameraServer.xml b/doc/classes/CameraServer.xml
index 757c09448c5..3b16768a3b0 100644
--- a/doc/classes/CameraServer.xml
+++ b/doc/classes/CameraServer.xml
@@ -49,6 +49,29 @@
If [code]true[/code], the server is actively monitoring available camera feeds.
This has a performance cost, so only set it to [code]true[/code] when you're actively accessing the camera.
+ [b]Note:[/b] After setting it to [code]true[/code], you can receive updated camera feeds through the [signal camera_feeds_updated] signal.
+ [codeblocks]
+ [gdscript]
+ func _ready():
+ CameraServer.camera_feeds_updated.connect(_on_camera_feeds_updated)
+ CameraServer.monitoring_feeds = true
+
+ func _on_camera_feeds_updated():
+ var feeds = CameraServer.feeds()
+ [/gdscript]
+ [csharp]
+ public override void _Ready()
+ {
+ CameraServer.CameraFeedsUpdated += OnCameraFeedsUpdated;
+ CameraServer.MonitoringFeeds = true;
+ }
+
+ void OnCameraFeedsUpdated()
+ {
+ var feeds = CameraServer.Feeds();
+ }
+ [/csharp]
+ [/codeblocks]
@@ -64,6 +87,11 @@
Emitted when a [CameraFeed] is removed (e.g. a webcam is unplugged).
+
+
+ Emitted when camera feeds are updated.
+
+
diff --git a/modules/camera/camera_android.cpp b/modules/camera/camera_android.cpp
index 60ff4952901..852da40853a 100644
--- a/modules/camera/camera_android.cpp
+++ b/modules/camera/camera_android.cpp
@@ -474,6 +474,7 @@ void CameraAndroid::update_feeds() {
}
ACameraManager_deleteCameraIdList(cameraIds);
+ emit_signal(SNAME(CameraServer::feeds_updated_signal_name));
}
void CameraAndroid::remove_all_feeds() {
diff --git a/modules/camera/camera_linux.cpp b/modules/camera/camera_linux.cpp
index 0c33598634b..0880bf9e070 100644
--- a/modules/camera/camera_linux.cpp
+++ b/modules/camera/camera_linux.cpp
@@ -80,6 +80,7 @@ void CameraLinux::_update_devices() {
free(devices);
}
+ call_deferred("emit_signal", SNAME(CameraServer::feeds_updated_signal_name));
usleep(1000000);
}
}
diff --git a/modules/camera/camera_macos.mm b/modules/camera/camera_macos.mm
index 88f7f0dfb87..eb1a810991e 100644
--- a/modules/camera/camera_macos.mm
+++ b/modules/camera/camera_macos.mm
@@ -363,6 +363,7 @@ void CameraMacOS::update_feeds() {
add_feed(newfeed);
};
};
+ emit_signal(SNAME(CameraServer::feeds_updated_signal_name));
}
void CameraMacOS::set_monitoring_feeds(bool p_monitoring_feeds) {
diff --git a/servers/camera_server.cpp b/servers/camera_server.cpp
index f95a8cb7306..c23f2020d03 100644
--- a/servers/camera_server.cpp
+++ b/servers/camera_server.cpp
@@ -53,6 +53,7 @@ void CameraServer::_bind_methods() {
ADD_SIGNAL(MethodInfo("camera_feed_added", PropertyInfo(Variant::INT, "id")));
ADD_SIGNAL(MethodInfo("camera_feed_removed", PropertyInfo(Variant::INT, "id")));
+ ADD_SIGNAL(MethodInfo(feeds_updated_signal_name));
BIND_ENUM_CONSTANT(FEED_RGBA_IMAGE);
BIND_ENUM_CONSTANT(FEED_YCBCR_IMAGE);
diff --git a/servers/camera_server.h b/servers/camera_server.h
index bb34229dade..91866fa3144 100644
--- a/servers/camera_server.h
+++ b/servers/camera_server.h
@@ -59,6 +59,7 @@ public:
};
typedef CameraServer *(*CreateFunc)();
+ static inline constexpr const char feeds_updated_signal_name[] = "camera_feeds_updated";
private:
protected: