From f3c586b10e4be8f7e74b65f26fa2c11b585105ce Mon Sep 17 00:00:00 2001 From: Agash Date: Tue, 11 Aug 2026 23:22:41 +0200 Subject: [PATCH 1/3] utils: Add nlohmann type converter for scene item blending method --- src/utils/Json.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/utils/Json.h b/src/utils/Json.h index 5b5bceaa7..e5bf774da 100644 --- a/src/utils/Json.h +++ b/src/utils/Json.h @@ -70,6 +70,11 @@ NLOHMANN_JSON_SERIALIZE_ENUM(obs_blending_type, { {OBS_BLEND_DARKEN, "OBS_BLEND_DARKEN"}, }) +NLOHMANN_JSON_SERIALIZE_ENUM(obs_blending_method, { + {OBS_BLEND_METHOD_DEFAULT, "OBS_BLEND_METHOD_DEFAULT"}, + {OBS_BLEND_METHOD_SRGB_OFF, "OBS_BLEND_METHOD_SRGB_OFF"}, + }) + NLOHMANN_JSON_SERIALIZE_ENUM(obs_deinterlace_mode, { {OBS_DEINTERLACE_MODE_DISABLE, "OBS_DEINTERLACE_MODE_DISABLE"}, {OBS_DEINTERLACE_MODE_DISCARD, "OBS_DEINTERLACE_MODE_DISCARD"}, From 8e8e9023d02389719ac09b4a892ecf81137baf5a Mon Sep 17 00:00:00 2001 From: Agash Date: Tue, 11 Aug 2026 23:22:41 +0200 Subject: [PATCH 2/3] requesthandler: Add scene item blend method requests Adds the following requests: - `GetSceneItemBlendMethod` - `SetSceneItemBlendMethod` Browser sources used as overlays need their blending method set to sRGB Off for transparency to composite correctly. That was previously only reachable through the UI, leaving a manual step in otherwise automated overlay setup. Closes #1341 --- src/requesthandler/RequestHandler.cpp | 2 + src/requesthandler/RequestHandler.h | 2 + .../RequestHandler_SceneItems.cpp | 78 +++++++++++++++++++ 3 files changed, 82 insertions(+) diff --git a/src/requesthandler/RequestHandler.cpp b/src/requesthandler/RequestHandler.cpp index 02a750f10..a692c4f51 100644 --- a/src/requesthandler/RequestHandler.cpp +++ b/src/requesthandler/RequestHandler.cpp @@ -147,6 +147,8 @@ const std::unordered_map RequestHandler::_han {"SetSceneItemIndex", &RequestHandler::SetSceneItemIndex}, {"GetSceneItemBlendMode", &RequestHandler::GetSceneItemBlendMode}, {"SetSceneItemBlendMode", &RequestHandler::SetSceneItemBlendMode}, + {"GetSceneItemBlendMethod", &RequestHandler::GetSceneItemBlendMethod}, + {"SetSceneItemBlendMethod", &RequestHandler::SetSceneItemBlendMethod}, {"GetSceneItemPrivateSettings", &RequestHandler::GetSceneItemPrivateSettings}, {"SetSceneItemPrivateSettings", &RequestHandler::SetSceneItemPrivateSettings}, diff --git a/src/requesthandler/RequestHandler.h b/src/requesthandler/RequestHandler.h index 49898aebc..312a34b86 100644 --- a/src/requesthandler/RequestHandler.h +++ b/src/requesthandler/RequestHandler.h @@ -166,6 +166,8 @@ class RequestHandler { RequestResult SetSceneItemIndex(const Request &); RequestResult GetSceneItemBlendMode(const Request &); RequestResult SetSceneItemBlendMode(const Request &); + RequestResult GetSceneItemBlendMethod(const Request &); + RequestResult SetSceneItemBlendMethod(const Request &); RequestResult GetSceneItemPrivateSettings(const Request &); RequestResult SetSceneItemPrivateSettings(const Request &); diff --git a/src/requesthandler/RequestHandler_SceneItems.cpp b/src/requesthandler/RequestHandler_SceneItems.cpp index de95e493a..46b4f44fb 100644 --- a/src/requesthandler/RequestHandler_SceneItems.cpp +++ b/src/requesthandler/RequestHandler_SceneItems.cpp @@ -809,6 +809,84 @@ RequestResult RequestHandler::SetSceneItemBlendMode(const Request &request) return RequestResult::Success(); } +/** + * Gets the blend method of a scene item. + * + * Blend methods: + * + * - `OBS_BLEND_METHOD_DEFAULT` + * - `OBS_BLEND_METHOD_SRGB_OFF` + * + * Scenes and Groups + * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field + * @requestField ?sceneName | String | Name of the scene the item is in + * @requestField ?sceneUuid | String | UUID of the scene the item is in + * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 + * + * @responseField sceneItemBlendMethod | String | Current blend method + * + * @requestType GetSceneItemBlendMethod + * @complexity 2 + * @rpcVersion -1 + * @initialVersion 5.8.0 + * @api requests + * @category scene items + */ +RequestResult RequestHandler::GetSceneItemBlendMethod(const Request &request) +{ + RequestStatus::RequestStatus statusCode; + std::string comment; + OBSSceneItemAutoRelease sceneItem = + request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + if (!sceneItem) + return RequestResult::Error(statusCode, comment); + + auto blendMethod = obs_sceneitem_get_blending_method(sceneItem); + + json responseData; + responseData["sceneItemBlendMethod"] = blendMethod; + + return RequestResult::Success(responseData); +} + +/** + * Sets the blend method of a scene item. + * + * Scenes and Groups + * + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field + * @requestField ?sceneName | String | Name of the scene the item is in + * @requestField ?sceneUuid | String | UUID of the scene the item is in + * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 + * @requestField sceneItemBlendMethod | String | New blend method + * + * @requestType SetSceneItemBlendMethod + * @complexity 2 + * @rpcVersion -1 + * @initialVersion 5.8.0 + * @api requests + * @category scene items + */ +RequestResult RequestHandler::SetSceneItemBlendMethod(const Request &request) +{ + RequestStatus::RequestStatus statusCode; + std::string comment; + OBSSceneItemAutoRelease sceneItem = + request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + if (!(sceneItem && request.ValidateString("sceneItemBlendMethod", statusCode, comment))) + return RequestResult::Error(statusCode, comment); + + enum obs_blending_method blendMethod = request.RequestData["sceneItemBlendMethod"]; + if (blendMethod == OBS_BLEND_METHOD_DEFAULT && request.RequestData["sceneItemBlendMethod"] != "OBS_BLEND_METHOD_DEFAULT") + return RequestResult::Error(RequestStatus::InvalidRequestField, + "The field sceneItemBlendMethod has an invalid value."); + + obs_sceneitem_set_blending_method(sceneItem, blendMethod); + + return RequestResult::Success(); +} + // Intentionally undocumented RequestResult RequestHandler::GetSceneItemPrivateSettings(const Request &request) { From 5b54cc2b0a44338eb43953f50849a2caa0d4b05e Mon Sep 17 00:00:00 2001 From: Agash Date: Tue, 11 Aug 2026 23:22:41 +0200 Subject: [PATCH 3/3] utils: Add `sceneItemBlendMethod` field to scene item list array Mirrors the existing `sceneItemBlendMode` field, so the blending method of a scene item can be read without a request per item. --- src/utils/Obs_ArrayHelper.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils/Obs_ArrayHelper.cpp b/src/utils/Obs_ArrayHelper.cpp index d7d7f6f8c..d68b72fce 100644 --- a/src/utils/Obs_ArrayHelper.cpp +++ b/src/utils/Obs_ArrayHelper.cpp @@ -171,6 +171,7 @@ std::vector Utils::Obs::ArrayHelper::GetSceneItemList(obs_scene_t *scene, item["sceneItemLocked"] = obs_sceneitem_locked(sceneItem); item["sceneItemTransform"] = ObjectHelper::GetSceneItemTransform(sceneItem); item["sceneItemBlendMode"] = obs_sceneitem_get_blending_mode(sceneItem); + item["sceneItemBlendMethod"] = obs_sceneitem_get_blending_method(sceneItem); OBSSource itemSource = obs_sceneitem_get_source(sceneItem); item["sourceName"] = obs_source_get_name(itemSource); item["sourceUuid"] = obs_source_get_uuid(itemSource);