ICENode 登録および Evaluate コールバック コードは、デフォルトで生成されます。必要に応じて他のコードも作成できるように、複数のチェック ボックス オプションが用意されています。
各関数の開始部分に場所をプリントするための呼び出しを挿入します。 たとえば以下のようになります。
Application().LogMessage(L"MyCustomICENode_EndEvaluate called",siVerboseMsg);
// My Custom ICENode Plugin
// Initial code generated by Softimage SDK Wizard
// Executed Fri May 15 21:24:29 EDT 2009 by greena
//
//
// Tip: You need to compile the generated code before you can load the plug-in.
// After you compile the plug-in, you can load it by clicking Update All in the Plugin Manager.
#include <xsi_application.h>
#include <xsi_context.h>
#include <xsi_pluginregistrar.h>
#include <xsi_status.h>
#include <xsi_icenodecontext.h>
#include <xsi_icenodedef.h>
#include <xsi_command.h>
#include <xsi_factory.h>
#include <xsi_longarray.h>
#include <xsi_doublearray.h>
#include <xsi_math.h>
#include <xsi_vector2f.h>
#include <xsi_vector3f.h>
#include <xsi_vector4f.h>
#include <xsi_matrix3f.h>
#include <xsi_matrix4f.h>
#include <xsi_rotationf.h>
#include <xsi_quaternionf.h>
#include <xsi_color4f.h>
#include <xsi_shape.h>
#include <xsi_icegeometry.h>
#include <xsi_iceportstate.h>
#include <xsi_indexset.h>
#include <xsi_dataarray.h>
#include <xsi_dataarray2D.h>
// Defines port, group and map identifiers used for registering the ICENode
enum IDs
{
ID_IN_InPort = 0,
ID_IN_InPort2 = 1,
ID_G_100 = 100,
ID_OUT_OutPort = 200,
ID_TYPE_CNS = 400,
ID_STRUCT_CNS,
ID_CTXT_CNS,
ID_UNDEF = ULONG_MAX
};
XSI::CStatus RegisterMyCustomICENode( XSI::PluginRegistrar& in_reg );
using namespace XSI;
XSIPLUGINCALLBACK CStatus XSILoadPlugin( PluginRegistrar& in_reg )
{
in_reg.PutAuthor(L"greena");
in_reg.PutName(L"My Custom ICENode Plugin");
in_reg.PutVersion(1,0);
RegisterMyCustomICENode( in_reg );
//RegistrationInsertionPoint - do not remove this line
return CStatus::OK;
}
XSIPLUGINCALLBACK CStatus XSIUnloadPlugin( const PluginRegistrar& in_reg )
{
CString strPluginName;
strPluginName = in_reg.GetName();
Application().LogMessage(strPluginName + L" has been unloaded.",siVerboseMsg);
return CStatus::OK;
}
CStatus RegisterMyCustomICENode( PluginRegistrar& in_reg )
{
ICENodeDef nodeDef;
nodeDef = Application().GetFactory().CreateICENodeDef(L"MyCustomICENode",L"My Custom ICENode");
CStatus st;
st = nodeDef.PutColor(154,188,102);
st.AssertSucceeded( ) ;
// Add custom types definition.
st = nodeDef.DefineCustomType(L"MyCustomDataType",L"MyCustomDataType",L"MyCustomDataType",255,8,255);
st.AssertSucceeded( ) ;
// Add input ports and groups.
st = nodeDef.AddPortGroup(ID_G_100);
st.AssertSucceeded( ) ;
st = nodeDef.AddInputPort(ID_IN_InPort,ID_G_100,siICENodeDataFloat,siICENodeStructureSingle,siICENodeContextSingleton,L"InPort",L"InPort",1.0f,ID_UNDEF,ID_UNDEF,ID_CTXT_CNS);
st.AssertSucceeded( ) ;
st = nodeDef.AddInputPort(ID_IN_InPort2,undefined,siICENodeDataFloat,siICENodeStructureArray,siICENodeContextAny,L"InPort2",L"InPort2",1.0f,ID_UNDEF,ID_UNDEF,ID_CTXT_CNS);
st.AssertSucceeded( ) ;
// Add output ports.
CStringArray OutPortCustomType(1);
OutPortCustomType[0] = L"MyCustomDataType";
st = nodeDef.AddOutputPort(ID_OUT_OutPort,siICENodeDataCustomType,OutPortCustomType,siICENodeStructureSingle,siICENodeContextAny,L"OutPort",L"OutPort",ID_UNDEF,ID_UNDEF,ID_CTXT_CNS);
st.AssertSucceeded( ) ;
PluginItem nodeItem = in_reg.RegisterICENode(nodeDef);
nodeItem.PutCategories(L"Custom ICENode");
return CStatus::OK;
}
XSIPLUGINCALLBACK CStatus MyCustomICENode_Evaluate( ICENodeContext& in_ctxt )
{
// The current output port being evaluated...
ULONG out_portID = in_ctxt.GetEvaluatedOutputPortID( );
switch( out_portID )
{
case ID_OUT_OutPort :
{
// Get the output port array ...
CDataArrayCustomType outData( in_ctxt );
// Get the input data buffers for each port
CDataArrayFloat InPortData( in_ctxt, ID_IN_InPort );
CDataArray2DFloat InPort2Data( in_ctxt, ID_IN_InPort2 );
// We need a CIndexSet to iterate over the data
CIndexSet indexSet( in_ctxt );
for(CIndexSet::Iterator it = indexSet.Begin(); it.HasNext(); it.Next())
{
// Add code to set output port...
Application().LogMessage( CString( InPortData[it] ) );
CDataArray2DFloat::Accessor InPort2SubArray = InPort2Data[it];
for (ULONG i=0; i<InPort2SubArray.GetCount( ); i++)
{
Application().LogMessage( CString( InPort2SubArray[i] ) );
}
}
}
break;
// Other output ports...
};
return CStatus::OK;
}