Mode langsung, agnostik renderer, gambar debug ringan API untuk C ++.
Perangkat lunak ini ada di domain publik. Di mana dedikasi itu tidak diakui, Anda diberikan lisensi abadi, tidak dapat dibatalkan untuk menyalin, mendistribusikan, dan memodifikasi kode sumber yang Anda inginkan.
Kode sumber disediakan "sebagaimana adanya", tanpa jaminan apa pun, tersurat maupun tersirat. Tidak diperlukan atribusi, tetapi penyebutan tentang penulis dihargai.
Draw debug adalah pustaka file sumber tunggal, sehingga deklarasi "header" dan implementasinya terkandung dalam file yang sama ( debug_draw.hpp ). Ini harus memfasilitasi penyebaran dan integrasi dengan proyek Anda sendiri. Yang harus Anda lakukan adalah #include file perpustakaan di salah satu file sumber Anda sendiri dan mendefinisikan DEBUG_DRAW_IMPLEMENTATION dalam file itu untuk menghasilkan implementasi. Anda juga masih dapat memasukkan perpustakaan di tempat lain. Ketika DEBUG_DRAW_IMPLEMENTATION tidak didefinisikan, ia bertindak sebagai file header C ++ normal. Contoh:
Di my_program.cpp :
# define DEBUG_DRAW_IMPLEMENTATION
# include " debug_draw.hpp " Sekarang di my_program.hpp atau header atau file sumber lainnya, Anda dapat memasukkannya sebagai header C ++ normal:
# include " debug_draw.hpp "Itu saja, Anda sekarang harus dapat membangun undian debug ke dalam aplikasi Anda sendiri.
Draw debug tidak membuat asumsi tentang Renderer API yang underlaying, sehingga dapat diintegrasikan dengan sangat mudah dengan Direct3D atau OpenGL atau mesin rendering lainnya pilihan Anda. Semua yang diperlukan adalah Anda memberikan implementasi untuk kelas abstrak dd::RenderInterface , yang memberikan undian debug dengan metode dasar untuk menggambar titik, garis, dan glyph karakter. Berikut ini adalah seperti apa dd::RenderInterface seperti:
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 ;
}; Tidak semua metode harus diimplementasikan, Anda memutuskan fitur mana yang akan didukung! Lihatlah kode sumber untuk deklarasi RenderInterface . Setiap metode dikomentari dengan baik dan menggambarkan perilaku yang diharapkan yang harus Anda terapkan. Untuk implementasi referensi RenderInterface menggunakan API standar seperti OpenGL, lihat samples/ direktori dalam proyek ini.
Setelah Anda mengimplementasikan RenderInterface untuk renderer Anda, yang perlu Anda lakukan sebelum mulai menggunakan undian debug adalah memanggil dd::initialize() meneruskannya pointer ke RenderInterface kustom Anda:
MyRenderInterface renderIface;
dd::initialize (&renderIface); Namun perhatikan bahwa debug menggambar batch semua primitif untuk mengurangi jumlah panggilan ke RenderInterface , jadi menggambar hanya akan benar -benar terjadi pada saat Anda memanggil dd::flush() , yang biasanya dilakukan di ujung bingkai, sebelum membalik buffer layar:
// 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());Jadi pengaturan keseluruhan harus terlihat seperti berikut:
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 ();
} Draw Debug menyediakan beberapa sakelar kompiler untuk konfigurasi dan kustomisasi perpustakaan. Periksa dokumentasi di debug_draw.hpp untuk daftar semua sakelar ditambah deskripsi terperinci masing -masing.
Perpustakaan memiliki sangat sedikit persyaratan bahasa. Salah satu tujuan utamanya adalah tidak menyakitkan untuk diintegrasikan dan portabel. Satu -satunya persyaratan adalah kompiler C ++ yang cukup baru dengan dukungan pustaka standar minimal. Beberapa fitur C ++ 11 diasumsikan, seperti nullptr dan <cstdint> . Sampel termasuk menggunakan perpustakaan standar C ++ yang lebih berat untuk menunjukkan penggunaan undian debug dengan utas.
Pengecualian RTTI dan C ++ tidak digunakan , jadi Anda seharusnya tidak memiliki masalah mengintegrasikan perpustakaan dengan proyek -proyek yang menonaktifkan fitur -fitur tersebut.
Jejak memori juga kecil dan Anda dapat mengelola jumlah memori yang berkomitmen pada antrian internal melalui arahan preprocessor. Kami saat ini hanya mengalokasikan sejumlah kecil memori dinamis di startup perpustakaan untuk mendekompres mesin terbang font untuk fungsi menggambar teks debug dan untuk antrian gambar dan data konteks perpustakaan.
Secara default, undian debug akan menggunakan konteks global statis secara internal, memberikan API gaya prosedural yang tidak aman . Ini adalah mode gambar debug "klasik" yang paling mudah digunakan dan diatur, tetapi perpustakaan juga mendukung dua mode lain yang aman dan dapat dikonfigurasi pada waktu kompilasi:
DEBUG_DRAW_PER_THREAD_CONTEXT : Jika ini didefinisikan sebelum implementasi, perpustakaan akan menggunakan konteks thread-lokal alih-alih default bersama global. Ini memungkinkan memanggil perpustakaan dari utas yang berbeda karena masing -masing akan menjaga konteks pribadinya dan menggambar antrian. Mode ini menyediakan antarmuka perpustakaan umum yang sama tetapi membutuhkan dukungan TLS (Penyimpanan Lokal) dari kompiler.
DEBUG_DRAW_EXPLICIT_CONTEXT : Jika ini didefinisikan sebelum implementasi, perpustakaan mengharapkan pengguna untuk menyediakan pegangan ke konteks. Mode ini memperlihatkan tipe dd::ContextHandle dan mengubah setiap fungsi di perpustakaan untuk mengambil pegangan ini sebagai argumen pertama. Mode ini membuat perpustakaan sepenuhnya stateless, sehingga setiap utas rendering yang memanggil ke perpustakaan dapat membuat dan mempertahankan instance sendiri dari undian debug.
Mode konteks eksplisit adalah API gaya yang lebih bersih dan lebih fungsional dan harus menjadi yang lebih disukai untuk pengguna baru. Mode prosedural masih disimpan sebagai default untuk kompatibilitas dengan versi perpustakaan yang lebih lama, tetapi disarankan agar Anda menggunakan mode konteks eksplisit dengan menambahkan #define DEBUG_DRAW_EXPLICIT_CONTEXT bersama -sama dengan DEBUG_DRAW_IMPLEMENTATION . Di masa depan, API yang stateful prosedural akan sudah usang mendukung yang eksplisit.
Menggambar kotak dengan satu set sumbu koordinat di tengahnya:
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 ); Untuk memvisualisasikan transformasi matriks, Anda dapat menggunakan dd::axisTriad() untuk menggambar transformasi sebagai tiga panah:
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 ); Sampel dan contoh yang lebih kompleks tentang cara mengintegrasikan undian debug dengan renderer Anda sendiri dapat ditemukan di dalam samples/ direktori. Setiap fungsi yang disediakan dalam API publik juga didokumentasikan dengan baik dalam file header. Anda akan menemukan komentar header deskriptif sebelum prototipe setiap fungsi publik yang diekspor oleh perpustakaan.