Wednesday, May 28, 2008

A tool to analyze Shake tree evaluation

I made a dummy node to log notify and eval plugs.
Every time notify() or eval() is called, plug's full name and new value is logged on the console.
When you connect a node like this,














Something like this is displayed on the Shake console.
It should be useful to analyze a tree.
























#include <nriiplug.h>
#include <nrifx.h>

class NRiFx_Linkage logNode : public NRiMonadic {
public:
logNode();
virtual ~logNode(){}
virtual int eval(NRiPlug *p);
virtual int notify(NRiPlug *p);
NRiDeclareNodeName(logNode);
protected:
void passData_(NRiPlug *from, NRiPlug* to);
void log_(NRiPlug* p, NRiName msg);
};

const NRiName logNode::thisClassName = "logNode";

logNode::logNode() : NRiMonadic()
{
in->setNotify(1, 1);
out->setNotify(1, 1);

in->time()->addDependency(out->time());
in->enable()->addDependency(out->enable());
in->roi()->addDependency(out->roi());
in->mask()->addDependency(out->mask());
in->iBuf()->addDependency(out->iBuf());
in->cacheLevel()->addDependency(out->cacheLevel());

out->width()->addDependency(in->width());
out->height()->addDependency(in->height());
out->bytes()->addDependency(in->bytes());
out->active()->addDependency(in->active());
out->oBuf()->addDependency(in->oBuf());
out->dod()->addDependency(in->dod());
out->bPixel()->addDependency(in->bPixel());
out->cacheId()->addDependency(in->cacheId());
out->bData()->addDependency(in->bData());
out->timeRange()->addDependency(in->timeRange());
}

int logNode::eval(NRiPlug *p)
{
NRiPlug* parent = p->getParent();
NRiPlug* otherParent = (parent == in)? out : in;
NRiPlug* otherPlug = otherParent->getChild(p->getName());
passData_(otherPlug, p);
log_(p, "eval");
return NRiMonadic::eval(p);
}

int logNode::notify(NRiPlug *p)
{
log_(p, "ntfy");
return NRiMonadic::notify(p);
}

void logNode::log_(NRiPlug* p, NRiName msg)
{
NRiName buf;
NRiSys::error((msg + ": " + p->getFullPathName() + " value=").getString());
switch(p->getType())
{
case kString:
NRiSys::error(p->asString().getString());
break;
case kInt:
NRiSys::error(NRiName(p->asInt()).getString());
break;
case kFloat:
NRiSys::error(NRiName(p->asFloat()).getString());
break;
case kDouble:
NRiSys::error(NRiName(p->asDouble()).getString());
break;
case kPtr:
buf.sprintf("0x%x", p->asPtr());
NRiSys::error(buf.getString());
break;
default:
break;
}
NRiSys::error("\n");
}

void logNode::passData_(NRiPlug *from, NRiPlug* to)
{

switch(from->getType())
{
case kString:
to->set(from->asString());
break;
case kInt:
to->set(from->asInt());
break;
case kFloat:
to->set(from->asFloat());
break;
case kDouble:
to->set(from->asDouble());
break;
case kPtr:
to->set(from->asPtr());
break;
default:
break;
}
}

extern "C"
{
NRiExport NRiIPlug *LogNode_(NRiIPlug *img)
{
logNode* fx = new logNode;
fx->in->connect(img);
fx->setParent(NRiNode::getRoot());
return fx->out;
}
}

No comments: