Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/libraries/tools/BulletDebugDrawer.cc @ 10195

Last change on this file since 10195 was 10195, checked in by landauf, 5 years ago

removed unnecessary material from BulletDebugDrawer.
fixed crash with ogre 1.7 if the number of vertices dropped to 0 in DebugDrawer.

File size: 6.5 KB
Line 
1/**
2 * Originally from http://www.ogre3d.org/tikiwiki/BulletDebugDrawer&structure=Cookbook
3 * This source code is released into the Public Domain.
4 *
5 * Modified by Fabian 'x3n' Landau by using DebugDrawer and Orxonox specific utilities (e.g. output).
6 */
7
8#include "BulletDebugDrawer.h"
9#include "OgreBulletUtils.h"
10
11#include <OgreRoot.h>
12#include <OgreManualObject.h>
13#include <OgreSceneManager.h>
14
15#include "util/Output.h"
16#include "DebugDrawer.h"
17
18namespace orxonox
19{
20    BulletDebugDrawer::BulletDebugDrawer(Ogre::SceneManager* sceneManager)
21    {
22        this->drawer_ = new DebugDrawer(sceneManager, 0.5f);
23        this->bFill_ = true;
24
25        mContactPoints = &mContactPoints1;
26
27        mDebugMode = (DebugDrawModes) DBG_DrawWireframe;
28        Ogre::Root::getSingleton().addFrameListener(this);
29    }
30
31    BulletDebugDrawer::~BulletDebugDrawer()
32    {
33        Ogre::Root::getSingleton().removeFrameListener(this);
34        delete this->drawer_;
35    }
36
37    void BulletDebugDrawer::drawLine(const btVector3& from, const btVector3& to, const btVector3& color)
38    {
39        this->drawer_->drawLine(vector3(from), vector3(to), colour(color, 1.0f));
40    }
41
42//    void BulletDebugDrawer::drawTriangle(const btVector3& v0, const btVector3& v1, const btVector3& v2, const btVector3& color, btScalar alpha)
43//    {
44//        // TODO
45//    }
46
47    void BulletDebugDrawer::drawSphere(const btVector3& p, btScalar radius, const btVector3& color)
48    {
49        this->drawer_->drawSphere(vector3(p), Ogre::Quaternion::IDENTITY, radius, colour(color, 1.0f), this->bFill_);
50    }
51
52    void BulletDebugDrawer::drawSphere(btScalar radius, const btTransform& transform, const btVector3& color)
53    {
54        Ogre::Matrix4 matrix = matrix4(transform);
55        this->drawer_->drawSphere(matrix.getTrans(), matrix.extractQuaternion(), radius, colour(color, 1.0f), this->bFill_);
56    }
57
58    void BulletDebugDrawer::drawBox(const btVector3& bbMin, const btVector3& bbMax, const btVector3& color)
59    {
60        Ogre::Vector3* corners = new Ogre::Vector3[8];
61        corners[0]  = Ogre::Vector3(bbMin[0], bbMin[1], bbMin[2]);
62        corners[1]  = Ogre::Vector3(bbMin[0], bbMax[1], bbMin[2]);
63        corners[2]  = Ogre::Vector3(bbMax[0], bbMax[1], bbMin[2]);
64        corners[3]  = Ogre::Vector3(bbMax[0], bbMin[1], bbMin[2]);
65        corners[4]  = Ogre::Vector3(bbMax[0], bbMax[1], bbMax[2]);
66        corners[5]  = Ogre::Vector3(bbMin[0], bbMax[1], bbMax[2]);
67        corners[6]  = Ogre::Vector3(bbMin[0], bbMin[1], bbMax[2]);
68        corners[7]  = Ogre::Vector3(bbMax[0], bbMin[1], bbMax[2]);
69        this->drawer_->drawCuboid(corners, colour(color, 1.0f), this->bFill_);
70    }
71
72    void BulletDebugDrawer::drawBox(const btVector3& bbMin, const btVector3& bbMax, const btTransform& trans, const btVector3& color)
73    {
74        Ogre::Vector3* corners = new Ogre::Vector3[8];
75        corners[0]  = Ogre::Vector3(trans * btVector3(bbMin[0], bbMin[1], bbMin[2]));
76        corners[1]  = Ogre::Vector3(trans * btVector3(bbMin[0], bbMax[1], bbMin[2]));
77        corners[2]  = Ogre::Vector3(trans * btVector3(bbMax[0], bbMax[1], bbMin[2]));
78        corners[3]  = Ogre::Vector3(trans * btVector3(bbMax[0], bbMin[1], bbMin[2]));
79        corners[4]  = Ogre::Vector3(trans * btVector3(bbMax[0], bbMax[1], bbMax[2]));
80        corners[5]  = Ogre::Vector3(trans * btVector3(bbMin[0], bbMax[1], bbMax[2]));
81        corners[6]  = Ogre::Vector3(trans * btVector3(bbMin[0], bbMin[1], bbMax[2]));
82        corners[7]  = Ogre::Vector3(trans * btVector3(bbMax[0], bbMin[1], bbMax[2]));
83        this->drawer_->drawCuboid(corners, colour(color, 1.0f), this->bFill_);
84    }
85
86    void BulletDebugDrawer::drawCylinder(btScalar radius, btScalar halfHeight, int upAxis, const btTransform& transform, const btVector3& color)
87    {
88        Ogre::Matrix4 matrix = matrix4(transform);
89        this->drawer_->drawCylinder(matrix.getTrans(), matrix.extractQuaternion(), radius, halfHeight * 2, colour(color, 1.0f), this->bFill_);
90    }
91
92    void BulletDebugDrawer::drawCone(btScalar radius, btScalar height, int upAxis, const btTransform& transform, const btVector3& color)
93    {
94        Ogre::Matrix4 matrix = matrix4(transform);
95        this->drawer_->drawCone(matrix.getTrans(), matrix.extractQuaternion(), radius, height, colour(color, 1.0f), this->bFill_);
96    }
97
98    void BulletDebugDrawer::drawContactPoint(const btVector3& PointOnB, const btVector3& normalOnB, btScalar distance, int lifeTime, const btVector3& color)
99    {
100        mContactPoints->resize(mContactPoints->size() + 1);
101        ContactPoint p = mContactPoints->back();
102        p.from = vector3(PointOnB);
103        p.to = p.from + vector3(normalOnB) * distance;
104        p.dieTime = Ogre::Root::getSingleton().getTimer()->getMilliseconds() + lifeTime;
105        p.color.r = color.x();
106        p.color.g = color.y();
107        p.color.b = color.z();
108    }
109
110    bool BulletDebugDrawer::frameStarted(const Ogre::FrameEvent& evt)
111    {
112        size_t now = Ogre::Root::getSingleton().getTimer()->getMilliseconds();
113        std::vector<ContactPoint>* newCP = mContactPoints == &mContactPoints1 ? &mContactPoints2 : &mContactPoints1;
114        for (std::vector<ContactPoint>::iterator i = mContactPoints->begin(); i < mContactPoints->end(); i++ )
115        {
116            ContactPoint& cp = *i;
117            this->drawer_->drawLine(cp.from, cp.to, cp.color);
118            if (now <= cp.dieTime)
119                newCP->push_back(cp);
120        }
121        mContactPoints->clear();
122        mContactPoints = newCP;
123
124        // Right before the frame is rendered, call DebugDrawer::build().
125        this->drawer_->build();
126
127        return true;
128    }
129
130    bool BulletDebugDrawer::frameEnded(const Ogre::FrameEvent& evt)
131    {
132        // After the frame is rendered, call DebugDrawer::clear()
133        this->drawer_->clear();
134
135        return true;
136    }
137
138    void BulletDebugDrawer::reportErrorWarning(const char* warningString)
139    {
140        orxout(internal_error) << warningString << endl;
141        Ogre::LogManager::getSingleton().getDefaultLog()->logMessage(warningString);
142    }
143
144    void BulletDebugDrawer::draw3dText(const btVector3& location, const char* textString)
145    {
146
147    }
148
149    void BulletDebugDrawer::setDebugMode(int debugMode)
150    {
151        mDebugMode = (DebugDrawModes) debugMode;
152    }
153
154    int BulletDebugDrawer::getDebugMode() const
155    {
156        return mDebugMode;
157    }
158
159    void BulletDebugDrawer::configure(bool bFill, float fillAlpha)
160    {
161        this->bFill_ = bFill;
162        this->drawer_->setFillAlpha(fillAlpha);
163    }
164}
Note: See TracBrowser for help on using the repository browser.