Softimage はレガシー C++ コマンドも引き続きサポートしていますが、自己インストール カスタム コマンドに関連する機能が豊富になり、ワークフローが改良されたため、新しいメカニズムに移行することをお勧めします。 コードの実際の実装に関しては、それほど変更されていません。
カスタム コマンドを Softimage に移植する 1 つの方法として、SDK コマンド ウィザードを使用して新しいコマンドを作成し(詳細については、「カスタム コマンド ウィザード」を参照)、実際の実装をコピーして新しい dll に貼り付ける方法があります。 これは手動でも簡単にできます。 この例では、Foo というコマンドを使用します。
レガシー C++ コマンドを自己インストール プラグインに移植するには
Script Editor で次のコードを実行し、Softimage で古いバージョンのコマンドが削除されたか確認します。
// JScript Application.RemoveCommand( "Foo" );
Windows では、関数の書き出しに .def ファイルを使用する代わりに、関数定義に XSIPLUGINCALLBACK マクロを追加します。
XSIPLUGINCALLBACK CStatus XSILoadPlugin( PluginRegistrar& in_reg )
.cpp ファイルに類似した XSILoadPlugin コールバック関数を追加します。
#ifdef unix
extern "C"
#endif
XSIPLUGINCALLBACK CStatus XSILoadPlugin( PluginRegistrar& in_reg )
{
in_reg.PutAuthor(L"My Name");
in_reg.PutName(L"foo Plug-in");
in_reg.PutVersion(1,0);
in_reg.RegisterCommand(L"Foo",L"Foo");
return CStatus::OK;
}
コールバックと自己インストール プラグインの詳細については、「自己インストール プラグイン」を参照してください。
Foo_Init という別のコールバック関数を追加します。 この関数は、次のように古いインストール スクリプトを置換します。
'OBSOLETE:
SUB InstallFooDemo( dllDir, ext )
Module="Foo"
filename = dllDir & "/" & Module & ext
Application.RemoveCommand "Foo"
SET oCmd = Application.CreateCommand("Foo",siNoCategory)
oCmd.ScriptingName = "Foo"
oCmd.FileName = filename
oCmd.Language = "CPP"
oCmd.arguments.add "Arg0", siArgumentInput
oCmd.arguments.addObjectArgument "Arg1"
' Add the new command
Application.AddCommand oCmd
END SUB
新しい Foo_Init 関数は、引数とコマンドに対するフラグを定義する場所に置きます。 コマンドを定義する C++ API は、インストール スクリプトで使用されるオブジェクト モデル API に似ています。このためコードは簡単に移植できます。 グラフィック シーケンサ プラグインに実装する必要があるコールバックの一覧についての詳細は、「Argument」クラスおよび 「Command」クラスを参照してください。
#ifdef unix
extern "C"
#endif
XSIPLUGINCALLBACK CStatus Foo_Init( CRef& in_ctxt )
{
Context ctxt( in_ctxt );
Command oCmd;
oCmd = ctxt.GetSource();
oCmd.PutDescription(L"Foo does important stuff");
oCmd.EnableReturnValue(true);
ArgumentArray oArgs;
oArgs = oCmd.GetArguments();
oArgs.Add(L"Arg0");
oArgs.AddObjectArgument(L"Arg1");
return CStatus::OK;
}
ここで古い XSIOnCommandCPP コールバックを新しい Foo_Execute コールバック関数に置換する必要があります。 古いコードを次に示します。
#ifdef unix
extern "C"
#endif
XSI::CStatus XSIOnCommandCPP
(
const XSI::CString& in_strCmdName, // name of the command
XSI::CValueArray& args, // array of arguments
XSI::CValue& io_retVal // return value
)
{
...
}
#ifdef unix
extern "C"
#endif
XSIPLUGINCALLBACK CStatus foo_Execute( CRef& in_ctxt )
{
Context ctxt( in_ctxt );
CValueArray args = ctxt.GetAttribute(L"Arguments");
...
}
CValue returnValue ; //...set a value in returnValue ; ctxt.PutAttribute( L"ReturnValue", returnValue );
コンパイル時 いくつかの新しい C++ API の include ステートメントを追加する必要があります。 たとえば以下のようになります。
#include <xsi_context.h> #include <xsi_pluginregistrar.h> #include <xsi_argument.h> #include <xsi_command.h>
dll が正しいパスにあるかどうかを確認してください(たとえば、ワークグループの「¥Application¥Plugins」ディレクトリ)。 プラグイン マネージャを使って Softimage を再起動せずに dll をロード/リロードできます(詳細については、「プラグイン マネージャを使って作業する」を参照)。