プラグインでの選択の移行機能は、使用するインタフェースと使用する Maya のバージョンにより、描画の移行とは別のタスクとみなされることがあります。
Maya 2016 から、ネイティブのビューポート 2 選択が使用可能になります。
2016 のリリースまでは、選択は既存のビューポート 1 のインタフェース使用した実行のみが可能でした。ビューポート 1 のインタフェースの描画は、ビューポート 2 の描画コードが別の描画 API (DirectX11 など)を使用している場合でも、OpenGL を使用する必要があります。
ビューポート 1 のインタフェースは、選択のための OpenGL ソフトウェア選択バッファに依存します。ソフトウェア選択バッファは、コア プロファイルのコンテキストを使用していときは使用できません。従来の OpenGL プロファイルが使用可能な場合、この機能は使用できる可能性があります。
選択した OpenGL プロファイルは、Windows および Linux プラットフォームで使用できます。Mac OS X の特定の設定では、コア プロファイルのコンテキストのみがインスタンス化されます。
以下に、さまざまなオブジェクトおよびコンポーネントに対するビューポート 2.0 の選択インタフェースの概要を示します。これらのインタフェースの詳細については、以下のセクションを参照してください。
オブジェクト/コンポーネント | 描画のインタフェース | 選択のインタフェース |
---|---|---|
マニピュレータ: | MUIDrawManager | MUIDrawManager を使用した描画はヒット テストに使用されます。 MUIDrawManager::beginDrawable(unsigned int name, bool nameIsPickable)このインタフェースの入力パラメータである bool nameIsPickable は、描画可能項目を選択可能としてマークするために使用できます。 |
ロケータ: | MUIDrawManager | MUIDrawManager を使用した描画はヒット テストに使用されます。 |
シェイプ: | MPxSurfaceShape::getShapeSelectionMask() により、ジオメトリのタイプ、選択項目の優先順位、およびフィルタリングを指定します。 MPxSubSceneOverride::getSelectionPath() により、複雑なプラグインで、レンダー項目から DAG パスを取得します。 |
|
コンポーネント |
|
ツール コンテキスト(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 の使用は、未処理の描画コードをサポートしないため、お勧めしません。
使用する描画インタフェース | ビューポート 2 選択が無効 | ビューポート 2 選択が有効 | 例 |
---|---|---|---|
MPxGeometryOverride (オブジェクト レベル) | ビューポート 1 選択のインタフェースを使用 | 選択はレンダー項目ごとに実行されます。シェイプの場合、MPxSurfaceShape::getShapeSelectionMask() は、ジオメトリのタイプ、選択の優先順位とフィルタ処理を指定するためにオーバーライドされます。 | footPrintNode_GeometryOverride: ロケータを使った使用例 apiMeshShape: サーフェス シェイプを使った使用例 gpuCacheShapeNode: getShapeSelectionMask() を使用した例 |
MPxGeometryOverride (コンポーネント レベル) | ビューポート 1 選択コードを使用 | 「コンポーネントのビューポート 2 選択の処理」セクションを参照してください。 | apiMeshShape |
使用する描画インタフェース | ビューポート 2 選択が無効 | ビューポート 2 選択が有効 | 例 |
---|---|---|---|
MPxSubSceneOverride | ビューポート 1 選択のインタフェースまたはカスタム セレクションを使用します。 | 複雑なプラグインの場合、getSelectionPath() を実装して、レンダー項目から適切な dag パス(MDagPath)を戻す必要がある場合があります。 | gpuCache: gpuCacheSubSceneOverride.cpp |
MPxSubSceneOverride (コンポーネント レベル) | ビューポート 1 選択のインタフェースまたはカスタム セレクションを使用します。 | 「コンポーネントのビューポート 2 選択の処理」セクションを参照してください。 |
ビューポート 2 選択が(Maya 2016 で)有効になると、MPxSurfaceShapeUI の選択インタフェースは呼び出されなくなります。
は、以下のビューポート 2 インタフェースによって処理されます。
registerComponentConverter() / deregisterComponentConverter() を使用して MDrawRegistry において登録および登録解除される。
「セレクション」モード(DrawMode)によって、レンダー項目を選択に使用するかどうかを示すことができます。
セレクション マスク(MSelectionMask)を設定して選択タイプを示す機能があります。
選択用にマーク付けされたレンダー項目は、レンダリング プリファレンスでの変更(ハイライト リストの変更など)のために描画更新コードが呼び出されるときに追加されます。選択の開始によって、選択領域内にないシーン エレメントのレンダー項目がダーティになることはありません。そのため、プラグインでは、MPxGeometryOverride::updateDG() が選択が行われるたびにすべてのノードに対して呼び出されるとは限りません。
例: apiMeshShape (MPxGeometryOverride、および MPxSubSceneOverride のバージョン)。
入力ジオメトリをディスプレイスするハードウェア シェーダ(たとえば、異なる場所で描画されるメッシュ、さらに詳細なものでは、テッセレーションなど)、またはシェーダのレベルで複雑なジオメトリを生成するハードウェア シェーダ(たとえば、ジオメトリ ステージを使用して、ポイントなどの非常に基本的なジオメトリ上のパーティクル ブロブなど複雑なジオメトリを描画するシェーダ)の場合:
レンダー項目(MRenderItems)に使用されるジオメトリを参照または抽出すること、および描画するために未処理リソース ハンドルを使用することは可能です。これにより、ビューポート 2 の描画および、ビューポート 1 の選択を使用する場合にメモリを複製しないようにすることができます。
カメラ ベースの選択モードでは、シーンは、選択可能な別個のシーン要素のそれぞれについて 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 ファイルを参照してください。
MPxLocatorNode::getShapeSelectionMask()または MPxSurfaceShape::getShapeSelectionMask()をオーバーライドすると、ビューポート 2.0 で使用する目的のセレクション マスクを返すことができます。
これは、既存の内部マスクか、MSelectionMask::registerSelectionType()を使用して登録されているカスタム マスクになります。たとえば、カスタム タイプ "my_selection_type" が登録されている場合、getShapeSelectionMask()は MSelectionMask("my_selection_type")を返します。
既定では、カスタム セレクション タイプは無効です。カスタム セレクション タイプを有効にするには、次を実行します。
"selectType -byName \"my_selection_type\" 1"
ここで、"my_selection_type" はカスタム タイプです。
カスタム セレクション タイプでも、selectPriority コマンドで優先順位を設定することができます。この例では、登録時、優先順位が 2 に設定されているものとします。
// Change it to be lower in priority selectPriority -byName "my_selection_type" 1; // Change it to be higher in priority selectPriority -byName "my_selection_type" 3;
使用例では、環境の中にシーンが含まれています。ユーザは、シーン内のオブジェクトの代わりに、環境を選択できない場合もあれば、偶然できてしまう場合もあります。この現象を抑えるために、環境の選択項目の優先順位を下げることができます。
特定のタイプの選択を無効にして、選択を禁止することもできます。
"selectType -byName "my_selection_type" 0;
MPxLocatorNode およびカスタム セレクション タイプの使用例については、footPrintNode ジオメトリ オーバーライドの実装(footPrintNode_GeometryOverride Developer Kit サンプル)を参照してください。内部マスクの使用例については、apiDirectionalLightShape および apiMeshShape を参照してください。