|
Hi, I writing a node for Maya, and actually I encountor a strange problem,getting values from MFnCompoundAttribute in compute() function, please see this tester code, when I want to use it in Maya for example connect output to a transform object, when i change parameters the transform move strange, I did whatever you thing, but I still have problem, I would be so appreciated if you help me?
Thank you.
#pragma once
#include <maya/MPxNode.h>
#include <maya/MFnNumericAttribute.h>
#include <maya/MFnGenericAttribute.h>
#include <maya/MFnTypedAttribute.h>
#include <maya/MFnCompoundAttribute.h>
#include <maya/MVector.h>
#include <maya/MFnDependencyNode.h>
#include <maya/MTypeId.h>
//---------------------------------------------------------------------------
// Test Node class
//---------------------------------------------------------------------------
class TestNode : public MPxNode
{
public:
TestNode();
virtual ~TestNode();
virtual MStatus compute( const MPlug& plug, MDataBlock& data );
static void* creator();
static MStatus initialize();
public:
static MObject input1;
static MObject input2;
static MObject input3;
static MObject output;
static MObject compTrgt;
static MTypeId id;
};
#include <maya/MPlug.h>
#include <maya/MDataBlock.h>
#include <maya/MDataHandle.h>
#include <maya/MGlobal.h>
//
#include “TestNode.h”
// Static members
MTypeId TestNode::id( 0x81c00 ); //something for test
MObject TestNode::input1;
MObject TestNode::input2;
MObject TestNode::input3;
MObject TestNode::output;
MObject TestNode::compTrgt;
//-------------------------------------------------------
TestNode::TestNode()
{
}
TestNode::~TestNode()
{
}
//---------------------------------------------------------------------------
//
//
//---------------------------------------------------------------------------
void* TestNode::creator()
{
return new TestNode();
}
//---------------------------------------------------------------------------
// Initialize()
//
//---------------------------------------------------------------------------
MStatus TestNode::initialize()
{
MStatus stat;
MFnNumericAttribute nAttr;
input1 = nAttr.createPoint( “input1”, “in1” );
nAttr.setKeyable(true);
input2 = nAttr.createPoint( “input2”, “in2” );
nAttr.setKeyable(true);
input3 = nAttr.createPoint( “input3”, “in3");
nAttr.setKeyable(true);
//------------------
MFnCompoundAttribute compAttr;
compTrgt = compAttr.create("compTrgt", “ctgt");
compAttr.addChild(input1);
compAttr.addChild(input2);
compAttr.addChild(input3);
compAttr.setArray(true);
//compAttr.setUsesArrayDataBuilder(true);
//compAttr.setIndexMatters(true);
// Output
output = nAttr.createPoint( “output”, “out” );
nAttr.setReadable(true);
nAttr.setWritable(false);
nAttr.setStorable(false);
// Add the attributes we have created to the node
stat = addAttribute( compTrgt );
if (!stat) { stat.perror("addAttribute"); return stat;}
stat = addAttribute( output );
if (!stat) { stat.perror("addAttribute"); return stat;}
//Connect effect
/*
stat = attributeAffects( input3, output );
if (!stat) { stat.perror("attributeAffects"); return stat;}
*/
stat = attributeAffects( compTrgt, output );
if (!stat) { stat.perror("attributeAffects"); return stat;}
return MS::kSuccess;
}
//---------------------------------------------------------------------------
// Compute()
//---------------------------------------------------------------------------
MStatus TestNode::compute( const MPlug& plug, MDataBlock& data )
{
MStatus returnStatus;
if( plug ==TestNode::output )
{
MVector result;
//MObject currNode = thisMObject();
//MPlug plugin1( currNode, input1);
//MPlug plugin2( currNode, input2);
//MPlug plugin3( currNode, input3);
MArrayDataHandle inputArrayData = data.inputArrayValue( compTrgt, &returnStatus );
if( returnStatus != MS::kSuccess )
MGlobal::displayError( “Node TestNode cannot get value\n” );
else
{
unsigned int i, count = inputArrayData.elementCount();
for(i =0; i < count; i++)
{
//inputArrayData.jumpToArrayElement(i);
MVector in1, in2, in3;
//
MDataHandle currElementHandle = inputArrayData.inputValue( &returnStatus );
//
in1 = currElementHandle.child(input1).asVector();
//MGlobal::displayInfo( MString("in1.x = “) + in1.x + MString(” in1.y = “) + in1.y + MString(” in1.z = “) + in1.z );
in2 = currElementHandle.child(input2).asVector();
//MGlobal::displayInfo( MString("in2.x = “) + in2.x + MString(” in2.y = “) + in2.y + MString(” in2.z = “) + in2.z );
in3 = currElementHandle.child(input3).asVector();
//MGlobal::displayInfo( MString("in3.x = “) + in3.x + MString(” in3.y = “) + in3.y + MString(” in3.z = “) + in3.z );
result += in1 + in2+ in3;
//=======================
//if( !inputArrayData.next()) break;
//inputArrayData.setAllClean();
inputArrayData.next();
}
//Set out vector
MDataHandle outputHandle = data.outputValue( TestNode::output );
outputHandle.setMVector( result );
//clean
data.setClean(plug);
outputHandle.setClean();
}// end else
}
else
return MS::kUnknownParameter;
return MS::kSuccess;
}
//---------------------------------------------------------------------------
|