如何在Nuke中的Ops之间交换自定义数据?

时间:2015-03-17 13:28:49

标签: c++ nuke

此问题针对使用C ++和NDKNuke的开发人员。

上下文:假设一个自定义Op实现了DD::Image::NoIop和的接口 DD::Image::Executable。该节点迭代一系列帧,提取信息 每个帧,存储在自定义数据结构中。自定义旋钮,是一个成员 上述Op的变量(但在UI中不可见)处理加载和保存 (序列化)数据结构。

现在我想在Ops之间交换数据结构。

到目前为止,我提出了以下想法:

  1. 表达式链接

    旋钮可以使用表达式链接共享信息(矩阵等)。 此功能是否也可以用于自定义数据?

  2. 序列化为图像数据

    自定义数据将被序列化并写入(新)通道。一个 处理树下面的节点可以抓取并反序列化 再次。当然,序列化之间不得更改通道 和反序列化或者......这是一个黑客,我知道,但是,嘿,任何端口 在风暴中!

  3. GeoOp +渲染器

    如果自定义数据纯粹是基于点的(不幸的是, 在我的情况下,我不能将上述节点变成3D节点并通过 将数据指向其他3D节点。在某些时候,将需要渲染节点 回到2D。

  4. 我正朝着正确的方向前进?如果没有,那么什么是明智的 使这个数据结构可用于其他节点的方法,这些节点依赖于 包含在哪里的信息?

1 个答案:

答案 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编译为单个共享对象。

答案很长:

  • UpstreamOp.cpp
  • DownstreamOp.cpp

定义依赖的Ops。

我第一次尝试使用UpstreamOp.cpp编译第一个插件, 照常。对于第二个插件,我编译了DownstreamOp.cpp和。{ UpstreamOp.cpp进入该插件。

奇怪的是,它在Linux上运行(没有测试Windows)。

但是,通过覆盖

bool Op::test_input( int input, Op * op ) const;
事情会破裂。使用上述插件创建和保存Comp仍然是 作品。但是,再次加载相同的Comp会破坏节点图中的连接 在UpstreamOpDownstreamOp之间,无法再进行连接 他们又来了。

我的假设是这样的:因为两个插件都包含UpstreamOp的符号 如果节点使用UpstreamOp的实例,则取决于插件的加载顺序 从第一个插件或第二个插件。所以,如果来自第一个插件的UpstreamOp 然后使用dynamic_cast中的任何Op::test_input()将失败,而两个Op不能 再联系了。

令人惊讶的是,Nuke甚至懒得以上述方式开始 配置,因为它可能相当挑剔插件中的符号,例如它们 缺失。

无论如何,为了解决这个问题,我做了以下几点:

  1. 将两个Ops编译成单个共享对象,例如myplugins.so和
  2. 添加TCL脚本或Python脚本(init.py/menu.py),指示Nuke如何加载  行动正确。
  3. 可以在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)。