obs-item-pos-transform
+ -

按键位移item的pos

2024-12-18 3 0

添加至场景中的源(如视频、图像)以obs_scene_item结构体来表示其实例。

struct obs_scene_item {
    struct vec2 pos;//记录在场景中的实际逻辑位置
    struct vec2 scale;//XY的缩放比例
    float rot;//旋转的角度

    struct matrix4 draw_transform;//视图转换矩阵
}

默认情况下:pos的坐标值为(0,0),对于画布输出为1080x1920,则右下角的位置为(1080.0f,1920.0f).
当键盘上的方向键按下时, 根据按键,其xy轴加减1,其具体过程如下:

        case 242: _t->NudgeUp(); break;
        case 243: _t->NudgeDown(); break;
        case 244: _t->NudgeLeft(); break;
        case 245: _t->NudgeRight(); break;

如向下按键按下时,调用

void OBSBasic::NudgeDown()
{
    Nudge(1, MoveDir::Down);
}

Nudge中根据方向计算偏移:

void OBSBasic::Nudge(int dist, MoveDir dir)
{
...
    struct vec2 offset;
    vec2_set(&offset, 0.0f, 0.0f);

    switch (dir) {
    case MoveDir::Up:
        offset.y = (float)-dist;
        break;
    case MoveDir::Down:
        offset.y = (float)dist;
        break;
    case MoveDir::Left:
        offset.x = (float)-dist;
        break;
    case MoveDir::Right:
        offset.x = (float)dist;
        break;
    }
    ...
        obs_scene_enum_items(GetCurrentScene(), nudge_callback, &offset);
}

obs_scene_enum_items中枚举当前场景中所有的item,找到选中的,更新其位置

static bool nudge_callback(obs_scene_t *, obs_sceneitem_t *item, void *param)
{
    struct vec2 &offset = *reinterpret_cast<struct vec2 *>(param);
    struct vec2 pos;

    //获取当前位置
    obs_sceneitem_get_pos(item, &pos);

    //根据偏移量获取新位置
    vec2_add(&pos, &pos, &offset);

    //更新位置及的矩阵
    obs_sceneitem_set_pos(item, &pos);
}

obs_sceneitem_set_pos更新位置,并调用do_update_transform更新矩阵

#define do_update_transform(item)                                          \
    do {                                                               \
        if (!item->parent || item->parent->is_group)               \
            os_atomic_set_bool(&item->update_transform, true); \
        else                                                       \
            update_item_transform(item, false);                \
    } while (false)
void obs_sceneitem_set_pos(obs_sceneitem_t *item, const struct vec2 *pos)
{
    if (item) {
        vec2_copy(&item->pos, pos);
        do_update_transform(item);
    }
}

update_item_transform函数中进行计算。

0 篇笔记 写笔记

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

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

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