New upstream version 22.0.3+dfsg1

This commit is contained in:
Sebastian Ramacher 2018-12-16 17:14:58 +01:00
parent 665f64a933
commit cdc9a9fc87
334 changed files with 14525 additions and 2639 deletions

View file

@ -39,6 +39,8 @@ struct SceneFindData {
OBSSceneItem item;
bool selectBelow;
obs_sceneitem_t *group = nullptr;
SceneFindData(const SceneFindData &) = delete;
SceneFindData(SceneFindData &&) = delete;
SceneFindData& operator=(const SceneFindData &) = delete;
@ -111,16 +113,6 @@ static vec3 GetTransformedPos(float x, float y, const matrix4 &mat)
return result;
}
static vec3 GetTransformedPosScaled(float x, float y, const matrix4 &mat,
float scale)
{
vec3 result;
vec3_set(&result, x, y, 0.0f);
vec3_transform(&result, &result, &mat);
vec3_mulf(&result, &result, scale);
return result;
}
static inline vec2 GetOBSScreenSize()
{
obs_video_info ovi;
@ -214,11 +206,26 @@ static bool CheckItemSelected(obs_scene_t *scene, obs_sceneitem_t *item,
if (!SceneItemHasVideo(item))
return true;
if (obs_sceneitem_is_group(item)) {
data->group = item;
obs_sceneitem_group_enum_items(item, CheckItemSelected, param);
data->group = nullptr;
if (data->item) {
return false;
}
}
vec3_set(&pos3, data->pos.x, data->pos.y, 0.0f);
obs_sceneitem_get_box_transform(item, &transform);
if (data->group) {
matrix4 parent_transform;
obs_sceneitem_get_draw_transform(data->group, &parent_transform);
matrix4_mul(&transform, &transform, &parent_transform);
}
matrix4_inv(&transform, &transform);
vec3_transform(&transformedPos, &pos3, &transform);
@ -248,8 +255,9 @@ bool OBSBasicPreview::SelectedAtPos(const vec2 &pos)
}
struct HandleFindData {
const vec2 &pos;
const float scale;
const vec2 &pos;
const float radius;
matrix4 parent_xform;
OBSSceneItem item;
ItemHandle handle = ItemHandle::None;
@ -259,38 +267,60 @@ struct HandleFindData {
HandleFindData& operator=(const HandleFindData &) = delete;
HandleFindData& operator=(HandleFindData &&) = delete;
inline HandleFindData(const vec2 &pos_, float scale_)
: pos (pos_),
scale (scale_)
{}
inline HandleFindData(const vec2 &pos_, float scale)
: pos (pos_),
radius (HANDLE_SEL_RADIUS / scale)
{
matrix4_identity(&parent_xform);
}
inline HandleFindData(const HandleFindData &hfd,
obs_sceneitem_t *parent)
: pos (hfd.pos),
radius (hfd.radius),
item (hfd.item),
handle (hfd.handle)
{
obs_sceneitem_get_draw_transform(parent, &parent_xform);
}
};
static bool FindHandleAtPos(obs_scene_t *scene, obs_sceneitem_t *item,
void *param)
{
if (!obs_sceneitem_selected(item))
return true;
HandleFindData &data = *reinterpret_cast<HandleFindData*>(param);
if (!obs_sceneitem_selected(item)) {
if (obs_sceneitem_is_group(item)) {
HandleFindData newData(data, item);
obs_sceneitem_group_enum_items(item, FindHandleAtPos,
&newData);
data.item = newData.item;
data.handle = newData.handle;
}
return true;
}
HandleFindData *data = reinterpret_cast<HandleFindData*>(param);
matrix4 transform;
vec3 pos3;
float closestHandle = HANDLE_SEL_RADIUS;
float closestHandle = data.radius;
vec3_set(&pos3, data->pos.x, data->pos.y, 0.0f);
vec3_set(&pos3, data.pos.x, data.pos.y, 0.0f);
obs_sceneitem_get_box_transform(item, &transform);
auto TestHandle = [&] (float x, float y, ItemHandle handle)
{
vec3 handlePos = GetTransformedPosScaled(x, y, transform,
data->scale);
vec3 handlePos = GetTransformedPos(x, y, transform);
vec3_transform(&handlePos, &handlePos, &data.parent_xform);
float dist = vec3_dist(&handlePos, &pos3);
if (dist < HANDLE_SEL_RADIUS) {
if (dist < data.radius) {
if (dist < closestHandle) {
closestHandle = dist;
data->handle = handle;
data->item = item;
data.handle = handle;
data.item = item;
}
}
};
@ -339,7 +369,10 @@ void OBSBasicPreview::GetStretchHandleData(const vec2 &pos)
if (!scene)
return;
HandleFindData data(pos, main->previewScale / main->devicePixelRatio());
float scale = main->previewScale / main->devicePixelRatio();
vec2 scaled_pos = pos;
vec2_divf(&scaled_pos, &scaled_pos, scale);
HandleFindData data(scaled_pos, scale);
obs_scene_enum_items(scene, FindHandleAtPos, &data);
stretchItem = std::move(data.item);
@ -377,6 +410,15 @@ void OBSBasicPreview::GetStretchHandleData(const vec2 &pos)
startCrop.left - startCrop.right);
cropSize.y = float(obs_source_get_height(source) -
startCrop.top - startCrop.bottom);
stretchGroup = obs_sceneitem_get_group(scene, stretchItem);
if (stretchGroup) {
obs_sceneitem_get_draw_transform(stretchGroup,
&invGroupTransform);
matrix4_inv(&invGroupTransform,
&invGroupTransform);
obs_sceneitem_defer_group_resize_begin(stretchGroup);
}
}
}
@ -482,6 +524,9 @@ static bool select_one(obs_scene_t *scene, obs_sceneitem_t *item, void *param)
{
obs_sceneitem_t *selectedItem =
reinterpret_cast<obs_sceneitem_t*>(param);
if (obs_sceneitem_is_group(item))
obs_sceneitem_group_enum_items(item, select_one, param);
obs_sceneitem_select(item, (selectedItem == item));
UNUSED_PARAMETER(scene);
@ -534,10 +579,15 @@ void OBSBasicPreview::mouseReleaseEvent(QMouseEvent *event)
if (!mouseMoved)
ProcessClick(pos);
stretchItem = nullptr;
mouseDown = false;
mouseMoved = false;
cropping = false;
if (stretchGroup) {
obs_sceneitem_defer_group_resize_end(stretchGroup);
}
stretchItem = nullptr;
stretchGroup = nullptr;
mouseDown = false;
mouseMoved = false;
cropping = false;
}
}
@ -550,30 +600,52 @@ static bool AddItemBounds(obs_scene_t *scene, obs_sceneitem_t *item,
void *param)
{
SelectedItemBounds *data = reinterpret_cast<SelectedItemBounds*>(param);
vec3 t[4];
auto add_bounds = [data, &t] ()
{
for (const vec3 &v : t) {
if (data->first) {
vec3_copy(&data->tl, &v);
vec3_copy(&data->br, &v);
data->first = false;
} else {
vec3_min(&data->tl, &data->tl, &v);
vec3_max(&data->br, &data->br, &v);
}
}
};
if (obs_sceneitem_is_group(item)) {
SelectedItemBounds sib;
obs_sceneitem_group_enum_items(item, AddItemBounds, &sib);
if (!sib.first) {
matrix4 xform;
obs_sceneitem_get_draw_transform(item, &xform);
vec3_set(&t[0], sib.tl.x, sib.tl.y, 0.0f);
vec3_set(&t[1], sib.tl.x, sib.br.y, 0.0f);
vec3_set(&t[2], sib.br.x, sib.tl.y, 0.0f);
vec3_set(&t[3], sib.br.x, sib.br.y, 0.0f);
vec3_transform(&t[0], &t[0], &xform);
vec3_transform(&t[1], &t[1], &xform);
vec3_transform(&t[2], &t[2], &xform);
vec3_transform(&t[3], &t[3], &xform);
add_bounds();
}
}
if (!obs_sceneitem_selected(item))
return true;
matrix4 boxTransform;
obs_sceneitem_get_box_transform(item, &boxTransform);
vec3 t[4] = {
GetTransformedPos(0.0f, 0.0f, boxTransform),
GetTransformedPos(1.0f, 0.0f, boxTransform),
GetTransformedPos(0.0f, 1.0f, boxTransform),
GetTransformedPos(1.0f, 1.0f, boxTransform)
};
for (const vec3 &v : t) {
if (data->first) {
vec3_copy(&data->tl, &v);
vec3_copy(&data->br, &v);
data->first = false;
} else {
vec3_min(&data->tl, &data->tl, &v);
vec3_max(&data->br, &data->br, &v);
}
}
t[0] = GetTransformedPos(0.0f, 0.0f, boxTransform);
t[1] = GetTransformedPos(1.0f, 0.0f, boxTransform);
t[2] = GetTransformedPos(0.0f, 1.0f, boxTransform);
t[3] = GetTransformedPos(1.0f, 1.0f, boxTransform);
add_bounds();
UNUSED_PARAMETER(scene);
return true;
@ -692,9 +764,22 @@ static bool move_items(obs_scene_t *scene, obs_sceneitem_t *item, void *param)
if (obs_sceneitem_locked(item))
return true;
bool selected = obs_sceneitem_selected(item);
vec2 *offset = reinterpret_cast<vec2*>(param);
if (obs_sceneitem_selected(item)) {
if (obs_sceneitem_is_group(item) && !selected) {
matrix4 transform;
vec3 new_offset;
vec3_set(&new_offset, offset->x, offset->y, 0.0f);
obs_sceneitem_get_draw_transform(item, &transform);
vec4_set(&transform.t, 0.0f, 0.0f, 0.0f, 1.0f);
matrix4_inv(&transform, &transform);
vec3_transform(&new_offset, &new_offset, &transform);
obs_sceneitem_group_enum_items(item, move_items, &new_offset);
}
if (selected) {
vec2 pos;
obs_sceneitem_get_pos(item, &pos);
vec2_add(&pos, &pos, offset);
@ -856,9 +941,6 @@ void OBSBasicPreview::CropItem(const vec2 &pos)
uint32_t align = obs_sceneitem_get_alignment(stretchItem);
vec3 tl, br, pos3;
if (boundsType != OBS_BOUNDS_NONE) /* TODO */
return;
vec3_zero(&tl);
vec3_set(&br, stretchItemSize.x, stretchItemSize.y, 0.0f);
@ -963,7 +1045,8 @@ void OBSBasicPreview::CropItem(const vec2 &pos)
obs_sceneitem_defer_update_begin(stretchItem);
obs_sceneitem_set_crop(stretchItem, &crop);
obs_sceneitem_set_pos(stretchItem, (vec2*)&newPos);
if (boundsType == OBS_BOUNDS_NONE)
obs_sceneitem_set_pos(stretchItem, (vec2*)&newPos);
obs_sceneitem_defer_update_end(stretchItem);
}
@ -1063,6 +1146,20 @@ void OBSBasicPreview::mouseMoveEvent(QMouseEvent *event)
pos.y = std::round(pos.y);
if (stretchHandle != ItemHandle::None) {
OBSBasic *main = reinterpret_cast<OBSBasic*>(
App()->GetMainWindow());
OBSScene scene = main->GetCurrentScene();
obs_sceneitem_t *group = obs_sceneitem_get_group(
scene, stretchItem);
if (group) {
vec3 group_pos;
vec3_set(&group_pos, pos.x, pos.y, 0.0f);
vec3_transform(&group_pos, &group_pos,
&invGroupTransform);
pos.x = group_pos.x;
pos.y = group_pos.y;
}
if (cropping)
CropItem(pos);
else
@ -1076,15 +1173,17 @@ void OBSBasicPreview::mouseMoveEvent(QMouseEvent *event)
}
}
static void DrawCircleAtPos(float x, float y, matrix4 &matrix,
float previewScale)
static void DrawCircleAtPos(float x, float y)
{
struct vec3 pos;
vec3_set(&pos, x, y, 0.0f);
struct matrix4 matrix;
gs_matrix_get(&matrix);
vec3_transform(&pos, &pos, &matrix);
vec3_mulf(&pos, &pos, previewScale);
gs_matrix_push();
gs_matrix_identity();
gs_matrix_translate(&pos);
gs_matrix_scale3f(HANDLE_RADIUS, HANDLE_RADIUS, 1.0f);
gs_draw(GS_LINESTRIP, 0, 0);
@ -1108,6 +1207,16 @@ bool OBSBasicPreview::DrawSelectedItem(obs_scene_t *scene,
if (!SceneItemHasVideo(item))
return true;
if (obs_sceneitem_is_group(item)) {
matrix4 mat;
obs_sceneitem_get_draw_transform(item, &mat);
gs_matrix_push();
gs_matrix_mul(&mat);
obs_sceneitem_group_enum_items(item, DrawSelectedItem, param);
gs_matrix_pop();
}
if (!obs_sceneitem_selected(item))
return true;
@ -1142,19 +1251,18 @@ bool OBSBasicPreview::DrawSelectedItem(obs_scene_t *scene,
gs_load_vertexbuffer(main->circle);
DrawCircleAtPos(0.0f, 0.0f, boxTransform, main->previewScale);
DrawCircleAtPos(0.0f, 1.0f, boxTransform, main->previewScale);
DrawCircleAtPos(1.0f, 0.0f, boxTransform, main->previewScale);
DrawCircleAtPos(1.0f, 1.0f, boxTransform, main->previewScale);
DrawCircleAtPos(0.5f, 0.0f, boxTransform, main->previewScale);
DrawCircleAtPos(0.0f, 0.5f, boxTransform, main->previewScale);
DrawCircleAtPos(0.5f, 1.0f, boxTransform, main->previewScale);
DrawCircleAtPos(1.0f, 0.5f, boxTransform, main->previewScale);
gs_matrix_push();
gs_matrix_scale3f(main->previewScale, main->previewScale, 1.0f);
gs_matrix_mul(&boxTransform);
DrawCircleAtPos(0.0f, 0.0f);
DrawCircleAtPos(0.0f, 1.0f);
DrawCircleAtPos(1.0f, 0.0f);
DrawCircleAtPos(1.0f, 1.0f);
DrawCircleAtPos(0.5f, 0.0f);
DrawCircleAtPos(0.0f, 0.5f);
DrawCircleAtPos(0.5f, 1.0f);
DrawCircleAtPos(1.0f, 0.5f);
obs_sceneitem_crop crop;
obs_sceneitem_get_crop(item, &crop);
@ -1208,8 +1316,12 @@ void OBSBasicPreview::DrawSceneEditing()
OBSScene scene = main->GetCurrentScene();
if (scene)
if (scene) {
gs_matrix_push();
gs_matrix_scale3f(main->previewScale, main->previewScale, 1.0f);
obs_scene_enum_items(scene, DrawSelectedItem, this);
gs_matrix_pop();
}
gs_load_vertexbuffer(nullptr);
@ -1232,4 +1344,4 @@ void OBSBasicPreview::SetScalingAmount(float newScalingAmountVal) {
scrollingOffset.x *= newScalingAmountVal / scalingAmount;
scrollingOffset.y *= newScalingAmountVal / scalingAmount;
scalingAmount = newScalingAmountVal;
}
}