Custom ICENodes are regular ICENodes implemented as self-installable plug-ins with the C++ API. Like built-in ICENodes, a custom ICENode reads in data, processes it and then writes out the data.
An ICENode can be used along with other custom or built-in ICENodes to create compound nodes. Input and output data comes from the other ICENodes in a graph: the data flows along each ICENode encapsulated in single or 2D array. The type of data encapsulation is specified when a new ICENode is registered in Softimage. For example, an ICENode can be defined with an input connection of float and an output connection of float vectors.
XSIPLUGINCALLBACK CStatus XSILoadPlugin( PluginRegistrar& in_reg )
{
in_reg.PutAuthor(L"SoftimageUser");
in_reg.PutName(L"MySimpleICENode Plugin");
enum IDs
{
ID_InPort = 0,
ID_OutPort = 1,
ID_InGroup = 100,
ID_TMAP = 400,
ID_SMAP,
ID_CMAP,
ID_UNDEF = UINT_MAX
};
ICENodeDef nodeOpDef;
nodeOpDef = Application().GetFactory().CreateICENodeDef(L"MySimpleICENode");
// Add input port and group.
CStatus st;
st = nodeOpDef.AddPortGroup( ID_InGroup );
st.AssertSucceeded( ) ;
st = nodeOpDef.AddInputPort(
ID_InPort, // port index (defined in IDs enum)
ID_InGroup, // index of group to add port to
siICENodePortDataFloat, // data type
siICENodePortStructureSingle, // structure type
siICENodeEvaluationContextAny, // context type
L"InFloats", // port name
L"InFloats "// port scripting name
);
st.AssertSucceeded( ) ;
// Add output port.
st = nodeOpDef.AddOutputPort(
ID_OutPort, // port index (defined in IDs enum)
siICENodePortDataFloat, // data type
siICENodePortStructureSingle, // structure type
siICENodeEvaluationContextAny, // context type
L"Out2DVectors", // port name
L"Out2DVectors "// port scripting name
);
st.AssertSucceeded( ) ;
// Register a new ICENode definition
PluginItem nodeItem = in_reg.RegisterICENode( nodeOpDef );
// Set the new ICENode category
nodeItem.PutCategories(L"ICENode Category Sample");
return CStatus::OK;
}The Evaluate callback is typically called in a multi-threaded context managed by Softimage, so you don't have to worry about thread locking when reading or writing the data passed to a custom ICENode. Evaluation threads are created by Softimage and assigned on a per-processor basis, so there will be one thread created per processor on your machine. The data is process in several passes where each pass is assigned to a thread.
You can also tell Softimage to process your custom ICENode in a single-thread or in multi-phase processing. Single-threading processing is often required when you need to access all the input data in one single pass. For instance you could create a node to compute the bounding-box of a geometry which requires access to the entire set of point positions in one pass. See Single-Thread Custom ICENode for more information. Multi-phase processing gives more control on the ports to evaluate and the context data types to process. See Multi-Phase Custom ICENode for more information.