#include <UT/UT_DSOVersion.h>
#include <UT/UT_WorkBuffer.h>
#include <CH/CH_Manager.h>
#include <OP/OP_Context.h>
#include <OP/OP_OperatorTable.h>
#include <PRM/PRM_Include.h>
#include <PRM/PRM_Parm.h>
#include <RU/RU_PixelFunctions.h>
#include "COP2_PixelAdd.h"
using namespace HDK_Sample;
COP_PIXEL_OP_SWITCHER(1, "Sample Pixel Add");
static PRM_Name names[] =
{
PRM_Name("addend", "Add Value"),
};
static PRM_Range addRange(PRM_RANGE_UI, -1, PRM_RANGE_UI, 1);
PRM_Template
COP2_PixelAdd::myTemplateList[] =
{
PRM_Template(PRM_SWITCHER, 3, &PRMswitcherName, switcher),
PRM_Template(PRM_RGB_J, TOOL_PARM, 4, &names[0], PRMoneDefaults,0,
&addRange),
PRM_Template(),
};
OP_TemplatePair COP2_PixelAdd::myTemplatePair( COP2_PixelAdd::myTemplateList,
&COP2_PixelOp::myTemplatePair );
OP_VariablePair COP2_PixelAdd::myVariablePair( 0, &COP2_MaskOp::myVariablePair);
const char * COP2_PixelAdd::myInputLabels[] =
{
"Image to Add to",
"Mask Input",
0
};
OP_Node *
COP2_PixelAdd::myConstructor(OP_Network *net,
const char *name,
OP_Operator *op)
{
return new COP2_PixelAdd(net, name, op);
}
COP2_PixelAdd::COP2_PixelAdd(OP_Network *parent,
const char *name,
OP_Operator *entry)
: COP2_PixelOp(parent, name, entry)
{
}
COP2_PixelAdd::~COP2_PixelAdd() { }
namespace HDK_Sample {
class cop2_AddFunc : public RU_PixelFunction
{
public:
cop2_AddFunc(float r,float g, float b, float a)
{ myAddend[0] = r; myAddend[1] = g; myAddend[2] = b; myAddend[3] = a; }
protected:
virtual bool eachComponentDifferent() const { return true; }
virtual bool needAllComponents() const { return false; }
static float add(RU_PixelFunction *pf, float val, int comp)
{ return val +((cop2_AddFunc*)pf)->myAddend[comp]; }
virtual RUPixelFunc getPixelFunction() const { return add; }
static void addvec(RU_PixelFunction *f, float **vals,
const bool *scope)
{
cop2_AddFunc *pf = (cop2_AddFunc *) f;
if(vals[0] && scope[0]) *vals[0] = *vals[0] + pf->myAddend[0];
if(vals[1] && scope[1]) *vals[1] = *vals[1] + pf->myAddend[1];
if(vals[2] && scope[2]) *vals[2] = *vals[2] + pf->myAddend[2];
if(vals[3] && scope[3]) *vals[3] = *vals[3] + pf->myAddend[3];
}
virtual RUVectorFunc getVectorFunction() const { return addvec; }
private:
float myAddend[4];
};
}
RU_PixelFunction *
COP2_PixelAdd::addPixelFunction(const TIL_Plane*plane,int,float t, int,int,int)
{
int index = mySequence.getImageIndex(t);
float effect = getFrameScopeEffect(index);
float r,g,b,a;
if(plane->isAlphaPlane())
{
r = g = b = a = ADD(3, t) * effect;
}
else
{
r = ADD(0,t) * effect;
g = ADD(1,t) * effect;
b = ADD(2,t) * effect;
a = ADD(3,t) * effect;
}
return new cop2_AddFunc(r,g,b,a);
}
const char *
COP2_PixelAdd::getOperationInfo()
{
float t = CHgetEvalTime();
int index = mySequence.getImageIndex(t);
float effect = getFrameScopeEffect(index);
static UT_WorkBuffer info;
info.sprintf("Add (%g, %g, %g, %g)",
ADD(0,t)*effect, ADD(1,t)*effect,
ADD(2,t)*effect, ADD(3,t)*effect);
return info.buffer();
}
void
newCop2Operator(OP_OperatorTable *table)
{
table->addOperator(new OP_Operator("hdk_samplepixadd",
"HDK Sample Pixel Add",
&COP2_PixelAdd::myConstructor,
&COP2_PixelAdd::myTemplatePair,
1,
2,
&COP2_PixelAdd::myVariablePair));
}