# OpenFX 支持 TODO（中文说明）

下面是 README 里 OpenFX TODO 的中文翻译与详细说明。每条都尽量解释“是什么、为什么需要、该往哪里改”。

1) 实现插件发现与加载流程
- 现状：`app/node/factory.cpp` 自己临时创建 Host/PluginCache 并扫描，`loadPlugins()` 只是一段占位逻辑。
- 为什么需要：没有统一的发现/加载入口，插件扫描路径和实例化流程很容易分叉，后续维护困难。
- 已完成：
  - 在 `app/pluginSupport/OliveHost.cpp` 实现 `loadPlugins()`：创建 Host/PluginCache，注册到 OFX 全局缓存，设置 host path，按需追加路径并扫描插件文件。
  - `app/node/factory.cpp` 统一通过 `loadPlugins()` 初始化插件，再从全局缓存取插件注册到节点库。

2) 输出剪辑图像的缓冲区管理（Output Clip）
- 现状：`OliveClipInstance::getImage()` 返回空的 OFX Image，没有分配像素内存，也没有设置 `kOfxImagePropData`。
- 为什么需要：插件渲染时会往 `kOfxImagePropData` 写入像素，如果这里没分配就会导致崩溃或黑屏。
- 可能改动：为 Output Clip 分配像素缓冲（例如 `std::vector<uint8_t>`），填充 `kOfxImagePropData`、`kOfxImagePropRowBytes`、`kOfxImagePropBounds`，并保证生命周期覆盖渲染过程。

3) 输入剪辑图像的拉取（Input Clip Fetch）
- 现状：`OliveClipInstance::getImage()` 对输入剪辑直接返回一个空 Image，没有真正把输入帧填进去。
- 为什么需要：多数插件需要输入图像做处理，没有输入就无法正确工作。
- 可能改动：根据当前时间 `time` 从渲染管线/缓存/纹理中取出输入帧，设置 OFX Image 的 data/bounds/rowBytes 等属性并返回。

4) 渲染路径中设置每帧输出数据与 ROD/Bounds
- 现状：`app/render/plugin/pluginrenderer.cpp` 中已接了 Image->AVFrame，但仍需要保证每帧输出图像属性正确（ROD/Bounds）。
- 为什么需要：插件对 ROD 和 bounds 非常敏感，用错会导致裁剪错误或错位。
- 可能改动：在渲染前或 render action 前，按当前时间/ROI 计算并设置 Output Clip 的 `kOfxImagePropBounds`、`kOfxImagePropRegionOfDefinition` 等。

5) 参数类型支持不完整（Param Instances）
- 现状：`OlivePluginInstance::newParam()` 只支持少量类型，`app/node/plugins/Plugin.cpp` 里也没有处理 Group/Page 等。
- 为什么需要：复杂插件大量依赖 String/3D/Custom 等参数，不支持就会缺参数或崩溃。
- 可能改动：补齐 String、Double3D/Integer3D、Group/Page、Custom/Bytes 等参数实例，并在节点输入映射里增加对应类型。

6) editBegin/editEnd、Progress、Timeline 等回调还只是空实现
- 现状：`OlivePluginInstance` 中多处函数是空壳或默认返回。
- 为什么需要：插件在编辑参数、显示进度、根据时间线上下文渲染时依赖这些回调。
- 已完成：
  - editBegin/editEnd：实现编辑会话计数，保证调用合法并可用于后续扩展。
  - progressStart/Update/End：接入 `ProgressDialog`，支持取消并返回给插件停止信号。
  - timeLineGetTime/GotoTime/Bounds：关联当前活跃的时间线/面板播放头，读取与设置时间。

7) 持久消息展示与清理机制需要完善
- 现状：我们已在 Host/Instance 里保存消息并能弹窗，但 UI 面板还需要稳定地展示、更新和清理。
- 为什么需要：插件经常用 persistent message 提示错误或警告，需要可追踪、可清除。
- 已完成：
  - Host/Instance 持久消息保存，节点右上角显示数量徽标。
  - 参数面板顶部展示消息列表，并可点击清除按钮移除消息。
  - 清除/新增消息后通过信号更新 UI。
8) Project Extent / Fielding 行为待确认
- 现状：`OlivePluginInstance::getProjectExtent()` 有 “TODO” 注释。
- 为什么需要：OFX 插件会根据项目尺寸、扫描线场信息做渲染决策。
- 已完成：
  - `getProjectExtent()` 明确返回项目宽高，不再留 TODO。
  - `getDefaultOutputFielding()` 根据 `VideoParams::interlacing()` 映射为 OFX fielding。
  - 渲染时 `renderAction()` 的 field 参数根据项目是否交错决定（progressive 用 `None`，interlaced 用 `Both`）。

9) OpenGL Render Suite 支持
- 现状：`OliveClipInstance::loadTexture()` 返回 null，OpenGL 渲染路径未实现。
- 为什么需要：有些 OFX 插件只支持 OpenGL 渲染，不支持 CPU 渲染。
- 已完成：
  - Host 端声明 `kOfxImageEffectPropOpenGLRenderSupported = true`。
  - `OliveClipInstance::loadTexture()` 返回真实的 OpenGL 纹理句柄。
  - 渲染前设置 Output Clip 的目标纹理，输入纹理走 OpenGL 纹理路径。

---

如果你希望，我可以把这些 TODO 拆成“优先级 + 预计工作量 + 依赖关系”的形式，方便你逐条推进。
