//
版本,系统声明
#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();
}