#ifndef __SOP_CustomBrush_h__
#define __SOP_CustomBrush_h__
#include <SOP/SOP_Node.h>
#include <UT/UT_RefArray.h>
namespace HDK_Sample {
enum
{
SOP_CUSTOMBRUSH_GRP_IDX = 0,
SOP_CUSTOMBRUSH_ORIGIN_IDX,
SOP_CUSTOMBRUSH_DIRECTION_IDX,
SOP_CUSTOMBRUSH_RADIUS_IDX,
SOP_CUSTOMBRUSH_COLOR_IDX,
SOP_CUSTOMBRUSH_ALPHA_IDX,
SOP_CUSTOMBRUSH_OPERATION_IDX,
SOP_CUSTOMBRUSH_EVENT_IDX,
SOP_CUSTOMBRUSH_CLEARALL_IDX
};
struct SOP_CustomBrushData
{
SOP_CustomBrushData() {}
SOP_CustomBrushData(int ptnum, fpreal r, fpreal g, fpreal b, fpreal a) : myPtNum(ptnum), myRed(r), myGreen(g), myBlue(b), myAlpha(a) {}
int myPtNum;
fpreal myRed;
fpreal myGreen;
fpreal myBlue;
fpreal myAlpha;
};
class SOP_CustomBrush : public SOP_Node
{
public:
SOP_CustomBrush(OP_Network *net, const char *name, OP_Operator *op);
virtual ~SOP_CustomBrush();
static PRM_Template myTemplateList[];
static OP_Node *myConstructor(OP_Network*, const char *, OP_Operator *);
virtual OP_ERROR cookInputGroups(OP_Context &context, int alone = 0);
void updateData(int numpts, UT_RefArray<SOP_CustomBrushData> &data);
protected:
virtual OP_ERROR cookMySop(OP_Context &context);
virtual OP_ERROR save(ostream &os, const OP_SaveFlags &flags,
const char *path_prefix);
virtual bool load(UT_IStream &is, const char *extension,
const char *path);
static int clearAllStatic(void *op, int, fpreal time, const PRM_Template *);
void clearAll();
private:
UT_Vector3 evalVector3(int idx, fpreal t)
{
return UT_Vector3(evalFloat(idx, 0, t),
evalFloat(idx, 1, t),
evalFloat(idx, 2, t));
}
UT_Vector3 getOrigin(fpreal t)
{ return evalVector3(SOP_CUSTOMBRUSH_ORIGIN_IDX, t); }
UT_Vector3 getDirection(fpreal t)
{ return evalVector3(SOP_CUSTOMBRUSH_DIRECTION_IDX, t); }
fpreal getRadius(fpreal t)
{ return evalFloat(SOP_CUSTOMBRUSH_RADIUS_IDX, 0, t); }
UT_Vector3 getBrushColor(fpreal t)
{ return evalVector3(SOP_CUSTOMBRUSH_COLOR_IDX, t); }
fpreal getBrushAlpha(fpreal t)
{ return evalFloat(SOP_CUSTOMBRUSH_ALPHA_IDX, 0, t); }
int getOperation(fpreal t)
{ return evalInt(SOP_CUSTOMBRUSH_OPERATION_IDX, 0, t); }
int getEvent(fpreal t)
{ return evalInt(SOP_CUSTOMBRUSH_EVENT_IDX, 0, t); }
const GA_PointGroup *myGroup;
GU_DetailGroupPair myDetailGroupPair;
int myNumPts;
int myOldNumPts;
UT_RefArray<SOP_CustomBrushData> myData;
UT_RefArray<SOP_CustomBrushData> myOldData;
};
}
#endif