ビューポート 1 から 2 に選択を移行する

基礎知識

プラグインでの選択の移行機能は、使用するインタフェースと使用する Maya のバージョンにより、描画の移行とは別のタスクとみなされることがあります。

Maya 2016 から、ネイティブのビューポート 2 選択が使用可能になります。

2016 のリリースまでは、選択は既存のビューポート 1 のインタフェース使用した実行のみが可能でした。ビューポート 1 のインタフェースの描画は、ビューポート 2 の描画コードが別の描画 API (DirectX11 など)を使用している場合でも、OpenGL を使用する必要があります。

ビューポート 1 のインタフェースは、選択のための OpenGL ソフトウェア選択バッファに依存します。ソフトウェア選択バッファは、コア プロファイルのコンテキストを使用していときは使用できません。従来の OpenGL プロファイルが使用可能な場合、この機能は使用できる可能性があります。

選択した OpenGL プロファイルは、Windows および Linux プラットフォームで使用できます。Mac OS X の特定の設定では、コア プロファイルのコンテキストのみがインスタンス化されます。

インタフェース

以下に、さまざまなオブジェクトおよびコンポーネントに対するビューポート 2.0 の選択インタフェースの概要を示します。これらのインタフェースの詳細については、以下のセクションを参照してください。

オブジェクト/コンポーネント 描画のインタフェース 選択のインタフェース
マニピュレータ:

MPxManipContainer MPxManipulatorNode

MUIDrawManager

MUIDrawManager を使用した描画はヒット テストに使用されます。

MUIDrawManager::beginDrawable(unsigned int name, bool nameIsPickable)

このインタフェースの入力パラメータである bool nameIsPickable は、描画可能項目を選択可能としてマークするために使用できます。

ロケータ:

MPxLocatorNode

MUIDrawManager

MUIDrawManager を使用した描画はヒット テストに使用されます。

シェイプ:

MPxSurfaceShape

MPxComponentShape

MPxLocatorNode

MPxGeometryOverride

MPxSubSceneOverride

MPxSurfaceShape::getShapeSelectionMask() により、ジオメトリのタイプ、選択項目の優先順位、およびフィルタリングを指定します。

MPxSubSceneOverride::getSelectionPath() により、複雑なプラグインで、レンダー項目から DAG パスを取得します。

コンポーネント

MPxGeometryOverride

MPxSubSceneOverride

注:

ツール コンテキスト(MPxContext)を選択することはできません。したがって、このリストには含まれていません。

マニピュレータ

マニピュレータは、シーン エレメントとして存在していないため、ビューポート 1 とビューポート 2 の両方に対するオブジェクト レベルでは選択できません。

MPxManipulatorNode インスタンスに使用可能な選択レベルは、「サブ オブジェクト」レベルで定義されます。「ハンドル レベル」とも呼ばれます。

既存のマニピュレータで構成されているマニピュレータ コンテナ(MPxManipContainer)は、このサポートがマニピュレータ レベルで定義されるため、選択をサポートするためのコードを追加する必要はありません。これは、ビューポート 1 およびビューポート 2 の両方に該当します。必要に応じてコンテナの描画(すなわち選択)を追加することができます。

使用する描画インタフェース ビューポート 2 選択が無効 ビューポート 2 選択が有効 SDK サンプル:
MUIDrawManager (カスタム セレクション ハンドルなし) ヒット テストにビューポート 1 の描画ルーチンを使用します。 描画中に MUIDrawManager を使用して行うすべての描画は単一のヒット テストに使用されます。 footprintManip (MPxManipulatorNode) swissArmyManip (MPxManipContainer)
MUIDrawManager (カスタム セレクション ハンドルなし) ビューポート 1 のインタフェースは、実際のセレクション ハンドルとして OpenGL 選択識別子を使用し、ソフトウェア選択バッファに明示的に依存しています(すべての OpenGL コンテキスト プロファイルには存在しない可能性があります)。使用できるインタフェース: colorAndName() shouldDrawHandleAsSelected() glFirstHandle() glActiveName() 特定の描画可能項目は、MUIDrawManager::beginDrawable() メソッドである MUIDrawManager::beginDrawable(unsigned int name, bool nameIsPickable) の引数を介して「ハンドル」識別子を使用することにより、選択可能としてマークを付けることができます。nameIsPickable が「true」に設定されている場合は、後続の描画コードはヒット テストに使用されます。これは、3D と 2D のマニピュレータの両方に適用されます。 lineManip (MPxManipulatorNode)

ロケータ

