シェーディング・ノードの種類には以下のものがある。
必要なものはノード・プラグインを作成する場合と変らない。
nodeName()
virtual ~nodeName()
virtual MStatus compute( const MPlug& plug, MDataBlock& data )
static void* nodeName::creator()
static MStatus nodeName::initialize()
MStatus initializePlugin( MObject obj )
MStatus uninitializePlugin( MObject obj )
MTypeId id
マテリアルを計算するプラグインの一例である。
#include <math.h>
#include <maya/MFnPlugin.h>
#include <maya/MPxNode.h>
#include <maya/MFnNumericAttribute.h>
#include <maya/MFloatVector.h>
class sample1 : public MPxNode
{
public:
sample1();
virtual ~sample1();
virtual MStatus compute( const MPlug&, MDataBlock& );
static void *creator();
static MStatus initialize();
static MTypeId id; // プラグインのId
protected:
static MObject color1R,color1G,color1B,color1;
static MObject aNormalCameraX, aNormalCameraY, aNormalCameraZ, aNormalCamera;
static MObject aOutColorR, aOutColorG, aOutColorB, aOutColor;
};
MObject sample1::color1R;
MObject sample1::color1G;
MObject sample1::color1B;
MObject sample1::color1;
MObject sample1::aNormalCameraX;
MObject sample1::aNormalCameraY;
MObject sample1::aNormalCameraZ;
MObject sample1::aNormalCamera;
MObject sample1::aOutColorR;
MObject sample1::aOutColorG;
MObject sample1::aOutColorB;
MObject sample1::aOutColor;
sample1::sample1()
{
}
sample1::~sample1()
{
}
void* sample1::creator()
{
return new sample1();
}
MStatus sample1::initialize()
{
MFnNumericAttribute nAttr;
color1R = nAttr.create( "color1R", "c1r", MFnNumericData::kFloat);
color1G = nAttr.create( "color1G", "c1g", MFnNumericData::kFloat);
color1B = nAttr.create( "color1B", "c1b", MFnNumericData::kFloat);
color1 = nAttr.create( "Color", "c1", color1R, color1G, color1B);
nAttr.setStorable(true);
nAttr.setUsedAsColor(true);
nAttr.setDefault(1.0f, 1.0f, 1.0f);
aNormalCameraX = nAttr.create( "normalCameraX", "nx", MFnNumericData::kFloat);
nAttr.setStorable(false);
nAttr.setDefault(1.0f);
aNormalCameraY = nAttr.create( "normalCameraY", "ny", MFnNumericData::kFloat);
nAttr.setStorable(false);
nAttr.setDefault(1.0f);
aNormalCameraZ = nAttr.create( "normalCameraZ", "nz", MFnNumericData::kFloat);
nAttr.setStorable(false);
nAttr.setDefault(1.0f);
aNormalCamera = nAttr.create( "normalCamera","n", aNormalCameraX,
aNormalCameraY, aNormalCameraZ);
nAttr.setStorable(false);
nAttr.setHidden(true);
aOutColorR = nAttr.create( "outColorR", "ocr", MFnNumericData::kFloat);
aOutColorG = nAttr.create( "outColorG", "ocg", MFnNumericData::kFloat);
aOutColorB = nAttr.create( "outColorB", "ocb", MFnNumericData::kFloat);
aOutColor = nAttr.create( "outColor", "oc", aOutColorR, aOutColorG, aOutColorB);
nAttr.setStorable(false);
nAttr.setHidden(false);
nAttr.setReadable(true);
nAttr.setWritable(false);
addAttribute(color1R);
addAttribute(color1G);
addAttribute(color1B);
addAttribute(color1);
addAttribute(aNormalCameraX);
addAttribute(aNormalCameraY);
addAttribute(aNormalCameraZ);
addAttribute(aNormalCamera);
addAttribute(aOutColorR);
addAttribute(aOutColorG);
addAttribute(aOutColorB);
addAttribute(aOutColor);
attributeAffects(color1R, color1);
attributeAffects(color1G, color1);
attributeAffects(color1B, color1);
attributeAffects(color1, aOutColor);
attributeAffects(aNormalCameraX, aOutColor);
attributeAffects(aNormalCameraY, aOutColor);
attributeAffects(aNormalCameraZ, aOutColor);
attributeAffects(aNormalCamera, aOutColor);
return MS::kSuccess;
}
MTypeId sample1::id( 0x70001 );
MStatus sample1::compute( const MPlug& plug, MDataBlock& block )
{
int k = 0;
float gamma, scalar;
k |= (plug == aOutColor);
k |= (plug == aOutColorR);
k |= (plug == aOutColorG);
k |= (plug == aOutColorB);
if(!k)
{
return MS::kUnknownParameter;
}
MFloatVector resultColor(0.0, 0.0, 0.0);
MFloatVector& col = block.inputValue( color1 ).asFloatVector();
MFloatVector& surfaceNormal = block.inputValue( aNormalCamera ).asFloatVector();
if(surfaceNormal[0] < 0)
{
resultColor[0] = 0.0;
resultColor[1] = 0.0;
resultColor[2] = 0.0;
}
else
{
resultColor[0] = col[0];
resultColor[1] = col[1];
resultColor[2] = col[2];
}
MDataHandle outColorHandle = block.outputValue( aOutColor );
MFloatVector& outColor = outColorHandle.asFloatVector();
outColor = resultColor;
outColorHandle.setClean();
return MS::kSuccess;
}
MStatus initializePlugin( MObject obj )
{
const MString UserClassify( "utility/general" );
MFnPlugin plugin( obj, "Alias|Wavefront", "1.0", "Any");
plugin.registerNode( "sample1", sample1::id,
sample1::creator,
sample1::initialize,
MPxNode::kDependNode, &UserClassify);
return MS::kSuccess;
}
MStatus uninitializePlugin( MObject obj)
{
MFnPlugin plugin( obj );
plugin.deregisterNode( sample1::id );
return MS::kSuccess;
}