C ++에 대한 즉각적인 모드, 렌더러, 경구, 경량 디버그 드로잉 API.
이 소프트웨어는 공개 도메인에 있습니다. 그 헌신이 인정되지 않은 경우, 당신은 적합한대로 소스 코드를 복사, 배포 및 수정할 수있는 영구적이고 돌이킬 수없는 라이센스가 부여됩니다.
소스 코드는 어떤 종류의 보증없이 "있는대로"제공됩니다. 귀속이 필요하지 않지만 저자에 대한 언급은 감사합니다.
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 "그렇습니다. 이제 자신의 응용 프로그램에 디버그 드로우를 구축 할 수 있어야합니다.
디버그 드로우는 언더 레이 렌더러 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 구현하면 디버그 드로우를 사용하기 전에해야 할 일은 dd::initialize() 사용자 정의 RenderInterface 에 포인터로 전달하는 것입니다.
MyRenderInterface renderIface;
dd::initialize (&renderIface); 그러나 Debug Draw는 모든 프리미티브를 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.hpp 의 문서를 확인하십시오.
도서관에는 언어 요구 사항이 거의 없습니다. 주요 목표 중 하나는 통합 및 휴대용이 고통스럽지 않다는 것입니다. 유일한 요구 사항은 최소한의 표준 라이브러리 지원을 제공하는 상당히 최근의 C ++ 컴파일러입니다. nullptr 및 <cstdint> 와 같은 일부 C ++ 11 기능이 가정됩니다. 샘플은 C ++ 표준 라이브러리를 더 많이 사용하여 스레드와 함께 디버그 드로우 사용을 보여줍니다.
RTTI 및 C ++ 예외는 사용되지 않으므로 라이브러리를 해당 기능을 비활성화하는 프로젝트와 통합하는 데 아무런 문제가 없습니다.
메모리 풋 프린트도 작으며 전처리 서기 지시문을 통해 내부 대기열에 커밋되는 메모리의 양을 관리 할 수 있습니다. 우리는 현재 라이브러리 시작시 소량의 동적 메모리 만 할당하여 디버그 텍스트 그리기 기능과 드로우 큐 및 라이브러리 컨텍스트 데이터에 대한 글꼴 글리프를 압축합니다.
기본적으로 Debug Draw는 내부적으로 정적 글로벌 컨텍스트를 사용하여 스레드 안전이 아닌 절차 스타일 API를 제공합니다. 사용 및 설정이 가장 쉬운 "클래식"디버그 드로우 모드이지만 라이브러리는 컴파일 타임에 스레드 안전하고 구성 가능한 두 가지 다른 모드를 지원합니다.
DEBUG_DRAW_PER_THREAD_CONTEXT : 구현 전에 정의되면 라이브러리는 글로벌 공유 기본값 대신 스레드-로컬 컨텍스트를 사용합니다. 이를 통해 각각은 개인 컨텍스트를 유지하고 대기열을 그리기 때문에 다른 스레드에서 라이브러리를 호출 할 수 있습니다. 이 모드는 동일한 공공 도서관 인터페이스를 제공하지만 컴파일러에서 TLS (스레드 로컬 스토리지) 지원이 필요합니다.
DEBUG_DRAW_EXPLICIT_CONTEXT : 구현 전에 정의되면 라이브러리는 사용자가 컨텍스트에 핸들을 제공 할 것으로 예상합니다. 이 모드는 dd::ContextHandle 유형을 노출시키고 라이브러리의 각 함수를 변경 하여이 핸들을 첫 번째 인수로 취합니다. 이 모드는 라이브러리를 완전히 무국적으로 만들어서 라이브러리로 호출되는 각 렌더링 스레드가 자체 디버그 드로우 인스턴스를 생성하고 유지할 수 있도록합니다.
명시적인 컨텍스트 모드는 더 깨끗하고 기능적인 스타일 API이며 새로운 사용자에게 선호하는 모드 여야합니다. 절차 모드는 이전 라이브러리 버전과의 호환성의 기본값으로 유지되지만 DEBUG_DRAW_IMPLEMENTATION 과 함께 #define DEBUG_DRAW_EXPLICIT_CONTEXT 추가하여 명시 적 컨텍스트 모드를 사용하는 것이 좋습니다. 앞으로 절차 적 상태 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에 제공된 각 기능은 헤더 파일에 잘 문서화되어 있습니다. 라이브러리에서 내보낸 각 공개 기능의 프로토 타입 전에 설명 헤더 댓글을 찾을 수 있습니다.