[英]How to exchange custom data between Ops in Nuke?
上下文:假设实现DD::Image::NoIop
和DD::Image::Executable
的接口的自定义Op。 节点迭代一系列帧,在每个帧中提取信息,这些信息存储在自定义数据结构中。 自定义旋钮是上述Op的成员变量(但在UI中不可见),用于处理数据结构的加载和保存(序列化)。
现在,我想在Ops之间交换该数据结构。
到目前为止,我已经提出了以下想法:
表达式链接
旋钮可以使用表达式链接共享信息(矩阵等)。 是否可以将此功能用于自定义数据?
序列化到图像数据
自定义数据将被序列化并写入(新)通道。 处理树下方的一个节点可以抓住它并再次反序列化。 当然,不得在序列化和反序列化之间更改通道,否则...这是一个hack,我知道,但是,嘿,风暴中的任何端口!
GeoOp +渲染器
如果自定义数据是纯粹基于点的(不幸的是,这不是我的情况),我可以将上述节点转换为3D节点,然后将点数据传递给其他3D节点。 在某个时候,将要求渲染节点返回2D。
我正朝着正确的方向前进吗? 如果不是,有什么明智的方法可以使此数据结构可用于其他依赖于其中包含的信息的节点?
在Nuke-dev邮件列表中已经回答了这个问题:
如果您知道Op输入的实际类,则可以将输入转换为该类类型并直接访问它。 以下是一个简单的示例:
//! @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编译为单个共享库。
长答案:
说
定义相关的操作。
像往常一样,在第一次尝试中,我仅使用UpstreamOp.cpp
编译了第一个插件。 对于第二个插件,我将DownstreamOp.cpp
和UpstreamOp.cpp
都编译到了该插件中。
足够奇怪(在Linux上;未测试Windows)。
但是,通过覆盖
bool Op::test_input( int input, Op * op ) const;
事情会破裂。 使用上述插件创建和保存Comp仍然有效。 但是再次加载相同的Comp将中断UpstreamOp
和DownstreamOp
之间的节点图中的连接,并且不再可能再次连接它们。
我的假设是:由于两个插件都包含UpstreamOp
符号,因此,如果节点使用第一个插件或第二个插件的UpstreamOp
实例,则取决于插件的加载顺序。 因此,如果使用第一个插件的UpstreamOp
,则Op::test_input()
任何dynamic_cast
将失败,并且两个Op不能再连接。
令人惊讶的是,Nuke甚至根本不愿意从上述配置开始,因为对于插件中的符号(例如,如果缺少符号)可能会比较挑剔。
无论如何,为了解决这个问题,我做了以下工作:
在开发指南中可以找到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)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.