xcx
11-14-2012, 07:33 AM
I'm confused how DAG nodes actually updates. So here's simple code, almost directly from Maya pluginWizard.
#include "DGUpdateNode.h"
#include <maya/MPlug.h>
#include <maya/MDataBlock.h>
#include <maya/MDataHandle.h>
#include <maya/MGlobal.h>
MTypeId DGUpdate::id( 0x00011 );
MObject DGUpdate::input;
MObject DGUpdate::output;
DGUpdate::DGUpdate() {}
DGUpdate::~DGUpdate() {}
MStatus DGUpdate::compute( const MPlug& plug, MDataBlock& data )
{
MStatus returnStatus;
if( plug == output )
{
MDataHandle inputData = data.inputValue( input, &returnStatus );
if( returnStatus != MS::kSuccess )
MGlobal::displayError( "Node DGUpdate cannot get value\n" );
else
{
MGlobal::displayInfo( "Updated\n" );
float result = inputData.asFloat();
MDataHandle outputHandle = data.outputValue( DGUpdate::output );
outputHandle.set( result );
data.setClean(plug);
}
} else {
return MS::kUnknownParameter;
}
return MS::kSuccess;
}
void* DGUpdate::creator()
{
return new DGUpdate();
}
MStatus DGUpdate::initialize()
{
MFnNumericAttribute nAttr;
MStatus stat;
input = nAttr.create( "input", "in", MFnNumericData::kFloat, 0.0 );
nAttr.setStorable(true);
nAttr.setKeyable(true);
output = nAttr.create( "output", "out", MFnNumericData::kFloat, 0.0 );
nAttr.setWritable(false);
nAttr.setStorable(false);
stat = addAttribute( input );
if (!stat) { stat.perror("addAttribute"); return stat;}
stat = addAttribute( output );
if (!stat) { stat.perror("addAttribute"); return stat;}
stat = attributeAffects( input, output );
if (!stat) { stat.perror("attributeAffects"); return stat;}
return MS::kSuccess;
}
Now when I change input value. I should get "Updated" print right? However I'm not getting any prints so what I'm doing wrong?
As far as I understand update process it goes like this.
When ever input plug changes output plugs which are specified to be affected by input plug are marked dirty and all plugs where output plugs are connected. When Maya next time updates all dirty plugs get re-evaluated from child first order.
Can someone clear this up for me, please?
#include "DGUpdateNode.h"
#include <maya/MPlug.h>
#include <maya/MDataBlock.h>
#include <maya/MDataHandle.h>
#include <maya/MGlobal.h>
MTypeId DGUpdate::id( 0x00011 );
MObject DGUpdate::input;
MObject DGUpdate::output;
DGUpdate::DGUpdate() {}
DGUpdate::~DGUpdate() {}
MStatus DGUpdate::compute( const MPlug& plug, MDataBlock& data )
{
MStatus returnStatus;
if( plug == output )
{
MDataHandle inputData = data.inputValue( input, &returnStatus );
if( returnStatus != MS::kSuccess )
MGlobal::displayError( "Node DGUpdate cannot get value\n" );
else
{
MGlobal::displayInfo( "Updated\n" );
float result = inputData.asFloat();
MDataHandle outputHandle = data.outputValue( DGUpdate::output );
outputHandle.set( result );
data.setClean(plug);
}
} else {
return MS::kUnknownParameter;
}
return MS::kSuccess;
}
void* DGUpdate::creator()
{
return new DGUpdate();
}
MStatus DGUpdate::initialize()
{
MFnNumericAttribute nAttr;
MStatus stat;
input = nAttr.create( "input", "in", MFnNumericData::kFloat, 0.0 );
nAttr.setStorable(true);
nAttr.setKeyable(true);
output = nAttr.create( "output", "out", MFnNumericData::kFloat, 0.0 );
nAttr.setWritable(false);
nAttr.setStorable(false);
stat = addAttribute( input );
if (!stat) { stat.perror("addAttribute"); return stat;}
stat = addAttribute( output );
if (!stat) { stat.perror("addAttribute"); return stat;}
stat = attributeAffects( input, output );
if (!stat) { stat.perror("attributeAffects"); return stat;}
return MS::kSuccess;
}
Now when I change input value. I should get "Updated" print right? However I'm not getting any prints so what I'm doing wrong?
As far as I understand update process it goes like this.
When ever input plug changes output plugs which are specified to be affected by input plug are marked dirty and all plugs where output plugs are connected. When Maya next time updates all dirty plugs get re-evaluated from child first order.
Can someone clear this up for me, please?
