【obs-studio开源项目从入门到放弃】预览窗口中source的UI操作绘制处理
生活随笔
收集整理的這篇文章主要介紹了
【obs-studio开源项目从入门到放弃】预览窗口中source的UI操作绘制处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 前言
- 獲取鼠標位置
- 繪制選中框
- 裁剪源
- 拉伸源
- 移動源
- 總結
前言
obs-studio項目簡介和架構:https://blog.csdn.net/qq_33844311/article/details/121479224
在obs的預覽窗口上可以對添加的源進行各種操作,比如移動、拉伸、裁切、復制。
下面主要分析一下這些操作的處理邏輯。
獲取鼠標位置
獲取當前鼠標位置信息
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; }繪制選中框
鼠標單擊預覽窗口添加的 source會繪制紅色的選中框。在obs的渲染線程處理相關的繪制操作,具體參考下面的函數調用堆棧。
> 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裁剪源
鼠標單擊選中源后按下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++移動源
鼠標選中源之后可以移動源的位置,處理邏輯參考下面的調用堆棧
> 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++關鍵處理函數 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); // 獲取當前 item位置vec2_add(&pos, &pos, offset); // 計算偏移后的 posobs_sceneitem_set_pos(item, &pos); // 更新 item位置}UNUSED_PARAMETER(scene);return true; }總結
以上都是個人工作當中對obs-studio開源項目的理解,難免有錯誤的地方,如果有歡迎指出。
若有幫助幸甚。
總結
以上是生活随笔為你收集整理的【obs-studio开源项目从入门到放弃】预览窗口中source的UI操作绘制处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫遇到图片禁止访问(如403)
- 下一篇: 基于新浪微博的男女性择偶观数据分析(下)