Softimage ではフィルタを使用して、特定タイプのオブジェクトに焦点を絞り込むことができます。 たとえば、Softimage に付属している Polygon Mesh フィルタでは、ポリゴン メッシュのみが抽出され、それ以外のものはすべて除去(除外)されます。 3D ビューでは、フィルタを使って選択ツールの動作を変更し、目的のオブジェクトのみ(たとえば、ヌル、コントロール オブジェクト、およびサーフェイス メッシュを除く、ポリゴン メッシュのみ)を容易に選択できます。 Explorer では、フィルタを使って、エレメント ツリーから不要ノードを除去できます。
カスタム フィルタは、Match コールバックを実行する自己インストールするプラグインです。 Match コールバックのジョブは、オブジェクトを除外すべきかどうかを決定することです。 たとえば、3D オブジェクト フィルタの実装例は、次のとおりです。
// [JScript]
//------------------------------------------------------------------
// Install callback for the plug-in
//------------------------------------------------------------------
function XSILoadPlugin( oPluginRegistrar )
{
// Give the plug-in a name
oPluginRegistrar.Name = "MyFilters";
// Register a filter named "MyFilter" for 3D objects
oPluginRegistrar.RegisterFilter( "MyFilter", siFilter3DObject );
}
//------------------------------------------------------------------
// Match callback for the filter registered under the name "MyFilter"
//------------------------------------------------------------------
function MyFilter_Match( oContext )
{
// Get the object from the Input attribute of the Context object
var o3DObject = oContext.GetAttribute( "Input" );
// Check if the object matches the filter conditions
var bMatch = isa_match( o3DObject );
// Return true to keep the object, false to filter the object out
return ( bMatch );
}
Softimage のカスタム フィルタは、メイン コマンド エリアの[Select]パネルにある選択フィルタのリストに表示されます。 ユーザがカスタム フィルタをアクティブ化し終えると、3D ビュー(またはオブジェクト ビューやスケマティック ビュー)内でユーザが選択しようとしたどのオブジェクトに対しても、Match コールバックが呼び出されます。 Match が true を返した場合は、そのオブジェクトが選択されます。
Explorer(XSI ExplorerやSDK Explorer)などのビューでは、カスタム フィルタが表示される検索ボックスに、[フィルタ]ドロップダウン リストがあります。 ユーザがフィルタを選択すると、Explorer 内のノードごとに Match が呼び出され、フィルタ条件に適合しないノードが除去されます。また、カスタム フィルタは Subset をコールバックしてオブジェクトをまとめて処理することができるため、Softimage ではコールバックを 1 つ起動するだけでフィルタを適用できます。
カスタム フィルタをコマンドおよびオブジェクト モデルと併用できます。たとえば、次のように SIFilter コマンドを使ったカスタム フィルタで、選択されたオブジェクトをフィルタリングすることができます。
var cloFilteredList = SIFilter( Application.Selection, "MyFilter" );
Softimage オブジェクト モデルでは、カスタム フィルタが Filters コレクションに取り込まれます。
var oFilter = Application.Filters.Item("MyFilter");
for ( var enumerator = new Enumerator( Application.Selection ) ; !enumerator.atEnd(); enumerator.moveNext() )
{
var o3DObject = enumerator.item();
if ( oFilter.Match( o3DObject ) )
{
doSomething( o3DObject );
}
}上の例で注意すべき点は、3D オブジェクト(たとえば、X3DObject)が Context オブジェクトではなく Match メソッドに渡されることです。 3D オブジェクトを Context オブジェクトにマーシャリングする処理は、Match コールバックが要求し、Softimage で代行されます。
また、Softimage SDK のインストール フォルダにある examples フォルダのライト フィルタおよびシンプルなフィルタのサンプルを参照することもできます。