C ++の即時モード、レンダリング、不可知論者、軽量デバッグ描画API。
このソフトウェアはパブリックドメインにあります。その献身が認識されていない場合、あなたは、あなたが適切に見られるようにソースコードをコピー、配布、および変更するための永続的で取消不能なライセンスを許可されます。
ソースコードは、明示的または暗示されたいかなる種類の保証もなく、「現状のまま」提供されます。帰属は必要ありませんが、著者についての言及は高く評価されています。
デバッグドローは単一のソースファイルライブラリであるため、「ヘッダー」フォワード宣言と実装は同じファイル( debug_draw.hpp )に含まれています。これにより、展開と独自のプロジェクトとの統合が容易になります。あなたがしなければならないのは、あなた自身のソースファイルのいずれかにライブラリファイル#include 、そのファイルにDEBUG_DRAW_IMPLEMENTATIONを定義して実装を生成することです。他の場所に図書館を含めることもできます。 DEBUG_DRAW_IMPLEMENTATIONが定義されていない場合、通常のC ++ヘッダーファイルとして機能します。例:
my_program.cppで:
# define DEBUG_DRAW_IMPLEMENTATION
# include " debug_draw.hpp " my_program.hppまたはその他のヘッダーまたはソースファイルで、通常のC ++ヘッダーとして含めることができます。
# include " debug_draw.hpp "それだけです、あなたは今、あなた自身のアプリケーションにデバッグ・ドローを構築できるはずです。
デバッグドローは、下層レンダラーAPIについて仮定しないため、Direct3DまたはOpenGL、または選択したその他のレンダリングエンジンと非常に簡単に統合できます。必要なのは、 dd::RenderInterface Abstractクラスの実装を提供することです。これは、ポイント、ライン、キャラクターグリフを描画するための基本的な方法をデバッグドローに提供することです。以下は、 dd::RenderInterfaceに見えるものです。
class RenderInterface
{
public:
virtual void beginDraw ();
virtual void endDraw ();
virtual GlyphTextureHandle createGlyphTexture ( int width, int height, const void * pixels);
virtual void destroyGlyphTexture (GlyphTextureHandle glyphTex);
virtual void drawPointList ( const DrawVertex * points, int count, bool depthEnabled);
virtual void drawLineList ( const DrawVertex * lines, int count, bool depthEnabled);
virtual void drawGlyphList ( const DrawVertex * glyphs, int count, GlyphTextureHandle glyphTex);
virtual ~RenderInterface () = 0 ;
};すべての方法を実装する必要があるわけではありません。サポートする機能を決定します。 RenderInterfaceの宣言については、ソースコードを調べてください。各方法はよくコメントされており、実装する予定の動作について説明します。 OpenGLなどの標準APIを使用してRenderInterfaceの参照実装については、このプロジェクトのsamples/ディレクトリを参照してください。
レンダラーにRenderInterfaceを実装したら、デバッグドローRenderInterface使用を開始する前に行う必要があるのはdd::initialize()を呼び出すことだけです。
MyRenderInterface renderIface;
dd::initialize (&renderIface);ただし、デバッグ描画はすべてのプリミティブをバッチにして、 RenderInterfaceへの呼び出し数を減らすため、描画は、通常、フレームの最後に行われるdd::flush()と呼ばれるまでにのみ行われます。
// You only have to pass the current time if you have timed debug
// draws in the queues. Otherwise just omit the argument or pass 0.
dd::flush (getTimeMilliseconds());したがって、全体的なセットアップは次のように見えるはずです。
class MyRenderInterface : public dd ::RenderInterface
{
// Cherrypick the methods you want to implement or implement them all
...
};
int main ()
{
MyRenderInterface renderIface;
dd::initialize (&renderIface);
while (!quitting)
{
// Any other drawing that you already do
...
// Call any dd:: functions to add debug primitives to the draw queues
...
dd::flush ( getTimeMilliseconds ());
// Swap buffers to present the scene
...
}
dd::shutdown ();
}Debug Drawは、ライブラリの構成とカスタマイズのためのいくつかのコンパイラスイッチを提供します。すべてのスイッチのリストとそれぞれの詳細な説明については、 debug_draw.hppのドキュメントを確認してください。
ライブラリには言語要件がほとんどありません。その主な目標の1つは、統合してポータブルにするために痛みを伴わないことです。唯一の要件は、最小限の標準ライブラリサポートを備えたかなり最近のC ++コンパイラです。 nullptrや<cstdint>など、いくつかのC ++ 11の機能が想定されています。含まれているサンプルには、C ++標準ライブラリをより重く使用して、スレッドでデバッグドローの使用を実証します。
RTTIおよびC ++の例外は使用されていないため、ライブラリをそれらの機能を無効にするプロジェクトと統合するのに問題はないはずです。
メモリフットプリントも小さく、プリプロセッサディレクティブを介して内部キューにコミットされるメモリの量を管理できます。現在、ライブラリスタートアップで少量の動的メモリを割り当てて、デバッグテキスト描画関数と描画キューとライブラリコンテキストデータのフォントグリフを減圧しています。
デフォルトでは、Debug Drawは内部的に静的なグローバルコンテキストを使用し、スレッド安全ではない手続きスタイルのAPIを提供します。これは、使用およびセットアップが最も簡単な「クラシック」デバッグドローモードですが、ライブラリはコンパイル時間で安全で構成可能なスレッドの2つのモードもサポートしています。
DEBUG_DRAW_PER_THREAD_CONTEXT :実装前にこれが定義されている場合、ライブラリはグローバル共有デフォルトではなくスレッドローカルコンテキストを使用します。これにより、それぞれがプライベートコンテキストを維持し、キューを描くため、さまざまなスレッドからライブラリを呼び出すことができます。このモードは同じ公共図書館のインターフェイスを提供しますが、コンパイラからのTLS(ローカルストレージ)サポートが必要です。
DEBUG_DRAW_EXPLICIT_CONTEXT :実装前にこれが定義されている場合、ライブラリはユーザーがコンテキストにハンドルを提供することを期待します。このモードはdd::ContextHandleタイプを公開し、ライブラリの各関数を変更して、このハンドルを最初の引数として取得します。このモードにより、ライブラリが完全にステートレスになり、ライブラリを呼び出す各レンダリングスレッドがデバッグドローの独自のインスタンスを作成および維持できます。
明示的なコンテキストモードは、よりクリーンでより機能的なスタイルのAPIであり、新しいユーザーに優先されるものである必要があります。手続きモードは、古いライブラリバージョンとの互換性のデフォルトとして引き続き保持されますが、 #define DEBUG_DRAW_EXPLICIT_CONTEXT DEBUG_DRAW_IMPLEMENTATIONとともに追加することにより、明示的なコンテキストモードを使用することをお勧めします。将来、手続き上のステートフルなAPIは、明示的なAPIを支持して非推奨されます。
その中心に座標軸のセットが付いたボックスを描画します。
const ddVec3 boxColor = { 0 . 0f , 0 . 8f , 0 . 8f };
const ddVec3 boxCenter = { 0 . 0f , 0 . 0f , 3 . 0f };
dd::box (boxCenter, boxColor, 1 . 5f , 1 . 5f , 1 . 5f );
dd::cross (boxCenter, 1 . 0f );マトリックス変換を視覚化するには、 dd::axisTriad()を使用して3つの矢印として変換を描画できます。
const ddMat4x4 transform = { // The identity matrix
1 . 0f , 0 . 0f , 0 . 0f , 0 . 0f ,
0 . 0f , 1 . 0f , 0 . 0f , 0 . 0f ,
0 . 0f , 0 . 0f , 1 . 0f , 0 . 0f ,
0 . 0f , 0 . 0f , 0 . 0f , 1 . 0f
};
dd::axisTriad (transform, 0 . 3f , 2 . 0f );デバッグドローを独自のレンダラーと統合する方法に関するより複雑なサンプルと例は、 samples/ディレクトリ内に見つけることができます。パブリックAPIで提供される各関数は、ヘッダーファイルにも十分に文書化されています。ライブラリによってエクスポートされる各パブリック機能のプロトタイプの前に、説明的なヘッダーコメントがあります。