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;

  • 相关阅读:
    【LeetCode】17. Letter Combinations of a Phone Number
    【LeetCode】16. 3Sum Closest
    【LeetCode】15. 3Sum 三个数和为0
    【LeetCode】14. Longest Common Prefix 最长前缀子串
    【LeetCode】13. Roman to Integer 罗马数字转整数
    【LeetCode】12. Integer to Roman 整型数转罗马数
    【LeetCode】11. Container With Most Water
    【LeetCode】10. Regular Expression Matching
    Models of good programmer
    RSA Algorithm
  • 原文地址:https://www.cnblogs.com/houdinime/p/1709313.html
Copyright © 2011-2022 走看看