obs-item-pos-transform
+ -

鼠标位移item的pos

2024-12-18 0 0

鼠标位移由OBSBasicPreview::mouseMoveEvent触发。

1.首选通过GetMouseEventPos计算出鼠标的位置在实际画布窗口中的相对位置。

返回的这个位置pos就变成了相对于画布绘图区域的逻辑位置了。

2.获取到POS调用MoveItems

void OBSBasicPreview::MoveItems(const vec2 &pos)
{
    Qt::KeyboardModifiers modifiers = QGuiApplication::keyboardModifiers();
    OBSBasic *main = reinterpret_cast<OBSBasic *>(App()->GetMainWindow());
    OBSScene scene = main->GetCurrentScene();

    vec2 offset, moveOffset;

    //与前位置与鼠标按下时的起始位置之差
    vec2_sub(&offset, &pos, &startPos);

    vec2_sub(&moveOffset, &offset, &lastMoveOffset);

    if (!(modifiers & Qt::ControlModifier))
        SnapItemMovement(moveOffset);

    vec2_add(&lastMoveOffset, &lastMoveOffset, &moveOffset);

    obs_scene_enum_items(scene, move_items, &moveOffset);
}

最终调用move_items

static bool move_items(obs_scene_t *scene, obs_sceneitem_t *item, void *param)
{
//获取偏移位置
    vec2 *offset = reinterpret_cast<vec2 *>(param);
    if (selected) {
        vec2 pos;
        //获取当前
        obs_sceneitem_get_pos(item, &pos);

        //计算新的位置
        vec2_add(&pos, &pos, offset);

        //更新位置
        obs_sceneitem_set_pos(item, &pos);
    }
}

所以这里的偏移使用的是方法:
1.鼠标按下时计录按下的位置
2.鼠标移动时的位置和刚开始按下的位置做差,就计算出了移动的位置。这样ITEM的源坐标加上这个偏多位置就是新的位置。

注意,这里的位置都是相对于画布绘图区域的逻辑坐标位置。

逻辑坐标的计算

位意一鼠标点相对于画布的逻辑坐位计算方法使用GetMouseEventPos来计算。

vec2 OBSBasicPreview::GetMouseEventPos(QMouseEvent *event)
{
    OBSBasic *main = reinterpret_cast<OBSBasic *>(App()->GetMainWindow());

    float pixelRatio = main->devicePixelRatioF();
    float scale = pixelRatio / main->previewScale;
    vec2 pos;
    vec2_set(&pos,
         (float(event->x()) - main->previewX / pixelRatio) * scale,
         (float(event->y()) - main->previewY / pixelRatio) * scale);

    return pos;
}

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!