The ICENode registration and Evaluate callback code is generated by default. Several check box options are offered to let you generate more code to suit your needs.
Adds extra code to get you started for each function. This includes helpful comments explaining how to code the blocks.
Inserts a call to print the location at the beginning of each function. For example:
Application().LogMessage(L"MyCustomICENode_EndEvaluate called",siVerboseMsg);
The wizard will generate code that looks similar to the following snippet:
// 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; }