代码
#include <GU/GU_Detail.h>
static float
densityFunction(const UT_Vector3 &P)
{
return 1 - P.length(); // Return signed distance to unit sphere
}
int
main(int argc, char *argv[])
{
GU_Detail gdp;
UT_BoundingBox bounds;
bounds.setBounds(-1, -1, -1, 1, 1, 1);
gdp.polyIsoSurface(HDK_Sample::densityFunction, bounds, 20, 20, 20);
gdp.save("sphere.bgeo", true, NULL);
return 0;
}
static float
densityFunction(const UT_Vector3 &P)
{
return 1 - P.length(); // Return signed distance to unit sphere
}
int
main(int argc, char *argv[])
{
GU_Detail gdp;
UT_BoundingBox bounds;
bounds.setBounds(-1, -1, -1, 1, 1, 1);
gdp.polyIsoSurface(HDK_Sample::densityFunction, bounds, 20, 20, 20);
gdp.save("sphere.bgeo", true, NULL);
return 0;
}
上面是个非常简单的独立程序,目的是生成一个小的、ISO球体。
如果改成SOP的节点,需要以下的步骤:
- 系统及版本等申明
- 头文件声明
- 头文件定义(可以分开)
- 消息钩子,链接到houdini中
- 参数定义
- 节点构造
- 功能函数构造
- 功能函数析构
- 制作过程,cooking
代码
//版本,系统声明
#define VERSION 10.0.554
#define I386
#define WIN32
#define SWAP_BITFIELDS
#define DLLEXPORT __declspec(dllexport)
#define SESI_LITTLE_ENDIAN
#define MAKING_DSO
//头文件声明
#include <UT/UT_DSOVersion.h> //版本信息
#include <GU/GU_Detail.h> //构建geometry
#include <SOP/SOP_Node.h> //
#include <PRM/PRM_Include.h>
#include <OP/OP_OperatorTable.h>
//头文件定义
class SOP_Sphere:public SOP_Node
{
public:
SOP_Sphere(OP_Network *net, const char *name, OP_Operator *entry);
virtual ~SOP_Sphere();
static OP_Node *myConstructor(OP_Network *, const char *, OP_Operator *);
static PRM_Template myTemplateList[];
protected:
virtual OP_ERROR cookMySop(OP_Context &context);
};
///////////////////////////////////////////////////////////////
//消息钩子,与houdini联系
void newSopOperator(OP_OperatorTable *table)
{
table->addOperator(new OP_Operator(
"hdk_sphere", //内部名称
"mySphere", //界面名称
SOP_Sphere::myConstructor, //构造
SOP_Sphere::myTemplateList, //参数
0, //最小输入
0 //最大输入
));
}
//参数
PRM_Template
SOP_Sphere::myTemplateList[]=
{
PRM_Template()
};
//节点构造
OP_Node *
SOP_Sphere::myConstructor(OP_Network *net, const char *name, OP_Operator *entry)
{
return new SOP_Sphere(net,name,entry);
}
//构造SOP_Sphere函数
SOP_Sphere::SOP_Sphere(OP_Network *net, const char *name, OP_Operator *entry):SOP_Node(net,name,entry)
{}
//析构SOP_Sphere函数
SOP_Sphere::~SOP_Sphere(){}
//cooking部分,构建功能
static float densityFunction(const UT_Vector3 &P)
{
return 1-P.length();
}
OP_ERROR SOP_Sphere::cookMySop(OP_Context &context)
{
//GU_Detail *gdp;
UT_BoundingBox bounds;
gdp->clearAndDestroy();
bounds.setBounds(-1,-1,-1,1,1,1);
gdp->polyIsoSurface(densityFunction,bounds,20,20,20);
return error();
}
#define VERSION 10.0.554
#define I386
#define WIN32
#define SWAP_BITFIELDS
#define DLLEXPORT __declspec(dllexport)
#define SESI_LITTLE_ENDIAN
#define MAKING_DSO
//头文件声明
#include <UT/UT_DSOVersion.h> //版本信息
#include <GU/GU_Detail.h> //构建geometry
#include <SOP/SOP_Node.h> //
#include <PRM/PRM_Include.h>
#include <OP/OP_OperatorTable.h>
//头文件定义
class SOP_Sphere:public SOP_Node
{
public:
SOP_Sphere(OP_Network *net, const char *name, OP_Operator *entry);
virtual ~SOP_Sphere();
static OP_Node *myConstructor(OP_Network *, const char *, OP_Operator *);
static PRM_Template myTemplateList[];
protected:
virtual OP_ERROR cookMySop(OP_Context &context);
};
///////////////////////////////////////////////////////////////
//消息钩子,与houdini联系
void newSopOperator(OP_OperatorTable *table)
{
table->addOperator(new OP_Operator(
"hdk_sphere", //内部名称
"mySphere", //界面名称
SOP_Sphere::myConstructor, //构造
SOP_Sphere::myTemplateList, //参数
0, //最小输入
0 //最大输入
));
}
//参数
PRM_Template
SOP_Sphere::myTemplateList[]=
{
PRM_Template()
};
//节点构造
OP_Node *
SOP_Sphere::myConstructor(OP_Network *net, const char *name, OP_Operator *entry)
{
return new SOP_Sphere(net,name,entry);
}
//构造SOP_Sphere函数
SOP_Sphere::SOP_Sphere(OP_Network *net, const char *name, OP_Operator *entry):SOP_Node(net,name,entry)
{}
//析构SOP_Sphere函数
SOP_Sphere::~SOP_Sphere(){}
//cooking部分,构建功能
static float densityFunction(const UT_Vector3 &P)
{
return 1-P.length();
}
OP_ERROR SOP_Sphere::cookMySop(OP_Context &context)
{
//GU_Detail *gdp;
UT_BoundingBox bounds;
gdp->clearAndDestroy();
bounds.setBounds(-1,-1,-1,1,1,1);
gdp->polyIsoSurface(densityFunction,bounds,20,20,20);
return error();
}
添加上一个简单的参数,结果如下:
代码
//版本,系统声明
#define VERSION 10.0.554
#define I386
#define WIN32
#define SWAP_BITFIELDS
#define DLLEXPORT __declspec(dllexport)
#define SESI_LITTLE_ENDIAN
#define MAKING_DSO
//头文件声明
#include <UT/UT_DSOVersion.h> //版本信息
#include <GU/GU_Detail.h> //构建geometry
#include <SOP/SOP_Node.h> //
#include <PRM/PRM_Include.h>
#include <OP/OP_OperatorTable.h>
//头文件定义
class SOP_Sphere:public SOP_Node
{
public:
SOP_Sphere(OP_Network *net, const char *name, OP_Operator *entry):SOP_Node(net,name,entry){};
virtual ~SOP_Sphere(){};
static OP_Node *myConstructor(OP_Network *, const char *, OP_Operator *);
static PRM_Template myTemplateList[];
protected:
virtual OP_ERROR cookMySop(OP_Context &context);
int DIVX() {return evalInt(0,0,0);}
int DIVY() {return evalInt(0,1,0);}
int DIVZ() {return evalInt(0,2,0);}
};
///////////////////////////////////////////////////////////////
//消息钩子,与houdini联系
void newSopOperator(OP_OperatorTable *table)
{
table->addOperator(new OP_Operator(
"hdk_sphere", //内部名称
"mySphere", //界面名称
SOP_Sphere::myConstructor, //构造
SOP_Sphere::myTemplateList, //参数
0, //最小输入
0 //最大输入
));
}
//参数
//参数名
static PRM_Name names[]=
{
PRM_Name("division", //内部名称
"Division X/Y/Z" //界面名称
),
PRM_Name(0)
};
//参数初始值
static PRM_Default divDefaults[]=
{
PRM_Default(20),
PRM_Default(40),
PRM_Default(20)
};
//参数范围
PRM_Range divRange(PRM_RANGE_RESTRICTED,0,PRM_RANGE_RESTRICTED,50);
//参数构造
PRM_Template
SOP_Sphere::myTemplateList[]=
{
PRM_Template(PRM_XYZ,3,&names[0],divDefaults,0,&divRange),
PRM_Template()
};
//节点构造
OP_Node *
SOP_Sphere::myConstructor(OP_Network *net, const char *name, OP_Operator *entry)
{
return new SOP_Sphere(net,name,entry);
}
//cooking部分,构建功能
static float densityFunction(const UT_Vector3 &P)
{
return 1-P.length();
}
OP_ERROR SOP_Sphere::cookMySop(OP_Context &context)
{
//GU_Detail *gdp;
int divx,divy,divz;
divx=DIVX();
divy=DIVY();
divz=DIVZ();
UT_BoundingBox bounds;
gdp->clearAndDestroy();
bounds.setBounds(-1,-1,-1,1,1,1);
gdp->polyIsoSurface(densityFunction,bounds,divx,divy,divz);
return error();
}
#define VERSION 10.0.554
#define I386
#define WIN32
#define SWAP_BITFIELDS
#define DLLEXPORT __declspec(dllexport)
#define SESI_LITTLE_ENDIAN
#define MAKING_DSO
//头文件声明
#include <UT/UT_DSOVersion.h> //版本信息
#include <GU/GU_Detail.h> //构建geometry
#include <SOP/SOP_Node.h> //
#include <PRM/PRM_Include.h>
#include <OP/OP_OperatorTable.h>
//头文件定义
class SOP_Sphere:public SOP_Node
{
public:
SOP_Sphere(OP_Network *net, const char *name, OP_Operator *entry):SOP_Node(net,name,entry){};
virtual ~SOP_Sphere(){};
static OP_Node *myConstructor(OP_Network *, const char *, OP_Operator *);
static PRM_Template myTemplateList[];
protected:
virtual OP_ERROR cookMySop(OP_Context &context);
int DIVX() {return evalInt(0,0,0);}
int DIVY() {return evalInt(0,1,0);}
int DIVZ() {return evalInt(0,2,0);}
};
///////////////////////////////////////////////////////////////
//消息钩子,与houdini联系
void newSopOperator(OP_OperatorTable *table)
{
table->addOperator(new OP_Operator(
"hdk_sphere", //内部名称
"mySphere", //界面名称
SOP_Sphere::myConstructor, //构造
SOP_Sphere::myTemplateList, //参数
0, //最小输入
0 //最大输入
));
}
//参数
//参数名
static PRM_Name names[]=
{
PRM_Name("division", //内部名称
"Division X/Y/Z" //界面名称
),
PRM_Name(0)
};
//参数初始值
static PRM_Default divDefaults[]=
{
PRM_Default(20),
PRM_Default(40),
PRM_Default(20)
};
//参数范围
PRM_Range divRange(PRM_RANGE_RESTRICTED,0,PRM_RANGE_RESTRICTED,50);
//参数构造
PRM_Template
SOP_Sphere::myTemplateList[]=
{
PRM_Template(PRM_XYZ,3,&names[0],divDefaults,0,&divRange),
PRM_Template()
};
//节点构造
OP_Node *
SOP_Sphere::myConstructor(OP_Network *net, const char *name, OP_Operator *entry)
{
return new SOP_Sphere(net,name,entry);
}
//cooking部分,构建功能
static float densityFunction(const UT_Vector3 &P)
{
return 1-P.length();
}
OP_ERROR SOP_Sphere::cookMySop(OP_Context &context)
{
//GU_Detail *gdp;
int divx,divy,divz;
divx=DIVX();
divy=DIVY();
divz=DIVZ();
UT_BoundingBox bounds;
gdp->clearAndDestroy();
bounds.setBounds(-1,-1,-1,1,1,1);
gdp->polyIsoSurface(densityFunction,bounds,divx,divy,divz);
return error();
}
Parameter index
Parameter name token
Parameter index passed by reference, looked up using 'pn'
Parameter by reference
Component index of a parameter
Evaluation time
Thread id (ie. return value from UTgetSTID())
int | evalInt (int pi, int vi, float t) const |
evalInt(0, //参数索引(第几个参数)
0, //参数分量索引(参数中的第几个分量)
0 //时间值(可否动画)
)