diff --git a/obs/window-basic-main.cpp b/obs/window-basic-main.cpp index c7c01a61d..10136bfba 100644 --- a/obs/window-basic-main.cpp +++ b/obs/window-basic-main.cpp @@ -1711,26 +1711,33 @@ void OBSBasic::on_actionResetTransform_triggered() obs_scene_enum_items(GetCurrentScene(), func, nullptr); } -static vec3 GetItemTL(obs_sceneitem_t item) +static void GetItemBox(obs_sceneitem_t item, vec3 &tl, vec3 &br) { matrix4 boxTransform; obs_sceneitem_get_box_transform(item, &boxTransform); - vec3 tl; vec3_set(&tl, M_INFINITE, M_INFINITE, 0.0f); + vec3_set(&br, -M_INFINITE, -M_INFINITE, 0.0f); - auto GetMinPos = [&] (vec3 &val, float x, float y) + auto GetMinPos = [&] (float x, float y) { vec3 pos; vec3_set(&pos, x, y, 0.0f); vec3_transform(&pos, &pos, &boxTransform); - vec3_min(&val, &val, &pos); + vec3_min(&tl, &tl, &pos); + vec3_max(&br, &br, &pos); }; - GetMinPos(tl, 0.0f, 0.0f); - GetMinPos(tl, 1.0f, 0.0f); - GetMinPos(tl, 0.0f, 1.0f); - GetMinPos(tl, 1.0f, 1.0f); + GetMinPos(0.0f, 0.0f); + GetMinPos(1.0f, 0.0f); + GetMinPos(0.0f, 1.0f); + GetMinPos(1.0f, 1.0f); +} + +static vec3 GetItemTL(obs_sceneitem_t item) +{ + vec3 tl, br; + GetItemBox(item, tl, br); return tl; } @@ -1867,7 +1874,34 @@ void OBSBasic::on_actionStretchToScreen_triggered() void OBSBasic::on_actionCenterToScreen_triggered() { - obs_bounds_type boundsType = OBS_BOUNDS_MAX_ONLY; - obs_scene_enum_items(GetCurrentScene(), CenterAlignSelectedItems, - &boundsType); + auto func = [] (obs_scene_t scene, obs_sceneitem_t item, void *param) + { + vec3 tl, br, itemCenter, screenCenter, offset; + obs_video_info ovi; + + if (!obs_sceneitem_selected(item)) + return true; + + obs_get_video_info(&ovi); + + vec3_set(&screenCenter, float(ovi.base_width), + float(ovi.base_height), 0.0f); + vec3_mulf(&screenCenter, &screenCenter, 0.5f); + + GetItemBox(item, tl, br); + + vec3_sub(&itemCenter, &br, &tl); + vec3_mulf(&itemCenter, &itemCenter, 0.5f); + vec3_add(&itemCenter, &itemCenter, &tl); + + vec3_sub(&offset, &screenCenter, &itemCenter); + vec3_add(&tl, &tl, &offset); + + SetItemTL(item, tl); + + UNUSED_PARAMETER(scene); + return true; + }; + + obs_scene_enum_items(GetCurrentScene(), func, nullptr); }