この例では、2 つの入力ポートと 2 つの出力ポートを使用して、ICENode を定義および登録する方法を示します。
#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;
}