【zeno】zeno如何为自定义节点添加功能(apply函数和ZENDEFNODE初探)

概述

上次说了,如何最小化地创建一个自定义的节点

这次将如何为该节点添加功能

唯一改动的是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

我们分为两部分去解析:

  1. ZENDEFNODE,用于绑定GUI参数
  2. apply():用于实现后台代码逻辑

ZENDEFNODE:GUI绑定用户输入和输出参数

这个ZENDEFNODE宏用来绑定GUI和后台代码逻辑。获取用户输入和输出的。显然是MVC设计模式。
我们只需要会用即可

ZENDEFNODE(PBD, {
    // inputs:
    {"prim"},
    // outputs:
    {"prim"},
    // params:
    {{"vec3f","external_force","0, -9.8, 0"}},
    //category
    {"PBD"},
});

小括号里,第一个是节点名,也是你的类名。第二个是个花括号,里面有四个小的花括号,分别对应着:

  1. 从其他节点输入的参数
  2. 向其他节点输出的参数
  3. 用户在该节点指定的参数
  4. 节点的类别(也就是在哪一级菜单中)

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:

  1. has_input(“prim”):用于检测是否有这个参数
  2. auto prim = get_input(“prim”); 用于将外界参数定义为我们需要的内部变量
  3. set_output(“prim”, std::move(prim)); 用于将内部变量输出到外界参数
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值