ロケータ(MPxLocatorNode)は、オブジェクト レベルでのみ選択可能になります。

ごく単純なジオメトリを描画するロケータの場合、またはシーン内で特定のロケータが発生する数が非常に少ない場合、描画と選択に対して MUIDrawManager インタフェースを使用することが可能です。

「クリック」または最も近いポイント単一選択の場合、使用するインタフェース ロジックでの変更はありません。メンバー MPxLocatorNode::useClosestPointForSelection() および MPxLocatorNode::closestPoint() は、ビューポート 1 選択に実装されます。ビューポート 2選択の場合、最も近いポイントがジオメトリ データから自動的に計算されるため、API は使用されません。

さらに複雑なもの、または、パフォーマンスの良さを必要とするものは「シェイプ」のカテゴリ(次のセクションで説明)に入ります。これらは MPxGeometryOverride または MPxSubSceneOverride を使用して実装されます。

使用する描画インタフェース ビューポート 2 選択が無効 ビューポート 2 選択が有効
MUIDrawManager MPxLocatorNode::boundingBox() はヒット テストに使用されます。 MUIDrawManager を使用したすべての描画はヒット テストに使用されます。 2016 バージョンの footPrintNode
MPxDrawOverride::prepareForDraw() MPxLocatorNode::boundingBox() はヒット テストに使用されます。ヒットの位置は、ロケータの原点の位置です。精度を上げるには、MPxLocatorNode::closestPoint() を実装します(上記参照)。

(注: 実装された場合でも、MPxDrawOverride::prepareForDraw() は使用されません。)

未処理の描画コードはサポートされないため、MPxDrawOverride の使用はお勧めしません。 2015 以前のバージョンの footPrintNode、または 2016 バージョンの rawFootPrintNode

シェイプ

MPxSurfaceShape および MPxComponentShape、(またはさらに複雑な描画か永続的な描画が必要な MPxLocatorNode)などの複雑なオブジェクト タイプでは、レンダー項目(MRenderItem)ベースのインタフェースである、MPxGeometryOverride または MPxSubSceneOverride を使用する必要があります。

複雑なオブジェクトの場合、ビューポート 2 選択が引き続き機能しても MUIDrawManager の使用はお勧めしません

ビューポート 2 選択が必要な場合での MPxDrawOverride の使用は、未処理の描画コードをサポートしないため、お勧めしません。

MPxGeometryOverride

使用する描画インタフェース ビューポート 2 選択が無効 ビューポート 2 選択が有効
MPxGeometryOverride (オブジェクト レベル) ビューポート 1 選択のインタフェースを使用 選択はレンダー項目ごとに実行されます。シェイプの場合、MPxSurfaceShape::getShapeSelectionMask() は、ジオメトリのタイプ、選択の優先順位とフィルタ処理を指定するためにオーバーライドされます。 footPrintNode_GeometryOverride: ロケータを使った使用例 apiMeshShape: サーフェス シェイプを使った使用例 gpuCacheShapeNode: getShapeSelectionMask() を使用した例
MPxGeometryOverride (コンポーネント レベル) ビューポート 1 選択コードを使用 「コンポーネントのビューポート 2 選択の処理」セクションを参照してください。 apiMeshShape

MPxSubSceneOverride

使用する描画インタフェース ビューポート 2 選択が無効 ビューポート 2 選択が有効
MPxSubSceneOverride ビューポート 1 選択のインタフェースまたはカスタム セレクションを使用します。 複雑なプラグインの場合、getSelectionPath() を実装して、レンダー項目から適切な dag パス(MDagPath)を戻す必要がある場合があります。 gpuCache: gpuCacheSubSceneOverride.cpp
MPxSubSceneOverride (コンポーネント レベル) ビューポート 1 選択のインタフェースまたはカスタム セレクションを使用します。 「コンポーネントのビューポート 2 選択の処理」セクションを参照してください。  

コンポーネントのビューポート 2 選択の処理

ビューポート 2 選択が Maya 2016 で有効になると、MPxSurfaceShapeUI の選択インタフェースは呼び出されなくなります。

以下のビューポート 1 での機能:

は、以下のビューポート 2 インタフェースによって処理されます。

プラグイン設定

プラグインは、指定されたレンダー項目名に MPxComponentConverter の独自の実装を登録する必要があります。複数のレンダー項目名に対して同じコンバータを登録して、異なるレンダー項目間で再利用できるようにすることができます。新しいコンバータは、処理するために各レンダー項目に対して作成されます。

通常の描画の更新

