按键位移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函数中进行计算。