靠着参考几个案例写出来的houdini节点,制作了一个节点,实现了与houdini里的sop_switch节点里的相同效果
一、头文件(SOP_MySwitch.h)
#ifndef __SOP_my_switch_h__
#define __SOP_my_switch_h__
#include<SOP/SOP_Node.h>
namespace MySwitch{
class SOP_MySwitch:public SOP_Node
{
public:
//节点构造函数
static OP_Node *myConstructor(OP_Network*,const char *,OP_Operator*);
//参数数组
static PRM_Template myTemplateList[];
protected:
//构造函数与析构函数
SOP_MySwitch(OP_Network *net,const char *name,OP_Operator *op);
virtual ~SOP_MySwitch();
// 在Houdini UI中标记节点输入
//virtual const char *inputLabel(unsigned idx) const;
// 节点的主要功能函数
virtual OP_ERROR cookMySop(OP_Context &context);
private:
// 帮助函数访问节点的参数值
int SELECT(fpreal t) {
return evalInt("divs", 0, t); }
};
}
#endif
二、头文件(SOP_MySwitch.C)
#include "SOP_MySwitch.h"
#include <limits.h>
#include <SYS/SYS_Math.h>
#include <UT/UT_DSOVersion.h>
#include <UT/UT_Interrupt.h>
#include <OP/OP_Operator.h>
#include <OP/OP_OperatorTable.h>
#include <GU/GU_Detail.h>
#include <GEO/GEO_PrimPoly.h>
#include <PRM/PRM_Include.h>
#include <CH/CH_LocalVariable.h>
#include <OP/OP_AutoLockInputs.h>
#include <GU/GU_PrimVDB.h>
#include <openvdb/openvdb.h>
using namespace MySwitch;
void newSopOperator(OP_OperatorTable *table)
{
OP_Operator *op;
op = new OP_Operator(
"mySwitvh", // 内部名称
"My Switch", // UI名称
SOP_MySwitch::myConstructor, //构造该节点的函数
SOP_MySwitch::myTemplateList, // 参数列表
0, //最小输入
100, // 最大输入
nullptr,//本地变量
OP_FLAG_GENERATOR//标识为常规
);
//该节点放置位置
op->setOpTabSubMenuPath("Custom");
//执行addOperator()之后,'table'将获得'op'的所有权
table->addOperator(op);
}
/*
const char *
SOP_MySwitch::inputLabel(unsigned idx) const
{
switch (idx) {
case 0: return "Geo";
case 1: return "Geo";
case 2: return "Geo";
case 3: return "Geo";
default: return "default";
}
}
*/
//属性界面
PRM_Template SOP_MySwitch::myTemplateList[] =
{
//PRM_Template(PRM_INT, 1, &PRMdivName, PRMthreeDefaults, 0, &PRMdivision2Range),
PRM_Template(PRM_INT,1, &PRMdivName, PRMzeroDefaults),
PRM_Template()
};
//构造函数与析构函数
OP_Node *
SOP_MySwitch::myConstructor(OP_Network *net, const char *name, OP_Operator *op)
{
return new SOP_MySwitch(net, name, op);
}
SOP_MySwitch::SOP_MySwitch(OP_Network *net, const char *name, OP_Operator *op) : SOP_Node(net, name, op) {
}
SOP_MySwitch::~SOP_MySwitch() {
}
//节点功能实现函数
OP_ERROR
SOP_MySwitch::cookMySop(OP_Context &context)
{
// 我们必须锁定我们的输入,然后访问其的几何图形,当我们返回时,
// OP_AutoLockInputs将自动解锁我们的输入
OP_AutoLockInputs inputs(this);
if (inputs.lock(context) >= UT_ERROR_ABORT)
return error();
// 复制传入的几何体
fpreal now = context.getTime();
int select = SELECT(now);
duplicateSource(select , context);
return error();
}