マニピュレータ(MPxManipulatorNode と MPxManipContainer)は、次のインタフェースを使用して、旧式のビューポートに描画されます。
virtual void draw(M3dView & view, const MDagPath & path, M3dView::DisplayStyle style,M3dView::DisplayStatus status);ビューポート 2.0(Viewport 2.0)のインタフェースは、旧式のインタフェースと使用方法を一致させようとしていますが、MUIDrawManager とフレーム コンテキスト(MFrameContext)にアクセスできる点が異なります。
virtual void preDrawUI( const M3dView &view );virtual void drawUI( MHWRender::MUIDrawManager& drawManager, const MHWRender::MFrameContext& frameContext) const;ビューポート 2.0(Viewport 2.0)と旧式のビューポートの間の主な違いの 1 つは、描画時に M3dView (3D ビューポートのラッパー)を使用できなくなった点です。同等の状態情報は、フレーム コンテキストから抽出されます。
サンプル プラグイン footPrintLocatorManip のサンプル コードを以下に示します。
void footPrintLocatorManip::preDrawUI( const M3dView &view )
{
// Update text drawing position
fTextPosition = // DG evaluation
}
void footPrintLocatorManip::drawUI(
MHWRender::MUIDrawManager& drawManager,
const MHWRender::MFrameContext& frameContext ) const
{
// Draw some text
drawManager.beginDrawable();
drawManager.setColor( MColor( 0.0f, 1.0f, 0.1f ) );
drawManager.text( fTextPosition, “Some text", MHWRender::MUIDrawManager::kLeft );
drawManager.text2d( MPoint(100,100), “Some text in 2D", MHWRender::MUIDrawManager::kLeft );
drawManager.endDrawable();
}
ここでは、テキストの位置を計算し、fTextPosition に格納します。この値は、MUIDrawManager インスタンスを使用してテキストを描画する位置を設定するために、描画時に使用されます。
選択するには、MPxManipContainer に含まれる一連のマニピュレータを使用することをお勧めします。プラグインでサブパーツ(handle)を選択する必要がある場合は、void MUIDrawManager::beginDrawable(unsigned int name, bool nameIsPickable); メソッド使用することができます。name 引数はデバイスから独立しており、MPxManipulatorNode::glActiveName() メソッドと一緒に使用することができます。name は、選択のためだけに使用され、通常の描画パスでは無視されます。
lineManip プラグインは、サンプルの使用方法を示します。
void lineManip::drawUI(
MHWRender::MUIDrawManager& drawManager,
const MHWRender::MFrameContext& frameContext ) const
{
// Find out if we should draw using selected color
bool drawAsSelected = false;
shouldDrawHandleAsSelected(lineName, drawAsSelected);
// Everything from begin/endDrawable has the lineName handle and is considered to be pickable
drawManager.beginDrawable(lineName, true);
drawManager.setColorIndex( drawAsSelected ? fSelectedLineColorIndex : fLineColorIndex );
drawManager.line( fLineStart, fLineEnd );
drawManager.endDrawable();
// The text is not considered to be pickable
drawManager.beginDrawable();
drawManager.setColorIndex( fLineColorIndex );
drawManager.text( fLineStart, MString("line manip"));
drawManager.endDrawable();
// The 2d line is considered to be pickable and has the same handle.
drawManager.beginDrawable(lineName, true);
drawManager.setColorIndex( drawAsSelected ? fSelectedLineColorIndex : fLineColorIndex );
drawManager.line2d(MPoint(100, 100), MPoint(200, 100));
drawManager.setLineWidth(5.0f);
drawManager.endDrawable();
// The 2d text is not considered to be pickable
drawManager.beginDrawable();
drawManager.setColorIndex( fLineColorIndex );
drawManager.setLineWidth(5.0f);
drawManager.text2d(MPoint(100, 105), MString("line manip 2D"));
drawManager.endDrawable();
}