diff --git a/src/requesthandler/RequestHandler.cpp b/src/requesthandler/RequestHandler.cpp index 02a750f1..a692c4f5 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 49898aeb..312a34b8 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 de95e493..46b4f44f 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) { diff --git a/src/utils/Json.h b/src/utils/Json.h index 5b5bceaa..e5bf774d 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"}, diff --git a/src/utils/Obs_ArrayHelper.cpp b/src/utils/Obs_ArrayHelper.cpp index d7d7f6f8..d68b72fc 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);