feat(oakplugin): wire OpenFX plugins into the node graph and renderer
- oaknode: dynamic node factory registration, PluginNode value model pushing PluginJobPayload, traverser texture passthrough for texture inputs, type-stamped RefBox::get_checked. - oakrender: PluginExecutor dependency-inversion slot; eval resolves and executes plugin jobs, purple frame on failure. - oakplugin: node_factory with full OFX param -> node input translation (15 types, color semantics heuristic, combo ordering, secret/ui_group/ui_page, clip inputs), plugin instance registry, render executor + duplicator installation, progress reporter and active-viewer provider injection points, U8/U16/F16 input conversion with NaN scrubbing, in-place output frame writeback fix. - gl_bridge.rs documents the wgpu<->GL interop spike: Metal-first on macOS rules out wgpu-hal GL interop; offscreen GL context deferred. End-to-end tests cover registration, param translation, CPU render pixel assertions, identity passthrough and NaN fallback.
This commit is contained in:
@@ -84,10 +84,29 @@ pub struct ProgressSuiteV2 {
|
||||
pub end: unsafe extern "C" fn(*mut c_void) -> c_int,
|
||||
}
|
||||
|
||||
/// progressStart:括号起点,OK(label/message 留作未来 UI 展示,
|
||||
/// 第 1 期不建模)。
|
||||
unsafe extern "C" fn progress_start_v1(_handle: *mut c_void, _label: *const c_char) -> c_int {
|
||||
caught(|| status::OK)
|
||||
/// C 字符串解码(空指针/非法 UTF-8 → 空串)。
|
||||
unsafe fn decode<'a>(p: *const c_char) -> &'a str {
|
||||
if p.is_null() {
|
||||
return "";
|
||||
}
|
||||
unsafe { std::ffi::CStr::from_ptr(p) }
|
||||
.to_str()
|
||||
.unwrap_or("")
|
||||
}
|
||||
|
||||
/// progressStart:括号起点;携 label(v2 另携 message)经
|
||||
/// [`crate::progress`] 工厂现造 UI 报告器(无工厂/已有报告器时
|
||||
/// no-op),状态恒 OK。
|
||||
unsafe extern "C" fn progress_start_v1(_handle: *mut c_void, label: *const c_char) -> c_int {
|
||||
caught(|| {
|
||||
let label = unsafe { decode(label) }.to_string();
|
||||
CURRENT.with(|c| {
|
||||
if let Some(r) = c.borrow().as_ref() {
|
||||
r.install_ui(&label, "");
|
||||
}
|
||||
});
|
||||
status::OK
|
||||
})
|
||||
}
|
||||
|
||||
unsafe extern "C" fn progress_update_v1(_handle: *mut c_void, progress: c_double) -> c_int {
|
||||
@@ -100,10 +119,19 @@ unsafe extern "C" fn progress_end_v1(_handle: *mut c_void) -> c_int {
|
||||
|
||||
unsafe extern "C" fn progress_start_v2(
|
||||
_handle: *mut c_void,
|
||||
_label: *const c_char,
|
||||
_message: *const c_char,
|
||||
label: *const c_char,
|
||||
message: *const c_char,
|
||||
) -> c_int {
|
||||
caught(|| status::OK)
|
||||
caught(|| {
|
||||
let label = unsafe { decode(label) }.to_string();
|
||||
let message = unsafe { decode(message) }.to_string();
|
||||
CURRENT.with(|c| {
|
||||
if let Some(r) = c.borrow().as_ref() {
|
||||
r.install_ui(&label, &message);
|
||||
}
|
||||
});
|
||||
status::OK
|
||||
})
|
||||
}
|
||||
|
||||
unsafe extern "C" fn progress_update_v2(_handle: *mut c_void, progress: c_double) -> c_int {
|
||||
|
||||
Reference in New Issue
Block a user