以前のブログでは、セクションジオメトリとカットジオメトリの出力動作をカスタマイズする機能について説明しました。OdGiSectionGeometryOutputおよびOdGiCuttedGeometryOutputインターフェースには、セクションおよびカットジオメトリ出力の動作を制御するための基本的な機能が含まれています。これらの機能は、色、透明度、マテリアルなどのジオメトリプロパティの変更に限定されます。この基本機能で不十分な場合、クライアントアプリケーションはこれらのクラスの任意のジオメトリ出力メソッドをオーバーライドし、独自のジオメトリ出力ロジックを実装できます。
ジオメトリセクショニングは、OdGiGeometry::pushModelTransformメソッドを使用してエンティティのベクトル化中にクリッピングと同時に設定できます。しかし、通常、ジオメトリセクショニングはOdGsView::setViewport3dClippingメソッドを使用してビューポート全体に基づいて設定されるため、このクリッピングはグラフィックシーン内のすべてのオブジェクトに適用されます。これは簡単な解決策ですが、グラフィックシーンに、出力セクションまたはカットジオメトリ以外の動作を持つべきオブジェクトが含まれている場合はどうでしょうか?シーン内の各オブジェクトに応じて、さまざまな出力ジオメトリ動作を持つ個別のクリッピング境界を設定することは、あまり高速な解決策ではありません。異なるセクションまたはカットジオメトリ動作を持つオブジェクトの処理を簡素化するために、グラフィックシーン内のセクション可能な各オブジェクトに対して呼び出すことができる特別なコールバックメソッドがあります。
OdGiClippedGeometryOutput インターフェース
virtual void OdGiClippedGeometryOutput::setupDrawableProcessing();
このメソッドは、OdGiSectionGeometryOutputおよびOdGiCuttedGeometryOutputクラスでオーバーライドして、各オブジェクトの正しいジオメトリ出力設定を行うことができます。何らかの理由ですでに独自の継承クラスを使用している場合は、これが簡単な方法です。しかし、OdGiClippedGeometryOutputインターフェースは、setupDrawableProcessing()メソッドをオーバーライドすることなくコールバックを処理するさらに簡単な方法を提供します。
OdGiClippedGeometryOutputCallbackインターフェースクラスには、継承クラスによってオーバーライドされなければならない単一のメソッドが含まれています。
virtual bool clippedGeometryOutputCallbackProc(OdGiClippedGeometryOutput &pGeomOutput, const OdGiConveyorContext &pDrawContext) = 0;
このメソッド内で、クライアントコードはpDrawContextからデータを呼び出して現在の描画可能オブジェクトをチェックし、必要な設定をpGeomOutputに適用できます。セクションまたはカットジオメトリの出力を処理する場合はtrueを返し、出力ジオメトリの処理を無効にする場合はfalseを返します。
OdGiConveyorContextクラスの以下のメソッドは、描画可能オブジェクトの分析に役立ちます。
- const OdGiDrawable* currentDrawable() const — 現在ベクトル化されている描画可能オブジェクトを取得します。
- const OdGiPathNode* currentGiPath() const — 現在の描画可能オブジェクトまでの描画可能オブジェクトのパス全体を取得します(ジオメトリの動作が現在の描画可能オブジェクトだけでなく、その親の描画可能オブジェクトにも依存する場合に役立ちます)。
- const OdGiViewport* giViewport() const — 現在のビューポート設定を返します。これは、ジオメトリ出力の動作が視線方向などに依存する場合に役立つことがあります。
最後に、コールバック実装を持つ構築されたクラスは、setGeometryProcessingCallback(OdGiClippedGeometryOutputCallback *pCallback) メソッドを使用して、OdGiSectionGeometryOutput または OdGiCuttedGeometryOutput クラスに設定できます。OdGiClippedGeometryOutput::setupDrawableProcessing() メソッドのデフォルト実装は、その後、setGeometryProcessingCallback() メソッドを呼び出します。
このシリーズの次の記事では、ジオメトリセクションコールバックの使用に関する詳細な例を紹介しますので、ブログにご注目ください。