New upstream version 22.0.3+dfsg1
This commit is contained in:
parent
665f64a933
commit
cdc9a9fc87
334 changed files with 14525 additions and 2639 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue