You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
2.3 KiB
C++
115 lines
2.3 KiB
C++
#include "bulletdebugdraw.hpp"
|
|
|
|
#include <iostream>
|
|
|
|
#include <BulletCollision/CollisionDispatch/btCollisionWorld.h>
|
|
|
|
#include <osg/Geometry>
|
|
#include <osg/Group>
|
|
|
|
#include "vismask.hpp"
|
|
|
|
namespace
|
|
{
|
|
osg::Vec3f toOsg(const btVector3& vec)
|
|
{
|
|
return osg::Vec3f(vec.x(), vec.y(), vec.z());
|
|
}
|
|
}
|
|
|
|
namespace MWRender
|
|
{
|
|
|
|
DebugDrawer::DebugDrawer(osg::ref_ptr<osg::Group> parentNode, btCollisionWorld *world)
|
|
: mParentNode(parentNode),
|
|
mWorld(world),
|
|
mDebugOn(true)
|
|
{
|
|
|
|
createGeometry();
|
|
}
|
|
|
|
void DebugDrawer::createGeometry()
|
|
{
|
|
if (!mGeometry)
|
|
{
|
|
mGeometry = new osg::Geometry;
|
|
mGeometry->setNodeMask(Mask_Debug);
|
|
|
|
mVertices = new osg::Vec3Array;
|
|
|
|
mDrawArrays = new osg::DrawArrays(osg::PrimitiveSet::LINES);
|
|
|
|
mGeometry->setUseDisplayList(false);
|
|
mGeometry->setVertexArray(mVertices);
|
|
mGeometry->setDataVariance(osg::Object::DYNAMIC);
|
|
mGeometry->addPrimitiveSet(mDrawArrays);
|
|
|
|
mParentNode->addChild(mGeometry);
|
|
}
|
|
}
|
|
|
|
void DebugDrawer::destroyGeometry()
|
|
{
|
|
if (mGeometry)
|
|
{
|
|
mParentNode->removeChild(mGeometry);
|
|
mGeometry = NULL;
|
|
mVertices = NULL;
|
|
mDrawArrays = NULL;
|
|
}
|
|
}
|
|
|
|
DebugDrawer::~DebugDrawer()
|
|
{
|
|
destroyGeometry();
|
|
}
|
|
|
|
void DebugDrawer::step()
|
|
{
|
|
if (mDebugOn)
|
|
{
|
|
mVertices->clear();
|
|
mWorld->debugDrawWorld();
|
|
mDrawArrays->setCount(mVertices->size());
|
|
mVertices->dirty();
|
|
mGeometry->dirtyBound();
|
|
}
|
|
}
|
|
|
|
void DebugDrawer::drawLine(const btVector3 &from, const btVector3 &to, const btVector3 &color)
|
|
{
|
|
mVertices->push_back(toOsg(from));
|
|
mVertices->push_back(toOsg(to));
|
|
}
|
|
|
|
void DebugDrawer::drawContactPoint(const btVector3 &PointOnB, const btVector3 &normalOnB, btScalar distance, int lifeTime, const btVector3 &color)
|
|
{
|
|
mVertices->push_back(toOsg(PointOnB));
|
|
mVertices->push_back(toOsg(PointOnB) + (toOsg(normalOnB) * distance * 20));
|
|
}
|
|
|
|
void DebugDrawer::reportErrorWarning(const char *warningString)
|
|
{
|
|
std::cerr << warningString << std::endl;
|
|
}
|
|
|
|
void DebugDrawer::setDebugMode(int isOn)
|
|
{
|
|
mDebugOn = (isOn == 0) ? false : true;
|
|
|
|
if (!mDebugOn)
|
|
destroyGeometry();
|
|
else
|
|
createGeometry();
|
|
}
|
|
|
|
int DebugDrawer::getDebugMode() const
|
|
{
|
|
return mDebugOn;
|
|
}
|
|
|
|
|
|
|
|
}
|