Ver Fonte

Merge pull request #1260 from admshao/multiview-updates

Multiview updates
Jim há 7 anos atrás
pai
commit
32d2aeb4ee

+ 9 - 4
UI/data/locale/en-US.ini

@@ -571,11 +571,16 @@ Basic.Settings.General.SystemTrayHideMinimize="Always minimize to system tray in
 Basic.Settings.General.SaveProjectors="Save projectors on exit"
 Basic.Settings.General.SwitchOnDoubleClick="Transition to scene when double-clicked"
 Basic.Settings.General.StudioPortraitLayout="Enable portrait/vertical layout"
+Basic.Settings.General.Multiview="Multiview"
+Basic.Settings.General.Multiview.MouseSwitch="Click to switch between scenes"
+Basic.Settings.General.Multiview.DrawSourceNames="Show scene names"
+Basic.Settings.General.Multiview.DrawSafeAreas="Draw safe areas (EBU R 95)"
 Basic.Settings.General.MultiviewLayout="Multiview Layout"
-Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontal, Top"
-Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontal, Bottom"
-Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertical, Left"
-Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertical, Right"
+Basic.Settings.General.MultiviewLayout.Horizontal.Top="Horizontal, Top (8 Scenes)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Horizontal, Bottom (8 Scenes)"
+Basic.Settings.General.MultiviewLayout.Vertical.Left="Vertical, Left (8 Scenes)"
+Basic.Settings.General.MultiviewLayout.Vertical.Right="Vertical, Right (8 Scenes)"
+Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Horizontal, Top (24 Scenes)"
 
 # basic mode 'stream' settings
 Basic.Settings.Stream="Stream"

+ 65 - 1
UI/forms/OBSBasicSettings.ui

@@ -582,10 +582,74 @@
                      </property>
                     </widget>
                    </item>
+                  </layout>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QGroupBox" name="groupBoxMultiview">
+                  <property name="title">
+                   <string>Basic.Settings.General.Multiview</string>
+                  </property>
+                  <layout class="QFormLayout" name="formLayoutMultiview">
+                   <property name="fieldGrowthPolicy">
+                    <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+                   </property>
+                   <property name="labelAlignment">
+                    <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+                   </property>
+                   <property name="topMargin">
+                    <number>2</number>
+                   </property>
+                   <item row="0" column="0">
+                    <spacer name="horizontalSpacerMultiview">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeType">
+                      <enum>QSizePolicy::Fixed</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>170</width>
+                       <height>5</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                   <item row="0" column="1">
+                    <widget class="QCheckBox" name="multiviewMouseSwitch">
+                     <property name="text">
+                      <string>Basic.Settings.General.Multiview.MouseSwitch</string>
+                     </property>
+                     <property name="checked">
+                      <bool>true</bool>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="1" column="1">
+                    <widget class="QCheckBox" name="multiviewDrawNames">
+                     <property name="text">
+                      <string>Basic.Settings.General.Multiview.DrawSourceNames</string>
+                     </property>
+                     <property name="checked">
+                      <bool>true</bool>
+                     </property>
+                    </widget>
+                   </item>
                    <item row="2" column="1">
+                    <widget class="QCheckBox" name="multiviewDrawAreas">
+                     <property name="text">
+                      <string>Basic.Settings.General.Multiview.DrawSafeAreas</string>
+                     </property>
+                     <property name="checked">
+                      <bool>true</bool>
+                     </property>
+                    </widget>
+                   </item>
+                   <item row="3" column="1">
                     <widget class="QComboBox" name="multiviewLayout"/>
                    </item>
-                   <item row="2" column="0">
+                   <item row="3" column="0">
                     <widget class="QLabel" name="label_64">
                      <property name="text">
                       <string>Basic.Settings.General.MultiviewLayout</string>

+ 52 - 0
UI/obs-app.cpp

@@ -421,6 +421,15 @@ bool OBSApp::InitGlobalConfigDefaults()
 	config_set_default_bool(globalConfig, "BasicWindow",
 			"VerticalVolControl", false);
 
+	config_set_default_bool(globalConfig, "BasicWindow",
+			"MultiviewMouseSwitch", true);
+
+	config_set_default_bool(globalConfig, "BasicWindow",
+			"MultiviewDrawNames", true);
+
+	config_set_default_bool(globalConfig, "BasicWindow",
+			"MultiviewDrawAreas", true);
+
 #ifdef _WIN32
 	config_set_default_bool(globalConfig, "Audio", "DisableAudioDucking",
 			true);
