This example demonstrates how to define and register an ICENode with two input ports and two output ports:
#include <xsi_application.h> #include <xsi_mdnodecontext.h> #include <xsi_mdnodedef.h> #include <xsi_pluginregistrar.h> #include <xsi_status.h> #include <xsi_factory.h> #include <xsi_math.h> #include <xsi_vector3f.h> #include <xsi_indexset.h> #include <xsi_dataarray.h> using namespace XSI; using namespace MATH; // user defined IDs enum IDs { // groups IdGr_In, // ports IdPort_InPos = 100, IdPort_OutX, IdPort_InValue, IdPort_OutY, // maps typemapid = 200, structmapid, contextmapid, UndefinedID = ULONG_MAX }; XSIPLUGINCALLBACK CStatus XSILoadPlugin( PluginRegistrar& in_reg ) { in_reg.PutAuthor(L"Softimage"); in_reg.PutName(L"ICENode registration sample plugin"); in_reg.PutVersion(1,0); Application app ; // Creates an ICENodeDef object from the factory Factory factory = app.GetFactory(); ICENodeDef nodeOpDef = Application().GetFactory().CreateICENodeDef( in_name ); // Set the threading model to multi-threading (default) CStatus st; st = nodeOpDef.PutThreadingModel( siICENodeMultiThreading ); st.AssertSucceeded( ) ; // Create the input port st = nodeOpDef.AddPortGroup( IdGr_In ); st.AssertSucceeded( ) ; // Create the input port of type Vector3f per vertex siICENodeDataType nDataType = siICENodeDataVector3; siICENodeStructureType nStructType = siICENodePortStructureSingle; siICENodeContextType nContextType = siICENodeEvaluationContextComponent0D; // constraint maps are not used for data and structure types, set them with the default ID IDs typemapValue = UndefinedID; IDs structmapValue = UndefinedID IDs contextmapValue = contextmapid; st = nodeOpDef.AddInputPort( IdPort_InPos, // input port index IdGr_In, // index of group to add port to nDataType, // data type for port nStructType, // structure type for port nContextType, // context type for port L"vector", // port name L"vector", // port scripting name MATH::CVector3f(1.0, 1.0, 1.0), // default value typemapValue, // data type constraint structmapValue, // structure type constraint contextmapValue // context type constraint ); st.AssertSucceeded( ) ; // Create the input port of type Long with a 'wildcard' context nDataType = siICENodePortDataLong; nStructType = siICENodePortStructureSingle; nContextType = siICENodeEvaluationContextAny; st = nodeOpDef.AddInputPort( IdPort_InValue, // input port index IdGr_In, // index of group to add port to nDataType, // data type for port nStructType, // structure type for port nContextType, // context type for port L"InValue", // port name L"InValue", // port scripting name 55L, // default value typemapValue, // data type constraint structmapValue, // structure type constraint contextmapValue // context type constraint ); st.AssertSucceeded( ) ; // Create 2 float output ports nDataType = siICENodePortDataFloat; // Note: IdPort_InPos and IdPort_inValue are context constrained by the output ports, // if one of the output port context is set to siICENodeContextSingleton at // connection time, these ports will also be set to siICENodeContextSingleton // (and vice-versa) st = nodeOpDef.AddOutputPort( IdPort_OutX, // output port index nDataType, // data type for port nStructType, // structure type for port nContextType, // context type for port L"x", // port name L"x", // port scripting name typemapValue, // data type constraint structmapValue, // structure type constraint contextmapValue // context type constraint ); st.AssertSucceeded( ) ; st = nodeOpDef.AddOutputPort( IdPort_OutY, // output port index nDataType, // data type for port nStructType, // structure type for port nContextType, // context type for port L"y", // port name L"y", // port scripting name typemapValue, // data type constraint structmapValue, // structure type constraint contextmapValue // context type constraint ); st.AssertSucceeded( ) ; // Register the new ICENode and add it to the Custom ICENode category PluginItem nodeItem = in_reg.RegisterICENode(nodeOpDef); nodeItem.PutCategories(L"Custom ICENode Sample"); return CStatus::OK; }