#ifndef MY_DEBUG_DRAWER_H #define MY_DEBUG_DRAWER_H #include "LinearMath/btIDebugDraw.h" #include "LinearMath/btAlignedObjectArray.h" #define BT_LINE_BATCH_SIZE 512 struct MyDebugVec3 { MyDebugVec3(const btVector3& org) :x(org.x()), y(org.y()), z(org.z()) { } float x; float y; float z; }; class MyDebugDrawer : public btIDebugDraw { SimpleOpenGL3App* m_glApp; int m_debugMode; btAlignedObjectArray m_linePoints; btAlignedObjectArray m_lineIndices; btVector3 m_currentLineColor; public: MyDebugDrawer(SimpleOpenGL3App* app) : m_glApp(app) ,m_debugMode(btIDebugDraw::DBG_DrawWireframe|btIDebugDraw::DBG_DrawAabb), m_currentLineColor(-1,-1,-1) { } virtual void drawLine(const btVector3& from1,const btVector3& to1,const btVector3& color1) { //float from[4] = {from1[0],from1[1],from1[2],from1[3]}; //float to[4] = {to1[0],to1[1],to1[2],to1[3]}; //float color[4] = {color1[0],color1[1],color1[2],color1[3]}; //m_glApp->m_instancingRenderer->drawLine(from,to,color); if (m_currentLineColor!=color1 || m_linePoints.size() >= BT_LINE_BATCH_SIZE) { flushLines(); m_currentLineColor = color1; } MyDebugVec3 from(from1); MyDebugVec3 to(to1); m_linePoints.push_back(from); m_linePoints.push_back(to); m_lineIndices.push_back(m_lineIndices.size()); m_lineIndices.push_back(m_lineIndices.size()); } virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color) { drawLine(PointOnB,PointOnB+normalOnB,color); } virtual void reportErrorWarning(const char* warningString) { } virtual void draw3dText(const btVector3& location,const char* textString) { } virtual void setDebugMode(int debugMode) { m_debugMode = debugMode; } virtual int getDebugMode() const { return m_debugMode; } virtual void flushLines() { int sz = m_linePoints.size(); if (sz) { float debugColor[4]; debugColor[0] = m_currentLineColor.x(); debugColor[1] = m_currentLineColor.y(); debugColor[2] = m_currentLineColor.z(); debugColor[3] = 1.f; m_glApp->m_instancingRenderer->drawLines(&m_linePoints[0].x,debugColor, m_linePoints.size(),sizeof(MyDebugVec3), &m_lineIndices[0], m_lineIndices.size(), 1); m_linePoints.clear(); m_lineIndices.clear(); } } }; #endif //MY_DEBUG_DRAWER_H