Code

 
 
 

ICENode 登録および Evaluate コールバック コードは、デフォルトで生成されます。必要に応じて他のコードも作成できるように、複数のチェック ボックス オプションが用意されています。

BeginEvaluate コールバック

オプションの BeginEvaluate コールバックを対象に、スケルトン コードを生成します。

EndEvaluateコールバック

オプションの EndEvaluate コールバックを対象に、スケルトン コードを生成します。

Init コールバック

オプションの Init コールバックを対象に、スケルトン コードを生成します。

Term コールバック

オプションの Term コールバックを対象に、スケルトン コードを生成します。

サンプル コードの追加

各関数の開始部分にコードを追加します。 ブロックのコーディング方法を説明する便利なコメントが含まれています。

デバッグ トレースの追加

各関数の開始部分に場所をプリントするための呼び出しを挿入します。 たとえば以下のようになります。

Application().LogMessage(L"MyCustomICENode_EndEvaluate called",siVerboseMsg);

[コードの生成]ボタン

ウィザードによって、以下のようなコード断片が生成されます。

// My Custom ICENode Plugin
// Initial code generated by Softimage SDK Wizard
// Executed Fri May 15 21:24:29 EDT 2009 by greena
// 
// 
// Tip: You need to compile the generated code before you can load the plug-in.
// After you compile the plug-in, you can load it by clicking Update All in the Plugin Manager.
#include <xsi_application.h>
#include <xsi_context.h>
#include <xsi_pluginregistrar.h>
#include <xsi_status.h>

#include <xsi_icenodecontext.h>
#include <xsi_icenodedef.h>
#include <xsi_command.h>
#include <xsi_factory.h>
#include <xsi_longarray.h>
#include <xsi_doublearray.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_icegeometry.h>
#include <xsi_iceportstate.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_InPort = 0,
	ID_IN_InPort2 = 1,
	ID_G_100 = 100,
	ID_OUT_OutPort = 200,
	ID_TYPE_CNS = 400,
	ID_STRUCT_CNS,
	ID_CTXT_CNS,
	ID_UNDEF = ULONG_MAX
};

XSI::CStatus RegisterMyCustomICENode( XSI::PluginRegistrar& in_reg );
using namespace XSI; 

XSIPLUGINCALLBACK CStatus XSILoadPlugin( PluginRegistrar& in_reg )
{
	in_reg.PutAuthor(L"greena");
	in_reg.PutName(L"My Custom ICENode Plugin");
	in_reg.PutVersion(1,0);
	
	RegisterMyCustomICENode( in_reg );
	
	//RegistrationInsertionPoint - do not remove this line
	
	return CStatus::OK;
}

XSIPLUGINCALLBACK CStatus XSIUnloadPlugin( const PluginRegistrar& in_reg )
{
	CString strPluginName;
	strPluginName = in_reg.GetName();
	Application().LogMessage(strPluginName + L" has been unloaded.",siVerboseMsg);
	return CStatus::OK;
}

CStatus RegisterMyCustomICENode( PluginRegistrar& in_reg )
{
	ICENodeDef nodeDef;
	nodeDef = Application().GetFactory().CreateICENodeDef(L"MyCustomICENode",L"My Custom ICENode");
	CStatus st;
	
	st = nodeDef.PutColor(154,188,102);
	st.AssertSucceeded( ) ;
	
	// Add custom types definition.
	st = nodeDef.DefineCustomType(L"MyCustomDataType",L"MyCustomDataType",L"MyCustomDataType",255,8,255);
	st.AssertSucceeded( ) ;
	
	// Add input ports and groups.
	st = nodeDef.AddPortGroup(ID_G_100);
	st.AssertSucceeded( ) ;
	
	st = nodeDef.AddInputPort(ID_IN_InPort,ID_G_100,siICENodeDataFloat,siICENodeStructureSingle,siICENodeContextSingleton,L"InPort",L"InPort",1.0f,ID_UNDEF,ID_UNDEF,ID_CTXT_CNS);
	st.AssertSucceeded( ) ;
	
	st = nodeDef.AddInputPort(ID_IN_InPort2,undefined,siICENodeDataFloat,siICENodeStructureArray,siICENodeContextAny,L"InPort2",L"InPort2",1.0f,ID_UNDEF,ID_UNDEF,ID_CTXT_CNS);
	st.AssertSucceeded( ) ;
	
	// Add output ports.
	CStringArray OutPortCustomType(1);
	OutPortCustomType[0] = L"MyCustomDataType";
	
	st = nodeDef.AddOutputPort(ID_OUT_OutPort,siICENodeDataCustomType,OutPortCustomType,siICENodeStructureSingle,siICENodeContextAny,L"OutPort",L"OutPort",ID_UNDEF,ID_UNDEF,ID_CTXT_CNS);
	st.AssertSucceeded( ) ;
	
	PluginItem nodeItem = in_reg.RegisterICENode(nodeDef);
	nodeItem.PutCategories(L"Custom ICENode");
	
	return CStatus::OK;
}

XSIPLUGINCALLBACK CStatus MyCustomICENode_Evaluate( ICENodeContext& in_ctxt )
{
	// The current output port being evaluated...
	ULONG out_portID = in_ctxt.GetEvaluatedOutputPortID( );
 
	switch( out_portID )
	{		
		case ID_OUT_OutPort :
		{
			// Get the output port array ...			
			CDataArrayCustomType outData( in_ctxt );
			
 			// Get the input data buffers for each port
			CDataArrayFloat InPortData( in_ctxt, ID_IN_InPort );
			CDataArray2DFloat InPort2Data( in_ctxt, ID_IN_InPort2 );
			
 			// We need a CIndexSet to iterate over the data 		
			CIndexSet indexSet( in_ctxt );
			for(CIndexSet::Iterator it = indexSet.Begin(); it.HasNext(); it.Next())
			{
				// Add code to set output port...
				Application().LogMessage( CString( InPortData[it] ) );
				CDataArray2DFloat::Accessor InPort2SubArray = InPort2Data[it];
				for (ULONG i=0; i<InPort2SubArray.GetCount( ); i++)
				{
					Application().LogMessage( CString( InPort2SubArray[i] ) );
				}
				
				
			}
		}
		break;
		
		// Other output ports...
	};
	
	return CStatus::OK;
}