diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 0850cdc18..5cd8f8de2 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -8666,7 +8666,7 @@ void OBSBasic::on_actionCopyTransform_triggered() { OBSSceneItem item = GetCurrentSceneItem(); - obs_sceneitem_get_info(item, &copiedTransformInfo); + obs_sceneitem_get_info2(item, &copiedTransformInfo); obs_sceneitem_get_crop(item, &copiedCropInfo); ui->actionPasteTransform->setEnabled(true); @@ -8697,7 +8697,7 @@ void OBSBasic::on_actionPasteTransform_triggered() OBSBasic *main = reinterpret_cast(data); obs_sceneitem_defer_update_begin(item); - obs_sceneitem_set_info(item, &main->copiedTransformInfo); + obs_sceneitem_set_info2(item, &main->copiedTransformInfo); obs_sceneitem_set_crop(item, &main->copiedCropInfo); obs_sceneitem_defer_update_end(item); @@ -8735,8 +8735,9 @@ static bool reset_tr(obs_scene_t * /* scene */, obs_sceneitem_t *item, void *) info.alignment = OBS_ALIGN_TOP | OBS_ALIGN_LEFT; info.bounds_type = OBS_BOUNDS_NONE; info.bounds_alignment = OBS_ALIGN_CENTER; + info.crop_to_bounds = false; vec2_set(&info.bounds, 0.0f, 0.0f); - obs_sceneitem_set_info(item, &info); + obs_sceneitem_set_info2(item, &info); obs_sceneitem_crop crop = {}; obs_sceneitem_set_crop(item, &crop); @@ -8979,8 +8980,9 @@ static bool CenterAlignSelectedItems(obs_scene_t * /* scene */, float(ovi.base_height)); itemInfo.bounds_type = boundsType; itemInfo.bounds_alignment = OBS_ALIGN_CENTER; + itemInfo.crop_to_bounds = obs_sceneitem_get_bounds_crop(item); - obs_sceneitem_set_info(item, &itemInfo); + obs_sceneitem_set_info2(item, &itemInfo); return true; } @@ -9034,7 +9036,7 @@ void OBSBasic::CenterSelectedSceneItems(const CenterType ¢erType) for (int x = 0; x < selectedItems.count(); x++) { OBSSceneItem item = ui->sources->Get(selectedItems[x].row()); obs_transform_info oti; - obs_sceneitem_get_info(item, &oti); + obs_sceneitem_get_info2(item, &oti); obs_source_t *source = obs_sceneitem_get_source(item); float width = float(obs_source_get_width(source)) * oti.scale.x; @@ -10021,7 +10023,7 @@ void OBSBasic::on_actionCopySource_triggered() SourceCopyInfo copyInfo; copyInfo.weak_source = OBSGetWeakRef(source); - obs_sceneitem_get_info(item, ©Info.transform); + obs_sceneitem_get_info2(item, ©Info.transform); obs_sceneitem_get_crop(item, ©Info.crop); copyInfo.blend_method = obs_sceneitem_get_blending_method(item); copyInfo.blend_mode = obs_sceneitem_get_blending_mode(item); diff --git a/UI/window-basic-preview.cpp b/UI/window-basic-preview.cpp index 8f3c79d3e..588c74212 100644 --- a/UI/window-basic-preview.cpp +++ b/UI/window-basic-preview.cpp @@ -1969,7 +1969,7 @@ bool OBSBasicPreview::DrawSelectedOverflow(obs_scene_t *, obs_sceneitem_t *item, GS_DEBUG_MARKER_BEGIN(GS_DEBUG_COLOR_DEFAULT, "DrawSelectedOverflow"); obs_transform_info info; - obs_sceneitem_get_info(item, &info); + obs_sceneitem_get_info2(item, &info); gs_effect_t *solid = obs_get_base_effect(OBS_EFFECT_REPEAT); gs_eparam_t *image = gs_effect_get_param_by_name(solid, "image"); @@ -2013,7 +2013,7 @@ bool OBSBasicPreview::DrawSelectedItem(obs_scene_t *, obs_sceneitem_t *item, matrix4 mat; obs_transform_info groupInfo; obs_sceneitem_get_draw_transform(item, &mat); - obs_sceneitem_get_info(item, &groupInfo); + obs_sceneitem_get_info2(item, &groupInfo); prev->groupRot = groupInfo.rot; @@ -2095,7 +2095,7 @@ bool OBSBasicPreview::DrawSelectedItem(obs_scene_t *, obs_sceneitem_t *item, boxScale.y *= curTransform.y.y; obs_transform_info info; - obs_sceneitem_get_info(item, &info); + obs_sceneitem_get_info2(item, &info); gs_matrix_push(); gs_matrix_mul(&boxTransform); @@ -2523,7 +2523,7 @@ void OBSBasicPreview::DrawSpacingHelpers() obs_sceneitem_get_box_transform(item, &boxTransform); obs_transform_info oti; - obs_sceneitem_get_info(item, &oti); + obs_sceneitem_get_info2(item, &oti); obs_video_info ovi; obs_get_video_info(&ovi); @@ -2545,7 +2545,7 @@ void OBSBasicPreview::DrawSpacingHelpers() if (parentGroup) { obs_transform_info groupOti; - obs_sceneitem_get_info(parentGroup, &groupOti); + obs_sceneitem_get_info2(parentGroup, &groupOti); //Correct the scene item rotation angle rot = oti.rot + groupOti.rot; diff --git a/UI/window-basic-source-select.cpp b/UI/window-basic-source-select.cpp index 62e0e3038..a500e3a72 100644 --- a/UI/window-basic-source-select.cpp +++ b/UI/window-basic-source-select.cpp @@ -122,7 +122,7 @@ static void AddSource(void *_data, obs_scene_t *scene) sceneitem = obs_scene_add(scene, data->source); if (data->transform != nullptr) - obs_sceneitem_set_info(sceneitem, data->transform); + obs_sceneitem_set_info2(sceneitem, data->transform); if (data->crop != nullptr) obs_sceneitem_set_crop(sceneitem, data->crop); if (data->blend_method != nullptr) diff --git a/UI/window-basic-transform.cpp b/UI/window-basic-transform.cpp index 06d139e3c..f0add7ec3 100644 --- a/UI/window-basic-transform.cpp +++ b/UI/window-basic-transform.cpp @@ -267,7 +267,7 @@ void OBSBasicTransform::RefreshControls() obs_transform_info osi; obs_sceneitem_crop crop; - obs_sceneitem_get_info(item, &osi); + obs_sceneitem_get_info2(item, &osi); obs_sceneitem_get_crop(item, &crop); obs_source_t *source = obs_sceneitem_get_source(item); @@ -347,7 +347,7 @@ void OBSBasicTransform::OnControlChanged() double height = double(source_cy); obs_transform_info oti; - obs_sceneitem_get_info(item, &oti); + obs_sceneitem_get_info2(item, &oti); /* do not scale a source if it has 0 width/height */ if (source_cx != 0 && source_cy != 0) { @@ -367,7 +367,7 @@ void OBSBasicTransform::OnControlChanged() oti.crop_to_bounds = ui->cropToBounds->isChecked(); ignoreTransformSignal = true; - obs_sceneitem_set_info(item, &oti); + obs_sceneitem_set_info2(item, &oti); ignoreTransformSignal = false; } diff --git a/libobs/obs-scene.c b/libobs/obs-scene.c index ee0aca272..b8bf01f52 100644 --- a/libobs/obs-scene.c +++ b/libobs/obs-scene.c @@ -2406,7 +2406,7 @@ bool save_transform_states(obs_scene_t *scene, obs_sceneitem_t *item, struct obs_transform_info info; struct obs_sceneitem_crop crop; - obs_sceneitem_get_info(item, &info); + obs_sceneitem_get_info2(item, &info); obs_sceneitem_get_crop(item, &crop); struct vec2 pos = info.pos; @@ -2518,7 +2518,7 @@ void load_transform_states(obs_data_t *temp, void *vp_scene) obs_sceneitem_defer_update_begin(item); - obs_sceneitem_set_info(item, &info); + obs_sceneitem_set_info2(item, &info); obs_sceneitem_set_crop(item, &crop); obs_sceneitem_defer_update_end(item); @@ -2827,6 +2827,20 @@ void obs_sceneitem_get_bounds(const obs_sceneitem_t *item, struct vec2 *bounds) void obs_sceneitem_get_info(const obs_sceneitem_t *item, struct obs_transform_info *info) +{ + if (item && info) { + info->pos = item->pos; + info->rot = item->rot; + info->scale = item->scale; + info->alignment = item->align; + info->bounds_type = item->bounds_type; + info->bounds_alignment = item->bounds_align; + info->bounds = item->bounds; + } +} + +void obs_sceneitem_get_info2(const obs_sceneitem_t *item, + struct obs_transform_info *info) { if (item && info) { info->pos = item->pos; @@ -2842,6 +2856,23 @@ void obs_sceneitem_get_info(const obs_sceneitem_t *item, void obs_sceneitem_set_info(obs_sceneitem_t *item, const struct obs_transform_info *info) +{ + if (item && info) { + item->pos = info->pos; + item->rot = info->rot; + if (isfinite(info->scale.x) && isfinite(info->scale.y)) { + item->scale = info->scale; + } + item->align = info->alignment; + item->bounds_type = info->bounds_type; + item->bounds_align = info->bounds_alignment; + item->bounds = info->bounds; + do_update_transform(item); + } +} + +void obs_sceneitem_set_info2(obs_sceneitem_t *item, + const struct obs_transform_info *info) { if (item && info) { item->pos = info->pos; diff --git a/libobs/obs.h b/libobs/obs.h index bde6fd6ac..73889e9a2 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -1885,11 +1885,14 @@ EXPORT uint32_t obs_sceneitem_get_bounds_alignment(const obs_sceneitem_t *item); EXPORT bool obs_sceneitem_get_bounds_crop(const obs_sceneitem_t *item); EXPORT void obs_sceneitem_get_bounds(const obs_sceneitem_t *item, struct vec2 *bounds); - EXPORT void obs_sceneitem_get_info(const obs_sceneitem_t *item, struct obs_transform_info *info); EXPORT void obs_sceneitem_set_info(obs_sceneitem_t *item, const struct obs_transform_info *info); +EXPORT void obs_sceneitem_get_info2(const obs_sceneitem_t *item, + struct obs_transform_info *info); +EXPORT void obs_sceneitem_set_info2(obs_sceneitem_t *item, + const struct obs_transform_info *info); EXPORT void obs_sceneitem_get_draw_transform(const obs_sceneitem_t *item, struct matrix4 *transform);