This summarizes the ICENode processing topic with a custom version of the built-in Vector3ToScalar ICENode.
#include <xsi_application.h> #include <xsi_context.h> #include <xsi_pluginregistrar.h> #include <xsi_status.h> #include <xsi_mdnodecontext.h> #include <xsi_mdnodedef.h> #include <xsi_factory.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_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_v3 = 0, ID_G_100 = 100, ID_OUT_x = 200, ID_OUT_y = 201, ID_OUT_z = 202, ID_TMAP = 400, ID_SMAP, ID_CMAP, ID_UNDEF = ULONG_MAX }; XSI::CStatus RegisterCustomVector3ToScalar( XSI::PluginRegistrar& in_reg ); using namespace XSI; XSIPLUGINCALLBACK CStatus XSILoadPlugin( PluginRegistrar& in_reg ) { in_reg.PutAuthor(L"Softimage"); in_reg.PutName(L"CustomVector3ToScalar Plugin"); in_reg.PutEmail(L""); in_reg.PutURL(L""); in_reg.PutVersion(1,0); RegisterCustomVector3ToScalar( in_reg ); //RegistrationInsertionPoint - do not remove this line return CStatus::OK; } CStatus RegisterCustomVector3ToScalar( PluginRegistrar& in_reg ) { ICENodeDef nodeOpDef; nodeOpDef = Application().GetFactory().CreateICENodeDef(L"CustomVector3ToScalar"); CStatus st; // Add input ports and groups. st = nodeOpDef.AddPortGroup(ID_G_100); st.AssertSucceeded( ) ; st = nodeOpDef.AddInputPort( ID_IN_v3, // port index ID_G_100, // group index siICENodeDataVector3, // data type siICENodePortStructureSingle, // structure type siICENodeEvaluationContextComponent0D, // context type L"v3", // port name L"v3", // port scripting name MATH::CVector3f(1.0,1.0,1.0), // default value ID_UNDEF, // data type constraint ID_SMAP, // structure type constraint ID_CMAP // context type contraint ); st.AssertSucceeded( ) ; // Add output ports st = nodeOpDef.AddOutputPort( ID_OUT_x, // port index siICENodePortDataFloat, // data type siICENodePortStructureSingle, // structure type siICENodeEvaluationContextComponent0D, // context type L"x", // port name L"x", // port scripting name ID_UNDEF, // data type constraint ID_SMAP, // structure type constraint ID_CMAP // context type contraint ); st.AssertSucceeded( ) ; st = nodeOpDef.AddOutputPort( ID_OUT_y, // port index siICENodePortDataFloat, // data type siICENodePortStructureSingle, // structure type siICENodeEvaluationContextComponent0D, // context type L"y", // port name L"y", // port scripting name ID_UNDEF, // data type constraint ID_SMAP, // structure type constraint ID_CMAP // context type contraint ); st.AssertSucceeded( ) ; st = nodeOpDef.AddOutputPort( ID_OUT_z, // port index siICENodePortDataFloat, // data type siICENodePortStructureSingle, // structure type siICENodeEvaluationContextComponent0D, // context type L"z", // port name L"z", // port scripting name ID_UNDEF, // data type constraint ID_SMAP, // structure type constraint ID_CMAP // context type contraint ); st.AssertSucceeded( ) ; PluginItem nodeItem = in_reg.RegisterICENode(nodeOpDef); nodeItem.PutCategories(L"Custom ICENode Sample"); return CStatus::OK; } XSIPLUGINCALLBACK CStatus CustomVector3ToScalar_Evaluate( ICENodeContext& in_ctxt ) { // Get the output data array CDataArrayFloat outData( in_ctxt ); // .. and the input array CDataArrayVector3f inputData( in_ctxt, ID_IN_v3 ); // And the index set CIndexSet indexSet( in_ctxt ); // Set the output data ULONG outport_uniqid = in_ctxt.GetEvaluatedOutputPortID( ); switch( outport_uniqid ) { case ID_OUT_x: { for(CIndexSet::Iterator it = indexSet.Begin(); it.HasNext(); it.Next()) { outData[it] = inputData[it].GetX(); } } break; case ID_OUT_y: { for(CIndexSet::Iterator it = indexSet.Begin(); it.HasNext(); it.Next()) { outData[it] = inputData[it].GetY(); } } break; case ID_OUT_z: { for(CIndexSet::Iterator it = indexSet.Begin(); it.HasNext(); it.Next()) { outData[it] = inputData[it].GetZ(); } } break; }; return CStatus::OK; }