<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相关推荐

  1. <2021SC@SDUSC>【Overload游戏引擎】源码模块简介及项目分工

    <2021SC@SDUSC>[Overload游戏引擎]源码模块简介及项目分工 模块简介 Overload SDK Overload 应用程序 项目分工 模块简介 Overload 由12 ...

  2. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(三)——Internal

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(三)--Internal 前言 Internal 1.Converter 2.EMemoryMode 3.Wi ...

  3. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(二)——ImGui

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(二) 前言 案例分析 程序框架 1.基本案例 2.实现定制绑定/定制引擎 渲染函数 总结 前言 本篇我们来分析 ...

  4. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(四)——ModulesPanels

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(四)--Modules&Panels 前言 Modules Canvas Panels APanel ...

  5. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(一)——Core

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(一) 文章目录 前言 OvUI的模块结构 源码分析 1.Core模块 (1)UIManger的构造函数和析构函 ...

  6. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(六)——Widgets

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(六)--Widgets Button Button namespace OvUI::Widgets::Butt ...

  7. 【Overload游戏引擎】源码分析之十三:OvRendering函数库(十一)

    2021SC@SDUSC 目录 1.Driver 1.1构造函数 1.2InitGlew 1.3GLDebugMessageCallback 2.Renderer 2.1Draw 2.2FetchGL ...

  8. 【Overload游戏引擎】源码分析之五:OvRendering函数库(三)

    2021SC@SDUSC 目录 IMesh.h与Mesh.h 1.CreateBuffers 2.ComputeBoundingSphere 3.其他函数 回顾一下前几篇文章,我们讲到了有关图形学三维 ...

  9. 【Overload游戏引擎】源码分析之六:OvRendering函数库(四)

    2021SC@SDUSC 目录 1.Uniform 1.1UniformType 1.2UniformInfo 2.Shader 2.1SetUniform和GetUniform 2.2GetUnif ...

最新文章

  1. MybatisPlus提示 Could not set property 'id' of '***' with value
  2. Linux centos ansible
  3. python如何删除代码_Python列表删除的三种方法代码分享
  4. java cpu_Java High CPU故障排除指南–第1部分
  5. spring cloud gateway集成hystrix全局断路器
  6. windowswps怎么以文件形式发送_wps怎么以文件形式分享
  7. 不是程序员,代码也不能太丑!python官方书写规范:任何人都该了解的 pep8
  8. freeswitch modules 模块
  9. C#程序加密工具.Net Reactor教程
  10. SpringBoot代理设置
  11. 8款逆天的在线实用工具
  12. JavaScript之切换背景图片(并使)背景栏保持和背景色调相似
  13. Light-sleep 模式下的电流功耗测试及特性(使用 Wi-Fi)
  14. Echarts绘制Tree树图的涟漪效果effectScatter
  15. 云服务器系统镜像选什么,云服务器系统镜像选什么用
  16. 【043】光盘库编码
  17. 【动画图解微积分笔记】 (一) -1.概述 (附B站视频)
  18. Erupt Framework:开源神器,助你无需前端代码搞定企业级后台管理系统
  19. 策略模式与工厂模式的区别
  20. java冒泡排序打印实时动态图(借鉴+改动)

热门文章

  1. 这个为什么显示不出来?
  2. Python安全测试工具合集
  3. python复制word到粘贴板_python3+PyQt5实现使用剪贴板做复制与粘帖示例
  4. 特斯拉灯光秀Light Show Creator开发手记(一)
  5. java.sql.SQLException: Field ‘id‘ doesn‘t have a default value
  6. python回溯算法_回溯算法经典问题及python代码实现
  7. PHP使用正则表达式匹配中文,有部分匹配不出来的解决办法
  8. 词向量 其实就是 语义映射矩阵
  9. python educoder 第3关:列表基本操作
  10. windows下批量创建用户、提升用户权限、设置用户不能更改密码、设置密码永不过期