MUIDrawManager クラスを使用すると、API ユーザは、ライン、円、円弧、アイコン、テキストなどの UI の基本要素を簡単に描画できます。
以前の API ではいわゆる直接モード描画が許可されていましたが、MUIDrawManager では保持モード描画に近い、別のタイプのインタラクションをエクスポーズします。ロジックは、「描画可能」リストに「描画可能項目」を入れるための待ち行列の項目で構成されています。
実際の保持モードの描画は、MRenderItem の使用に関連付けられています。より複雑なジオメトリまたはシェーディングが必要な場合は、MRenderItem と、追加の描画可能項目に MUIDrawManager を使用するインタフェースを使用する必要があります。
MUIDrawManager を使用するかどうかの判断は、多くの場合、簡易化と柔軟性の選択に基づきます。次の表に、MUIDrawManager 使用の長所と短所の概要を示します。
長所 | 注意点 |
---|---|
単純な UI (ここでいう単純は少量の UI の意味)、または少数のオブジェクトが UI を描画する場合に適しています。 | 描画可能項目は永続ではないため、うまくスケールしない場合がありますが、MPxSubSceneOverride を使用すると再利用できるようになります。 |
即時モードの描画に似ているため、古い描画コードのポートが簡単になります。MRenderItem 使用の複雑さを避けることができます。 | シェーディング オプションの固定セットと、単一のテクスチャ描画を提供します。指定できるジオメトリ アトリビュートは固定されます。 |
2D 描画がサポートされます。行列のトランスフォームを気にする必要はありません。 | 結合の利点を活用できません(永続ではないため)。 |
テキスト、アイコン、線分、面スタイル、深度の優先順位、2D および 3D の基本プリミティブ、任意のメッシュがサポートされます。 | ビューポートの表示モードに基づいて関与する固有の概念がありません。 |
3D ビューポートと UV テクスチャ エディタ(UV Texture Editor)のマニピュレータおよびとツール コンテキストの唯一のインタフェースを含む、すべてのメイン インタフェースに使用できます。 | (MRenderItem でできるように)ポスト エフェクトと高度な透明度オプションには参加しません。 |
1 セットのコードをサポートされるすべてのハードウェア描画 API 全体で再使用できます。 | 指定されたプロパティに基づいて描画順序が固定されます。 |
各描画可能項目では、描画項目のタイプに基づいて自動的に適切なシェーダ インスタンスとジオメトリが使用されます。たとえば、テキストには適切な「テキスト シェーダ」があります。この情報は、簡素化のためユーザーには表示されません。
マネージャが各描画可能項目をチェックし、レンダー パイプライン内でさまざまなタイミングで描画されるリストに描画可能項目を配置します。現在、リストへの配置に対するコントロールは、MUIDrawManager でエクスポーズされていません。MUIDrawManager のユーザは、描画可能項目の取得元リストによって決まる明示的なプロパティがあること、および通常、MUIDrawManager が使用されるインタフェースによってリストの配置が決まることを認識する必要があります。たとえば、マニピュレータ インタフェースを介して提供されるマネージャから待ち行列に入れられた描画可能項目は、描画可能項目が深度テストされず、深度にも書き込まれないことを意味します。
MUIDrawManager は、任意の時間または任意の場所でアクセスできるように設計されていません。したがって、インタフェースへのアクセスは、さまざまな API インタフェースの少数のメソッドに制限されています。すべてのデータおよびコンテキスト情報の管理は、マネージャによって準備され、必要に応じてコール側に渡されます。コール側に渡される可能性がある情報には、DAG パス、パス情報、ビュー情報などがあります。たとえば、ヘッドアップ ディスプレイ要素などのいくつかの描画可能項目は、ビューポートの四角形に対してスケーリングする必要がある場合があります。
MUIDrawManager はレンダラが所有し、明示的に構成することはできません。
現在 MUIDrawManager をサポートしているのは次のインタフェースです。
MPxDrawOverride、MPxGeometryOverride、および MPxSubSceneOverride には、MUIDrawManager を使用するためにオーバーライドできる署名を持つ共通メソッドがあります。
仮想関数は次のとおりです。
メソッド hasUIDrawables() をオーバーライドして true を返し、ユーザが addUIDrawables() メソッドを使用して描画可能項目の追加を希望していることを示すことができます。false 値は、addUIDrawables() の呼び出しをスキップすることを意味します。
メソッド addUIDrawables() は、MUIDrawManager へのアクセスを許可する主要なメソッドです。ここで待ち行列に入れられた描画可能項目は、パイプライン内の適切なレンダー項目リストにフィルタまたはバケット化できる追加のレンダー項目と考えることができます。
描画可能項目は、本質的に一時的であるため、更新のたびにこれらを再作成するための固有のコストがあります。MPxSubSceneOverride には、追加の仮想メソッドがあります。
MPxSubSceneOverride::areUIDrawablesDirty()
描画呼び出しを行っても描画可能項目が存続することを示すためにオーバーライドできます。
MPxManipContainer および MPxManipulatorNode マニピュレータの場合は、2 つのオーバーライド メソッドが MUIDrawManager とのインタラクションを提供します。
これらのメソッドは、現在のレンダラがビューポート 2.0 である場合にのみ呼び出されます。
preDrawUI() は常に drawUI() の前に呼び出されます。preDrawUI() を使用すると、ユーザは描画データの準備を実行することができます。次に、drawUI() は、MUIDrawManager に渡された値を使用して、描画データで描画します。待ち行列に入れられた描画可能項目は、シーンの DAG オブジェクトの描画の後、および HUD (ヘッズアップディスプレイ)の描画の前にレンダーされます。
ツール コンテキストで、MPxContext は次のメソッドを使用できます。
これらのメソッドは、現在のレンダラがビューポート 2.0 である場合にのみ呼び出されます。
これらは doPress、doRelease、doDrag、doHold、doEnterRegion、および doPtrMoved のビューポート 2.0 バージョンとみなすことができます。プラグインは、これらの関数をオーバーライドして既定のビューポートに同じ動作を実装できます。
MUIDrawManager は、レンダーのオーバーライドにも使用することができます。MUserRenderOperation および MHUDRender の場合は、次の 2 つのメソッドを使用できます。
MSceneRender の場合は、次の 3 つの関数を使用できます。
これらの関数をオーバーライドして、ユーザ、HUD、プリシーン、ポストシーンのレンダー操作中に描画する描画可能項目を定義します。
前述したように、MUIDrawManager は、保持モードの描画を持つものとみなすことができます。そのため、指定された状態が設定された後に待ち行列に入れられた描画可能項目に適用される特定の状態を設定できます。
ラインの表示アトリビュートをコントロールするために、可能なライン状態コントロールに、幅とラインのスタイルの設定を含めます。
例:
ラインの幅の状態を指定された値(ピクセル単位)に設定します。
定義済みのライン スタイルのセットからライン スタイルを設定します。これらには、ソリッド、短い点線、短い破線、破線、点線が含まれます。さらにコントロールを強化するために、次のメソッドを使用できます。
void setLineStyle(unsigned int factor, unsigned short pattern); を使用することができます。
係数は、パターン内の各ビットの乗数です。
パターンは、描画するラインのフラグメントを決定するビット マスク パターンです。
プリミティブ ペイント スタイルをコントロールするには、setPaintStyle() を使用して、フラットシェード、点線、またはシェード描画の適用を許可します。シェード描画では、内部の固定マテリアルを使用します。
テキストをコントロールするには、サイズを保持モード状態(setFontSize())として設定します。
MUIDrawManager は、3D および 2D 両方の描画可能インタフェースをサポートします。通常、2D インタフェースはメソッドの名前に「2d」を付けて示されます。たとえば、ine() は 3D 描画可能インタフェース用で、line2d() は 2D 描画可能インタフェース用です。
2D 描画可能インタフェースの場合は、3D の位置またはベクトルの X および Y コンポーネントのみ使用され、描画の単位はスクリーン ピクセルです。
例