Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Obs Studio
提交
abc26b87
O
Obs Studio
项目概览
小白菜888
/
Obs Studio
通知
4
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Obs Studio
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
abc26b87
编写于
12月 13, 2017
作者:
S
Shaolin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
UI: Add Multiview Layout Options
上级
864caee1
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
253 addition
and
40 deletion
+253
-40
UI/data/locale/en-US.ini
UI/data/locale/en-US.ini
+5
-0
UI/forms/OBSBasicSettings.ui
UI/forms/OBSBasicSettings.ui
+17
-1
UI/window-basic-settings.cpp
UI/window-basic-settings.cpp
+35
-0
UI/window-projector.cpp
UI/window-projector.cpp
+196
-39
未找到文件。
UI/data/locale/en-US.ini
浏览文件 @
abc26b87
...
...
@@ -566,6 +566,11 @@ 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.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 mode 'stream' settings
Basic.Settings.Stream
=
"Stream"
...
...
UI/forms/OBSBasicSettings.ui
浏览文件 @
abc26b87
...
...
@@ -146,7 +146,7 @@
<x>
0
</x>
<y>
0
</y>
<width>
801
</width>
<height>
715
</height>
<height>
1044
</height>
</rect>
</property>
<layout
class=
"QVBoxLayout"
name=
"verticalLayout_19"
>
...
...
@@ -549,6 +549,9 @@
<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>
...
...
@@ -579,6 +582,19 @@
</property>
</widget>
</item>
<item
row=
"2"
column=
"1"
>
<widget
class=
"QComboBox"
name=
"multiviewLayout"
/>
</item>
<item
row=
"2"
column=
"0"
>
<widget
class=
"QLabel"
name=
"label_64"
>
<property
name=
"text"
>
<string>
Basic.Settings.General.MultiviewLayout
</string>
</property>
<property
name=
"buddy"
>
<cstring>
multiviewLayout
</cstring>
</property>
</widget>
</item>
</layout>
</widget>
</item>
...
...
UI/window-basic-settings.cpp
浏览文件 @
abc26b87
...
...
@@ -45,6 +45,7 @@
#include "window-basic-main.hpp"
#include "window-basic-settings.hpp"
#include "window-basic-main-outputs.hpp"
#include "window-projector.hpp"
#include <util/platform.h>
...
...
@@ -317,6 +318,7 @@ 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
->
multiviewLayout
,
COMBO_CHANGED
,
GENERAL_CHANGED
);
HookWidget
(
ui
->
outputMode
,
COMBO_CHANGED
,
OUTPUTS_CHANGED
);
HookWidget
(
ui
->
streamType
,
COMBO_CHANGED
,
STREAM1_CHANGED
);
HookWidget
(
ui
->
simpleOutputPath
,
EDIT_CHANGED
,
OUTPUTS_CHANGED
);
...
...
@@ -1087,6 +1089,31 @@ void OBSBasicSettings::LoadGeneralSettings()
"BasicWindow"
,
"StudioPortraitLayout"
);
ui
->
studioPortraitLayout
->
setChecked
(
studioPortraitLayout
);
ui
->
multiviewLayout
->
addItem
(
QTStr
(
"Basic.Settings.General.MultiviewLayout.Horizontal.Top"
),
QT_UTF8
(
"horizontaltop"
));
ui
->
multiviewLayout
->
addItem
(
QTStr
(
"Basic.Settings.General.MultiviewLayout.Horizontal.Bottom"
),
QT_UTF8
(
"horizontalbottom"
));
ui
->
multiviewLayout
->
addItem
(
QTStr
(
"Basic.Settings.General.MultiviewLayout.Vertical.Left"
),
QT_UTF8
(
"verticalleft"
));
ui
->
multiviewLayout
->
addItem
(
QTStr
(
"Basic.Settings.General.MultiviewLayout.Vertical.Right"
),
QT_UTF8
(
"verticalright"
));
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
);
loading
=
false
;
}
...
...
@@ -2656,6 +2683,14 @@ void OBSBasicSettings::SaveGeneralSettings()
main
->
ResetUI
();
}
if
(
WidgetChanged
(
ui
->
multiviewLayout
))
{
config_set_string
(
GetGlobalConfig
(),
"BasicWindow"
,
"MultiviewLayout"
,
QT_TO_UTF8
(
GetComboData
(
ui
->
multiviewLayout
)));
OBSProjector
::
UpdateMultiviewProjectors
();
}
}
void
OBSBasicSettings
::
SaveStream1Settings
()
...
...
UI/window-projector.cpp
浏览文件 @
abc26b87
...
...
@@ -8,8 +8,14 @@
#include "qt-wrappers.hpp"
#include "platform.hpp"
#define HORIZONTAL_TOP 0
#define HORIZONTAL_BOTTOM 1
#define VERTICAL_LEFT 2
#define VERTICAL_RIGHT 3
static
QList
<
OBSProjector
*>
multiviewProjectors
;
static
bool
updatingMultiview
=
false
;
static
int
multiviewLayout
=
HORIZONTAL_TOP
;
OBSProjector
::
OBSProjector
(
QWidget
*
widget
,
obs_source_t
*
source_
,
bool
window
)
:
OBSQTDisplay
(
widget
,
...
...
@@ -245,10 +251,10 @@ void OBSProjector::OBSRenderMultiview(void *data, uint32_t cx, uint32_t cy)
OBSBasic
*
main
=
(
OBSBasic
*
)
obs_frontend_get_main_window
();
uint32_t
targetCX
,
targetCY
;
int
x
,
y
;
float
fX
,
fY
,
halfCX
,
halfCY
,
sourceX
,
sourceY
,
quarterCX
,
quarterCY
,
scale
,
targetCXF
,
targetCYF
,
hiCX
,
hiCY
,
qiX
,
qiY
,
qiCX
,
qiCY
,
hiScaleX
,
hiScaleY
,
qiScaleX
,
qiScaleY
;
float
fX
,
fY
,
halfCX
,
halfCY
,
sourceX
,
sourceY
,
labelX
,
labelY
,
quarterCX
,
quarterCY
,
scale
,
targetCXF
,
targetCYF
,
hiCX
,
hiCY
,
qiX
,
qiY
,
qiCX
,
qiCY
,
hiScaleX
,
hiScaleY
,
qiScaleX
,
qiScaleY
;
uint32_t
offset
;
gs_effect_t
*
solid
=
obs_get_base_effect
(
OBS_EFFECT_SOLID
);
...
...
@@ -317,6 +323,86 @@ void OBSProjector::OBSRenderMultiview(void *data, uint32_t cx, uint32_t cy)
gs_projection_pop
();
};
auto
calcBaseSource
=
[
&
](
int
i
)
{
switch
(
multiviewLayout
)
{
case
VERTICAL_LEFT
:
sourceX
=
halfCX
;
sourceY
=
(
i
/
2
)
*
quarterCY
;
if
(
i
%
2
!=
0
)
sourceX
=
halfCX
+
quarterCX
;
break
;
case
VERTICAL_RIGHT
:
sourceX
=
0
;
sourceY
=
(
i
/
2
)
*
quarterCY
;
if
(
i
%
2
!=
0
)
sourceX
=
quarterCX
;
break
;
case
HORIZONTAL_BOTTOM
:
if
(
i
<
4
)
{
sourceX
=
(
float
(
i
)
*
quarterCX
);
sourceY
=
0
;
}
else
{
sourceX
=
(
float
(
i
-
4
)
*
quarterCX
);
sourceY
=
quarterCY
;
}
break
;
default:
//HORIZONTAL_TOP:
if
(
i
<
4
)
{
sourceX
=
(
float
(
i
)
*
quarterCX
);
sourceY
=
halfCY
;
}
else
{
sourceX
=
(
float
(
i
-
4
)
*
quarterCX
);
sourceY
=
halfCY
+
quarterCY
;
}
}
};
auto
calcPreviewProgram
=
[
&
](
bool
program
)
{
switch
(
multiviewLayout
)
{
case
VERTICAL_LEFT
:
sourceX
=
2.0
f
;
sourceY
=
halfCY
+
2.0
f
;
labelX
=
offset
;
labelY
=
halfCY
*
1.8
f
;
if
(
program
)
{
sourceY
=
2.0
f
;
labelY
=
halfCY
*
0.8
f
;
}
break
;
case
VERTICAL_RIGHT
:
sourceX
=
halfCX
+
2.0
f
;
sourceY
=
halfCY
+
2.0
f
;
labelX
=
halfCX
+
offset
;
labelY
=
halfCY
*
1.8
f
;
if
(
program
)
{
sourceY
=
2.0
f
;
labelY
=
halfCY
*
0.8
f
;
}
break
;
case
HORIZONTAL_BOTTOM
:
sourceX
=
2.0
f
;
sourceY
=
halfCY
+
2.0
f
;
labelX
=
offset
;
labelY
=
halfCY
*
1.8
f
;
if
(
program
)
{
sourceX
=
halfCX
+
2.0
f
;
labelX
=
halfCX
+
offset
;
}
break
;
default:
//HORIZONTAL_TOP:
sourceX
=
2.0
f
;
sourceY
=
2.0
f
;
labelX
=
offset
;
labelY
=
halfCY
*
0.8
f
;
if
(
program
)
{
sourceX
=
halfCX
+
2.0
f
;
labelX
=
halfCX
+
offset
;
}
}
};
/* ----------------------------- */
/* draw sources */
...
...
@@ -334,13 +420,7 @@ void OBSProjector::OBSRenderMultiview(void *data, uint32_t cx, uint32_t cy)
if
(
!
label
)
continue
;
if
(
i
<
4
)
{
sourceX
=
(
float
(
i
)
*
quarterCX
);
sourceY
=
halfCY
;
}
else
{
sourceX
=
(
float
(
i
-
4
)
*
quarterCX
);
sourceY
=
halfCY
+
quarterCY
;
}
calcBaseSource
(
i
);
qiX
=
sourceX
+
4.0
f
;
qiY
=
sourceY
+
4.0
f
;
...
...
@@ -399,11 +479,15 @@ void OBSProjector::OBSRenderMultiview(void *data, uint32_t cx, uint32_t cy)
/* ----------------------------- */
/* draw preview */
obs_source_t
*
previewLabel
=
window
->
multiviewLabels
[
0
];
offset
=
labelOffset
(
previewLabel
,
halfCX
);
calcPreviewProgram
(
false
);
gs_matrix_push
();
gs_matrix_translate3f
(
2.0
f
,
2.0
f
,
0.0
f
);
gs_matrix_translate3f
(
sourceX
,
sourceY
,
0.0
f
);
gs_matrix_scale3f
(
hiScaleX
,
hiScaleY
,
1.0
f
);
setRegion
(
2.0
f
,
2.0
f
,
hiCX
,
hiCY
);
setRegion
(
sourceX
,
sourceY
,
hiCX
,
hiCY
);
if
(
studioMode
)
{
obs_source_video_render
(
previewSrc
);
...
...
@@ -418,7 +502,8 @@ void OBSProjector::OBSRenderMultiview(void *data, uint32_t cx, uint32_t cy)
/* ----------- */
gs_matrix_push
();
gs_matrix_scale3f
(
0.5
f
,
0.5
f
,
1.0
f
);
gs_matrix_translate3f
(
sourceX
,
sourceY
,
0.0
f
);
gs_matrix_scale3f
(
hiScaleX
,
hiScaleY
,
1.0
f
);
renderVB
(
solid
,
window
->
outerBox
,
targetCX
,
targetCY
);
renderVB
(
solid
,
window
->
innerBox
,
targetCX
,
targetCY
);
...
...
@@ -432,13 +517,11 @@ void OBSProjector::OBSRenderMultiview(void *data, uint32_t cx, uint32_t cy)
/* ----------- */
obs_source_t
*
previewLabel
=
window
->
multiviewLabels
[
0
];
offset
=
labelOffset
(
previewLabel
,
halfCX
);
cx
=
obs_source_get_width
(
previewLabel
);
cy
=
obs_source_get_height
(
previewLabel
);
gs_matrix_push
();
gs_matrix_translate3f
(
offset
,
(
halfCY
*
0.8
f
)
,
0.0
f
);
gs_matrix_translate3f
(
labelX
,
labelY
,
0.0
f
);
drawBox
(
cx
,
cy
+
int
(
halfCX
*
0.015
f
),
0xD91F1F1F
);
obs_source_video_render
(
previewLabel
);
...
...
@@ -448,11 +531,15 @@ void OBSProjector::OBSRenderMultiview(void *data, uint32_t cx, uint32_t cy)
/* ----------------------------- */
/* draw program */
obs_source_t
*
programLabel
=
window
->
multiviewLabels
[
1
];
offset
=
labelOffset
(
programLabel
,
halfCX
);
calcPreviewProgram
(
true
);
gs_matrix_push
();
gs_matrix_translate3f
(
halfCX
+
2.0
,
2.0
f
,
0.0
f
);
gs_matrix_translate3f
(
sourceX
,
sourceY
,
0.0
f
);
gs_matrix_scale3f
(
hiScaleX
,
hiScaleY
,
1.0
f
);
setRegion
(
halfCX
+
2.0
f
,
2.0
f
,
hiCX
,
hiCY
);
setRegion
(
sourceX
,
sourceY
,
hiCX
,
hiCY
);
obs_render_main_texture
();
resetRegion
();
...
...
@@ -461,8 +548,8 @@ void OBSProjector::OBSRenderMultiview(void *data, uint32_t cx, uint32_t cy)
/* ----------- */
gs_matrix_push
();
gs_matrix_translate3f
(
halfCX
,
0.0
f
,
0.0
f
);
gs_matrix_scale3f
(
0.5
f
,
0.5
f
,
1.0
f
);
gs_matrix_translate3f
(
sourceX
,
sourceY
,
0.0
f
);
gs_matrix_scale3f
(
hiScaleX
,
hiScaleY
,
1.0
f
);
renderVB
(
solid
,
window
->
outerBox
,
targetCX
,
targetCY
);
...
...
@@ -470,13 +557,11 @@ void OBSProjector::OBSRenderMultiview(void *data, uint32_t cx, uint32_t cy)
/* ----------- */
obs_source_t
*
programLabel
=
window
->
multiviewLabels
[
1
];
offset
=
labelOffset
(
programLabel
,
halfCX
);
cx
=
obs_source_get_width
(
programLabel
);
cy
=
obs_source_get_height
(
programLabel
);
gs_matrix_push
();
gs_matrix_translate3f
(
halfCX
+
offset
,
(
halfCY
*
0.8
f
)
,
0.0
f
);
gs_matrix_translate3f
(
labelX
,
labelY
,
0.0
f
);
drawBox
(
cx
,
cy
+
int
(
halfCX
*
0.015
f
),
0xD91F1F1F
);
obs_source_video_render
(
programLabel
);
...
...
@@ -571,25 +656,85 @@ static int getSourceByPosition(int x, int y)
int
maxY
=
cy
;
int
halfX
=
cx
/
2
;
int
halfY
=
cy
/
2
;
int
pos
=
-
1
;
if
(
float
(
cx
)
/
float
(
cy
)
>
ratio
)
{
int
validX
=
cy
*
ratio
;
minX
=
halfX
-
(
validX
/
2
);
maxX
=
halfX
+
(
validX
/
2
);
}
else
{
int
validY
=
cx
/
ratio
;
maxY
=
halfY
+
(
validY
/
2
);
}
switch
(
multiviewLayout
)
{
case
VERTICAL_LEFT
:
if
(
float
(
cx
)
/
float
(
cy
)
>
ratio
)
{
int
validX
=
cy
*
ratio
;
maxX
=
halfX
+
(
validX
/
2
);
}
else
{
int
validY
=
cx
/
ratio
;
minY
=
halfY
-
(
validY
/
2
);
maxY
=
halfY
+
(
validY
/
2
);
}
minX
=
halfX
;
if
(
x
<
minX
||
x
>
maxX
||
y
<
minY
||
y
>
maxY
)
break
;
pos
=
2
*
((
y
-
minY
)
/
((
maxY
-
minY
)
/
4
));
if
(
x
>
minX
+
((
maxX
-
minX
)
/
2
))
pos
++
;
break
;
case
VERTICAL_RIGHT
:
if
(
float
(
cx
)
/
float
(
cy
)
>
ratio
)
{
int
validX
=
cy
*
ratio
;
minX
=
halfX
-
(
validX
/
2
);
}
else
{
int
validY
=
cx
/
ratio
;
minY
=
halfY
-
(
validY
/
2
);
maxY
=
halfY
+
(
validY
/
2
);
}
maxX
=
halfX
;
minY
=
halfY
;
if
(
x
<
minX
||
x
>
maxX
||
y
<
minY
||
y
>
maxY
)
break
;
if
(
x
<
minX
||
x
>
maxX
||
y
<
minY
||
y
>
maxY
)
return
-
1
;
pos
=
2
*
((
y
-
minY
)
/
((
maxY
-
minY
)
/
4
));
if
(
x
>
minX
+
((
maxX
-
minX
)
/
2
))
pos
++
;
break
;
case
HORIZONTAL_BOTTOM
:
if
(
float
(
cx
)
/
float
(
cy
)
>
ratio
)
{
int
validX
=
cy
*
ratio
;
minX
=
halfX
-
(
validX
/
2
);
maxX
=
halfX
+
(
validX
/
2
);
}
else
{
int
validY
=
cx
/
ratio
;
minY
=
halfY
-
(
validY
/
2
);
}
maxY
=
halfY
;
int
quarterX
=
(
maxX
-
minX
)
/
4
;
int
pos
=
(
x
-
minX
)
/
quarterX
;
if
(
y
>
minY
+
((
maxY
-
minY
)
/
2
))
pos
+=
4
;
if
(
x
<
minX
||
x
>
maxX
||
y
<
minY
||
y
>
maxY
)
break
;
pos
=
(
x
-
minX
)
/
((
maxX
-
minX
)
/
4
);
if
(
y
>
minY
+
((
maxY
-
minY
)
/
2
))
pos
+=
4
;
break
;
default:
// HORIZONTAL_TOP
if
(
float
(
cx
)
/
float
(
cy
)
>
ratio
)
{
int
validX
=
cy
*
ratio
;
minX
=
halfX
-
(
validX
/
2
);
maxX
=
halfX
+
(
validX
/
2
);
}
else
{
int
validY
=
cx
/
ratio
;
maxY
=
halfY
+
(
validY
/
2
);
}
minY
=
halfY
;
if
(
x
<
minX
||
x
>
maxX
||
y
<
minY
||
y
>
maxY
)
break
;
pos
=
(
x
-
minX
)
/
((
maxX
-
minX
)
/
4
);
if
(
y
>
minY
+
((
maxY
-
minY
)
/
2
))
pos
+=
4
;
}
return
pos
;
}
...
...
@@ -699,6 +844,18 @@ void OBSProjector::UpdateMultiview()
}
obs_frontend_source_list_free
(
&
scenes
);
const
char
*
multiviewLayoutText
=
config_get_string
(
GetGlobalConfig
(),
"BasicWindow"
,
"MultiviewLayout"
);
if
(
astrcmpi
(
multiviewLayoutText
,
"horizontalbottom"
)
==
0
)
multiviewLayout
=
HORIZONTAL_BOTTOM
;
else
if
(
astrcmpi
(
multiviewLayoutText
,
"verticalleft"
)
==
0
)
multiviewLayout
=
VERTICAL_LEFT
;
else
if
(
astrcmpi
(
multiviewLayoutText
,
"verticalright"
)
==
0
)
multiviewLayout
=
VERTICAL_RIGHT
;
else
multiviewLayout
=
HORIZONTAL_TOP
;
}
void
OBSProjector
::
UpdateMultiviewProjectors
()
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录