Bullet debug draw added

It is off by default, see attributes of dSolverNode to turn it on
This commit is contained in:
rponom
2010-01-30 04:21:12 +00:00
parent 08f597454a
commit d5f5ddf2f1
15 changed files with 302 additions and 28 deletions

View File

@@ -1,29 +1,47 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BulletMayaPlugin", "BulletMayaPlugin.vcproj", "{681412B0-F197-4A2F-9263-DEA2E8690146}"
ProjectSection(WebsiteProperties) = preProject
Debug.AspNetCompiler.Debug = "True"
Release.AspNetCompiler.Debug = "False"
EndProjectSection
ProjectSection(ProjectDependencies) = postProject
{6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}
{ED51AA4D-82EF-089C-CD6D-91CF224E2A9E} = {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}
{B1B5F775-54A9-2437-E4AC-7E817E492142} = {B1B5F775-54A9-2437-E4AC-7E817E492142}
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{6AB01C9C-9163-F400-B5C3-20D046631E17} = {6AB01C9C-9163-F400-B5C3-20D046631E17}
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{A0958CD9-0E39-4A77-3711-9B488F508FBF} = {A0958CD9-0E39-4A77-3711-9B488F508FBF}
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
{B1B5F775-54A9-2437-E4AC-7E817E492142} = {B1B5F775-54A9-2437-E4AC-7E817E492142}
{6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletcollision", "..\..\msvc\8\libbulletcollision.vcproj", "{6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}"
ProjectSection(WebsiteProperties) = preProject
Debug.AspNetCompiler.Debug = "True"
Release.AspNetCompiler.Debug = "False"
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletdynamics", "..\..\msvc\8\libbulletdynamics.vcproj", "{61BD1097-CF2E-B296-DAA9-73A6FE135319}"
ProjectSection(WebsiteProperties) = preProject
Debug.AspNetCompiler.Debug = "True"
Release.AspNetCompiler.Debug = "False"
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletmath", "..\..\msvc\8\libbulletmath.vcproj", "{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}"
ProjectSection(WebsiteProperties) = preProject
Debug.AspNetCompiler.Debug = "True"
Release.AspNetCompiler.Debug = "False"
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libGIMPACTUtils", "..\..\msvc\8\libGIMPACTUtils.vcproj", "{B1B5F775-54A9-2437-E4AC-7E817E492142}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libBulletColladaConverter", "..\..\msvc\8\libBulletColladaConverter.vcproj", "{ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcolladadom", "..\..\msvc\8\libcolladadom.vcproj", "{6AB01C9C-9163-F400-B5C3-20D046631E17}"
ProjectSection(WebsiteProperties) = preProject
Debug.AspNetCompiler.Debug = "True"
Release.AspNetCompiler.Debug = "False"
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblibxml", "..\..\msvc\8\liblibxml.vcproj", "{A0958CD9-0E39-4A77-3711-9B488F508FBF}"
ProjectSection(WebsiteProperties) = preProject
Debug.AspNetCompiler.Debug = "True"
Release.AspNetCompiler.Debug = "False"
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -51,14 +69,6 @@ Global
{B1B5F775-54A9-2437-E4AC-7E817E492142}.DebugDll|Win32.Build.0 = DebugDll|Win32
{B1B5F775-54A9-2437-E4AC-7E817E492142}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32
{B1B5F775-54A9-2437-E4AC-7E817E492142}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32
{ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.DebugDll|Win32.ActiveCfg = DebugDll|Win32
{ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.DebugDll|Win32.Build.0 = DebugDll|Win32
{ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32
{ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32
{6AB01C9C-9163-F400-B5C3-20D046631E17}.DebugDll|Win32.ActiveCfg = DebugDll|Win32
{6AB01C9C-9163-F400-B5C3-20D046631E17}.DebugDll|Win32.Build.0 = DebugDll|Win32
{6AB01C9C-9163-F400-B5C3-20D046631E17}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32
{6AB01C9C-9163-F400-B5C3-20D046631E17}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32
{A0958CD9-0E39-4A77-3711-9B488F508FBF}.DebugDll|Win32.ActiveCfg = DebugDll|Win32
{A0958CD9-0E39-4A77-3711-9B488F508FBF}.DebugDll|Win32.Build.0 = DebugDll|Win32
{A0958CD9-0E39-4A77-3711-9B488F508FBF}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32

View File

@@ -36,6 +36,8 @@ btVector3 maxWorld(10000,10000,10000);
int maxNumObj=32768;
void bt_solver_t::export_bullet_file(const char* fileName)
{
// ColladaConverter tmpConverter(m_dynamicsWorld.get());
@@ -62,6 +64,36 @@ void bt_solver_t::import_bullet_file(const char* filename)
}
class bt_debug_draw : public btIDebugDraw
{
int m_debugMode;
public:
virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color)
{
glBegin(GL_LINES);
glColor3f(color.getX(), color.getY(), color.getZ());
glVertex3d(from.getX(), from.getY(), from.getZ());
glVertex3d(to.getX(), to.getY(), to.getZ());
glEnd();
}
virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color)
{
return;
}
virtual void reportErrorWarning(const char* warningString)
{
return;
}
virtual void draw3dText(const btVector3& location,const char* textString)
{
return;
}
virtual void setDebugMode(int debugMode) { m_debugMode = debugMode; }
virtual int getDebugMode() const { return m_debugMode; }
};
bt_solver_t::bt_solver_t():
// m_broadphase(new btAxisSweep3(minWorld,maxWorld,maxNumObj)),
m_broadphase(new btDbvtBroadphase()),
@@ -80,4 +112,15 @@ bt_solver_t::bt_solver_t():
m_dynamicsWorld->setGravity(btVector3(0, -9.81f, 0));
// m_dynamicsWorld->getSolverInfo().m_splitImpulse = true;
bt_debug_draw* dbgDraw = new bt_debug_draw();
m_dynamicsWorld->setDebugDrawer(dbgDraw);
}
void bt_solver_t::debug_draw(int dbgMode)
{
m_dynamicsWorld->getDebugDrawer()->setDebugMode(dbgMode);
m_dynamicsWorld->debugDrawWorld();
}

View File

@@ -152,6 +152,8 @@ public:
m_dynamicsWorld->stepSimulation(dt, 1000, 1.0f / 120.0f);
}
virtual void debug_draw(int dbgMode);
virtual void export_bullet_file(const char* fileName);
virtual void import_bullet_file(const char* filename);

View File

@@ -92,13 +92,13 @@ MStatus hingeConstraintNode::initialize()
status = addAttribute(ia_damping);
MCHECKSTATUS(status, "adding damping attribute")
ia_lowerLimit = fnNumericAttr.create("lowerLimit", "llmt", MFnNumericData::kDouble, -90.0, &status);
ia_lowerLimit = fnNumericAttr.create("lowerLimit", "llmt", MFnNumericData::kDouble, 1.0, &status);
MCHECKSTATUS(status, "creating lower limit attribute")
fnNumericAttr.setKeyable(true);
status = addAttribute(ia_lowerLimit);
MCHECKSTATUS(status, "adding lower limit attribute")
ia_upperLimit = fnNumericAttr.create("upperLimit", "ulmt", MFnNumericData::kDouble, 90.0, &status);
ia_upperLimit = fnNumericAttr.create("upperLimit", "ulmt", MFnNumericData::kDouble, -1.0, &status);
MCHECKSTATUS(status, "creating upper limit attribute")
fnNumericAttr.setKeyable(true);
status = addAttribute(ia_upperLimit);

View File

@@ -106,9 +106,19 @@ dSolverCmd::redoIt()
}
}
m_dgModifier = new MDGModifier;
m_dgModifier = new MDagModifier;
MObject dSolverObj = m_dgModifier->createNode(dSolverNode::typeId);
MObject parentObj = m_dgModifier->createNode("transform");
m_dgModifier->renameNode(parentObj, "dDebugDraw");
m_dgModifier->doIt();
MObject dSolverObj = m_dgModifier->createNode(dSolverNode::typeId, parentObj, &stat);
if(stat != MStatus::kSuccess)
{
MString errStr = stat.errorString();
fprintf(stderr, "ERROR : %s\n", errStr.asChar());
}
m_dgModifier->doIt();
// connect the time attribute