@@ -591,6 +600,42 @@ static string GetSceneCollectionFileFromName(const char *name)
 	return outputPath;
 }
 
+bool OBSApp::UpdatePre22MultiviewLayout(const char *layout)
+{
+	if (!layout)
+		return false;
+
+	if (astrcmpi(layout, "horizontaltop") == 0) {
+		config_set_int(globalConfig, "BasicWindow", "MultiviewLayout",
+			static_cast<int>(
+				MultiviewLayout::HORIZONTAL_TOP_8_SCENES));
+		return true;
+	}
+
+	if (astrcmpi(layout, "horizontalbottom") == 0) {
+		config_set_int(globalConfig, "BasicWindow", "MultiviewLayout",
+			static_cast<int>(
+				MultiviewLayout::HORIZONTAL_BOTTOM_8_SCENES));
+		return true;
+	}
+
+	if (astrcmpi(layout, "verticalleft") == 0) {
+		config_set_int(globalConfig, "BasicWindow", "MultiviewLayout",
+			static_cast<int>(
+				MultiviewLayout::VERTICAL_LEFT_8_SCENES));
+		return true;
+	}
+
+	if (astrcmpi(layout, "verticalright") == 0) {
+		config_set_int(globalConfig, "BasicWindow", "MultiviewLayout",
+			static_cast<int>(
+				MultiviewLayout::VERTICAL_RIGHT_8_SCENES));
+		return true;
+	}
+
+	return false;
+}
+
 bool OBSApp::InitGlobalConfig()
 {
 	char path[512];
@@ -656,6 +701,13 @@ bool OBSApp::InitGlobalConfig()
 		changed = true;
 	}
 
+	if (config_has_user_value(globalConfig, "BasicWindow",
+			"MultiviewLayout")) {
+		const char *layout = config_get_string(globalConfig,
+				"BasicWindow", "MultiviewLayout");
+		changed |= UpdatePre22MultiviewLayout(layout);
+	}
+
 	if (changed)
 		config_save_safe(globalConfig, "tmp", nullptr);
 

+ 2 - 0
UI/obs-app.hpp

@@ -78,6 +78,8 @@ private:
 
 	std::deque<obs_frontend_translate_ui_cb> translatorHooks;
 
+	bool UpdatePre22MultiviewLayout(const char *layout);
+
 	bool InitGlobalConfig();
 	bool InitGlobalConfigDefaults();
 	bool InitLocale();

+ 5 - 2
UI/window-basic-main.cpp

@@ -3251,8 +3251,10 @@ int OBSBasic::ResetVideo()
 			ResizeProgram(ovi.base_width, ovi.base_height);
 	}
 
-	if (ret == OBS_VIDEO_SUCCESS)
+	if (ret == OBS_VIDEO_SUCCESS) {
 		OBSBasicStats::InitializeValues();
+		OBSProjector::UpdateMultiviewProjectors();
+	}
 
 	return ret;
 }
@@ -3773,6 +3775,8 @@ void OBSBasic::ChangeSceneIndex(bool relative, int offset, int invalidIdx)
 	item->setSelected(true);
 
 	sceneChanging = false;
+
+	OBSProjector::UpdateMultiviewProjectors();
 }
 
 void OBSBasic::on_actionSceneUp_triggered()
@@ -5672,7 +5676,6 @@ OBSProjector *OBSBasic::OpenProjector(obs_source_t *source, int monitor,
 		projectors[monitor] = projector;
 	}
 
-	projector->Init();
 	return projector;
 }
 

+ 52 - 18
UI/window-basic-settings.cpp

@@ -318,6 +318,9 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
 	HookWidget(ui->snapDistance,         DSCROLL_CHANGED,GENERAL_CHANGED);
 	HookWidget(ui->doubleClickSwitch,    CHECK_CHANGED,  GENERAL_CHANGED);
 	HookWidget(ui->studioPortraitLayout, CHECK_CHANGED,  GENERAL_CHANGED);
