zoukankan      html  css  js  c++  java
  • Star

    代码
    //系统及版本声明

    #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;

  • 相关阅读:
    新年献礼 技术胖262集前端免费视频 让您走的更容易些
    Eruda 一个被人遗忘的调试神器
    你(可能)不知道的web api
    含有阶乘的幂级数和
    sin x 特解的假设
    将y=arctanx展开为x的幂级数
    判断数项级数是否收敛
    ubuntu中用安装字体的方法解决文档中的音标乱码
    英语单词
    用递归实现汉诺塔
  • 原文地址:https://www.cnblogs.com/houdinime/p/1709313.html
Copyright © 2011-2022 走看看