houdini HDK开发6——创建自定义节点(SOP_MySwitch)

靠着参考几个案例写出来的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();
}
三、编译生成节点,在houdini里面创建该节点,并与原来节点相比较在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/peixin_huang/article/details/104117940