瀏覽代碼

Make 'center to screen' just center the source

Instead of using bounds to force the source to be centered (and
unrotated), just center the source positionally on the screen.  Will
also preserve rotation.
jp9000 11 年之前
父節點
當前提交
aef8c218c0
共有 1 個文件被更改,包括 45 次插入11 次删除
  1. 45 11
      obs/window-basic-main.cpp

+ 45 - 11
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);
 }