<2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(五)——Plugins
<2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(五)——Plugins
- 前言
- DataDispatcher
- DDSource
- DDTarget
- IPlugin
- Pluginable
- 总结
前言
Plugins是一个简单的插件,作用是在右键单击时显示上下文菜单,可以将小部件添加到上下文菜单中。
DataDispatcher
数据调度器,起作用是自动更新DataWidget数据的插件
RegisterReference——寄存器引用:
void RegisterReference(T& p_reference){m_dataPointer = &p_reference;}void RegisterProvider(std::function<void(T)> p_provider){m_provider = p_provider;}void RegisterGatherer(std::function<T(void)> p_gatherer){m_gatherer = p_gatherer;}
1.注册一个提供者(当小部件数据被修改时应该调用哪个函数)
2.注册一个聚集(当小部件数据需要更新时应该调用哪个函数)
void Provide(T p_data){if (m_valueChanged){if (m_dataPointer)*m_dataPointer = p_data;elsem_provider(p_data);m_valueChanged = false;}}
向调度员提供数据
void NotifyChange(){m_valueChanged = true;}T Gather(){return m_dataPointer ? *m_dataPointer : m_gatherer();}virtual void Execute() override {}
1.通知发生了更改
2.从调度程序返回数据
3.执行数据调度器行为(无效)
DDSource
DDSource(const std::string& p_identifier,const std::string& p_tooltip,T p_data) : identifier(p_identifier), tooltip(p_tooltip), data(p_data){}
创建拖放源
virtual void Execute() override{ImGuiDragDropFlags src_flags = 0;src_flags |= ImGuiDragDropFlags_SourceNoDisableHover; src_flags |= ImGuiDragDropFlags_SourceNoHoldToOpenOthers; if (!hasTooltip)src_flags |= ImGuiDragDropFlags_SourceNoPreviewTooltip; if (ImGui::BeginDragDropSource(src_flags)){if (!m_isDragged)DragStartEvent.Invoke();m_isDragged = true;if (!(src_flags & ImGuiDragDropFlags_SourceNoPreviewTooltip))ImGui::Text(tooltip.c_str());ImGui::SetDragDropPayload(identifier.c_str(), &data, sizeof(data));ImGui::EndDragDropSource();}else{if (m_isDragged)DragStopEvent.Invoke();m_isDragged = false;}}
执行拖放源的行为。这里需要保持源显示为悬停状态,因为我们的拖动是本地的,所以我们禁用了在拖动时打开外部树节点/选项卡的功能。然后,需要隐藏工具提示。
接着要使用一个bool变量,判断如果拖放源被拖动,则返回true。
DDTarget
表示拖放目标
DDTarget(const std::string& p_identifier) : identifier(p_identifier){}
创建拖放目标
virtual void Execute() override{if (ImGui::BeginDragDropTarget()){if (!m_isHovered)HoverStartEvent.Invoke();m_isHovered = true;ImGuiDragDropFlags target_flags = 0;// target_flags |= ImGuiDragDropFlags_AcceptBeforeDelivery; if (!showYellowRect)target_flags |= ImGuiDragDropFlags_AcceptNoDrawDefaultRect; if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(identifier.c_str(), target_flags)){T data = *(T*)payload->Data;DataReceivedEvent.Invoke(data);}ImGui::EndDragDropTarget();}else{if (m_isHovered)HoverEndEvent.Invoke();m_isHovered = false;}}bool IsHovered() const{return m_isHovered;}
执行拖放目标行为。
1.这里可以实现不要等到交付(在目标上释放鼠标按钮)时才执行操作。
2.实施拖放行为时需要不显示黄色矩形。
3.如果拖放目标被拖放源悬停,则返回true
IPlugin
namespace OvUI::Plugins
{class IPlugin{public:virtual void Execute() = 0;void* userData = nullptr;};
}
插件本质上是一种可以插入到小部件的行为,IPlugin类是实现OvUI插件的接口。作用是执行插件行为,并可以任意存储所需的任何数据。
Pluginable
该类实现可插入功能,使插件能够执行
*/~Pluginable(){RemoveAllPlugins();}template<typename T, typename... Args>T& AddPlugin(Args&& ... p_args){static_assert(std::is_base_of<Plugins::IPlugin, T>::value, "T should derive from IPlugin");T* newPlugin = new T(std::forward<Args>(p_args)...);m_plugins.push_back(newPlugin);return *newPlugin;}
先执行析构函数销毁每个插件,然后添加插件。
template<typename T>T* GetPlugin(){static_assert(std::is_base_of<Plugins::IPlugin, T>::value, "T should derive from IPlugin");for (auto it = m_plugins.begin(); it != m_plugins.end(); ++it){T* result = dynamic_cast<T*>(*it);if (result)return result;}return nullptr;}
返回给定类型的插件,如果找不到则返回null ptr
void ExecutePlugins(){for (auto& plugin : m_plugins)plugin->Execute();}void RemoveAllPlugins(){for (auto& plugin : m_plugins)delete plugin;m_plugins.clear();}
执行每个插件,删除所有插件。
总结
本篇分析了插件功能的实现,总体上比较易懂,这里需要注意插件的执行需要实现可插入功能,最后仍然需要与ImGui对接完成插件的显示。
<2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(五)——Plugins相关推荐
- <2021SC@SDUSC>【Overload游戏引擎】源码模块简介及项目分工
<2021SC@SDUSC>[Overload游戏引擎]源码模块简介及项目分工 模块简介 Overload SDK Overload 应用程序 项目分工 模块简介 Overload 由12 ...
- <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(三)——Internal
<2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(三)--Internal 前言 Internal 1.Converter 2.EMemoryMode 3.Wi ...
- <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(二)——ImGui
<2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(二) 前言 案例分析 程序框架 1.基本案例 2.实现定制绑定/定制引擎 渲染函数 总结 前言 本篇我们来分析 ...
- <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(四)——ModulesPanels
<2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(四)--Modules&Panels 前言 Modules Canvas Panels APanel ...
- <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(一)——Core
<2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(一) 文章目录 前言 OvUI的模块结构 源码分析 1.Core模块 (1)UIManger的构造函数和析构函 ...
- <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(六)——Widgets
<2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(六)--Widgets Button Button namespace OvUI::Widgets::Butt ...
- 【Overload游戏引擎】源码分析之十三:OvRendering函数库(十一)
2021SC@SDUSC 目录 1.Driver 1.1构造函数 1.2InitGlew 1.3GLDebugMessageCallback 2.Renderer 2.1Draw 2.2FetchGL ...
- 【Overload游戏引擎】源码分析之五:OvRendering函数库(三)
2021SC@SDUSC 目录 IMesh.h与Mesh.h 1.CreateBuffers 2.ComputeBoundingSphere 3.其他函数 回顾一下前几篇文章,我们讲到了有关图形学三维 ...
- 【Overload游戏引擎】源码分析之六:OvRendering函数库(四)
2021SC@SDUSC 目录 1.Uniform 1.1UniformType 1.2UniformInfo 2.Shader 2.1SetUniform和GetUniform 2.2GetUnif ...
最新文章
- MybatisPlus提示 Could not set property 'id' of '***' with value
- Linux centos ansible
- python如何删除代码_Python列表删除的三种方法代码分享
- java cpu_Java High CPU故障排除指南–第1部分
- spring cloud gateway集成hystrix全局断路器
- windowswps怎么以文件形式发送_wps怎么以文件形式分享
- 不是程序员,代码也不能太丑!python官方书写规范:任何人都该了解的 pep8
- freeswitch modules 模块
- C#程序加密工具.Net Reactor教程
- SpringBoot代理设置
- 8款逆天的在线实用工具
- JavaScript之切换背景图片(并使)背景栏保持和背景色调相似
- Light-sleep 模式下的电流功耗测试及特性(使用 Wi-Fi)
- Echarts绘制Tree树图的涟漪效果effectScatter
- 云服务器系统镜像选什么,云服务器系统镜像选什么用
- 【043】光盘库编码
- 【动画图解微积分笔记】 (一) -1.概述 (附B站视频)
- Erupt Framework:开源神器,助你无需前端代码搞定企业级后台管理系统
- 策略模式与工厂模式的区别
- java冒泡排序打印实时动态图(借鉴+改动)
热门文章
- 这个为什么显示不出来?
- Python安全测试工具合集
- python复制word到粘贴板_python3+PyQt5实现使用剪贴板做复制与粘帖示例
- 特斯拉灯光秀Light Show Creator开发手记(一)
- java.sql.SQLException: Field ‘id‘ doesn‘t have a default value
- python回溯算法_回溯算法经典问题及python代码实现
- PHP使用正则表达式匹配中文,有部分匹配不出来的解决办法
- 词向量 其实就是 语义映射矩阵
- python educoder 第3关:列表基本操作
- windows下批量创建用户、提升用户权限、设置用户不能更改密码、设置密码永不过期