![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//系统及版本声明
#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 <UT/UT_Interrupt.h>
#include <GU/GU_PrimPoly.h>
#include <CH/CH_LocalVariable.h>
#include <PRM/PRM_Include.h>
#include <OP/OP_Operator.h>
#include <OP/OP_OperatorTable.h>
#include <SOP/SOP_Node.h>
//头文件定义
namespace HDK_Sample{
class SOP_Star:public SOP_Node
{
public:
static OP_Node *myConstructor(OP_Network *, const char *, OP_Operator *);
static PRM_Template myTemplateList[];
static CH_LocalVariable myVariables[];
protected:
SOP_Star(OP_Network *net,const char *name,OP_Operator *op);
virtual ~SOP_Star();
virtual unsigned disableParms();
virtual OP_ERROR cookMySop(OP_Context &context);
virtual float getVariableValue(int index,int thread);
private:
int DIVISIONS(float t) {return evalInt ("divs",0,t);}
float XRADIUS(float t) {return evalFloat ("rad",0,t);}
float YRADIUS(float t) {return evalFloat ("rad",1,t);}
int NEGRADIUS() {return evalInt ("nradius",0,0);}
float CENTERX(float t) {return evalFloat ("t",0,t);}
float CENTERY(float t) {return evalFloat ("t",1,t);}
float CENTERZ(float t) {return evalFloat ("t",2,t);}
int ORIENT() {return evalInt ("orient",0,0);}
int myCurrPoint;
int myTotalPoints;
};
}
using namespace HDK_Sample;
//消息钩子
void
newSopOperator(OP_OperatorTable *table)
{
table->addOperator(
new OP_Operator("hdk_star","Star",
SOP_Star::myConstructor,
SOP_Star::myTemplateList,
0,0,
SOP_Star::myVariables,
OP_FLAG_GENERATOR
)
);
}
//参数定义
static PRM_Name negativeName("nradius","Negative Radius");
static PRM_Default fiveDefault(5);
static PRM_Default radiDefaults[]={
PRM_Default(1),
PRM_Default(0.3)
};
PRM_Template
SOP_Star::myTemplateList[]={
PRM_Template(PRM_INT_J,1,&PRMdivName,&fiveDefault,0,&PRMdivision2Range),
PRM_Template(PRM_XYZ_J,2,&PRMradiusName,radiDefaults),
PRM_Template(PRM_TOGGLE,1,&negativeName),
PRM_Template(PRM_XYZ_J,3,&PRMcenterName),
PRM_Template(PRM_ORD,1,&PRMorientName,0,&PRMplaneMenu),
PRM_Template()
};
//定义局部变量
enum{ VAR_PT,VAR_NPT};
CH_LocalVariable
SOP_Star::myVariables[]={
{"PT", VAR_PT, 0},
{"NPT", VAR_NPT,0},
{0,0,0},
};
float
SOP_Star::getVariableValue(int index, int thread)
{
if(myCurrPoint<0) return 0;
switch(index)
{
case VAR_PT: return myCurrPoint;
case VAR_NPT: return myTotalPoints;
}
return SOP_Node::getVariableValue(index,thread);
}
//节点构造
OP_Node *
SOP_Star::myConstructor(OP_Network *net, const char *name, OP_Operator *op)
{
return new SOP_Star(net,name,op);
}
//功能函数构造
SOP_Star::SOP_Star(OP_Network *net,const char *name,OP_Operator *op):SOP_Node(net,name,op)
{
myCurrPoint = -1;
}
//功能函数析构
SOP_Star::~SOP_Star(){}
unsigned
SOP_Star::disableParms(){return 0;}
//制作
OP_ERROR
SOP_Star::cookMySop(OP_Context &context)
{
float now;
float rad,tx,ty,tz;
int divisions,plane,negradius;
int xcoord,ycoord,zcoord;
float tmp,tinc;
GEO_Point *ppt;
GU_PrimPoly *poly;
int i;
UT_Interrupt *boss;
now = context.myTime;
divisions = DIVISIONS(now)*2;
myTotalPoints = divisions;
myCurrPoint = 0;
plane = ORIENT();
negradius = NEGRADIUS();
tx = CENTERX(now);
ty = CENTERY(now);
tz = CENTERZ(now);
switch(plane)
{
case 0:
xcoord = 0;
ycoord = 1;
zcoord = 2;
break;
case 1:
xcoord = 1;
ycoord = 2;
zcoord = 0;
break;
case 2:
xcoord = 0;
ycoord = 2;
zcoord = 1;
break;
}
if(error()<UT_ERROR_ABORT)
{
boss = UTgetInterrupt();
if(divisions < 4)
{
addWarning(SOP_MESSAGE,"Invalid divisions");
divisions = 4;
}
gdp->clearAndDestroy();
boss->opStart("Building Star");
poly = GU_PrimPoly::build(gdp,divisions,GU_POLY_CLOSED);
tinc = M_PI*2/(float)divisions;
for(i=0;i<divisions;i++)
{
if(boss->opInterrupt())
break;
myCurrPoint = i;
tmp = (float)i * tinc;
rad = (i & 1)?XRADIUS(now) :YRADIUS(now);
if(!negradius&&rad<0)
rad = 0;
ppt = poly->getVertex(i).getPt();
ppt->getPos()(xcoord) = cos(tmp) * rad + tx;
ppt->getPos()(ycoord) = sin(tmp) * rad + ty;
ppt->getPos()(zcoord) = 0 + tz;
}
select(GU_SPrimitive);
boss->opEnd();
}
myCurrPoint = -1;
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 <UT/UT_Interrupt.h>
#include <GU/GU_PrimPoly.h>
#include <CH/CH_LocalVariable.h>
#include <PRM/PRM_Include.h>
#include <OP/OP_Operator.h>
#include <OP/OP_OperatorTable.h>
#include <SOP/SOP_Node.h>
//头文件定义
namespace HDK_Sample{
class SOP_Star:public SOP_Node
{
public:
static OP_Node *myConstructor(OP_Network *, const char *, OP_Operator *);
static PRM_Template myTemplateList[];
static CH_LocalVariable myVariables[];
protected:
SOP_Star(OP_Network *net,const char *name,OP_Operator *op);
virtual ~SOP_Star();
virtual unsigned disableParms();
virtual OP_ERROR cookMySop(OP_Context &context);
virtual float getVariableValue(int index,int thread);
private:
int DIVISIONS(float t) {return evalInt ("divs",0,t);}
float XRADIUS(float t) {return evalFloat ("rad",0,t);}
float YRADIUS(float t) {return evalFloat ("rad",1,t);}
int NEGRADIUS() {return evalInt ("nradius",0,0);}
float CENTERX(float t) {return evalFloat ("t",0,t);}
float CENTERY(float t) {return evalFloat ("t",1,t);}
float CENTERZ(float t) {return evalFloat ("t",2,t);}
int ORIENT() {return evalInt ("orient",0,0);}
int myCurrPoint;
int myTotalPoints;
};
}
using namespace HDK_Sample;
//消息钩子
void
newSopOperator(OP_OperatorTable *table)
{
table->addOperator(
new OP_Operator("hdk_star","Star",
SOP_Star::myConstructor,
SOP_Star::myTemplateList,
0,0,
SOP_Star::myVariables,
OP_FLAG_GENERATOR
)
);
}
//参数定义
static PRM_Name negativeName("nradius","Negative Radius");
static PRM_Default fiveDefault(5);
static PRM_Default radiDefaults[]={
PRM_Default(1),
PRM_Default(0.3)
};
PRM_Template
SOP_Star::myTemplateList[]={
PRM_Template(PRM_INT_J,1,&PRMdivName,&fiveDefault,0,&PRMdivision2Range),
PRM_Template(PRM_XYZ_J,2,&PRMradiusName,radiDefaults),
PRM_Template(PRM_TOGGLE,1,&negativeName),
PRM_Template(PRM_XYZ_J,3,&PRMcenterName),
PRM_Template(PRM_ORD,1,&PRMorientName,0,&PRMplaneMenu),
PRM_Template()
};
//定义局部变量
enum{ VAR_PT,VAR_NPT};
CH_LocalVariable
SOP_Star::myVariables[]={
{"PT", VAR_PT, 0},
{"NPT", VAR_NPT,0},
{0,0,0},
};
float
SOP_Star::getVariableValue(int index, int thread)
{
if(myCurrPoint<0) return 0;
switch(index)
{
case VAR_PT: return myCurrPoint;
case VAR_NPT: return myTotalPoints;
}
return SOP_Node::getVariableValue(index,thread);
}
//节点构造
OP_Node *
SOP_Star::myConstructor(OP_Network *net, const char *name, OP_Operator *op)
{
return new SOP_Star(net,name,op);
}
//功能函数构造
SOP_Star::SOP_Star(OP_Network *net,const char *name,OP_Operator *op):SOP_Node(net,name,op)
{
myCurrPoint = -1;
}
//功能函数析构
SOP_Star::~SOP_Star(){}
unsigned
SOP_Star::disableParms(){return 0;}
//制作
OP_ERROR
SOP_Star::cookMySop(OP_Context &context)
{
float now;
float rad,tx,ty,tz;
int divisions,plane,negradius;
int xcoord,ycoord,zcoord;
float tmp,tinc;
GEO_Point *ppt;
GU_PrimPoly *poly;
int i;
UT_Interrupt *boss;
now = context.myTime;
divisions = DIVISIONS(now)*2;
myTotalPoints = divisions;
myCurrPoint = 0;
plane = ORIENT();
negradius = NEGRADIUS();
tx = CENTERX(now);
ty = CENTERY(now);
tz = CENTERZ(now);
switch(plane)
{
case 0:
xcoord = 0;
ycoord = 1;
zcoord = 2;
break;
case 1:
xcoord = 1;
ycoord = 2;
zcoord = 0;
break;
case 2:
xcoord = 0;
ycoord = 2;
zcoord = 1;
break;
}
if(error()<UT_ERROR_ABORT)
{
boss = UTgetInterrupt();
if(divisions < 4)
{
addWarning(SOP_MESSAGE,"Invalid divisions");
divisions = 4;
}
gdp->clearAndDestroy();
boss->opStart("Building Star");
poly = GU_PrimPoly::build(gdp,divisions,GU_POLY_CLOSED);
tinc = M_PI*2/(float)divisions;
for(i=0;i<divisions;i++)
{
if(boss->opInterrupt())
break;
myCurrPoint = i;
tmp = (float)i * tinc;
rad = (i & 1)?XRADIUS(now) :YRADIUS(now);
if(!negradius&&rad<0)
rad = 0;
ppt = poly->getVertex(i).getPt();
ppt->getPos()(xcoord) = cos(tmp) * rad + tx;
ppt->getPos()(ycoord) = sin(tmp) * rad + ty;
ppt->getPos()(zcoord) = 0 + tz;
}
select(GU_SPrimitive);
boss->opEnd();
}
myCurrPoint = -1;
return error();
}
ppt = poly->getVertex(i).getPt();
ppt->getPos()(xcoord) = cos(tmp) * radx + tx;
ppt->getPos()(ycoord) = sin(tmp) * rady + ty;
ppt->getPos()(zcoord) = 0 + tz;