+	HookWidget(ui->multiviewMouseSwitch, CHECK_CHANGED,  GENERAL_CHANGED);
+	HookWidget(ui->multiviewDrawNames,   CHECK_CHANGED,  GENERAL_CHANGED);
+	HookWidget(ui->multiviewDrawAreas,   CHECK_CHANGED,  GENERAL_CHANGED);
 	HookWidget(ui->multiviewLayout,      COMBO_CHANGED,  GENERAL_CHANGED);
 	HookWidget(ui->outputMode,           COMBO_CHANGED,  OUTPUTS_CHANGED);
 	HookWidget(ui->streamType,           COMBO_CHANGED,  STREAM1_CHANGED);
@@ -1100,30 +1103,37 @@ void OBSBasicSettings::LoadGeneralSettings()
 			"BasicWindow", "StudioPortraitLayout");
 	ui->studioPortraitLayout->setChecked(studioPortraitLayout);
 
+	bool multiviewMouseSwitch = config_get_bool(GetGlobalConfig(),
+			"BasicWindow", "MultiviewMouseSwitch");
+	ui->multiviewMouseSwitch->setChecked(multiviewMouseSwitch);
+
+	bool multiviewDrawNames = config_get_bool(GetGlobalConfig(),
+			"BasicWindow", "MultiviewDrawNames");
+	ui->multiviewDrawNames->setChecked(multiviewDrawNames);
+
+	bool multiviewDrawAreas = config_get_bool(GetGlobalConfig(),
+			"BasicWindow", "MultiviewDrawAreas");
+	ui->multiviewDrawAreas->setChecked(multiviewDrawAreas);
+
 	ui->multiviewLayout->addItem(QTStr(
 			"Basic.Settings.General.MultiviewLayout.Horizontal.Top"),
-			QT_UTF8("horizontaltop"));
+			static_cast<int>(MultiviewLayout::HORIZONTAL_TOP_8_SCENES));
 	ui->multiviewLayout->addItem(QTStr(
 			"Basic.Settings.General.MultiviewLayout.Horizontal.Bottom"),
-			QT_UTF8("horizontalbottom"));
+			static_cast<int>(MultiviewLayout::HORIZONTAL_BOTTOM_8_SCENES));
 	ui->multiviewLayout->addItem(QTStr(
 			"Basic.Settings.General.MultiviewLayout.Vertical.Left"),
-			QT_UTF8("verticalleft"));
+			static_cast<int>(MultiviewLayout::VERTICAL_LEFT_8_SCENES));
 	ui->multiviewLayout->addItem(QTStr(
 			"Basic.Settings.General.MultiviewLayout.Vertical.Right"),
-			QT_UTF8("verticalright"));
+			static_cast<int>(MultiviewLayout::VERTICAL_RIGHT_8_SCENES));
+	ui->multiviewLayout->addItem(QTStr(
+			"Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top"),
+			static_cast<int>(MultiviewLayout::HORIZONTAL_TOP_24_SCENES));
 
-	const char *multiviewLayoutText = config_get_string(GetGlobalConfig(),
-			"BasicWindow", "MultiviewLayout");
-
-	if (astrcmpi(multiviewLayoutText, "horizontalbottom") == 0)
-		ui->multiviewLayout->setCurrentIndex(1);
-	else if (astrcmpi(multiviewLayoutText, "verticalleft") == 0)
-		ui->multiviewLayout->setCurrentIndex(2);
-	else if (astrcmpi(multiviewLayoutText, "verticalright") == 0)
-		ui->multiviewLayout->setCurrentIndex(3);
-	else
-		ui->multiviewLayout->setCurrentIndex(0);
+	ui->multiviewLayout->setCurrentIndex(
+			config_get_int(GetGlobalConfig(), "BasicWindow",
+					"MultiviewLayout"));
 
 	loading = false;
 }
@@ -2712,13 +2722,37 @@ void OBSBasicSettings::SaveGeneralSettings()
 		main->ResetUI();
 	}
 
+	bool multiviewChanged = false;
+	if (WidgetChanged(ui->multiviewMouseSwitch)) {
+		config_set_bool(GetGlobalConfig(), "BasicWindow",
+				"MultiviewMouseSwitch",
+				ui->multiviewMouseSwitch->isChecked());
+		multiviewChanged = true;
+	}
+
+	if (WidgetChanged(ui->multiviewDrawNames)) {
+		config_set_bool(GetGlobalConfig(), "BasicWindow",
+				"MultiviewDrawNames",
+				ui->multiviewDrawNames->isChecked());
+		multiviewChanged = true;
+	}
+
+	if (WidgetChanged(ui->multiviewDrawAreas)) {
+		config_set_bool(GetGlobalConfig(), "BasicWindow",
+				"MultiviewDrawAreas",
+				ui->multiviewDrawAreas->isChecked());
+		multiviewChanged = true;
+	}
+
 	if (WidgetChanged(ui->multiviewLayout)) {
-		config_set_string(GetGlobalConfig(), "BasicWindow",
+		config_set_int(GetGlobalConfig(), "BasicWindow",
 				"MultiviewLayout",
-				QT_TO_UTF8(GetComboData(ui->multiviewLayout)));
+				ui->multiviewLayout->currentData().toInt());
+		multiviewChanged = true;
+	}
 
