说明
本文旨在建立一个zeno的最小化的自定义节点(子模块)。
最终,你将看见自己新建的子节点
这里我建立的子模块名字为PBD
1. git设置
自己fork一下zeno,然后把源换成自己的远程仓库,然后自己新建一个branch
这是为了保证自己随意写BUG(bushi),不影响其他部分。
2. 在projects的目录下面新建文件夹并添加3个文件
其下有这PBD.h PBD.cpp, CMakeLists.txt, .gitignore四个文件
(gitignore只是用来告诉git哪些不需要纳入版本管理的,就不讲了)
3. 在projects/PBD/CMakeLists.txt中写
增加这一行
target_sources(zeno PRIVATE PBD.cpp PBD.h)
没错就这一行
4. 在projects/CMakeLists.txt中增加
没错就增加这一行
5. 在PBD.h和PBD.cpp中写自己的类
我们最终要的是编译出一个新的节点
一个模板
PBD.h
#pragma once
#if defined (_MSC_VER)
#undef max
#undef min
#define NOMINMAX
#endif
// disable some warnings on Windows
#if defined (_MSC_VER)
__pragma(warning (push))
__pragma(warning (disable : 4244))
__pragma(warning (disable : 4457))
__pragma(warning (disable : 4458))
__pragma(warning (disable : 4389))
__pragma(warning (disable : 4996))
#elif defined (__GNUC__)
_Pragma("GCC diagnostic push")
_Pragma("GCC diagnostic ignored \"-Wconversion\"")
_Pragma("GCC diagnostic ignored \"-Wsign-compare\"")
_Pragma("GCC diagnostic ignored \"-Wshadow\"")
#endif
//=============================================================
class PBD
{
public:
PBD();
};
#if defined (_MSC_VER)
__pragma(warning (pop))
#elif defined (__GNUC__)
_Pragma("GCC diagnostic pop")
#endif
PBD.cpp
#include <zeno\zeno.h>
#include "PBD.h"
namespace zeno {
struct PBD : zeno::INode {
virtual void apply() override {
}
};
ZENDEFNODE(PBD, {
{
{}
},
{
},
{},
{
"PBD"
},
});
} // namespace zeno
解释一下:
zeno.h这个头文件包含了大部分所需要的工具类
然后在zeno这个命名空间里写两部分:
- 类PBD的方法定义
- 类PBD在GUI中对应的节点
类PBD:
zeno写类用的是struct而不是class(其实也没啥大区别,不知道为什么他们这么用)
然后继承INode类(前面的zeno::也是命名空间)
然后重写一个虚函数apply
对应节点
采用ZENDEFNODE这个宏。来将后台代码绑定到GUI上
6. 开启CMake编译宏
更改build/CMakeCache.txt
或者利用VS Code的CMake插件编译
编译运行和最终效果
编译运行
选择如下配置,然后点击运行(那个三角形)
结果
按tab建立节点发现节点
建立子节点如下