SOP/SOP_DetailAttrib.C
#include <UT/UT_DSOVersion.h>
#include <GEO/GEO_PointRef.h>
#include <GU/GU_Detail.h>
#include <PRM/PRM_Include.h>
#include <OP/OP_Operator.h>
#include <OP/OP_OperatorTable.h>
#include "SOP_DetailAttrib.h"
using namespace HDK_Sample;
void
newSopOperator(OP_OperatorTable *table)
{
table->addOperator(new OP_Operator("hdk_detailattrib",
"DetailAttrib",
SOP_DetailAttrib::myConstructor,
SOP_DetailAttrib::myTemplateList,
1,
1));
}
static PRM_Name sop_names[] = {
PRM_Name("attribname", "Attribute"),
PRM_Name("value", "Value"),
};
static PRM_Default sop_valueDefault(0.1);
static PRM_Range sop_valueRange(PRM_RANGE_RESTRICTED,0,PRM_RANGE_UI,1);
PRM_Template
SOP_DetailAttrib::myTemplateList[]=
{
PRM_Template(PRM_STRING, 1, &sop_names[0], 0),
PRM_Template(PRM_FLT_J, 1, &sop_names[1], &sop_valueDefault, 0,
&sop_valueRange),
PRM_Template()
};
OP_Node *
SOP_DetailAttrib::myConstructor(OP_Network *net,const char *name,OP_Operator *entry)
{
return new SOP_DetailAttrib(net, name, entry);
}
SOP_DetailAttrib::SOP_DetailAttrib(OP_Network *net, const char *name, OP_Operator *entry)
: SOP_Node(net, name, entry)
{
}
SOP_DetailAttrib::~SOP_DetailAttrib()
{
}
unsigned
SOP_DetailAttrib::disableParms()
{
int changed = 0;
return changed;
}
OP_ERROR
SOP_DetailAttrib::cookMySop(OP_Context &context)
{
double t = context.getTime();
UT_String aname;
GB_AttributeRef aoff;
int asize;
GB_AttribType atype;
GB_Attribute *attrib;
static float zero = 0.0;
float *detailattrib;
if (lockInputs(context) >= UT_ERROR_ABORT)
return error();
duplicateSource(0, context);
ATTRIBNAME(aname, t);
atype = GB_ATTRIB_FLOAT;
attrib = gdp->attribs().find(aname, atype);
if (!attrib)
{
gdp->addAttrib(aname, sizeof(float), GB_ATTRIB_FLOAT, &zero);
attrib = gdp->attribs().find(aname, atype);
}
asize = attrib->getSize();
aoff = gdp->attribs().getOffset(aname, atype);
gdp->attribs().getElement().setValue<float>(aoff, VALUE(t));
unlockInputs();
return error();
}