+	if (multiviewChanged)
 		OBSProjector::UpdateMultiviewProjectors();
-	}
 }
 
 void OBSBasicSettings::SaveStream1Settings()

Diff do ficheiro suprimidas por serem muito extensas
+ 383 - 324
UI/window-projector.cpp


+ 37 - 11
UI/window-projector.hpp

@@ -13,6 +13,14 @@ enum class ProjectorType {
 
 class QMouseEvent;
 
+enum class MultiviewLayout : uint8_t {
+	HORIZONTAL_TOP_8_SCENES = 0,
+	HORIZONTAL_BOTTOM_8_SCENES = 1,
+	VERTICAL_LEFT_8_SCENES = 2,
+	VERTICAL_RIGHT_8_SCENES = 3,
+	HORIZONTAL_TOP_24_SCENES = 4
+};
+
 class OBSProjector : public OBSQTDisplay {
 	Q_OBJECT
 
@@ -31,17 +39,37 @@ private:
 	bool isWindow;
 	QString projectorTitle;
 	ProjectorType type = ProjectorType::Source;
-	OBSWeakSource multiviewScenes[8];
-	OBSSource     multiviewLabels[10];
-	gs_vertbuffer_t *outerBox = nullptr;
-	gs_vertbuffer_t *innerBox = nullptr;
-	gs_vertbuffer_t *leftVLine = nullptr;
-	gs_vertbuffer_t *rightVLine = nullptr;
-	gs_vertbuffer_t *leftLine = nullptr;
-	gs_vertbuffer_t *topLine = nullptr;
-	gs_vertbuffer_t *rightLine = nullptr;
+	std::vector<OBSWeakSource> multiviewScenes;
+	std::vector<OBSSource> multiviewLabels;
+	gs_vertbuffer_t *actionSafeMargin      = nullptr;
+	gs_vertbuffer_t *graphicsSafeMargin    = nullptr;
+	gs_vertbuffer_t *fourByThreeSafeMargin = nullptr;
+	gs_vertbuffer_t *leftLine              = nullptr;
+	gs_vertbuffer_t *topLine               = nullptr;
+	gs_vertbuffer_t *rightLine             = nullptr;
+	gs_effect_t *solid = nullptr;
+	gs_eparam_t *color = nullptr;
+	// Multiview position helpers
+	float thickness = 4;
+	float offset, thicknessx2 = thickness * 2, pvwprgCX,
+		pvwprgCY, sourceX, sourceY, labelX, labelY, scenesCX, scenesCY,
+		ppiCX, ppiCY, siX, siY, siCX, siCY, ppiScaleX, ppiScaleY,
+		siScaleX, siScaleY, fw, fh, ratio;
+
+	float lineLength                = 0.1f;
+	// Rec. ITU-R BT.1848-1 / EBU R 95
+	float actionSafePercentage      = 0.035f; // 3.5%
+	float graphicsSafePercentage    = 0.05f; // 5.0%
+	float fourByThreeSafePercentage = 0.1625f; // 16.25%
 	bool ready = false;
 
+	// argb colors
+	static const uint32_t outerColor      = 0xFFD0D0D0;
+	static const uint32_t labelColor      = 0xD91F1F1F;
+	static const uint32_t backgroundColor = 0xFF000000;
+	static const uint32_t previewColor    = 0xFF00D000;
+	static const uint32_t programColor    = 0xFFD00000;
+
 	void UpdateMultiview();
 	void UpdateProjectorTitle(QString name);
 
@@ -53,8 +81,6 @@ public:
 			QString title, ProjectorType type_);
 	~OBSProjector();
 
-	void Init();
-
 	OBSSource GetSource();
 	ProjectorType GetProjectorType();
 	int GetMonitor();

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff