Softimage SDK Programmer's Guide > Customizing with the SDK > Custom ICENodes >

# What is a Custom ICENode?

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.