上下文:假设一个自定义Op实现了DD::Image::NoIop
和的接口
DD::Image::Executable
。该节点迭代一系列帧,提取信息
每个帧,存储在自定义数据结构中。自定义旋钮,是一个成员
上述Op的变量(但在UI中不可见)处理加载和保存
(序列化)数据结构。
现在我想在Ops之间交换数据结构。
到目前为止,我提出了以下想法:
表达式链接
旋钮可以使用表达式链接共享信息(矩阵等)。 此功能是否也可以用于自定义数据?
序列化为图像数据
自定义数据将被序列化并写入(新)通道。一个 处理树下面的节点可以抓取并反序列化 再次。当然,序列化之间不得更改通道 和反序列化或者......这是一个黑客,我知道,但是,嘿,任何端口 在风暴中!
GeoOp +渲染器
如果自定义数据纯粹是基于点的(不幸的是, 在我的情况下,我不能将上述节点变成3D节点并通过 将数据指向其他3D节点。在某些时候,将需要渲染节点 回到2D。
我正朝着正确的方向前进?如果没有,那么什么是明智的 使这个数据结构可用于其他节点的方法,这些节点依赖于 包含在哪里的信息?
答案 0 :(得分:0)
此问题已在Nuke-dev mailing list:
上得到解答如果你知道操作系统输入的实际等级,就可以投出 输入到该类类型并直接访问它。一个简单的例子可能是 下面这个片段:
//! @file DownstreamOp.cpp
#include "UpstreamOp.h" // The Op that contains your custom data.
// ...
UpstreamOp * upstreamOp = dynamic_cast< UpstreamOp * >( input( 0 ) );
if ( upstreamOp )
{
YourCustomData * data = yourOp->getData();
// ...
}
// ...
<强>更新强>
参考我通过电子邮件收到的问题进行更新:
我正在尝试做同样的事情,从一个Iop传递自定义数据 插件到另一个。 但是这两个插件是在不同的dso / dll文件中定义的。 你是怎么做到的?
简短回答:
将您的Ops编译为单个共享对象。
答案很长:
说
定义依赖的Ops。
我第一次尝试使用UpstreamOp.cpp
编译第一个插件,
照常。对于第二个插件,我编译了DownstreamOp.cpp
和。{
UpstreamOp.cpp
进入该插件。
奇怪的是,它在Linux上运行(没有测试Windows)。
但是,通过覆盖
bool Op::test_input( int input, Op * op ) const;
事情会破裂。使用上述插件创建和保存Comp仍然是
作品。但是,再次加载相同的Comp会破坏节点图中的连接
在UpstreamOp
和DownstreamOp
之间,无法再进行连接
他们又来了。
我的假设是这样的:因为两个插件都包含UpstreamOp
的符号
如果节点使用UpstreamOp
的实例,则取决于插件的加载顺序
从第一个插件或第二个插件。所以,如果来自第一个插件的UpstreamOp
然后使用dynamic_cast
中的任何Op::test_input()
将失败,而两个Op不能
再联系了。
令人惊讶的是,Nuke甚至懒得以上述方式开始 配置,因为它可能相当挑剔插件中的符号,例如它们 缺失。
无论如何,为了解决这个问题,我做了以下几点:
可以在dev guide和说明中找到TCL脚本的示例 你的menu.py可能是这样的
menu = nuke.menu( 'Nodes' ).addMenu( 'my-plugins' )
menu.addCommand('UpstreamOp', lambda: nuke.createNode('UpstreamOp'))
menu.addCommand('DownstreamOp', lambda: nuke.createNode('DownstreamOp'))
nuke.load('myplugins')
到目前为止,这对我们来说是可靠的(在Linux和Windows上,没有经过测试的Mac)。