概述
上次说了,如何最小化地创建一个自定义的节点
这次将如何为该节点添加功能
唯一改动的是PBD.cpp文件
改动为:
#include <zeno\zeno.h>
#include <zeno\types\PrimitiveObject.h>
#include "PBD.h"
namespace zeno {
struct PBD : zeno::INode {
virtual void apply() override
{
if (has_input("prim"))
{
auto prim = get_input<PrimitiveObject>("prim");
auto &pos = prim->attr<vec3f>("pos");
for(int i = 0; i < pos.size(); i++)
{
pos[i] += 1.0;
}
set_output("prim", std::move(prim));
}
};
};
ZENDEFNODE(PBD, {
// inputs:
{"prim"},
// outputs:
{"prim"},
// params:
{{"vec3f","external_force","0, -9.8, 0"}},
//category
{"PBD"},
});
} // namespace zeno
我们分为两部分去解析:
- ZENDEFNODE,用于绑定GUI参数
- apply():用于实现后台代码逻辑
ZENDEFNODE:GUI绑定用户输入和输出参数
这个ZENDEFNODE宏用来绑定GUI和后台代码逻辑。获取用户输入和输出的。显然是MVC设计模式。
我们只需要会用即可
ZENDEFNODE(PBD, {
// inputs:
{"prim"},
// outputs:
{"prim"},
// params:
{{"vec3f","external_force","0, -9.8, 0"}},
//category
{"PBD"},
});
小括号里,第一个是节点名,也是你的类名。第二个是个花括号,里面有四个小的花括号,分别对应着:
- 从其他节点输入的参数
- 向其他节点输出的参数
- 用户在该节点指定的参数
- 节点的类别(也就是在哪一级菜单中)
apply:实现后台代码逻辑
这个虚方法继承自INode类。重写该方法以实现自定义节点所需要的功能。
其中只写了最简单的一个功能:将所有顶点位置平移1.0
if (has_input("prim"))
{
auto prim = get_input<PrimitiveObject>("prim");
auto &pos = prim->attr<vec3f>("pos");
for(int i = 0; i < pos.size(); i++)
{
pos[i] += 1.0;
}
set_output("prim", std::move(prim));
}
};
我们看3个重要的API:
- has_input(“prim”):用于检测是否有这个参数
- auto prim = get_input(“prim”); 用于将外界参数定义为我们需要的内部变量
- set_output(“prim”, std::move(prim)); 用于将内部变量输出到外界参数