View File

@@ -50,7 +50,8 @@ public:
protected:
MArgDatabase *m_argDatabase;
MDGModifier *m_dgModifier;
MDagModifier *m_dgModifier;
// MDGModifier *m_dgModifier;
};
#endif

View File

@@ -77,6 +77,21 @@ MObject dSolverNode::ssSolverType;
bool dSolverNode::isStartTime;
MObject dSolverNode::ia_DBG_DrawWireframe;
MObject dSolverNode::ia_DBG_DrawAabb;
MObject dSolverNode::ia_DBG_DrawFeaturesText;
MObject dSolverNode::ia_DBG_DrawContactPoints;
MObject dSolverNode::ia_DBG_NoDeactivation;
MObject dSolverNode::ia_DBG_NoHelpText;
MObject dSolverNode::ia_DBG_DrawText;
MObject dSolverNode::ia_DBG_ProfileTimings;
MObject dSolverNode::ia_DBG_EnableSatComparison;
MObject dSolverNode::ia_DBG_DisableBulletLCP;
MObject dSolverNode::ia_DBG_EnableCCD;
MObject dSolverNode::ia_DBG_DrawConstraints;
MObject dSolverNode::ia_DBG_DrawConstraintLimits;
MObject dSolverNode::ia_DBG_FastWireframe;
#define ATTR_POSITION "position"
//#define ATTR_POSITION_TYPE VECTOR_ATTR
#define ATTR_VELOCITY "velocity"
@@ -94,6 +109,74 @@ bool dSolverNode::isStartTime;
//#define ATTR_IN_RANGLENEXT_TYPE FLOAT_ATTR
static int getDbgDrawVal(const MObject& thisObj, const MObject& attr, int flag)
{
MPlug plug(thisObj, attr);
bool retVal = false;
plug.getValue(retVal);
return retVal ? (1 << flag) : 0;
}
void dSolverNode::draw( M3dView & view, const MDagPath & path,
M3dView::DisplayStyle style,
M3dView::DisplayStatus status )
{
view.beginGL();
glPushAttrib( GL_ALL_ATTRIB_BITS );
glDisable(GL_LIGHTING);
if( !(status == M3dView::kActive ||
status == M3dView::kLead ||
status == M3dView::kHilite ||
( style != M3dView::kGouraudShaded && style != M3dView::kFlatShaded )) ) {
glColor3f(1.0, 1.0, 0.0);
}
/*
glBegin(GL_LINES);
glColor3f(1.0, 0.5, 0.5);
glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.5, 0.5, 1.0);
glVertex3f(1.f, 1.f, 1.f);
glEnd();
*/
MObject thisObject = thisMObject();
MFnDagNode fnDagNode(thisObject);
MFnTransform fnParentTransform(fnDagNode.parent(0));
fnParentTransform.setTranslation(MVector(0.f, 0.f, 0.f), MSpace::kObject); // lock translation
fnParentTransform.setRotation(MEulerRotation(0., 0., 0.)); // lock rotation
double fixScale[3] = { 1., 1., 1. }; // lock scale
fnParentTransform.setScale(fixScale);
int dbgMode = 0;
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DrawWireframe, 0);
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DrawAabb, 1);
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DrawFeaturesText, 2);
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DrawContactPoints, 3);
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_NoDeactivation, 4);
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_NoHelpText, 5);
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DrawText, 6);
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_ProfileTimings, 7);
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_EnableSatComparison, 8);
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DisableBulletLCP, 9);
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_EnableCCD, 10);
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DrawConstraints, 11);
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DrawConstraintLimits, 12);
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_FastWireframe, 13);
solver_t::debug_draw(dbgMode);
glPopAttrib();
view.endGL();
}
static void sceneLoadedCB(void* clientData)
{
dSolverNode::updateAllRigidBodies();
@@ -312,6 +395,65 @@ MStatus dSolverNode::initialize()
status = addAttribute(ia_splitImpulse);
MCHECKSTATUS(status, "adding ia_splitImpulse attribute")
ia_DBG_DrawWireframe = fnNumericAttr.create("drawWireframe", "dwfr", MFnNumericData::kBoolean, false, &status);
MCHECKSTATUS(status, "creating ia_DBG_DrawWireframe attribute")
status = addAttribute(ia_DBG_DrawWireframe);
MCHECKSTATUS(status, "adding ia_DBG_DrawWireframe attribute")
ia_DBG_DrawAabb = fnNumericAttr.create("drawAabb", "daabb", MFnNumericData::kBoolean, false, &status);
MCHECKSTATUS(status, "creating ia_DBG_DrawAabb attribute")
status = addAttribute(ia_DBG_DrawAabb);
MCHECKSTATUS(status, "adding ia_DBG_DrawAabb attribute")
ia_DBG_DrawFeaturesText = fnNumericAttr.create("drawFeaturesText", "dft", MFnNumericData::kBoolean, false, &status);
MCHECKSTATUS(status, "creating ia_DBG_DrawFeaturesText attribute")
status = addAttribute(ia_DBG_DrawFeaturesText);
MCHECKSTATUS(status, "adding ia_DBG_DrawFeaturesText attribute")
ia_DBG_DrawContactPoints = fnNumericAttr.create("drawContactPoints", "dcp", MFnNumericData::kBoolean, false, &status);
MCHECKSTATUS(status, "creating ia_DBG_DrawContactPoints attribute")
status = addAttribute(ia_DBG_DrawContactPoints);
MCHECKSTATUS(status, "adding ia_DBG_DrawContactPoints attribute")
ia_DBG_NoDeactivation = fnNumericAttr.create("noDeactivation", "dnda", MFnNumericData::kBoolean, false, &status);
MCHECKSTATUS(status, "creating ia_DBG_NoDeactivation attribute")
status = addAttribute(ia_DBG_NoDeactivation);
MCHECKSTATUS(status, "adding ia_DBG_NoDeactivation attribute")
ia_DBG_NoHelpText = fnNumericAttr.create("noHelpText", "dnht", MFnNumericData::kBoolean, false, &status);
MCHECKSTATUS(status, "creating ia_DBG_NoHelpText attribute")
status = addAttribute(ia_DBG_NoHelpText);
MCHECKSTATUS(status, "adding ia_DBG_NoHelpText attribute")
ia_DBG_DrawText = fnNumericAttr.create("drawText", "dtxt", MFnNumericData::kBoolean, false, &status);
MCHECKSTATUS(status, "creating ia_DBG_DrawText attribute")
status = addAttribute(ia_DBG_DrawText);
MCHECKSTATUS(status, "adding ia_DBG_DrawText attribute")
ia_DBG_ProfileTimings = fnNumericAttr.create("pProfileTimings", "dptm", MFnNumericData::kBoolean, false, &status);
MCHECKSTATUS(status, "creating ia_DBG_ProfileTimings attribute")
status = addAttribute(ia_DBG_ProfileTimings);
MCHECKSTATUS(status, "adding ia_DBG_ProfileTimings attribute")
ia_DBG_EnableSatComparison = fnNumericAttr.create("enableSatComparison", "desc", MFnNumericData::kBoolean, false, &status);
MCHECKSTATUS(status, "creating ia_DBG_EnableSatComparison attribute")
status = addAttribute(ia_DBG_EnableSatComparison);
MCHECKSTATUS(status, "adding ia_DBG_EnableSatComparison attribute")
ia_DBG_DisableBulletLCP = fnNumericAttr.create("disableBulletLCP", "dblcp", MFnNumericData::kBoolean, false, &status);
MCHECKSTATUS(status, "creating ia_DBG_DisableBulletLCP attribute")
status = addAttribute(ia_DBG_DisableBulletLCP);
MCHECKSTATUS(status, "adding ia_DBG_DisableBulletLCP attribute")
ia_DBG_EnableCCD = fnNumericAttr.create("enableCCD", "deccd", MFnNumericData::kBoolean, false, &status);
MCHECKSTATUS(status, "creating ia_DBG_EnableCCD attribute")
status = addAttribute(ia_DBG_EnableCCD);
MCHECKSTATUS(status, "adding ia_DBG_EnableCCD attribute")
ia_DBG_DrawConstraints = fnNumericAttr.create("drawConstraints", "dcnst", MFnNumericData::kBoolean, false, &status);
MCHECKSTATUS(status, "creating ia_DBG_DrawConstraints attribute")
status = addAttribute(ia_DBG_DrawConstraints);
MCHECKSTATUS(status, "adding ia_DBG_DrawConstraints attribute")
ia_DBG_DrawConstraintLimits = fnNumericAttr.create("drawConstraintLimits", "dcsl", MFnNumericData::kBoolean, false, &status);
MCHECKSTATUS(status, "creating ia_DBG_DrawConstraintLimits attribute")
status = addAttribute(ia_DBG_DrawConstraintLimits);
MCHECKSTATUS(status, "adding ia_DBG_DrawConstraintLimits attribute")
ia_DBG_FastWireframe = fnNumericAttr.create("fastWireframe", "dfwf", MFnNumericData::kBoolean, false, &status);
MCHECKSTATUS(status, "creating ia_DBG_FastWireframe attribute")
status = addAttribute(ia_DBG_FastWireframe);
MCHECKSTATUS(status, "adding ia_DBG_FastWireframe attribute")
status = attributeAffects(ia_time, oa_rigidBodies);
MCHECKSTATUS(status, "adding attributeAffects(ia_time, oa_rigidBodies)")

View File

@@ -31,18 +31,42 @@ Modified by Roman Ponomarev <rponom@gmail.com>
#include <maya/MString.h>
#include <maya/MTypeId.h>
#include <maya/MPxNode.h>
#include <maya/MPxLocatorNode.h>
#include <maya/MTime.h>
#include <vector>
#include "mathUtils.h"
class dSolverNode : public MPxNode
//class dSolverNode : public MPxNode
class dSolverNode : public MPxLocatorNode
{
public:
dSolverNode();
virtual ~dSolverNode();
virtual void postConstructor();
virtual void draw( M3dView & view, const MDagPath & path,
M3dView::DisplayStyle style,
M3dView::DisplayStatus status );
virtual bool isBounded() const {
return false;
}
virtual MBoundingBox boundingBox() const
{
MObject node = thisMObject();
MPoint corner1(-1, -1, -1);
MPoint corner2(1, 1, 1);
return MBoundingBox(corner1, corner2);
}
virtual bool excludeAsLocator() const {
return false;
}
virtual bool isTransparent() const {
return false;
}
static void * creator();
static MStatus initialize();
@@ -61,6 +85,22 @@ public:
//Solver Settings
static MObject ssSolverType;
//
static MObject ia_DBG_DrawWireframe;
static MObject ia_DBG_DrawAabb;
static MObject ia_DBG_DrawFeaturesText;
static MObject ia_DBG_DrawContactPoints;
static MObject ia_DBG_NoDeactivation;
static MObject ia_DBG_NoHelpText;
static MObject ia_DBG_DrawText;
static MObject ia_DBG_ProfileTimings;
static MObject ia_DBG_EnableSatComparison;
static MObject ia_DBG_DisableBulletLCP;
static MObject ia_DBG_EnableCCD;
static MObject ia_DBG_DrawConstraints;
static MObject ia_DBG_DrawConstraintLimits;
static MObject ia_DBG_FastWireframe;
//
@@ -90,7 +130,6 @@ protected:
void updateActiveRigidBodies(MPlugArray &rbConnections);
void applyFields(MPlugArray &rbConnections, float dt);
void updateConstraint(MObject& bodyNode);
protected:
MTime m_prevTime;
};

View File

@@ -135,7 +135,8 @@ MStatus initializePlugin( MObject obj )
status = plugin.registerNode( dSolverNode::typeName, dSolverNode::typeId,
dSolverNode::creator,
dSolverNode::initialize,
MPxNode::kDependNode );
// MPxNode::kDependNode );
MPxNode::kLocatorNode );
MCHECKSTATUS(status, "registering dSolverNode")
status = plugin.registerCommand( dSolverCmd::typeName,

View File

@@ -40,6 +40,21 @@ global proc AEdSolverTemplate( string $nodeName )
editorTemplate -addControl startTime;
editorTemplate -addControl rigidBodies;
editorTemplate -addControl drawWireframe;
editorTemplate -addControl drawAabb;
editorTemplate -addControl drawFeaturesText;
editorTemplate -addControl drawContactPoints;
editorTemplate -addControl noDeactivation;
editorTemplate -addControl noHelpText;
editorTemplate -addControl drawText;
editorTemplate -addControl profileTimings;
editorTemplate -addControl enableSatComparison;
editorTemplate -addControl disableBulletLCP;
editorTemplate -addControl enableCCD;
editorTemplate -addControl drawConstraints;
editorTemplate -addControl drawConstraintLimits;
editorTemplate -addControl fastWireframe;
AEdependNodeTemplate $nodeName;

View File

@@ -195,3 +195,9 @@ void solver_t::step_simulation(float dt)
{
m_impl->step_simulation(dt);
}
void solver_t::debug_draw(int dbgMode)
{
m_impl->debug_draw(dbgMode);
}

View File

@@ -99,6 +99,8 @@ public:
//
static void step_simulation(float dt);
static void debug_draw(int dbgMode);
static shared_ptr<solver_impl_t> get_solver();
private:

View File

@@ -83,6 +83,8 @@ public:
virtual void step_simulation(float dt) = 0;
virtual void debug_draw(int dbgMode) {}
public:
virtual ~solver_impl_t() { }
};

View File

@@ -49,7 +49,7 @@ m_useLinearReferenceFrameA(useLinearReferenceFrameA),
m_useOffsetForConstraintFrame(D6_USE_FRAME_OFFSET),
m_useSolveConstraintObsolete(D6_USE_OBSOLETE_METHOD)
{
calculateTransforms();
}
@@ -62,6 +62,7 @@ btGeneric6DofConstraint::btGeneric6DofConstraint(btRigidBody& rbB, const btTrans
{
///not providing rigidbody A means implicitly using worldspace for body A
m_frameInA = rbB.getCenterOfMassTransform() * m_frameInB;
calculateTransforms();
}

View File

@@ -64,7 +64,7 @@ void btSliderConstraint::initParams()
m_useLinearReferenceFrameA = USE_OFFSET_FOR_CONSTANT_FRAME;
calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
}