mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-09-24 23:31:36 +08:00
Merge pull request #1260 from admshao/multiview-updates
Multiview updates
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -78,6 +78,8 @@ private:
|
||||
|
||||
std::deque<obs_frontend_translate_ui_cb> translatorHooks;
|
||||
|
||||
bool UpdatePre22MultiviewLayout(const char *layout);
|
||||
|
||||
bool InitGlobalConfig();
|
||||
bool InitGlobalConfigDefaults();
|
||||
bool InitLocale();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
if (WidgetChanged(ui->multiviewLayout)) {
|
||||
config_set_string(GetGlobalConfig(), "BasicWindow",
|
||||
"MultiviewLayout",
|
||||
QT_TO_UTF8(GetComboData(ui->multiviewLayout)));
|
||||
|
||||
OBSProjector::UpdateMultiviewProjectors();
|
||||
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_int(GetGlobalConfig(), "BasicWindow",
|
||||
"MultiviewLayout",
|
||||
ui->multiviewLayout->currentData().toInt());
|
||||
multiviewChanged = true;
|
||||
}
|
||||
|
||||
if (multiviewChanged)
|
||||
OBSProjector::UpdateMultiviewProjectors();
|
||||
}
|
||||
|
||||
void OBSBasicSettings::SaveStream1Settings()
|
||||
|
||||
+453
-364
File diff suppressed because it is too large
Load Diff
+37
-11
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user