Сразу же, рендеринг агностик, легкий API рисунка отладки для C ++.
Это программное обеспечение находится в общественном доступе. Там, где эта посвящение не признано, вам предоставляется постоянная, безотзывная лицензия на копирование, распространение и изменение исходного кода по мере того, как вы считаете подходящим.
Исходный код предоставляется «как есть», без гарантии любого рода, явного или подразумеваемого. Никакой атрибуции не требуется, но упоминание об авторах (-ах) ценится.
Debug Draw - это единая библиотека исходных файлов, поэтому объявления «заголовок» и реализация содержатся в одном и том же файле ( 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 "Вот и все, теперь вы должны быть в состоянии встроить отладочнуюнику в своем собственном приложении.
Debug Draw не делает предположений о подложенном API рендеринга, поэтому его можно легко интегрировать с Direct3D или OpenGL или любым другим двигателем рендеринга по вашему выбору. Все, что требуется, это то, что вы предоставляете реализацию для абстрактного класса dd::RenderInterface , который предоставляет отладочнуюнику с основными методами для рисования точек, линий и глифов персонажа. Ниже приведено, как выглядит 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 . Каждый метод хорошо прокомментирован и описывает ожидаемое поведение, которое вы должны реализовать. Для справочных реализаций RenderInterface с использованием стандартных API, таких как OpenGL, см. В этом проекте samples/ каталог.
После того, как вы реализуете RenderInterface для вашего рендеринга, все, что вам нужно сделать, прежде чем начать использовать Debug Draw, это вызов dd::initialize() Пропустив его указатель на свой пользовательский RenderInterface :
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 чтобы узнать список всех переключателей, а также подробное описание каждого.
Библиотека имеет очень мало языковых требований. Одна из его основных целей - быть безболезненным, чтобы интегрировать и портативную. Единственным требованием является довольно недавний компилятор C ++ с минимальной стандартной библиотечной поддержкой. Предполагаются некоторые функции C ++ 11, такие как nullptr и <cstdint> . Образцы включали в себя более тяжелое использование стандартной библиотеки C ++, чтобы продемонстрировать использование отладки с потоками.
Исключения RTTI и C ++ не используются , поэтому у вас не должно быть проблем, связанных с интеграцией библиотеки с проектами, которые отключают эти функции.
Следует также невелика памяти, и вы можете управлять объемом памяти, которая привержена внутренней очереди с помощью предварительных директив. В настоящее время мы распределяем небольшой объем динамической памяти при запуске библиотеки, чтобы распаковать глифы шрифта для функций текстового чертежа отладки, а также для очередей рисования и библиотечных контекстных данных.
По умолчанию Debug Draw будет использовать статический глобальный контекст внутренне, предоставляя API процедурного стиля, который не является безопасным потоком . Это режим «классической» отладки, который самый простые в использовании и настройке, но библиотека также поддерживает два других режима, которые безопасны и настраиваются по потоку во время компиляции:
DEBUG_DRAW_PER_THREAD_CONTEXT : Если это определено до реализации, библиотека будет использовать потоковой локальный контекст вместо глобального общего дефолта. Это позволяет вызывать библиотеку из разных потоков, поскольку каждый будет хранить свой личный контекст и рисовать очереди. Этот режим предоставляет тот же интерфейс публичной библиотеки, но требует поддержки TLS (потока локального хранения) от компилятора.
DEBUG_DRAW_EXPLICIT_CONTEXT : Если это определено до реализации, библиотека ожидает, что пользователь предоставит рукоятку в контекст. В этом режиме раскрывает тип dd::ContextHandle и изменяет каждую функцию в библиотеке, чтобы воспринимать эту ручку в качестве первого аргумента. Этот режим делает библиотеку полностью без сохранности, так что каждый поток рендеринга, который вызывает в библиотеку, может создавать и поддерживать свой собственный экземпляр Debug Draw.
Режим явного контекста-это более чистый и более функциональный API и должен быть предпочтительным для новых пользователей. Процедурный режим по -прежнему сохраняется в качестве по умолчанию для совместимости с более старыми версиями библиотеки, но рекомендуется использовать режим явного контекста, добавив #define DEBUG_DRAW_EXPLICIT_CONTEXT вместе с DEBUG_DRAW_IMPLEMENTATION . В будущем процедурный 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() чтобы нарисовать преобразование как три стрелки:
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, также хорошо задокументирована в файле заголовка. Вы найдете описательный комментарий заголовка до того, как прототип каждой публичной функции экспортируется библиотекой.