選択用にマーク付けされたレンダー項目は、レンダリング プリファレンスでの変更(ハイライト リストの変更など)のために描画更新コードが呼び出されるときに追加されます。選択の開始によって、選択領域内にないシーン エレメントのレンダー項目がダーティになることはありません。そのため、プラグインでは、MPxGeometryOverride::updateDG() が選択が行われるたびにすべてのノードに対して呼び出されるとは限りません。

ここでは、選択が処理される手順について説明します。

選択描画ステージ:

  • MPxGeometryOverride::updateSelectionGranularity() は、ジオメトリ ノードがコンポーネント選択に参加するかどうかを判断するために呼び出されます。
  • カメラ セレクション モードの場合:
    • 選択可能なすべてのレンダー項目は、コンポーネントごとに異なるカラーを使用する、特別なシェーダで描画されます。
    • 描画バッファはその後スキャンされて、選択領域内にある各カラーは MIntersection に変換されます。
  • 通常のセレクション モードの場合:
    • 選択可能なすべてのレンダー項目の頂点の位置は、選択領域で MIntersection の計算に使用されます。

選択解釈ステージ :

  • ヒットのリストは、レンダー項目(またはクリック選択の近接)によってソートされます。
  • レンダー項目のすべてのヒットが処理され、MPxComponentConverter::addIntersection() は、ヒット情報を MFnComponent に変換するために呼び出されます。
  • すべてのヒットがレンダー項目に対して処理されるとき、またはもっとも近いヒットが「クリック」選択に対して処理されるときに、MPxComponentConverter::component() および MPxComponentConverter::selectionMask() は最終のコンポーネント情報を収集するために呼び出されて、MPxGeometryOverride::refineSelectionPath() は、選択された項目のリストに追加される前に選択情報に最後の仕上げを追加するために呼び出されます。

例: apiMeshShape (MPxGeometryOverride、および MPxSubSceneOverride のバージョン)。

複雑なシェーダの注記

入力ジオメトリをディスプレイスするハードウェア シェーダ(たとえば、異なる場所で描画されるメッシュ、さらに詳細なものでは、テッセレーションなど)、またはシェーダのレベルで複雑なジオメトリを生成するハードウェア シェーダ(たとえば、ジオメトリ ステージを使用して、ポイントなどの非常に基本的なジオメトリ上のパーティクル ブロブなど複雑なジオメトリを描画するシェーダ)の場合:

カメラ ベースの選択範囲

カメラ ベースの選択モードでは、シーンは、選択可能な別個のシーン要素のそれぞれについて 1 つのプレーン カラーを使用してペイントされます。シェーダでは、次の式を使用して、選択範囲に使用するプレーン カラーを生成する必要があります。

int colorID = [HWS_PrimitiveBase];
if (![HWS_ObjectLevel])
    colorID += PrimitiveID;
if ([HWS_InstancedDraw])
    colorID += InstanceID * [HWS_PrimitiveCountPerInstance];
float4 color;
color.x = float(colorID & 0x000000FF) / 255.0;
color.y = float((colorID & 0x0000FF00) >> 8) / 255.0;
color.z = float((colorID & 0x00FF0000) >> 16) / 255.0;
color.w = 1.0;

PrimitiveID および InstanceID は、正しい GLSL/HLSL API (DX11 では SV_PrimitiveID および SV_InstanceID、GLSL では gl_PrimitiveID および gl_InstanceID)を使用して取得できるシステムの値です。角かっこは、前述のセマンティックを使用して宣言された変数を示すために使用します。

ディスプレイスされたジオメトリを選択する方法、および頂点、エッジ、フェースのコンポーネントを、ディスプレイスされた正しい位置で描画する方法のデモンストレーション用の WaterSimulation シェーダ サンプルにある、NormalView_Selection テクニックの定義を参照してください。GLSL バージョンについては、Maya インストール フォルダの presets¥GLSL¥examples フォルダにある WaterSimulation.ogsfx ファイルおよび PS_HWSelection.ogsfh ファイルを参照してください。DX11 バージョンについては、presets¥HLSL11¥examples フォルダにある WaterSimulation.fx ファイルおよび PS_HWSelection.fxh ファイルを参照してください。

注:詳細については、上記の「通常の描画の更新」セクションの「カメラ セレクション モード」を参照してください。

ジオメトリの注記

レンダー項目(MRenderItems)に使用されるジオメトリを参照または抽出すること、および描画するために未処理リソース ハンドルを使用することは可能です。これにより、ビューポート 2 の描画および、ビューポート 1 の選択を使用する場合にメモリを複製しないようにすることができます。