日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【obs-studio开源项目从入门到放弃】预览窗口中source的UI操作绘制处理

發(fā)布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【obs-studio开源项目从入门到放弃】预览窗口中source的UI操作绘制处理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 前言
    • 獲取鼠標(biāo)位置
    • 繪制選中框
    • 裁剪源
    • 拉伸源
    • 移動源
    • 總結(jié)


前言

obs-studio項(xiàng)目簡介和架構(gòu):https://blog.csdn.net/qq_33844311/article/details/121479224

在obs的預(yù)覽窗口上可以對添加的源進(jìn)行各種操作,比如移動、拉伸、裁切、復(fù)制。

下面主要分析一下這些操作的處理邏輯。

獲取鼠標(biāo)位置

獲取當(dāng)前鼠標(biāo)位置信息

vec2 OBSBasicPreview::GetMouseEventPos(QMouseEvent *event) {OBSBasic *main = reinterpret_cast<OBSBasic *>(App()->GetMainWindow());float pixelRatio = main->devicePixelRatioF(); //獲取當(dāng)前系統(tǒng)縮放系數(shù)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; }

繪制選中框

鼠標(biāo)單擊預(yù)覽窗口添加的 source會繪制紅色的選中框。在obs的渲染線程處理相關(guān)的繪制操作,具體參考下面的函數(shù)調(diào)用堆棧。

> obs64.exe!DrawSquareAtPos(float x, float y)1567 C++obs64.exe!OBSBasicPreview::DrawSelectedItem(obs_scene * scene, obs_scene_item * item, void * param)1841 C++obs.dll!obs_scene_enum_items(obs_scene * scene, bool(*)(obs_scene *, obs_scene_item *, void *) callback, void * param)1939 Cobs64.exe!OBSBasicPreview::DrawSceneEditing()1957 C++ // 繪制紅色的編輯框obs64.exe!OBSBasic::RenderMain(void * data, unsigned int cx, unsigned int cy)4205 C++obs.dll!render_display(obs_display * display)242 Cobs.dll!render_displays()99 Cobs.dll!obs_graphics_thread_loop(obs_graphics_context * context)1058 Cobs.dll!obs_graphics_thread(void * param)1130 Cw32-pthreads.dll!ptw32_threadStart(void * vthreadParms)225 C

裁剪源

鼠標(biāo)單擊選中源后按下alt并縮放源,可以裁切源的渲染大小。

obs64.exe!OBSBasicPreview::CropItem(const vec2 & pos)1276 C++ > obs64.exe!OBSBasicPreview::mouseMoveEvent(QMouseEvent * event)1509 C++[外部代碼] obs64.exe!OBSApp::notify(QObject * receiver, QEvent * e)1621 C++[外部代碼] obs64.exe!OBSApp::notify(QObject * receiver, QEvent * e)1621 C++[外部代碼] obs64.exe!run_program(std::basic_fstream<char,std::char_traits<char>> & logFile, int argc, char * * argv)2214 C++obs64.exe!main(int argc, char * * argv)2910 C++obs64.exe!WinMain(HINSTANCE__ * __formal, HINSTANCE__ * __formal, char * __formal, int __formal)97 C++

拉伸源

通過選中源,拉伸改變源的渲染大小。

> obs64.exe!OBSBasicPreview::StretchItem(const vec2 & pos)1391 C++obs64.exe!OBSBasicPreview::mouseMoveEvent(QMouseEvent * event)1511 C++[外部代碼] obs64.exe!OBSApp::notify(QObject * receiver, QEvent * e)1621 C++[外部代碼] obs64.exe!OBSApp::notify(QObject * receiver, QEvent * e)1621 C++[外部代碼] obs64.exe!run_program(std::basic_fstream<char,std::char_traits<char>> & logFile, int argc, char * * argv)2214 C++obs64.exe!main(int argc, char * * argv)2910 C++obs64.exe!WinMain(HINSTANCE__ * __formal, HINSTANCE__ * __formal, char * __formal, int __formal)97 C++

移動源

鼠標(biāo)選中源之后可以移動源的位置,處理邏輯參考下面的調(diào)用堆棧

> obs64.exe!move_items(obs_scene * scene, obs_scene_item * item, void * param)913 C++obs.dll!obs_scene_enum_items(obs_scene * scene, bool(*)(obs_scene *, obs_scene_item *, void *) callback, void * param)1939 Cobs64.exe!OBSBasicPreview::MoveItems(const vec2 & pos)951 C++obs64.exe!OBSBasicPreview::mouseMoveEvent(QMouseEvent * event)1518 C++[外部代碼] obs64.exe!OBSApp::notify(QObject * receiver, QEvent * e)1621 C++[外部代碼] obs64.exe!OBSApp::notify(QObject * receiver, QEvent * e)1621 C++[外部代碼] obs64.exe!run_program(std::basic_fstream<char,std::char_traits<char>> & logFile, int argc, char * * argv)2214 C++obs64.exe!main(int argc, char * * argv)2910 C++obs64.exe!WinMain(HINSTANCE__ * __formal, HINSTANCE__ * __formal, char * __formal, int __formal)97 C++

關(guān)鍵處理函數(shù) move_items

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_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); // 獲取當(dāng)前 item位置vec2_add(&pos, &pos, offset); // 計(jì)算偏移后的 posobs_sceneitem_set_pos(item, &pos); // 更新 item位置}UNUSED_PARAMETER(scene);return true; }

總結(jié)

以上都是個人工作當(dāng)中對obs-studio開源項(xiàng)目的理解,難免有錯誤的地方,如果有歡迎指出。

若有幫助幸甚。


總結(jié)

以上是生活随笔為你收集整理的【obs-studio开源项目从入门到放弃】预览窗口中source的UI操作绘制处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。