00001
00031 #include <LinearMath/btIDebugDraw.h>
00032
00033 extern double bulletWorldScalingFactor;
00034
00035 class CLBulletDebugDraw : public btIDebugDraw
00036 {
00037 public:
00038 struct Callbacks
00039 {
00040 void (*drawLine)(const double *, const double *, const double *, void *);
00041 void (*drawSphere)(const double *, double , const double *, void *);
00042 void (*drawTriangle)(const double *, const double *, const double *,
00043 const double *, double , void *);
00044 void (*drawBox)(const double *, const double *,
00045 const double *, void *);
00046 void (*drawAabb)(const double *, const double *, const double *, void *);
00047 void (*drawTransform)(const double *, double , void *);
00048 void (*drawArc)(const double *, const double *,
00049 const double *, double , double ,
00050 double , double , const double *,
00051 bool , double , void *);
00052 void (*drawSpherePatch)(const double *, const double *, const double *,
00053 double , double , double , double ,
00054 double , const double *,
00055 double , void *);
00056 void (*drawContactPoint)(const double *, const double *, double ,
00057 int , const double *, void *);
00058 void (*reportErrorWarning)(const char *, void *);
00059 void (*draw3dText)(const double *, const char *, void *);
00060
00061 Callbacks()
00062 : drawLine(0), drawSphere(0), drawTriangle(0), drawBox(0),
00063 drawAabb(0), drawTransform(0), drawArc(0), drawSpherePatch(0),
00064 drawContactPoint(0), reportErrorWarning(0), draw3dText(0) {}
00065 };
00066
00067
00068 CLBulletDebugDraw(void *arg=0)
00069 : debug_mode_(DBG_NoDebug),
00070 arg_(arg) {}
00071
00072 CLBulletDebugDraw(const Callbacks &callbacks, void *arg=0)
00073 : debug_mode_(DBG_NoDebug),
00074 callbacks_(callbacks),
00075 arg_(arg) {}
00076
00077 virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color)
00078 {
00079 double from_[3] = {from.x() / bulletWorldScalingFactor,
00080 from.y() / bulletWorldScalingFactor,
00081 from.z() / bulletWorldScalingFactor};
00082 double to_[3] = {to.x() / bulletWorldScalingFactor,
00083 to.y() / bulletWorldScalingFactor,
00084 to.z() / bulletWorldScalingFactor};
00085 double color_[3] = {color.x(), color.y(), color.z()};
00086
00087 if(callbacks_.drawLine)
00088 (*callbacks_.drawLine)(from_, to_, color_, arg_);
00089 }
00090
00091 virtual void drawSphere (const btVector3& p, btScalar radius, const btVector3& color)
00092 {
00093 double p_[3] = {p.x() / bulletWorldScalingFactor,
00094 p.y() / bulletWorldScalingFactor,
00095 p.z() / bulletWorldScalingFactor};
00096 double color_[3] = {color.x(), color.y(), color.z()};
00097
00098 if(callbacks_.drawSphere)
00099 (*callbacks_.drawSphere)(p_, radius / bulletWorldScalingFactor, color_, arg_);
00100 else
00101 btIDebugDraw::drawSphere(p/bulletWorldScalingFactor, radius / bulletWorldScalingFactor, color);
00102 }
00103
00104 virtual void drawTriangle(const btVector3& v0,const btVector3& v1,const btVector3& v2,const btVector3& color, btScalar alpha)
00105 {
00106 double v0_[3] = {v0.x() / bulletWorldScalingFactor,
00107 v0.y() / bulletWorldScalingFactor,
00108 v0.z() / bulletWorldScalingFactor};
00109 double v1_[3] = {v1.x() / bulletWorldScalingFactor,
00110 v1.y() / bulletWorldScalingFactor,
00111 v1.z() / bulletWorldScalingFactor};
00112 double v2_[3] = {v2.x() / bulletWorldScalingFactor,
00113 v2.y() / bulletWorldScalingFactor,
00114 v2.z() / bulletWorldScalingFactor};
00115 double color_[3] = {color.x(), color.y(), color.z()};
00116
00117
00118 if(callbacks_.drawTriangle)
00119 (callbacks_.drawTriangle)(v0_, v1_, v2_, color_, alpha, arg_);
00120 else
00121 btIDebugDraw::drawTriangle(v0 / bulletWorldScalingFactor,
00122 v1 / bulletWorldScalingFactor, v2 / bulletWorldScalingFactor,
00123 color, alpha);
00124 }
00125
00126 virtual void drawBox (const btVector3& boxMin, const btVector3& boxMax, const btVector3& color)
00127 {
00128 double boxMin_[3] = {boxMin.x() / bulletWorldScalingFactor,
00129 boxMin.y() / bulletWorldScalingFactor,
00130 boxMin.z() / bulletWorldScalingFactor};
00131 double boxMax_[3] = {boxMax.x() / bulletWorldScalingFactor,
00132 boxMax.y() / bulletWorldScalingFactor,
00133 boxMax.z() / bulletWorldScalingFactor};
00134 double color_[3] = {color.x(), color.y(), color.z()};
00135
00136 if(callbacks_.drawBox)
00137 (*callbacks_.drawBox)(boxMin_, boxMax_, color_, arg_);
00138 else
00139 btIDebugDraw::drawBox(boxMin / bulletWorldScalingFactor, boxMax / bulletWorldScalingFactor, color);
00140 }
00141
00142 virtual void drawAabb(const btVector3& from,const btVector3& to,const btVector3& color)
00143 {
00144 double from_[3] = {from.x() / bulletWorldScalingFactor,
00145 from.y() / bulletWorldScalingFactor,
00146 from.z() / bulletWorldScalingFactor};
00147 double to_[3] = {to.x() / bulletWorldScalingFactor,
00148 to.y() / bulletWorldScalingFactor,
00149 to.z() / bulletWorldScalingFactor};
00150 double color_[3] = {color.x() / bulletWorldScalingFactor,
00151 color.y() / bulletWorldScalingFactor,
00152 color.z() / bulletWorldScalingFactor};
00153
00154 if(callbacks_.drawAabb)
00155 (*callbacks_.drawAabb)(from_, to_, color_, arg_);
00156 else
00157 btIDebugDraw::drawAabb(from / bulletWorldScalingFactor, to / bulletWorldScalingFactor, color);
00158 }
00159
00160 virtual void drawTransform(const btTransform& transform, btScalar orthoLen)
00161 {
00162 btVector3 origin = transform.getOrigin() / bulletWorldScalingFactor;
00163 btQuaternion rotation = transform.getRotation();
00164 double transform_[7] = {origin.x(), origin.y(), origin.z(),
00165 rotation.x(), rotation.y(), rotation.z(),
00166 rotation.w()};
00167
00168 if(callbacks_.drawTransform)
00169 (*callbacks_.drawTransform)(transform_, orthoLen / bulletWorldScalingFactor, arg_);
00170 else
00171 {
00172 btTransform scaled(rotation, origin);
00173 btIDebugDraw::drawTransform(scaled, orthoLen / bulletWorldScalingFactor);
00174 }
00175 }
00176
00177 virtual void drawArc(const btVector3& center, const btVector3& normal, const btVector3& axis, btScalar radiusA, btScalar radiusB, btScalar minAngle, btScalar maxAngle,
00178 const btVector3& color, bool drawSect, btScalar stepDegrees = btScalar(10.f))
00179 {
00180 double center_[3] = {center.x() / bulletWorldScalingFactor,
00181 center.y() / bulletWorldScalingFactor,
00182 center.z() / bulletWorldScalingFactor};
00183 double normal_[3] = {normal.x() / bulletWorldScalingFactor,
00184 normal.y() / bulletWorldScalingFactor,
00185 normal.z() / bulletWorldScalingFactor};
00186 double axis_[3] = {axis.x() / bulletWorldScalingFactor,
00187 axis.y() / bulletWorldScalingFactor,
00188 axis.z() / bulletWorldScalingFactor};
00189 double color_[3] = {color.x(), color.y(), color.z()};
00190
00191 if(callbacks_.drawArc)
00192 (*callbacks_.drawArc)(center_, normal_, axis_,
00193 radiusA / bulletWorldScalingFactor, radiusB / bulletWorldScalingFactor,
00194 minAngle, maxAngle, color_, drawSect, stepDegrees, arg_);
00195 else
00196 btIDebugDraw::drawArc(center / bulletWorldScalingFactor, normal / bulletWorldScalingFactor,
00197 axis / bulletWorldScalingFactor, radiusA / bulletWorldScalingFactor, radiusB / bulletWorldScalingFactor,
00198 minAngle, maxAngle, color, drawSect, stepDegrees);
00199 }
00200
00201 virtual void drawSpherePatch(const btVector3& center, const btVector3& up, const btVector3& axis, btScalar radius,
00202 btScalar minTh, btScalar maxTh, btScalar minPs, btScalar maxPs, const btVector3& color, btScalar stepDegrees = btScalar(10.f))
00203 {
00204 double center_[3] = {center.x() / bulletWorldScalingFactor,
00205 center.y() / bulletWorldScalingFactor,
00206 center.z() / bulletWorldScalingFactor};
00207 double up_[3] = {up.x() / bulletWorldScalingFactor,
00208 up.y() / bulletWorldScalingFactor,
00209 up.z() / bulletWorldScalingFactor};
00210 double axis_[3] = {axis.x() / bulletWorldScalingFactor,
00211 axis.y() / bulletWorldScalingFactor,
00212 axis.z() / bulletWorldScalingFactor};
00213 double color_[3] = {color.x(), color.y(), color.z()};
00214
00215 if(callbacks_.drawSpherePatch)
00216 (*callbacks_.drawSpherePatch)(center_, up_, axis_, radius / bulletWorldScalingFactor,
00217 minTh, maxTh, minPs, maxPs, color_, stepDegrees, arg_);
00218 else
00219 btIDebugDraw::drawSpherePatch(center / bulletWorldScalingFactor, up / bulletWorldScalingFactor,
00220 axis / bulletWorldScalingFactor, radius / bulletWorldScalingFactor,
00221 minTh, maxTh, minPs, maxPs, color, stepDegrees);
00222 }
00223
00224 virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color)
00225 {
00226 double PointOnB_[3] = {PointOnB.x() / bulletWorldScalingFactor,
00227 PointOnB.y() / bulletWorldScalingFactor,
00228 PointOnB.z() / bulletWorldScalingFactor};
00229 double normalOnB_[3] = {normalOnB.x() / bulletWorldScalingFactor,
00230 normalOnB.y() / bulletWorldScalingFactor,
00231 normalOnB.z() / bulletWorldScalingFactor};
00232 double color_[3] = {color.x(), color.y(), color.z()};
00233
00234 if(callbacks_.drawContactPoint)
00235 (*callbacks_.drawContactPoint)(PointOnB_, normalOnB_, distance, lifeTime, color_, arg_);
00236 }
00237
00238 virtual void reportErrorWarning(const char* warningString)
00239 {
00240 if(callbacks_.reportErrorWarning)
00241 (*callbacks_.reportErrorWarning)(warningString, arg_);
00242 }
00243
00244 void draw3dText(const btVector3& location,const char* textString)
00245 {
00246 double location_[3] = {location.x() / bulletWorldScalingFactor,
00247 location.y() / bulletWorldScalingFactor,
00248 location.z() / bulletWorldScalingFactor};
00249
00250 if(callbacks_.draw3dText)
00251 (*callbacks_.draw3dText)(location_, textString, arg_);
00252 }
00253
00254 virtual void setDebugMode(int debugMode)
00255 {
00256 debug_mode_ = debugMode;
00257 }
00258
00259 virtual int getDebugMode() const
00260 {
00261 return debug_mode_;
00262 }
00263
00264 void setCallbacks(const Callbacks &callbacks)
00265 {
00266 callbacks_ = callbacks;
00267 }
00268
00269 Callbacks &getCallbacks()
00270 {
00271 return callbacks_;
00272 }
00273
00274 private:
00275 int debug_mode_;
00276 Callbacks callbacks_;
00277 void *arg_;
00278 };
00279
00280 extern "C"
00281 {
00282
00283 CLBulletDebugDraw *newCLBulletDebugDraw(CLBulletDebugDraw::Callbacks *callbacks, void *arg)
00284 {
00285 if(callbacks)
00286 return new CLBulletDebugDraw(*callbacks, arg);
00287 else
00288 return new CLBulletDebugDraw(arg);
00289 }
00290
00291 void deleteCLBulletDebugDraw(CLBulletDebugDraw *ptr)
00292 {
00293 delete ptr;
00294 }
00295
00296 void setDebugMode(CLBulletDebugDraw *draw, int debugMode)
00297 {
00298 draw->setDebugMode(debugMode);
00299 }
00300
00301 int getDebugMode(CLBulletDebugDraw *draw)
00302 {
00303 return draw->getDebugMode();
00304 }
00305
00306 void setCallbacks(CLBulletDebugDraw *draw, CLBulletDebugDraw::Callbacks *callbacks)
00307 {
00308 draw->setCallbacks(*callbacks);
00309 }
00310
00311 CLBulletDebugDraw::Callbacks *getCallbacks(CLBulletDebugDraw *draw)
00312 {
00313 return &draw->getCallbacks();
00314 }
00315
00316 }